原文写于2017/7/28
It’s unbelievable how much you don’t know about the game you’ve been playing all your life.
— Mickey Mantle
你对你打了一辈子的比赛还有那么多不知道的事情,这一切真是难以置信。
— 米奇·曼托(欧美史上十大最佳棒球运动员)
译注:本文是基于moneyball这个非常经典的数据科学应用范例写的,在kaggle上也有同名项目moneyball,同时在csdn也有很多相关文章。主要内容是用R语言写了一个线性回归模型。虽然没什么新意,也不妨来看看他的思路。
*点球成金(moneyball)*是一部电影,由同名书籍改编,讲述的是2002年的Oakland Athletics,当时最穷的棒球队之一的故事。Billy Beane在1997年成为了队伍的总经理,在他的带领下队伍表现逐渐提升。但是在2002年的年初,他们失去了3个关键队员。面对这样的打击,他们还能把他们的表现维持下去吗?
Billy Beane和他的同事Paul DePodesta,使用了一个被称为赛伯计量学(Sabermetrics)的分析方法来尝试在球队收入下降的情况下,组建一支有竞争力的棒球队。他们的分析显示有些技术被低估而另一些被高估了。如果他们能发现那些被低估的技术,他们也许可以以低价聘到好的运动员。
他们的分析表示一个队伍需要赢最少95场比赛来获取进到季后赛的资格。据此,他们必须赢135分以上,才能达到95胜的期望。我将用R语言,构建一个线性回归模型来验证他们的分析。数据集包含15个变量,对变量的描述在这里。在这些变量中,我们来看胜场数和是否进到季后赛两项,并且只看2002年前(moneyball之前)的数据。
# read in data
> baseball = read.csv("baseball.csv")
> str(baseball)
'data.frame': 1232 obs. of 15 variables:
$ Team : Factor w/ 39 levels "ANA","ARI","ATL",..: 2 3 4 5 7 8 9 10 11 12 ...
$ League : Factor w/ 2 levels "AL","NL": 2 2 1 1 2 1 2 1 2 1 ...
$ Year : int 2012 2012 2012 2012 2012 2012 2012 2012 2012 2012 ...
$ RS : int 734 700 712 734 613 748 669 667 758 726 ...
$ RA : int 688 600 705 806 759 676 588 845 890 670 ...
$ W : int 81 94 93 69 61 85 97 68 64 88 ...
$ OBP : num 0.328 0.32 0.311 0.315 0.302 0.318 0.315 0.324 0.33 0.335 ...
$ SLG : num 0.418 0.389 0.417 0.415 0.378 0.422 0.411 0.381 0.436 0.422 ...
$ BA : num 0.259 0.247 0.247 0.26 0.24 0.255 0.251 0.251 0.274 0.268 ...
$ Playoffs : int 0 1 1 0 0 0 1 0 0 1 ...
$ RankSeason : int NA 4 5 NA NA NA 2 NA NA 6 ...
$ RankPlayoffs: int NA 5 4 NA NA NA 4 NA NA 2 ...
$ G : int 162 162 162 162 162 162 162 162 162 162 ...
$ OOBP : num 0.317 0.306 0.315 0.331 0.335 0.319 0.305 0.336 0.357 0.314 ...
$ OSLG : num 0.415 0.378 0.403 0.428 0.424 0.405 0.39 0.43 0.47 0.402 ...
# we're interested only in years before moneyball (2002)
> moneyball = subset(baseball, Year < 2002)
> table(moneyball$W, moneyball$Playoffs)
0 1
40 1 0
50 1 0
51 1 0
52 2 0
53 3 0
54 5 0
55 1 0
56 3 0
57 5 0
59 7 0
60 7 0
61 6 0
62 8 0
63 10 0
64 13 0
65 17 0
66 11 0
67 19 0
68 15 0
69 18 0
70 17 0
71 20 0
72 20 0
73 22 0
74 27 0
75 27 0
76 36 0
77 31 0
78 17 0
79 32 0
80 26 0
81 28 0
82 20 1
83 35 0
84 28 2
85 30 1
86 31 1
87 27 1
88 23 7
89 22 5
90 17 12
91 15 10
92 12 11
93 6 7
94 6 6
95 5 15
96 3 8
97 4 13
98 4 11
99 1 7
100 1 5
101 0 7
102 1 8
103 1 5
104 0 4
106 0 1
108 0 3
109 0 1
114 0 1
116 0 1
提取出的数据三列分别表示胜场数,该胜场数下没进到季后赛的队伍数量,进到季后赛的数量。94胜场下,比例还是1:1,到了95胜场,比例就上升到了1:3,这和电影中的分析基本一致。
# Compute Run Difference (RD) add it to dataframe
> moneyball$RD = moneyball$RS - moneyball$RA
> names(moneyball) # Note that moneyball now has a new variable 'RD'
[1] "Team" "League" "Year" "RS" "RA"
[6] "W" "OBP" "SLG" "BA" "Playoffs"
[11] "RankSeason" "RankPlayoffs" "G" "OOBP" "OSLG"
[16] "RD"
# Scatterplot to check for linear relationship
> plot(moneyball$RD, moneyball$W, xlab = "Run Difference", ylab = "Wins", title("Moneyball: Relationship b/w Wins and RD"))
RS表示run scored 得分
RA表示run allowes 失分
得分run difference = RS - RA
上面的图片显示了胜场和得分的线性关系。现在来构建我们的线性回归模型。
# Regression model to predict wins:
> Wins = lm(W ~ RD, data=moneyball)
> summary(Wins)
Call:
lm(formula = W ~ RD, data = moneyball)
Residuals:
Min 1Q Median 3Q Max
-14.2662 -2.6509 0.1234 2.9364 11.6570
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 80.881375 0.131157 616.67 <2e-16 ***
RD 0.105766 0.001297 81.55 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 3.939 on 900 degrees of freedom
Multiple R-squared: 0.8808, Adjusted R-squared: 0.8807
F-statistic: 6651 on 1 and 900 DF, p-value: < 2.2e-16
我们得到的回归方程式是:
W = 80.8814 + 0.105766 × RD 并且需要W >= 95
因此RD >= 133.4
这与电影中分析得到的135分很接近,所以他们的分析是合理的。
那么现在,他们到底是怎么做到多赢那么多分的呢。
他们的分析发现,有两项数据是最重要的:
- OBP:球员上垒的时间百分比
- SLG:一个球员在他的回合能绕垒多远
另外,安打率是被高估了的。让我们来验证这些结论:
# Regression model to predict runs scored:
> RunsScored = lm(RS ~ OBP + SLG, data=moneyball)
> summary(RunsScored)
Call:
lm(formula = RS ~ OBP + SLG, data = moneyball)
Residuals:
Min 1Q Median 3Q Max
-70.838 -17.174 -1.108 16.770 90.036
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -804.63 18.92 -42.53 <2e-16 ***
OBP 2737.77 90.68 30.19 <2e-16 ***
SLG 1584.91 42.16 37.60 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 24.79 on 899 degrees of freedom
Multiple R-squared: 0.9296, Adjusted R-squared: 0.9294
F-statistic: 5934 on 2 and 899 DF, p-value: < 2.2e-16
线性回归得出可决系数(R-squared value,表示对平均值的偏离)为0.92,因此我们的模型拟合得很好;并且两个变量(OBP, SLG)都很重要。
得分 (RS) = -804.63 + 2737.77(OBP) + 1584.91(SLG) …(i)
类似的,对于失分 (RA),我们也可以利用本队投手的数据预测出对手的OBP和SLG,并构建线性模型:
# Regression model to predict runs allowed:
> RunsAllowed = lm(RA ~ OOBP + OSLG, data=moneyball)
> summary(RunsAllowed)
Call:
lm(formula = RA ~ OOBP + OSLG, data = moneyball)
Residuals:
Min 1Q Median 3Q Max
-82.397 -15.178 -0.129 17.679 60.955
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -837.38 60.26 -13.897 < 2e-16 ***
OOBP 2913.60 291.97 9.979 4.46e-16 ***
OSLG 1514.29 175.43 8.632 2.55e-13 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 25.67 on 87 degrees of freedom
(812 observations deleted due to missingness)
Multiple R-squared: 0.9073, Adjusted R-squared: 0.9052
F-statistic: 425.8 on 2 and 87 DF, p-value: < 2.2e-16
失分 (RA) = -837.38 + 2913.60(OOBP) + 1514.29(OSLG) …(ii)
通过2001年Oakland Athletics的数据
- OBP = 0.339
- SLG = 0.430
代入式(i),我们得到得分RS = 805
同样的,得到失分 RA = 622
得到胜场预测W = 80.8814 + 0.1058 × (RS - RA) = 100
电影里的预测(表格第二行)和我们的结果很相近,与真实结果也符合。当年Oakland Athletics连胜20场,突入了季后赛。他们2002年103-59的记录也是美国职棒大联盟最佳。
尽管他们没能赢下世界职业棒球大赛,这支球队数据驱动的运作方式使棒球队的运作迎来一次大革命。如此,点球成金改变了许多大联盟管理层的经营方式。