点球成金:线性回归是如何改变棒球的(TechnicalFridays博客个人翻译)

原文写于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的记录也是美国职棒大联盟最佳。
在这里插入图片描述
尽管他们没能赢下世界职业棒球大赛,这支球队数据驱动的运作方式使棒球队的运作迎来一次大革命。如此,点球成金改变了许多大联盟管理层的经营方式。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值