環境、データともに前回からのものを引き続き利用します。
STATCAST で遊ぶ vol.2
バレル率とホームラン数
MLB STATCAST において、バレル(Barrels)とは、打球速度(初速)と発射角(打球の打ち出し角度)が完璧な組み合わせを持つ打球で、最低期待打率 .500、期待長打率 1.500 と定義されています。
バレル率は、ある打者が、バレルで打った数 ÷ 全打球で計算されます。
バレル率が高ければ高いほど、打率は上がり、長打も多くなるわけですからバレル率とホームランは相関していそうです。相関とは、この場合「バレル率の高い選手ほど、ホームラン数も多い」という関係のことを表現しています。
では、前回の復習になりますが、CSV データから、バレル率とホームラン数を数値変数にしてみましょう。
player_batting <- read.csv("./2024_batting_d-bs-s.csv")
barrel_batted_rate <- as.numeric(player_batting$barrel_batted_rate)
home_run <- as.numeric(player_batting$home_run)
バレル率(barrel_batted_rate)とホームラン数(home_run)の変数ができたので、これを散布図にしてみましょう。
plot(home_run, barrel_batted_rate)
ざっくり図を見て理解できるのは、バレル率(Y軸)が高ければ、ホームラン数(X軸)も多いということがわかると思います。このように散布図が右肩上がりのときは、相関していると見ていいでしょう。
試しに、バレル率と相関していなそうなデータで調べてみましょう。選手の年齢との関係を調べてみましょう。
player_age <- as.numeric(player_batting$player_age)
plot(player_age, barrel_batted_rate)
全然、関係なさそうですね。バレル率が高いからと言って、年齢も高いということは言えなそうですね。
標準化してみる
さて、バレル率は、率というくらいですから比率のデータで、ホームラン数は、積み上げた値です。
このように、単位の違うものを見比べるときに、スコア化されているとわかりやすくなります。
よく用いられるのは、 z得点と偏差値ですが、まず、バレル率とホームラン数を z得点で標準化します。 z得点は平均すると0、標準偏差は1になるように変換することです。式は、次のようになります。
z得点 = \frac{x - μ}{σ}
x は、データの値、μ(ミュー) は平均、σ(シグマ)は標準偏差です。
ということで、バレル率とホームラン数の平均と標準偏差を求める必要がありますね。
ここでは、標本=母集団なので、標本分散を採用しましょう。
平均、分散、標準偏差の順番に求めて、z得点を求めてみましょう。
barrel_batted_rate_avg <- mean(barrel_batted_rate) # バレル率平均
barrel_batted_rate_avg
[1] 9.16124
home_run_avg <- mean(home_run) # ホームラン数平均
home_run_avg
[1] 21.67442
barrel_batted_rate_varp <- var(barrel_batted_rate) * (length(barrel_batted_rate) - 1) / length(barrel_batted_rate) # バレル率分散
barrel_batted_rate_varp
[1] 17.19943
home_run_varp <- var(home_run) * (length(home_run) - 1) / length(home_run) # ホームラン数分散
home_run_varp
[1] 82.79322
barrel_batted_rate_stdevp <- sqrt(barrel_batted_rate_varp) # バレル率標準偏差
barrel_batted_rate_stdevp
[1] 4.147219
home_run_stdevp <- sqrt(home_run_varp) # ホームラン数標準偏差
home_run_stdevp
[1] 9.099078
z_barrel_batted_rate <- (barrel_batted_rate - barrel_batted_rate_avg) / barrel_batted_rate_stdevp
z_barrel_batted_rate
[1] 1.239085594 -0.135329306 0.853284920 -0.087104222
〜略〜
[125] -0.641692690 -1.268618785 1.070297799 -0.665805233
[129] -0.882818112
z_home_run <- (home_run - home_run_avg) / home_run_stdevp
z_home_run
[1] 1.13479424 1.90410295 0.47538678 -0.51372442
〜略〜
[125] -0.07411944 -1.06323064 1.24469549 0.47538678
[129] -0.84342815
検算してみます。平均が 0、標準偏差が 1になればいいわけですから、各z得点の平均を式に含めて、標準偏差を計算して、1になれば、合っていると言えそうです。
sqrt(mean((z_barrel_batted_rate - mean(z_barrel_batted_rate)) ** 2))
[1] 1
sqrt(mean((z_home_run - mean(z_home_run)) ** 2))
[1] 1
((z得点 - z得点の平均)を2乗し、その平均を取るということは、二乗和 ÷ データ個数と同じことになります。その平方根を取れば、標準偏差になります。
どちらも 1でした。合っていそうです。
z得点同士で、散布図を描いてみましょう。
plot(z_barrel_batted_rate, z_home_run)
繰り返しになりますので、画像は載せませんが、X軸、Y軸の目盛りの数字以外は、同じ図が描けていると思います。
偏差値
z得点が求まっていれば、偏差値を計算するのは簡単です。
偏差値は、平均が50、標準偏差が10になるように標準化するものですから、求めたz得点を10倍し、50を足すことで求められます。z得点は、平均が0、標準偏差が1ですから、10倍すれば標準偏差は10になります。そして、50を足せば、平均も50になるということです。
sts_barrel_batted_rate <- z_barrel_batted_rate * 10 + 50
sts_barrel_batted_rate
[1] 62.39086 48.64671 58.53285 49.12896 42.85970 56.84497
〜略〜
[121] 51.05796 47.44108 45.27095 41.41294 43.58307 37.31381
[127] 60.70298 43.34195 41.17182
sts_home_run <- z_home_run * 10 + 50
sts_home_run
[1] 61.34794 69.04103 54.75387 44.86276 45.96177 48.15979
〜略〜
[121] 52.55584 51.45683 52.55584 40.46671 49.25881 39.36769
[127] 62.44695 54.75387 41.56572
summary(sts_barrel_batted_rate)
Min. 1st Qu. Median Mean 3rd Qu. Max.
29.84 43.34 49.13 50.00 56.84 92.77
summary(sts_home_run)
Min. 1st Qu. Median Mean 3rd Qu. Max.
28.38 43.76 48.16 50.00 54.75 89.92
sqrt(mean((sts_barrel_batted_rate - mean(sts_barrel_batted_rate)) ** 2))
[1] 10
sqrt(mean((sts_home_run - mean(sts_home_run)) ** 2))
[1] 10
どちらも、平均値が 50、標準偏差 10 になっていますね。
大谷翔平はどうなってるのか?
バレル率とホームラン数の標準化をやってみましたが、算出できたデータセットの要約と大谷翔平のデータと比べてみましょう。
61番目が大谷翔平のデータです。
summary(z_barrel_batted_rate)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-2.0161 -0.6658 -0.0871 0.0000 0.6845 4.2773
summary(z_home_run)
Min. 1st Qu. Median Mean 3rd Qu. Max.
-2.1622 -0.6236 -0.1840 0.0000 0.4754 3.9922
z_barrel_batted_rate[61]
[1] 2.975189
z_home_run[61]
[1] 3.552622
平均は 0なのですから、大谷翔平が、バレル率、ホームラン数ともに大きく上回っています。でも、summary を見ると、最大値は、大谷翔平を大きくバレル率で上回る選手がいるようですね。
誰でしょうか。まあ、予想通りなんですが、アーロン・ジャッジです。
ジャッジのデータは91番目。
z_barrel_batted_rate[91]
[1] 4.277266
z_home_run[91]
[1] 3.992227
まとめ
今回は、単純化して、バレル率のみを取り上げましたが、STATCAST には、打球速度の平均、発射角の平均等の面白い、かつ使えるデータが沢山あります。
平均値であるとはいえ、初速と発射角が分かれば、到達距離が計算できますよね。また、大谷、ジャッジとホームランバッターばかりを取り上げましたが、打者にも色々なタイプがいます。
その辺も、今後、探っていきたいと思います。