西班牙皇家马德里队于昨天结束的欧冠决赛中夺冠,而我司大数据团队早在4月份就已通过PageRank算法成功做出预测。让我们来看看他们夺冠的过程中跟大数据技术的关系。
截至我写这篇文章的时候,本赛季欧冠正好刚刚打完四分之一决赛:
(上图名单按字母排序)
如上所示,四强就是皇马、马竞、尤文和摩纳哥啦。
能够打入四强的球队显然都不好对付,究竟谁能夺冠,大家也都给出了自己的猜测:有人觉得上届冠军皇马实力强劲,有望卫冕;有人认为马竞在过去三年两进决赛之后,怎么也该打破魔咒获得冠军了;尤文近几年表现出的实力也是有目共睹,今年更是完胜巴萨;当然还有摩纳哥,虽然看起来似乎比不了以上三家,但黑马总是令人忌惮的,谁知道会不会爆一个大冷门呢?
你可能觉得,看这四个球队的联赛成绩就可以知道谁更厉害了。不过事情不一定这么简单。欧冠常被认为代表了足球竞技的最高水平,参赛队伍都是欧洲内各大联赛的前几名,强强对话究竟谁占上风,恐怕不能简单地以联赛成绩来判断。键盘侠界一直有一种理念(也可能是迷信):联赛靠虐菜(尽可能战胜弱队拿分,毕竟打谁都是3分),欧冠靠死撑(对阵强队,即使不一定占据绝对优势,也不能被轻易打垮)。并且,由于球风、偏好甚至集中度的不同,每个球队擅长对付的对手也不同,因此,有的球队被誉为劫富济贫专打强队的能手,有的球队则被嘲笑是窝里横……
本来这种论调我是拒绝的,直到2013-14赛季的赛果颠覆了我的观念。13/14赛季的欧冠冠军是皇马,他们战胜了许多强敌打进决赛,又在决赛中艰苦地战胜了马竞,赢得球队历史上的第十冠;然而,在同赛季的西甲联赛中,皇马的表现实在是不怎么样,最后仅屈居第三,而西甲冠军正是——马竞。
这可能是一个相当典型的例子了,马竞赢得了一个赛季的长跑,却在最后关头倒在了皇马脚下,心中想必也是很不爽的。所以,难道马竞就是传说中的虐菜小能手,而皇马专克强敌?
于是我就想到了著名的网页排序算法——PageRank,Google用于用来标识网页的重要性的一种方法。比如,我搜索了“西甲”这个关键字,世界上当然有成千上万个网页里都有这两个字,Google到底应该首先推给我哪一个呢?PageRank算法的思想是,假设我们要评估网页A的重要性,那么就要看有多少网页(n)引用了网页A;一般来说,n越大、而且这n个网页的重要性越高,A就越重要,也就是说,网页A的重要性由所有引用它的网页的重要性共同决定。由于网页数量繁多,我们经过若干次迭代入链后,就可以得到一组收敛的评分——也就是所有网页的PageRank值。
这个道理似乎很适用于足球比赛。我们可以认为,一支球队的实力由所有输给它的球队的实力决定,别的球队输给它一次,就等于给它加血。球队的实力(PageRank),也就是通过所有输给它的球队的重要性经过递归算法得到的。
简单地说,球队:
不但赢得越多越厉害——这是各大联赛的积分标准
而且赢强队越多越厉害——这就是综合实力了
好了,这就是球队PageRank算法的理论基础。
既然刚才已经说过了13/14赛季的西甲怪现象,不妨就拿这个赛季来算一下PageRank吧。条件所限,我是拿R来实现这一套流程的,其实可能底层语言方便得多.
感谢数据时代(或者菠菜业),现在找比赛资料真是容易得多,如果你不是执着于什么斯洛文尼亚第三级别联赛,应该都能在网上找到。我的数据来源是http://www.football-data.co.uk/data.php,可以提供22个欧洲联赛在过去19年中的赛果,包括半场结果、全场结果、角球、处罚等(看到这里你该知道它是为哪个行业服务的了)。
简单说一下思路:
1. 对源数据进行处理
从那家网站上获得的比赛数据很复杂,我只保留了双方球队名和进球数。同时,我认为一个赛季的表现并没有说服力:从实力提升到在欧冠中有所突破,往往需要几个赛季的时间,很多球队就倒在其中的某一环。因此,我选择了2010/11 - 2013/14共四个赛季的数据。比较理想的一点是,这四个赛季中,皇马和马竞都各有一位执教时间满3年的主教练,可以保证球队发展的连续性。关于主客场,我选择了忽略其中可能存在的差别。
经过简单处理之后,数据变成了“球队A - 球队B - A进球数 - B进球数”的格式,每场比赛都有一条记录。
2. 将数据变成有向图
网页PageRank算法中,如果网页A引用了网页B,则可以认为存在A->B的关系;生动一点说,“A把自己的重要性贡献了一部分给B”。我认为以图来思考PageRank非常简洁有效,也就是说,球队A输给了球队B,则可以认为存在A->B的关系,A给B加了血。
这样,我们就可以画出一个有向图:
3. 计算PageRank
每个赛季西甲有20支球队,但在前后4个赛季中,共有26个球队参加过比赛。计算的PageRank值如下:
我很困惑为什么我的R并不严格按照descending的顺序排序……但是很明显,从4年的时间段来看,巴萨和皇马是西甲的两大巨头,马竞与之尚有差距。事实上在那几个赛季中,马竞的确处于崛起的过程,然而大概还没有进阶成为老油条,所以在至关重要的决赛中,拼不过皇马也属正常了。
我并不希望把这个问题搞得太复杂,但这可能导致某些部分失去了应有的复杂性。不过,足球比赛中本来就有很多不能量化的东西,在此我也只是提出一种可能的思路,希望对大家有所帮助。
另外,在我漫长的算数过程中,我发现单赛季联赛PageRank排名与实际排名差异极小,实验了几个赛季,冠军位置都没有变过。——所以,联赛也不能光靠虐菜的。
上面已经说过,今年的欧冠四强是皇马、马竞、尤文和摩纳哥。不过,坦白地说,摩纳哥真的让人很为难,要知道去年它都没有进入欧冠小组赛……同样,part 2里面的大量联赛数据也无法在尤文身上重演。
我考虑过是否要把欧洲五大联赛的数据完全混起来计算,但要知道,各联赛的中下游球队完全没有机会碰面,只有上游球队可能一年碰个两次,这样巨大的数据差异难以得出客观的结果。事已至此,我的想法是或者就拿近四年欧冠正赛(2013/14 - 2016/17四分之一淘汰赛)的数据来用,尽量保证参与节点的稳定性。
偷懒起见,我觉得可以先拿皇马、马竞、尤文三队之间的直接交战数据试一试,虽然绝对数量少得可怜,但四个赛季里他们三个一共交手10次(还不算今年没来得及碰上),这个数字在欧洲各队之间算是非常可观的。结果如下:
注:以90分钟结果为准
三个队没有差很多,但皇马确实略高一筹。不过这看起来怎么都有点敷衍,所以还是选取2013-14赛季开始至今的欧冠全数据试试吧。过程不赘述了,结果如下(仍然无法正确地排序,sad):
黑马摩纳哥在这种算法中当然是吃亏的,姑且不论。直接给答案:皇马>马竞>尤文。
我觉得也不妨单拿淘汰赛的结果试一下,参赛队伍一下减少到了29个:
如图,选中皇马的时候,给他贡献过经验值的球队都会高亮出来
看看最大的几个圆,皇马、拜仁、马竞、巴萨、尤文……西甲这几年真的是好厉害。具体PageRank分数如下:
我们关注的三支队伍的顺序依然是皇马>马竞>尤文。这么看来淘汰赛小能手皇马很有夺冠的希望啊。
不过,像任何一个算法一样,这种算法也有不完善的地方。比如……咳咳,请抬头看德甲的另两支球队,沃尔夫斯堡的得分竟然比多特蒙德还要高,然而谁会觉得前者比后者更有竞争力?回想一下,其实是因为这几年间该队只参加了一次欧冠淘汰赛,并且很意外地战胜了一次皇马……所以分数一下子就拉高啦。
所以,请大家娱乐为主,领会算法精神为辅,毕竟,如果算法就能给出比赛结果,那还踢球干嘛?足球的魅力,本来也在于其不确定性。
其实PageRank与足球的潜(挑)在(口)结(水)合(话)点(题)真是太多了,比如:梅西和C罗,究竟谁是虐菜小王子、谁才是硬仗大师?英超真的像他们自己声称的那样,联赛内部竞争过于激励以至于欧战乏力吗?阿森纳为何在欧冠全排名中可以挤进前十,只算淘汰赛却连塞维利亚都比不上?……感觉我马上就可以收到太阳报的offer了,我先去办签证了哦。
在研究过程中,对我帮助最大的R程序包是:igraph, dplyr和visNetwork,最后一个简直是画交互图的神器。
本文转载自毕马威大数据挖掘微信公众号。文章由项目经验丰富的博士以及资深顾问精心准备,内容也是结合实际业务的理论应用和心得体会等干货。