OPS を計算してみる
OPS(On-base plus sluggin, 出塁率 + 長打率) は日本でもかなり浸透してきた指標で、かなり古い指標であるにもかかわらず、その有用性は今でも健在です。
計算も簡単で、出塁率と長打率を単純に足すだけです。
OPS = OBP + SLG
OBP は出塁率で、次の式で計算できます。
OBP = \frac{H + BB + HBP}{AB + BB + SF + HBP}
- H ... ヒット
- BB ... 四球
- HBP ... 死球
- AB ... 打数
- SF ... 犠飛
SLG は長打率で、次の式で計算できます。
SLG = \frac{TB}{AB}
- TB ... 塁打
TB は、次の式で計算できます。
TB = Single \times 1 + Double \times 2 + Triple \times 3 + Home{-}run \times 4
- Single ... 単打
- Double ... 二塁打
- Triple ... 三塁打
- Home-run ... 本塁打
計算用に新しいデータを STACAST から取得します。
2015年〜2024年STATCAST規定到達打者データ
CUSTOM COLUMUNS が 180 になっていることを確認して「Download CSV」でダウンロードします。ダウンロードした stats.csv を 2015-2024_batting_all.csv にリネームして、RStudio の作業ディレクトリに放り込みます。
CSV を R に読み込んで、計算に必要なデータを揃えます。
player_batting_all <- read.csv("2015-2024_batting_all.csv")
hit <- as.numeric(player_batting_all$hit) # 安打
walk <- as.numeric(player_batting_all$walk) # 四球
hit_by_pitch <- as.numeric(player_batting_all$b_hit_by_pitch) # 死球
ab <- as.numeric(player_batting_all$ab) # 打数
sac_fly <- as.numeric(player_batting_all$b_sac_fly) #犠飛
single <- as.numeric(player_batting_all$single) # 単打
double <- as.numeric(player_batting_all$double) # 二塁打
triple <- as.numeric(player_batting_all$triple) # 三塁打
home_run <- as.numeric(player_batting_all$home_run) # 本塁打
それでは、OPS まで計算して、STATCAST に含まれる OPS と比べてみましょう。
obp = (hit + walk + hit_by_pitch) / (ab + walk + sac_fly + hit_by_pitch) # 出塁率
tb = single * 1 + double * 2 + triple * 3 + home_run * 4 # 塁打
slg = tb / ab # 長打率
ops = obp + slg # OPS
summary(ops)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.5390 0.7272 0.7817 0.7886 0.8391 1.1846
summary(player_batting_all$on_base_plus_slg)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.5390 0.7270 0.7820 0.7886 0.8390 1.1850
小数点第3位以下に誤差はあるものの正しいようです。
誤差が生じるのは、STATCAST の OPS などのデータは小数点以下第3位までを有効桁数としているためです。
一応、他も確認してみましょう。
summary(tb)
Min. 1st Qu. Median Mean 3rd Qu. Max.
45.0 199.0 233.0 228.2 269.0 411.0
summary(player_batting_all$b_total_bases)
Min. 1st Qu. Median Mean 3rd Qu. Max.
45.0 199.0 233.0 228.2 269.0 411.0
summary(obp)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.2383 0.3147 0.3344 0.3373 0.3581 0.4898
summary(player_batting_all$on_base_percent)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.2380 0.3150 0.3340 0.3373 0.3580 0.4900
summary(slg)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.2663 0.4068 0.4455 0.4513 0.4913 0.7013
summary(player_batting_all$slg_percent)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.2660 0.4070 0.4460 0.4513 0.4910 0.7010
誤差がありますが、これも正しいようです。
大谷翔平とアーロン・ジャッジのデータを抽出する
player_id を使えば、ある選手のSTATCAST規定到達シーズンのデータが抽出できます。
選手名 | last_name...first_name | player_id |
---|---|---|
大谷翔平 | Ohtani, Shohei | 660271 |
アーロン・ジャッジ | Judge, Aaron | 592450 |
フアン・ソト | Soto, Juan | 665742 |
鈴木誠也 | Suzuki, Seiya | 673548 |
last_name...first_name でも同姓同名がいなければ抽出できますが、危険なので、player_id を使いましょう。
ohtani_shohei <- player_batting_all[player_batting_all$player_id == "660271",]
ohtani_shohei$on_base_plus_slg # 大谷翔平のSTATCAST規定到達シーズンの OPS
[1] 0.964 0.875 1.066 1.036
judge_aaron <- player_batting_all[player_batting_all$player_id == "592450",]
judge_aaron$on_base_plus_slg # アーロン・ジャッジのSTATCAST規定到達シーズンの OPS
[1] 1.049 0.917 1.111 1.159
player_batting_all は、規定打席到達の年度別データが選手ごとに入っています。プライマリキーは、player_id と year の複合キーになるということなので、ある年度のある選手のデータを抽出する場合は、両方を指定しなければなりません。
ohtani_shohei_2024 <- player_batting_all[player_batting_all$player_id == "660271" & player_batting_all$year == "2024",]
ohtani_shohei_2024$on_base_plus_slg # 大谷翔平の2024シーズンの OPS
[1] 1.036
judge_aaron_2024 <- player_batting_all[player_batting_all$player_id == "592450" & player_batting_all$year == "2024",]
judge_aaron_2024$on_base_plus_slg # アーロン・ジャッジの2024シーズンの OPS
[1] 1.159
ある年度の全データが欲しい場合は、応用で、year で絞り込めば抽出できます。複合キーの一つである year で抽出しているので、当然ですが player_id のみで一意にデータを特定できます。
player_batting_2024 <- player_batting_all[player_batting_all$year == "2024",] # 2024シーズンのデータ
player_batting_2024$on_base_plus_slg[player_batting_2024$player_id == "660271"] # 大谷翔平の 2024シーズンの OPS
[1] 1.036
player_batting_2024$on_base_plus_slg[player_batting_2024$player_id == "592450"] # アーロン・ジャッジの 2024シーズンの OPS
[1] 1.159
2024 シーズンの OPS の summary を見てみましょう。
summary(player_batting_2024$on_base_plus_slg)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.6130 0.7160 0.7550 0.7648 0.7910 1.1590
二人とも平均の 0.7550 を大きく上回り、ジャッジに関しては最大値を叩き出していることがわかります。