セイバーメトリクス

Rによるセイバーメトリクス入門 をじっくり学ぶ 選手の成績推移を求めてみる。プホルス選手編

今回は、選手の成績推移について解析してみます。

選手のメジャーデビューから引退までの打撃成績推移を分析します。

Albert Pujolsの打撃成績推移

それでは偉大なるアルバート・プホルスについて

成績推移を見てみましょう。

プホルスは史上4人目の700本塁打記録の持ち主です。

 

まず、プホルスのIDを取り出します。

People%>%
     
 filter(nameFirst == "Albert", nameLast == "Pujols")%>%
 pull(playerID)-> pujols_id

 

打撃データについて犠牲フライや死球など

古いデータには残っていなことがあり、欠損値を0にします

batting <- Batting%>%
 replace_na(list (SF =0, HBP =0))

ここでget_stats関数を作成します

この関数では、選手の成績推移を計算します。

選手のIDから年齢別に成績をひっぱてくる関数です。

 get_stats <- function(player.id){
 batting%>%
 filter(playerID == player.id)%>%
 inner_join(People, by = "playerID")%>%
 mutate(birthyear = ifelse(birthMonth >=7, birthYear +1, birthYear),
  Age = yearID - birthyear,
  SLG = (H- X2B - X3B -HR + 2*X2B + 3*X3B +4*HR)/AB,
  OBP = (H + BB + HBP)/(AB + BB + HBP + SF),
  OPS = SLG + OBP)%>%
  select(Age, SLG, OBP, OPS)
}

  

この関数にプホルスのIDを入れて見ます。

そして年齢とOPSの変化グラフ化してみます

Pujols <- get_stats(pujols_id)
ggplot(Pujols, aes(Age, OPS))+geom_point()
プホルス選手の年齢とOPSの変化

これを見ると、デビュー直後から非常に高い成績を残していたようです。

30歳ごろまでOPS1.000付近をキープしていました

(ちなみにエンゼルスに移籍したのが32歳・・・その後成績は下降気味)

選手成績の曲線モデル化

先程のデータについて、

なめらかな曲線を使ってモデル化してみます。

なめらかな曲線は二次関数として以下のように表せます。

 A + Bx + Cx2 

これを今回の解析に合わせると

 A + B(年齢ー30歳) + C(年齢ー30歳)2 

そうすると以下のような特徴を

1、定数Aはその選手が30歳のときのOPSの予測値となる

2、微分をすることでピークの年齢は

 30 − B/2Cで表すことができる

3、ピーク年齢がわかれば、ピーク時の最大OPSの推定ができる

4、定数Cによって、選手の成績変化の大きさがわかる

 

fit_model関数を作成します。

選手の成績データを入れることによって,

lm関数を使って二次曲線を作ります

bとして二次関数の定数A, B, Cを格納します

そうすることで、最大成績の年齢、最大成績のOPSを算出することができます

fit_model <- function(d){
 fit <- lm(OPS ~ I(Age - 30)+ I((Age - 30)^2), data =d)
 b <- coef(fit)
 Age.max <- 30 - b[2] / b[3]/2
 Max <- b[1]-b[2]^2/ b[3]/4
list(fit = fit, Age.max = Age.max, Max = Max)
} 

このfit_model関数にプホルスのデータを入れます。

そして定数のA, B, Cを表現してみます。

F2 <- fit_model(Pujols)
coef(F2$fit)

 (Intercept)     I(Age - 30) I((Age - 30)^2) 

   0.9516574468   -0.0207914693   -0.0007889231 

となり、

これは、モデル化した曲線が

0.952 - 0.021(年齢 - 30歳)- 0.001(年齢 - 30歳)2

となりました。

 

そして、算出されたピーク時の年齢、その時のOPSを算出してみます。

c(F2$Age.max, F2$Max)

I(Age - 30) (Intercept)
16.822879 1.088643

そうすると結果は

全盛期の年齢16.8歳、その時のOPS1.089となりました。

プホルスの全盛期は17歳!?となりましたが、

それだけデビュー時から成績が突出していたのでしょう。

  

最後にモデリングした曲線をプロットしてみます。

ggplot(Pujols, aes(Age, OPS))+geom_point()+
 geom_smooth(method = "lm", se = FALSE, size = 1.5,
 formula = y ~ poly(x, 2, raw= TRUE))
プホルス選手のOPS成績推移

このような感じになりました。

 

確かに、デビュー時が最高の成績で徐々に下降しているようにも見えますね。

-セイバーメトリクス