GraphGists

对于不了解的人来说,欧洲歌唱大赛是欧洲国家之间的一项歌唱比赛。特殊之处在于,各国必须相互投票以决定获胜者。

giphy

但是,每年都有一种相同的印象:听起来像是有些国家在结成帮派。我们可以借助图的力量来揭示这种感觉吗?让我们看看。

模型非常简单。

Eurovision

以下是 2012 年、2013 年、2014 年和 2015 年决赛中所有欧洲歌唱大赛投票的数据收割。

评论:投票国家也可以是候选国家。

对于注意到“澳大利亚”的人来说,这不是“奥地利”的打字错误,澳大利亚确实在 2015 年作为候选国参加了欧洲歌唱大赛。

谁参加了比赛,是哪一年,是候选国还是投票国?

让我们从简单地检查一下谁参加了哪一场决赛,以及谁只投票开始。

MATCH (country)-[v:VOTE]->()
WITH country, count(DISTINCT v.year) AS nb_voting ,collect(DISTINCT v.year) AS year_voting
MATCH ()-[p:VOTE]->(country)
WITH country, nb_voting,year_voting, count(DISTINCT p.year) AS nb_participation ,collect(DISTINCT p.year) AS year_participation
RETURN country.name,nb_voting,year_voting,nb_participation,year_participation
ORDER BY nb_participation DESC

一年的投票分配可视化

快速图表来表示一年的投票分配(这里是 2015 年)。

MATCH path = (voter:Country)-[v:VOTE]->(candidate:Country)
WHERE v.year = 2015 AND v.score >= 8
RETURN path

最佳投票者

哪个投票者总是为获胜者投票?

MATCH (voter)-[vote:VOTE]->(country)
WHERE vote.score = 12 AND country.winner = "Yes"
WITH voter, COUNT(DISTINCT vote.year) AS nb_year , COLLECT(DISTINCT vote.year) AS years
WHERE nb_year = 4
RETURN voter.name,years
ORDER BY nb_year DESC

如果你需要下注,英国看起来是一个非常好的顾问 :-D

投票的影响?

如果我们只给出 8 分、10 分和 12 分,这会改变每年的排名吗?

MATCH ()-[up:VOTE]->(country)
WHERE up.score >= 8
WITH country, up.year as year, SUM(up.score) AS up_score
MATCH ()-[all:VOTE]->(country)
WHERE all.year = year
WITH country, year, up_score , SUM(all.score) as all_score
RETURN country.name,year, all_score,up_score
ORDER BY year,all_score DESC

因此,听起来 8 分以下的投票不会真正影响排名。也许有些地方会在前 5 名中交换位置,但没有发生剧烈变化。

投票的多样性

正如我们之前所看到的,最重要的是著名的 8 分、10 分和 12 分。这些投票是如何在每年每个国家分配的?

让我们看看一个国家每年为多少不同的候选人投票。

MATCH (a)-[e:VOTE]->(b)
WHERE e.score >= 8
WITH a, count(DISTINCT e.year) AS years, collect(DISTINCT b.name) AS candidate, count(DISTINCT b.name) AS nb_candidate,toFloat(count(DISTINCT b.name))/ toFloat(count(DISTINCT e.year)*3) AS ratio
WHERE ratio <> 1
RETURN a.name,candidate,nb_candidate,years,ratio
ORDER BY ratio ASC

详情

MATCH (voter)-[e:VOTE]->(candidate)
WHERE e.score >= 8
WITH voter, candidate, collect(DISTINCT e.year) AS years, COUNT(DISTINCT e.year) as nb_year
RETURN voter.name,candidate.name,years
ORDER BY nb_year DESC,voter.name

该比率显示了一个国家在四场决赛中投票的“多样性”。大多数国家几乎每次都投票给不同的国家。但其中少数国家没有这种投票多样性,他们几乎总是投票给同一个候选人。

可视化

MATCH w WHERE w.winner = "Yes" REMOVE w:Country SET w:Winner;
MATCH (a)-[e:VOTE]->(b)
WHERE e.score >= 8
WITH a,b, count(DISTINCT e.year) AS years
WHERE years >= 2
CREATE p= (a)-[r:SIMILAR_VOTE {nb:years}]->(b)

RETURN p

12 分给了……朋友

在这个查询中,我们将尝试检查每年的相互投票,其中两个投票的分数都高达 8 分。

MATCH (a)-[e:VOTE]->(b),(b)-[f:VOTE]->(a)
WHERE f.year = e.year AND e.score >= 8 AND f.score >= 8
RETURN a.name,b.name,e.year,e.score,f.score
ORDER BY e.year,a.name

这个结果相当详细,我们可以通过按年份聚合来简化它。

MATCH (a)-[e:VOTE]->(b), (b)-[f:VOTE]->(a)
WHERE f.year = e.year AND e.score >= 8 AND f.score >= 8
WITH a,b,collect(DISTINCT e.year) as years,count(DISTINCT e.year) as nb_years
RETURN a.name,b.name,years
ORDER BY nb_years DESC

有趣的是,实际上有一些国家相互投票,其中一些国家在四年的时间里出现了两次。

朋友图

让我们可视化最后的结果。

MATCH w WHERE w.winner = "Yes" REMOVE w:Country SET w:Winner;
MATCH p = (a)-[e:VOTE]->(b), q = (b)-[f:VOTE]->(a)
WHERE f.year = e.year AND e.score >= 8 AND f.score >= 8

RETURN p

有趣的是,一些获胜者听起来像是属于一个国家集群的一部分。但由于他们是获胜者,他们在图中自然会表现得像“中心”。让我们做同样的事情,但不包括他们。

MATCH p = (a)-[e:VOTE]->(b), q = (b)-[f:VOTE]->(a)
WHERE f.year = e.year AND e.score >= 8 AND f.score >= 8 AND a.winner <> "Yes" AND b.winner <> "Yes"

RETURN p

无论是否包含获胜候选人,结果都是一样的:它几乎看起来像世界边界图。所以听起来有些国家属于一个“地理帮派”。

结论

当然,可以通过更多的数据和更详细的分析来改进调查。

我们不能肯定地得出结论说各国是按照“帮派”组织的,但我们可以观察到一些有趣的奇点,并根据地理位置区分一些国家集群。