今回は、選手の成績推移について解析してみます。
選手のメジャーデビューから引退までの打撃成績推移を分析します。
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()
これを見ると、デビュー直後から非常に高い成績を残していたようです。
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))
このような感じになりました。
確かに、デビュー時が最高の成績で徐々に下降しているようにも見えますね。