0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

STATCAST で遊ぶ vol.5

Last updated at Posted at 2025-01-28

前回は、STATCAST で遊ぶ vol.4

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 を大きく上回り、ジャッジに関しては最大値を叩き出していることがわかります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?