众所周知,NBA每个赛季,球队之间的交手次数是不一样的,这一点和大部分足球联赛不同。
但和足球联赛相同的一点是:赢强队和赢烂队的价值是一样的。足球里都能拿3分,NBA里都算1个胜场。
所以东西部的战绩“含金量不同”,“西强东弱”之类的说法不绝于耳,很难拿出统一的标准。
最近雄鹿锁定联盟第一战绩了,我心里的第一反应是“呵呵,还不是因为打东部烂队的机会多,有什么了不起”。
但又觉得自己这样想未免太武断了,缺乏数据支撑。
于是想到了用ELO算法,把30个球队放在一起,按照整个赛季的赛程、战绩,计算ELO值的变化,看看能否有些新发现。
似乎前几个赛季在reddit还是虎扑上也见过用ELO算NBA的帖子,但查了一下这个赛季还没有,我就抛砖引玉了。
所以我做这个事儿的本意,是想证明雄鹿的联盟第一水分太大(我做完之后有没有打自己脸呢?且看下文)
(一)先简单介绍一下ELO
这是一个数学家发明出来的东西,在象棋围棋、电子竞技之类的地方已经用的很多了。英雄联盟的天梯积分制度,就是这么来的。
ELO是一套算法的理念,在具体的公式里,有些参数是常数,可以根据情况调的,所以不是每一个竞技项目采用的等级分制度都是完全一样的,而是在ELO这个理念之下,根据这个项目的特点、参与人群的水平分布,来合理设置参数。
大部分情况下我们认为竞技者的水平服从正态分布,尤其比如围棋棋手数量很多,和标准正态分布就很接近。
但NBA球队只有30支,不是非常严格地贴合正态分布,但大致上也是八九不离十。
ELO的一个基本特点和目前足球、篮球联赛的积分制度是正好相反的:在ELO算法下,赢一个强队(等级分高的)的价值,要远高于赢一个烂队(等级分低的)
这是比较好理解的,好比说下围棋,如果今天我能赢柯洁一盘,基本上能直接给我定个段了。但柯洁赢我一盘,又有什么意义呢?
(二)我是怎么做的
我就假定在另一个平行宇宙,NBA 30支球队在玩天梯排位赛,一个队伍会随机地排到另一个队伍。然后打了一个赛季下来,每个队都正好打了82场,比赛发生的顺序和战绩结果,正好和我们这个宇宙里的2018-19赛季的NBA常规赛一样!
但是我没办法进入到那个平行宇宙上虎扑查战绩排名,所以我只能用我们这个宇宙里一个叫excel的软件模拟一下。
我设定的初始条件是这样的:
ELO大概的算法是这样:A和B对打,比赛之前我判断一下谁胜率高,这个判断是完全基于当前的等级分的(比如某个队特别强,只要想赢,见勇士一次灭一次,但是为了争蔡恩选择了82连败,那么在ELO看来他就是一个弱队)
判断下来这个赛前胜利值期望,两边加起来是1(因为两个队加起来只能赢一场球,要么你赢要么我赢)
如果觉得完全55开(两边等级分一样),初始胜利值期望就都是0.5,大家可以代进去算。
400这个参数是经验值,我也不知道为什么。这个参数越小,单场比赛带来的积分变化就会越大;越大,积分变化就越小。400是通常情况下比较平衡的取值。
有了初始的胜利值判断之后,就根据赛果来给分了。如果强队赢了弱队,也就是爆冷,弱队赚很多分,强队扣很多分。如果是强队赢了弱队,那么强队得分很少(赢了是应该的),弱队的失分也很少(输了也不丢人)
K的取值我取了32. 据说职业围棋取的是16,为了防止最顶级的几个棋手之间,因为一两场比赛的胜负,就把等级分完全逆转。32是通常情况下比较均衡的取值。
初始积分方面,实在是很难做到完全准确了。如果都以1000分开始赛季,显然有问题。赛季初,勇士和尼克斯打一场,难道赛前我们认为会是55开?
如果以上赛季的排名而言,也不够科学,因为休赛期人员变动很大。而且上赛季的排名,也是在东西部分区的情况下打出来的,而不是按照ELO等级分来的。
但是没办法,综合我们可以得到的数据,上赛季的战绩已经是参考价值最大的了。而且这赛季还有1230场比赛,即便初始ELO存在微小偏差,这么多比赛打完之后,等级分也会逐渐更准确地反映球队的实力
根据上赛季的常规赛排名,我设定的初始ELO如下:
设置的比较粗略,大致是按照常规赛胜率排名来的。第一是1000,名次下降一位就-10,如果胜率差了3%以上,还要额外-10。如果胜率一样,ELO就一样。
大家可以代几个值进去算算,比如说火箭1000分太阳700分,差不多相当于认为太阳有15%胜率。
然后我就根据NBA的赛程和战果,每发生一场比赛,就按照刚才条件里的公式,在两个球队本场比赛开始前的等级分基础上,根据赛果修改新的等级分。当然是用excel公式实现的(捂脸
等级分随着每个比赛日的变化表,如下图示例
每个比赛日之后,不是每个球队都有比赛的。没比赛的,会保持之前的等级分。比如Oct 16这一行(灰色的),这是第一个比赛日,在这一天之前的等级分,就是初始的。
Oct16这一天,76人队打了比赛,输了。所以分数掉到了904,显示在Oct17这一天的比赛开始前。别的队没打比赛,所以在Oct17 和 Oct16两行是一样的。
这么做有点怪,不过是为了excel里的操作方便,否则我每找一个值还得把行数-1。
每场比赛导致的变化表,如下图示例。
还是用Oct16举例,76人初始920分,凯尔特人940分。赛前算法判断凯尔特人胜率略高一些。如果是完全55开,赛后的等级分变化应该是K值的一半,也就是16。但这场比赛之后,76人输了,符合算法的预期,扣分只有15分。
截图之外举个例子,当地时间3月10日 太阳爆冷战胜了勇士,这场比赛之后的等级分变化幅度是28分,为本赛季截至目前之最。3月31日 雄鹿输给老鹰,则被扣了26分。
(三)做完了有什么发现
一共一千多场比赛,每场比赛之后要改两个球队的等级分,这个运算量对于电脑来说太简单了
几乎是在将公式拖拽到所有单元格的同时,一个个数字全都浮现了出来
做了个图如下——
最右侧从上到下就是ELO等级分的排名,每一条线的颜色+连接点形状的组合都是不同的,虽然还是密密麻麻,但是大家可以放大了之后,从最右侧找自己关注的球队,沿着线往左连回去~
不得不说火箭真是不容易,雄鹿的战绩含金量也是很高的,猛龙赛季初是真的猛,其他东部球队是真的捞……
受不少JRS建议,再多贴几个表
11月初,12月初,圣诞大战,全明星周末,315,清明节几个时间点,分别列出当时的ELO值,红色标出了各个时间点的前三名。同时也可以关注一下湖人和雷霆的变化轨迹……
还可以看看各支球队在整个赛季中的最低值、最高值之间的差异
直观看来,最稳定的似乎是夏洛特黄蜂~火箭、爵士、开拓者目前都处于整个赛季的最佳状态,掘金近期则是往下走了一些,雷霆则处于相对低谷的时期