Last update: 2018-10-14.
2018年5月, Statcast dataに, 各投球におけるおおまかな守備位置の分類を示す変数が加えられた. これ以前には守備位置に関するデータはほとんど公開されておらず, その打席結果への影響は, MLBチーム関係者など一部を除いて, 想像の域を出ていなかった. 特に, 野手が直接関与しないプレーへの影響は理解されていなかった. 守備シフトの変化はグラウンドに飛んだ打球の結果に影響することに加えて, 投手と野手の打席でのアプローチを変えさせる可能性が考えられる. そのため, 野手が直接関与しないプレーへの影響の評価が重要となりうる.
Statcastでのデータの公開に先立って, Statcastを運用しているMLBAMのTom TangoはシフトによるwOBAへの影響をブログで示した. 大まかに言うと, 左打者 (特に1塁手が1塁に牽制のため張り付いている状態) では多少有効そうだが, 右打者に対してはむしろシフトを敷くことでwOBAが上昇し守備側にとってかなり悪い結果を招いている, という結果である. しかし, このpostではwOBAの構成要素については結果が示されていない.
Russell Carletonは打球や非打球の指標がどう変化したか, あるいはLWTSでの変化まで検討している. 守備側から見ると, BABIPは改善しているが, 全体的に見るとシフトによってLWTSが悪化しており, その要因としてHRを含む長打の増加, 四球の増加を指摘している.
ここでは内野守備シフト (以下単にシフトと呼ぶ) の効果を調べるため, MLB15-18のデータを使って, 守備位置の違いによる打撃成績の変化を検討する. 特にwOBA構成要素の変化について, 打者の左右ごとに分けて調べ, 打者の左右で見られたwOBAへの影響の違いがどの要素の違いで生じているのかを確認する.
シフトの対象となる打者とされない打者は打撃能力にかなり違いがあることが予想される. そのため, 単純に状況ごとに成績を計算しても全く意味をなさない. なんらかの補正が必要となる. 投手能力についても補正が必要かもしれない.
ここではこれらのバイアスを軽減するために, 以下の方針で仮にシフトが影響を及ぼさなかった場合の成績を推定する.
推定値としての正確さに多少問題がある可能性はあるが, とりあえず代理変数としておおまかな目安にはなるだろう.
データ解析にはRを使う. データはbaseballr packageを用いて取得し, 変数のタイプを適切なものに変換済み (データは2018-10-02に取得). とりあえずデータを読み込む. MLB15-18データ (レギュラーシーズン) がdfと名付けられたデータフレームとして保存されていることを想定している.
# 必要なpackages: tidyverse, ineq, knitr
# 列が全部含まれているとrmarkdownが止まるので必要な列に絞る
# df <- df%>%
# select(player_name, pitcher_name, events, type,
# launch_speed, launch_angle, hc_x, hc_y,
# stand,if_fielding_alignment,
# woba_value,estimated_woba_using_speedangle,
# woba_denom,barrel, babip_value,
# game_year)
# save(df, file="sc_data_for_shift_work1_15-18.Rdata")
# 基本的にはscrape_statcast_savant_batter_allで集めたデータ
# scrape_statcast_savant_pitcher_allのplayer_nameをpitcher_nameとして保持しているdfを使っている
# 名前を使う必要性は無いので投手のidであるpitcherで代用可能だろう
load("sc_data_for_shift_work1_15-18.Rdata")
# ちょっくら前処理
strikeouts <- c("strikeout", "strikeout_double_play")
df <- df %>% mutate(
# 打球方向を計算 (原点の値はAlbert, 2018aから)
spray_angle = atan2(hc_x - 125.42, 198.27 - hc_y) * 180 / pi,
# atan2(x, y) にしているのでyとxが計算上座標変換されてる感じになっていることに注意
hand_adj_spray =
ifelse(stand == "L", - spray_angle, spray_angle),
# 上の変換によって左右打者ともに引っ張りがマイナスになっている
# -17°以下を引っ張りと定義する (Albert, 2018b)
# ポールあたりが-45°, 45°
Pull_FL = ifelse(hand_adj_spray <= -17, 1,0),
# 内野守備位置をfactorにしてレベルの順番を設定
if_fielding_alignment =
factor(if_fielding_alignment,
levels = c("Standard", "Infield shift", "Strategic")),
# 必要なflagをつくる
BB_FL = ifelse(events == "walk", 1, 0),
HR_FL = ifelse(events == "home_run", 1, 0),
K_FL = ifelse(events %in% strikeouts, 1, 0),
Std_IF_FL = ifelse(if_fielding_alignment == "Standard", 1, 0),
Shift_IF_FL = ifelse(if_fielding_alignment == "Infield shift", 1, 0),
Strategic_IF_FL = ifelse(if_fielding_alignment == "Strategic", 1, 0),
Bat_L_FL = ifelse(stand == "L", 1, 0),
# xwOBA計算のための変数を作る
xwoba_value = ifelse(type == "X",
estimated_woba_using_speedangle,
woba_value))
角度の計算結果をプロットで確認. 2017年の-17°より小さい打球に絞る.
df %>% filter(game_year == "2017")%>%
filter(spray_angle <= -17)%>%
ggplot() +
geom_point(aes(x = hc_x - 125.42, y = 198.27 - hc_y, colour = spray_angle),
size = 0.5) +
geom_segment(aes(x = 0, y = 0, xend = -100, yend = 100))+
geom_segment(aes(x = 0, y = 0, xend = 100, yend = 100))+
coord_equal()+
theme_bw(base_family = "HiraKakuPro-W3") +
xlim(-125, 125)+
ylim(-50, 200)+
scale_color_gradient(low = "green3", high = "magenta2")+
labs(title = "-17°より小さい角度の打球位置 (MLB 17).",
subtitle = "線分はファールラインの目安.",
colour = "角度",
caption = "Source: Statcast.")
大丈夫そう.
各投球 (打席ではないことに注意. ある打席で投球数が10あり, すべてシフト状態であれば10回とカウントされている.) における内野守備状態の年度間推移.
table(df$if_fielding_alignment, df$game_year)
##
## 2015 2016 2017 2018
## Standard 524118 546806 568553 531816
## Infield shift 66326 97759 89444 127104
## Strategic 72286 58543 59608 58099
Statcastの集計を信じる限り, 2017は頻度の上昇は少し落ち着いていたようだが, 2018ではさらに増加している. ところで, baseballsavantのリーダーボードでは2015が含まれていない. 2015はデータの信頼度が低いなどの可能性があるのかも?
対象期間内における, 打席位置ごとの内野守備状況.
(stand_tbl <- table(df$stand, df$if_fielding_alignment))
##
## Standard Infield shift Strategic
## L 755149 273523 143492
## R 1416144 107110 105044
内野シフト (Shift or Strategic) を受ける回数は左打者のほうが多い. 比率で見る.
round(prop.table(stand_tbl, margin=1), 3)
##
## Standard Infield shift Strategic
## L 0.644 0.233 0.122
## R 0.870 0.066 0.065
左打席のほうが少ないため, 比率で見ると差がより顕著である.
年度ごとに分けて示す.
round(prop.table(table(df$stand, df$if_fielding_alignment, df$game_year), margin=1), 3)
## , , = 2015
##
##
## Standard Infield shift Strategic
## L 0.166 0.043 0.033
## R 0.202 0.009 0.021
##
## , , = 2016
##
##
## Standard Infield shift Strategic
## L 0.162 0.060 0.029
## R 0.220 0.017 0.015
##
## , , = 2017
##
##
## Standard Infield shift Strategic
## L 0.167 0.056 0.031
## R 0.229 0.015 0.014
##
## , , = 2018
##
##
## Standard Infield shift Strategic
## L 0.149 0.074 0.030
## R 0.219 0.025 0.014
左打者でも右打者での増加が続いている.
内野シフトはどれぐらい多くの打者に対して適用されているのか? 打者ごとの傾向を探るため, それぞれの打者について, 各打席結果時の内野守備状況をまとめてテーブルにする. このような打者ごとのシフト回数を検討することは重要である. というのも, 仮にshiftを受けている人数が小さく, 特定の選手の影響が大きい状態では, 一般性のある効果の推定は困難となるためである.
ここではShift / (Standard + Shift) 比率をShift%と呼ぶことにする. Strategicは様々な状況の集合であり, 現時点では解釈は困難であるため, それ以外の状況に注目する.
shift_freq <- df %>% filter(woba_denom == 1)%>%
group_by(player_name)%>%
dplyr::summarise(PA = sum(woba_denom),
BatLpct = round(mean(Bat_L_FL) * 100, 0),
Standard = sum(Std_IF_FL, na.rm = TRUE),
Shift = sum(Shift_IF_FL, na.rm = TRUE),
Strategic = sum(Strategic_IF_FL, na.rm = TRUE),
Shift_pct = round(Shift * 100 / (Standard + Shift), 1)
# Strategicも入れる場合
# Total_shift = Shift + Strategic,
# Shift_pct = round(Total_shift * 100 / (Standard + Total_shift), 1)
)%>%
arrange(desc(Shift_pct)) # Shift%の降順
kable(shift_freq %>%
filter(PA >= 300)%>%
slice(1:50)) # 上位50人を示す
| player_name | PA | BatLpct | Standard | Shift | Strategic | Shift_pct |
|---|---|---|---|---|---|---|
| Ryan Howard | 861 | 100 | 40 | 732 | 52 | 94.8 |
| Chris Davis | 2366 | 100 | 127 | 2060 | 116 | 94.2 |
| David Ortiz | 1209 | 100 | 76 | 995 | 82 | 92.9 |
| Lucas Duda | 1568 | 100 | 163 | 1198 | 160 | 88.0 |
| Joey Gallo | 1254 | 100 | 144 | 974 | 123 | 87.1 |
| Adam LaRoche | 484 | 100 | 65 | 328 | 51 | 83.5 |
| Brian McCann | 1634 | 100 | 243 | 1165 | 182 | 82.7 |
| Brandon Moss | 1384 | 100 | 218 | 1015 | 117 | 82.3 |
| Pedro Alvarez | 1018 | 100 | 171 | 614 | 192 | 78.2 |
| Alex Avila | 1032 | 100 | 185 | 650 | 186 | 77.8 |
| Mitch Moreland | 2038 | 100 | 426 | 1371 | 210 | 76.3 |
| Colby Rasmus | 1076 | 100 | 240 | 739 | 68 | 75.5 |
| Kyle Schwarber | 1251 | 100 | 310 | 780 | 147 | 71.6 |
| Matt Olson | 901 | 100 | 208 | 523 | 167 | 71.5 |
| Mark Teixeira | 893 | 67 | 237 | 560 | 54 | 70.3 |
| Brett Wallace | 359 | 100 | 88 | 197 | 69 | 69.1 |
| Jay Bruce | 2196 | 100 | 568 | 1263 | 319 | 69.0 |
| Justin Smoak | 1894 | 75 | 539 | 1185 | 137 | 68.7 |
| Brandon Belt | 2104 | 100 | 565 | 1232 | 245 | 68.6 |
| Seth Smith | 1254 | 100 | 354 | 756 | 114 | 68.1 |
| Logan Morrison | 1854 | 100 | 522 | 1049 | 237 | 66.8 |
| Anthony Rizzo | 2693 | 100 | 721 | 1440 | 475 | 66.6 |
| Freddie Freeman | 2347 | 100 | 662 | 1271 | 361 | 65.8 |
| Greg Bird | 658 | 100 | 205 | 380 | 62 | 65.0 |
| Curtis Granderson | 2231 | 100 | 743 | 1269 | 167 | 63.1 |
| Cody Bellinger | 1158 | 100 | 387 | 647 | 105 | 62.6 |
| Carlos Santana | 2680 | 68 | 961 | 1495 | 178 | 60.9 |
| Matt Joyce | 1358 | 100 | 453 | 681 | 189 | 60.1 |
| Matt Adams | 1207 | 100 | 370 | 555 | 261 | 60.0 |
| Kyle Seager | 2617 | 100 | 895 | 1337 | 332 | 59.9 |
| Dominic Smith | 332 | 100 | 115 | 171 | 44 | 59.8 |
| Eric Thames | 819 | 100 | 296 | 433 | 83 | 59.4 |
| Carlos Gonzalez | 2258 | 100 | 783 | 1076 | 356 | 57.9 |
| Luis Valbuena | 1514 | 100 | 555 | 760 | 167 | 57.8 |
| Mike Moustakas | 1944 | 100 | 668 | 905 | 298 | 57.5 |
| Michael Conforto | 1605 | 100 | 614 | 818 | 139 | 57.1 |
| Jarrod Saltalamacchia | 551 | 76 | 197 | 257 | 79 | 56.6 |
| Daniel Palka | 446 | 100 | 165 | 208 | 71 | 55.8 |
| Victor Martinez | 2015 | 76 | 724 | 827 | 431 | 53.3 |
| Kendrys Morales | 2323 | 68 | 900 | 1001 | 363 | 52.7 |
| Jake Bauers | 386 | 100 | 172 | 188 | 26 | 52.2 |
| Alex Gordon | 2018 | 100 | 850 | 926 | 202 | 52.1 |
| Prince Fielder | 1048 | 100 | 377 | 410 | 218 | 52.1 |
| Justin Bour | 1673 | 100 | 609 | 616 | 404 | 50.3 |
| Matt Carpenter | 2493 | 100 | 1113 | 1128 | 173 | 50.3 |
| Carlos Beltran | 1624 | 73 | 687 | 691 | 198 | 50.1 |
| Joc Pederson | 1810 | 100 | 799 | 797 | 181 | 49.9 |
| Adam Lind | 1284 | 100 | 505 | 500 | 246 | 49.8 |
| Shohei Ohtani | 365 | 100 | 173 | 171 | 21 | 49.7 |
| Kole Calhoun | 2554 | 100 | 1151 | 1104 | 249 | 49.0 |
300PA以上の打者におけるShift%の上位50人の中で純粋な右打者は一人もいない. 両打ちもそれなりに含まれるが, やはり基本的に左打者が多い. 問題になるのは特にShift%の高い選手はそもそもStandard状態で十分な打席数に立っていないことである. これらの選手はStandard状態での成績の良い推定が得られないため, 取り除いてそれ以外の選手のみでShiftの効果を測定している. 他の補正方法もありうるだろうが, どのような方法をとったにせよ推定が甘いことの問題を大きくしないためには, これらのシフトを多く受けている打者の寄与を小さくせざるをえない思われる.
全体の傾向を散布図で眺める.
shift_freq %>%
ggplot(aes(x = PA, y = Shift_pct, colour = BatLpct))+
geom_point(alpha = 0.7, size = 0.5) +
theme_bw(base_family = "HiraKakuPro-W3")+
theme(axis.text.x = element_text(size=9),
axis.text.y = element_text(size=9))+
scale_color_gradient(high = "magenta2", low = "green3")+
labs(title = "Shift%.",
subtitle = "Strategicは除いた.",
x = "打席数",
y = "Shift%",
colour = "左打席%")
やはり左打席が多い打者でShift%が高い傾向があるが, 右打者でもShift%がそれなりに高い (20-50%) 選手はそれなりにいるようだ. 個別の選手の影響の大きさをなんとなく調べるため, ローレンツ曲線を作成する.
# ローレンツ曲線用データの作成
# ここでineq packageを使っている
# 打席タイプごとに分割して計算する
# 右打者は左打席比率5%以下,
# 左打者にしている左打席比率95%以上にしている
# standの記載にエラーがあった場合の備えだが多分不要だろう
batR <- shift_freq %>%
filter(BatLpct <= 5)
batL <- shift_freq %>%
filter(BatLpct >= 95)
batS <- shift_freq %>%
filter(BatLpct > 5, BatLpct < 95)
LcR <- Lc(batR$Shift,
n = rep(1,length(batR$Shift)),
plot = FALSE)
LcS <- Lc(batS$Shift,
n = rep(1,length(batS$Shift)),
plot = FALSE)
LcL <- Lc(batL$Shift,
n = rep(1,length(batL$Shift)),
plot = FALSE)
# ggplotで使うためにdfに変換して合わせる
LcR_df <- data.frame(p = LcR[1],
L = LcR[2],
Stand = "R")
LcS_df <- data.frame(p = LcS[1],
L = LcS[2],
Stand = "S")
LcL_df <- data.frame(p = LcL[1],
L = LcL[2],
Stand = "L")
Lc_df <- LcR_df %>% rbind(LcS_df) %>% rbind(LcL_df)
# ローレンツ曲線描画
ggplot(Lc_df,
aes(x = p, y = L, group = Stand, colour = Stand, linetype = Stand)) +
geom_line() +
theme_bw(base_family = "HiraKakuPro-W3")+
theme(axis.text.x = element_text(size=10),
axis.text.y = element_text(size=10),
axis.title = element_text(size = 12)) +
geom_abline()+
labs(title = "Shiftのローレンツ曲線",
x = "累積相対度数",
y = "累積Shift頻度")
基本的に右でも左でも25%程度の上位選手によってほとんどが占められている. これは, そもそもどの打席タイプにおいても打席数が少ない選手が多く, このような選手はほとんど影響が無いことを部分的には反映しているはずである. 比較のためPAのローレンツ曲線を提示する (重複となるためコードは示さない).
あたりまえだがPAで見てもかなりの部分がごく一部の打者に集中している. しかしShiftに比べればその占有率は低いことも確認できる. また, 多くの場合において打率について考えるときには, PAが一定以上 (例えば200以上とか) である場合を考える. そのような場合に比べて, ここでのPAは全選手の打数を調べているので, 対象となる人数が多くても実際に影響を及ぼしている人数は小さいはずであることに注意. すでに示したShiftに関するローレンツ曲線を見やすさのため一部を拡大して示す.
# ローレンツ曲線描画
ggplot(Lc_df,
aes(x = p, y = L, group = Stand, colour = Stand, linetype = Stand)) +
geom_line(aes()) +
geom_hline(yintercept = 0.5, colour = "gray")+
theme_bw(base_family = "HiraKakuPro-W3")+
theme(axis.text.x = element_text(size=10),
axis.text.y = element_text(size=10),
axis.title = element_text(size = 12)) +
xlim(0.75, 1)+
geom_abline()+
labs(title = "Shiftのローレンツ曲線",
x = "累積相対度数",
y = "累積Shift頻度")
右打者では特に一部の選手によってShift状態が占められている傾向があるようだ. 50%のシフト (中央の灰色の先は累積Shift頻度0.5を示す) が, 右打者では2.5%程度の選手によって, 左打者では5%程度の選手によって占められている. ここで, 打席タイプごとの打者数を確認する.
table(Lc_df$Stand)
##
## R S L
## 1044 132 501
当然だが, ありがたいことに右打者のほうが圧倒的に多い. このため, 右打者でも左打者でもだいたい25人程度によって50%のシフトが占められている. ある一人の選手が及ぼすシフト効果への影響の大きさは, 右でも左でもそう大差無いのではないか. とはいえこれは, 補正を適用する前の, 全ての打者の結果である. 補正適用後の打者のPAのローレンツ曲線については後で示す.
まずは標準的な守備位置での打者成績. 打球系の成績と, 分母にPAをとるような成績を分けて計算してdata frameとして保存し, それらを結合する。
# contact系
# type == "X"にはファウルは含まれないことに注意
# summariseにdplyr::を加えるのは妙なconflictを避けるための個人的なおまじないなので気にしないで欲しい
batX <- df %>%
filter(if_fielding_alignment == "Standard", type == "X")%>%
group_by(player_name)%>%
dplyr::summarise(bat_mean_angle = mean(launch_angle, na.rm = TRUE),
bat_mean_velo = mean(launch_speed, na.rm = TRUE),
wOBAcon_value = sum(woba_value, na.rm = TRUE),
xwOBAcon_value = sum(xwoba_value, na.rm = TRUE),
wOBAcon_denom = sum(woba_denom, na.rm = TRUE),
bat_wOBAcon = wOBAcon_value / wOBAcon_denom,
bat_xwOBAcon = xwOBAcon_value / wOBAcon_denom,
barrel_CT = sum(barrel, na.rm = TRUE),
bat_barrel_BBE = barrel_CT / wOBAcon_denom,
Pull_CT = sum(Pull_FL, na.rm = TRUE),
bat_Pull_pct = Pull_CT * 100 / wOBAcon_denom,
HR = sum(HR_FL, na.rm = TRUE),
bat_HR_BBE = HR / wOBAcon_denom,
bat_BABIP = sum(babip_value)/ (wOBAcon_denom - HR))
# 続いてPAを分母にとる打撃成績
# wOBA_denom >= 300の選手に限る
# 後でこのリストの選手だけに対象を絞る
bat <- df %>%
filter(if_fielding_alignment == "Standard")%>%
group_by(player_name)%>%
dplyr::summarise(wOBA_value = sum(woba_value, na.rm = TRUE),
xwOBA_value = sum(xwoba_value, na.rm = TRUE),
wOBA_denom = sum(woba_denom, na.rm = TRUE),
bat_wOBA = wOBA_value / wOBA_denom,
bat_xwOBA = xwOBA_value / wOBA_denom,
K = sum(K_FL, na.rm = TRUE),
BB = sum(BB_FL, na.rm = TRUE),
bat_Kpct = K *100 / wOBA_denom ,
bat_BBpct = BB *100 /wOBA_denom,
BatLpct = round(mean(Bat_L_FL) * 100, 0)
)%>%
mutate(Bat_stand = ifelse(BatLpct < 5, "R",
ifelse(BatLpct > 95, "L", "S")),
Bat_stand = factor(Bat_stand, levels = c("R", "S", "L")))%>%
filter(wOBA_denom >= 300)
# batとbatXを合わせて、必要な列を残す
# left_joinなのでwOBA_denom >= 300のデータのみを含む
std_batting <- left_join(bat, batX) %>%
select(player_name, bat_wOBA, bat_xwOBA, bat_wOBAcon, bat_xwOBAcon,
bat_mean_velo, bat_mean_angle,
bat_Kpct, bat_BBpct, bat_HR_BBE, bat_BABIP,
bat_barrel_BBE, bat_Pull_pct, Bat_stand)
head(std_batting,10)
## # A tibble: 10 x 14
## player_name bat_wOBA bat_xwOBA bat_wOBAcon bat_xwOBAcon bat_mean_velo
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 A.J. Ellis 0.308 0.317 0.322 0.336 87.4
## 2 A.J. Pierzyn… 0.301 0.304 0.314 0.318 86.1
## 3 A.J. Pollock 0.358 0.337 0.398 0.371 88.4
## 4 Aaron Altherr 0.322 0.315 0.405 0.394 89.3
## 5 Aaron Hicks 0.345 0.335 0.377 0.363 88.2
## 6 Aaron Hill 0.297 0.303 0.300 0.308 87.7
## 7 Aaron Judge 0.396 0.413 0.588 0.623 94.9
## 8 Abraham Almo… 0.302 0.305 0.359 0.363 87.0
## 9 Adalberto Mo… 0.308 0.282 0.432 0.390 86.2
## 10 Adam Duvall 0.330 0.315 0.428 0.406 88.0
## # ... with 8 more variables: bat_mean_angle <dbl>, bat_Kpct <dbl>,
## # bat_BBpct <dbl>, bat_HR_BBE <dbl>, bat_BABIP <dbl>,
## # bat_barrel_BBE <dbl>, bat_Pull_pct <dbl>, Bat_stand <fct>
冒頭で述べたようにこのStandard状態の打撃成績を平均して推定値として使用する. そのため, Standard条件での打撃成績を計算したわけだが, Standard状態での打席数が少ない打者ではよい推定が得られない. そこで, これらの打者 (standardでPA300未満) のデータを元のpitch-by-pitch dataから排除する. 非常に高い比率でシフトされている選手はStandard状態での打席数が少ないため (打者レベルでの傾向の項で示したtableを参照), 排除されているであろうことに注意. MLBチームがある程度合理的であるならば, このような選手はシフトに対して脆弱である可能性が高く, 以下で示す結果はシフトの効果を過小評価している可能性がある.
selected_players <- std_batting$player_name
situations_of_interest <- c("Standard" , "Infield shift")
# pitch-by-pitch dataに打撃成績を付加する
# 打撃成績が計算されている打者の打席だけに絞る
# シフトも簡単のためStandardかShiftだけに絞る
data <- df %>% filter(player_name %in% selected_players)%>%
left_join(std_batting)%>%
filter(if_fielding_alignment %in% situations_of_interest)
投手成績を同様に計算.
# contact系
# type == "X"にはファウルは含まれないことに注意
# pitcher_nameは元々存在しない列だが, pitcherで代用可能 (のハズ)
pitX <- df %>%
filter(if_fielding_alignment == "Standard", type == "X")%>%
group_by(pitcher_name)%>%
dplyr::summarise(pit_mean_angle = mean(launch_angle, na.rm = TRUE),
pit_mean_velo = mean(launch_speed, na.rm = TRUE),
wOBAcon_value = sum(woba_value, na.rm = TRUE),
xwOBAcon_value = sum(xwoba_value, na.rm = TRUE),
wOBAcon_denom = sum(woba_denom, na.rm = TRUE),
pit_wOBAcon = wOBAcon_value / wOBAcon_denom,
pit_xwOBAcon = xwOBAcon_value / wOBAcon_denom,
barrel_CT = sum(barrel, na.rm = TRUE),
pit_barrel_BBE = barrel_CT / wOBAcon_denom,
Pull_CT = sum(Pull_FL, na.rm = TRUE),
pit_Pull_pct = Pull_CT * 100 / wOBAcon_denom,
HR = sum(HR_FL, na.rm = TRUE),
pit_HR_BBE = HR / wOBAcon_denom,
pit_BABIP = sum(babip_value)/ (wOBAcon_denom - HR))
# PAを分母にとる投手成績
# wOBA_denom >= 300の選手に限る
# 後でこのリストの選手だけに対象を絞る
pit <- df %>%
filter(if_fielding_alignment == "Standard")%>%
group_by(pitcher_name)%>% # or group_by(pitcher)
dplyr::summarise(wOBA_value = sum(woba_value, na.rm = TRUE),
xwOBA_value = sum(xwoba_value, na.rm = TRUE),
wOBA_denom = sum(woba_denom, na.rm = TRUE),
pit_wOBA = wOBA_value / wOBA_denom,
pit_xwOBA = xwOBA_value / wOBA_denom,
K = sum(K_FL, na.rm = TRUE),
BB = sum(BB_FL, na.rm = TRUE),
pit_Kpct = K *100 / wOBA_denom ,
pit_BBpct = BB *100 /wOBA_denom)%>%
filter(wOBA_denom >= 300)
# pitとpitXを合わせて、必要な列を残す
std_pitching <- left_join(pit, pitX) %>%
select(pitcher_name, pit_wOBA, pit_xwOBA, pit_wOBAcon, pit_xwOBAcon,
pit_mean_velo, pit_mean_angle,
pit_Kpct, pit_BBpct, pit_HR_BBE, pit_BABIP,
pit_barrel_BBE, pit_Pull_pct)
head(std_pitching,10)
## # A tibble: 10 x 13
## pitcher_name pit_wOBA pit_xwOBA pit_wOBAcon pit_xwOBAcon pit_mean_velo
## <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 A.J. Burnett 0.336 0.331 0.394 0.387 89.5
## 2 A.J. Cole 0.349 0.317 0.425 0.377 87.1
## 3 A.J. Griffin 0.339 0.325 0.393 0.373 87.3
## 4 Aaron Harang 0.373 0.351 0.411 0.384 89.5
## 5 Aaron Loup 0.345 0.295 0.425 0.349 85.6
## 6 Aaron Nola 0.298 0.278 0.369 0.339 85.9
## 7 Aaron Sanchez 0.316 0.327 0.342 0.357 89.1
## 8 Adalberto Me… 0.359 0.357 0.394 0.391 86.5
## 9 Adam Conley 0.340 0.328 0.382 0.365 87.4
## 10 Adam Morgan 0.343 0.331 0.400 0.384 87.9
## # ... with 7 more variables: pit_mean_angle <dbl>, pit_Kpct <dbl>,
## # pit_BBpct <dbl>, pit_HR_BBE <dbl>, pit_BABIP <dbl>,
## # pit_barrel_BBE <dbl>, pit_Pull_pct <dbl>
投手成績を打者の左右を考慮しないで計算している. 右投手は右打者に, 左投手は左打者に有利であり, 右打者の方が多いことを考慮すると, 左打者から見ると投手能力の推定値は過大評価になっているかもしれない. またGB投手はGB打者に, FB投手はFB打者に強いことがTangoらによって示されている (Tango et al., 2007). が, それも考慮していない. 今後, これらを考慮しないことで影響があるかどうかは検討課題になるかも.
selected_pitchers <- std_pitching$pitcher_name
# pitch-by-pitch dataに投球成績を付加する
# 投手成績が計算されている投手の打席だけに絞る
data <- data %>%
filter(pitcher_name %in% selected_pitchers)%>%
left_join(std_pitching)
元々のpitch-by-pitch dataから, 対象となる打者と投手の対戦のみに絞りこんだ. この対象となるデータにおけるshiftのローレンツ曲線を示す.
右打者では10%程度, 左打者では15%程度の選手によって約半数が占められている.
対象打者における打席位置を示す.
##
## R S L
## 289 66 138
右打者では30人程度, 左打者では20人程度が約半数を占めていることになる. 効果の一般性という意味ではやや不安になる数字だと感じるが, 正直なところ桁感が無いのでよくわからないところがある. 両打ちの打者もカウントされるため, 実際にはもう少し多様性は担保されていると言えるだろう (しかし, 両打ちは打撃成績の推定値の計算で左右を考慮していないので, そこも多少問題を生じる可能性がありそうな気がしている.).
比較のため全体の打者の打席位置を再掲する.
##
## R S L
## 1044 132 501
Standard状態でPA300以上に絞っているので当然打者は全体に比べて少なくなるが, 予想通り特に左打者で低下の割合がやや顕著である.
打者の左右, 守備位置についてデータを分割し, 実際の, あるいは推定のwOBAやK%, BB%を計算.
shift_bat <- data%>%
filter(woba_denom ==1)%>%
group_by(stand, if_fielding_alignment)%>%
dplyr::summarise(ex_bat_wOBA = mean(bat_wOBA, na.rm = TRUE),
ex_bat_Kpct = mean(bat_Kpct, na.rm = TRUE),
ex_bat_BBpct = mean(bat_BBpct, na.rm = TRUE),
ex_pit_wOBA = mean(pit_wOBA, na.rm = TRUE),
ex_pit_Kpct = mean(pit_Kpct, na.rm = TRUE),
ex_pit_BBpct = mean(pit_BBpct, na.rm = TRUE),
wOBA_value = sum(woba_value, na.rm = TRUE),
xwOBA_value = sum(xwoba_value, na.rm = TRUE),
wOBA_denom = sum(woba_denom, na.rm = TRUE),
wOBA = wOBA_value / wOBA_denom,
xwOBA = xwOBA_value / wOBA_denom,
K = sum(K_FL, na.rm = TRUE),
BB = sum(BB_FL, na.rm = TRUE),
Kpct = K *100 / wOBA_denom ,
BBpct = BB *100 /wOBA_denom)%>%
select(stand,if_fielding_alignment,
wOBA, ex_bat_wOBA, ex_pit_wOBA,
Kpct, ex_bat_Kpct, ex_pit_Kpct,
BBpct, ex_bat_BBpct, ex_pit_BBpct, wOBA_denom)
shift_bat[,3:11] <- round(shift_bat[,3:11], 3)
kable(shift_bat[,c(1:2, 12)])
| stand | if_fielding_alignment | wOBA_denom |
|---|---|---|
| L | Standard | 143339 |
| L | Infield shift | 45623 |
| R | Standard | 288185 |
| R | Infield shift | 20428 |
wOBAの分母となる数値 (概ね公式のPAと一致する) をサンプル数としてカウントした. それなりに頻度が小さい状況に注目しているため, MLB4年分でもややサンプル数は頼りない部分があるかもしれない.
kable(shift_bat[,1:5])
| stand | if_fielding_alignment | wOBA | ex_bat_wOBA | ex_pit_wOBA |
|---|---|---|---|---|
| L | Standard | 0.332 | 0.335 | 0.322 |
| L | Infield shift | 0.335 | 0.347 | 0.323 |
| R | Standard | 0.329 | 0.333 | 0.322 |
| R | Infield shift | 0.364 | 0.346 | 0.325 |
推定値を見る限り, 打者はwOBAの高い選手でShiftを受けることが多いようだ. これはShiftを受けた打者は多くの場合打力が高めであることを示唆している. これは後述するwOBAconでも顕著な傾向であり, 補正する必要性を示しているといえるだろう. 投手の推定wOBAは打者に比べると, 変化は小さいようだが, どちらかと言うとwOBAが高い (つまり能力が劣っている可能性が高い) 投手がShiftを多用するようだ. エース級の投手であれば, 余計なことをせずにそのまま抑えてしまいそうなことを考えると, それらしい結果かもしれない.
Shift状態において, 左打者のwOBAは推定値よりもやや低い. 左打者では全体的に見れば, シフトがそれなりに機能していたということかもしれない. 一方, 右打者では推定値よりもやや高くなっていた. この結果はイントロで引用したTangoが示した, ランナー状態を考慮していない状態の結果と概ね一致していると言えそう.
kable(shift_bat[,c(1:2, 6:8)])
| stand | if_fielding_alignment | Kpct | ex_bat_Kpct | ex_pit_Kpct |
|---|---|---|---|---|
| L | Standard | 19.046 | 18.768 | 21.561 |
| L | Infield shift | 22.412 | 19.807 | 21.466 |
| R | Standard | 21.503 | 21.195 | 21.761 |
| R | Infield shift | 18.847 | 23.531 | 21.201 |
Shift状態のK%に注目すると, 左右で効果が大きく異なっている. 左打者では推定値よりも2.5%三振が多くなっているが, 右打者では5%程も低下している. 右打者にシフトさせた投手は比較的三振を取らない投手であった傾向があり, これも右打者のK%低下に貢献しているだろう. しかし, 打席結果で見られる差の大きさ (約5%) を考えれば, 投手の能力の差 (約0.5%) の影響は軽微ではないか.
kable(shift_bat[,c(1:2, 9:11)])
| stand | if_fielding_alignment | BBpct | ex_bat_BBpct | ex_pit_BBpct |
|---|---|---|---|---|
| L | Standard | 7.888 | 8.046 | 7.201 |
| L | Infield shift | 9.820 | 8.836 | 7.064 |
| R | Standard | 7.115 | 7.283 | 7.241 |
| R | Infield shift | 9.600 | 8.382 | 7.092 |
BB%は左右いずれも推定値よりも1%前後増加している (ちなみに故意四球は含まれていない). これはベースとなる期待値に対する上昇率としては10%程度であり, Carletonが示したwalkの上昇量と概ね一致している (Carleton, 2018).
やや右打者のほうがBB%の増加が大きかったようだが, 左右でそこまで大きな差はなかったようだ. BB%の左右で見られるwOBAconの差への寄与はそれほど大きくないのではないか.
左右で比較的似たような効果であることから, それぞれに共通している補正できていないバイアスが入っている可能性があるかもしれない. 例えば, BB%はランナー状態によって変化が起こるため, 各状況におけるランナー状態の頻度の違いが関与している可能性などがあるかもしれない.
次に打球系の価値に違いがあるか調べる.
shift_batX <- data%>%
filter(type == "X")%>%
group_by(stand, if_fielding_alignment)%>%
dplyr::summarise(
ex_bat_wOBAcon = mean(bat_wOBAcon, na.rm = TRUE),
ex_bat_xwOBAcon = mean(bat_xwOBAcon, na.rm = TRUE),
ex_bat_angle = mean(bat_mean_angle, na.rm = TRUE),
ex_bat_velo = mean(bat_mean_velo, na.rm = TRUE),
ex_bat_barrel_BBE = mean(bat_barrel_BBE, na.rm = TRUE),
ex_bat_Pull_pct = mean(bat_Pull_pct, na.rm = TRUE),
ex_bat_BABIP = mean(bat_BABIP, na.rm = TRUE),
ex_bat_HR_BBE = mean(bat_HR_BBE, na.rm = TRUE),
ex_pit_wOBAcon = mean(pit_wOBAcon, na.rm = TRUE),
ex_pit_xwOBAcon = mean(pit_xwOBAcon, na.rm = TRUE),
ex_pit_angle = mean(pit_mean_angle, na.rm = TRUE),
ex_pit_velo = mean(pit_mean_velo, na.rm = TRUE),
ex_pit_barrel_BBE = mean(pit_barrel_BBE, na.rm = TRUE),
ex_pit_Pull_pct = mean(pit_Pull_pct, na.rm = TRUE),
ex_pit_BABIP = mean(pit_BABIP, na.rm = TRUE),
ex_pit_HR_BBE = mean(pit_HR_BBE, na.rm = TRUE),
mean_angle = mean(launch_angle, na.rm = TRUE),
mean_velo = mean(launch_speed, na.rm = TRUE),
wOBAcon_value = sum(woba_value, na.rm = TRUE),
xwOBAcon_value = sum(xwoba_value, na.rm = TRUE),
wOBAcon_denom = sum(woba_denom, na.rm = TRUE),
wOBAcon = wOBAcon_value / wOBAcon_denom,
xwOBAcon = xwOBAcon_value / wOBAcon_denom,
barrel_CT = sum(barrel, na.rm = TRUE),
barrel_BBE = barrel_CT / wOBAcon_denom,
Pull_CT = sum(Pull_FL, na.rm = TRUE),
Pull_pct = Pull_CT * 100 / wOBAcon_denom,
HR = sum(HR_FL, na.rm = TRUE),
HR_BBE = HR / wOBAcon_denom,
BABIP = sum(babip_value)/ (wOBAcon_denom - HR)
)%>%
select(stand,if_fielding_alignment,
wOBAcon, ex_bat_wOBAcon, ex_pit_wOBAcon,
HR_BBE, ex_bat_HR_BBE, ex_pit_HR_BBE,
BABIP, ex_bat_BABIP, ex_pit_BABIP,
mean_angle, ex_bat_angle, ex_pit_angle,
mean_velo, ex_bat_velo, ex_pit_velo,
barrel_BBE, ex_bat_barrel_BBE, ex_pit_barrel_BBE,
Pull_pct, ex_bat_Pull_pct, ex_pit_Pull_pct,
xwOBAcon, ex_bat_xwOBAcon, ex_pit_xwOBAcon,
wOBAcon_denom)
shift_batX[,c(3:5, 9:26)] <- round(shift_batX[,c(3:5, 9:26)], 3)
shift_batX[,c(6:8)] <- round(shift_batX[,c(6:8)], 4)
kable(shift_batX[,1:5])
| stand | if_fielding_alignment | wOBAcon | ex_bat_wOBAcon | ex_pit_wOBAcon |
|---|---|---|---|---|
| L | Standard | 0.374 | 0.377 | 0.377 |
| L | Infield shift | 0.389 | 0.396 | 0.378 |
| R | Standard | 0.387 | 0.390 | 0.378 |
| R | Infield shift | 0.410 | 0.418 | 0.379 |
Shift状態におけるwOBAconは, 右でも左でも打者では推定値よりもわずかに低下している. shiftは打球に限って言えば少しは有効だったようだ. 打球への効果は左右で大きな差はなく, 少なくともMLB15-18については, 右打者のwOBAで見られたシフトを採用することによる損失は主に打球ではない部分で生じていたのかもしれない.
kable(shift_batX[,c(1:2, 6:8)])
| stand | if_fielding_alignment | HR_BBE | ex_bat_HR_BBE | ex_pit_HR_BBE |
|---|---|---|---|---|
| L | Standard | 0.0359 | 0.0362 | 0.0396 |
| L | Infield shift | 0.0559 | 0.0518 | 0.0401 |
| R | Standard | 0.0436 | 0.0447 | 0.0400 |
| R | Infield shift | 0.0652 | 0.0645 | 0.0402 |
HR/BBEは左では非常に弱い増加傾向があるかもしれない (15-17では右も統計的に有意ではない程度で少し増えていたが, 15-18ではほとんど違いが見られなくなった). 一番右の列を見ると, HRが打たれやすい投手が多くシフトしていることもあり, それを考慮すると, 左打者で0.0036程度といったところ. ありがたいことに二項分布的な事象であるので誤差範囲を簡単にざっくり計算できる. まずBBEのサンプル数.
kable(shift_batX[,c(1:2, 27)])
| stand | if_fielding_alignment | wOBAcon_denom |
|---|---|---|
| L | Standard | 103417 |
| L | Infield shift | 30483 |
| R | Standard | 202992 |
| R | Infield shift | 14386 |
打球系に絞っているのでwOBAの計算よりも当然サンプルサイズは小さくなる. 二項分布の分散から, 仮に期待されるHR/BBEの確率が正しいとした場合のSDを計算する.
round(sqrt(30483 * 0.0518 * (1-0.0518)) / 30483, 5)
## [1] 0.00127
左打者ではHR/BBEの増加は2SDを超えている. ただし, これは推定HR/BBEの数値が正しいことを前提としており, 前提が正しくない場合は異なる結論となる可能性は否定できない (というかP値というのはたいていの場合そういうものだと思うが; Wasserstein and Lazar (邦訳: 佐藤俊哉), 2017).
ところで0.003程度のHRの増加は野球の文脈ではどの程度の意味があったのだろうか? wOBAconが0.4の打者を考える. この選手の0.003の打球がHRに入れ替わった状況を考える. HRのwOBA valueは概ね1.6であるから..
0.4 * 0.997 + 1.6 * 0.003
## [1] 0.4036
wOBAconへの影響自体は比較的軽微だったと見ることができそうだ.
kable(shift_batX[,c(1:2, 9:11)])
| stand | if_fielding_alignment | BABIP | ex_bat_BABIP | ex_pit_BABIP |
|---|---|---|---|---|
| L | Standard | 0.304 | 0.306 | 0.300 |
| L | Infield shift | 0.284 | 0.300 | 0.299 |
| R | Standard | 0.302 | 0.303 | 0.299 |
| R | Infield shift | 0.287 | 0.298 | 0.300 |
BABIPの低下も左右両方で見られ, 左のほうがやや顕著かもしれない. 左打者で本塁打が増加傾向にあったために, wOBAconで見ると相殺されて左右差が見えていなかったのかもしれない. 今回は調べなかったが2塁打にも影響があり, それによって相殺された可能性もあるかもしれない (Carleton, 2018はデータは示していないが, 2, 3塁打についてもわずかに増加傾向であると述べている).
kable(shift_batX[,c(1:2, 12:14)])
| stand | if_fielding_alignment | mean_angle | ex_bat_angle | ex_pit_angle |
|---|---|---|---|---|
| L | Standard | 10.291 | 10.295 | 10.600 |
| L | Infield shift | 13.470 | 13.074 | 10.637 |
| R | Standard | 11.253 | 11.418 | 10.704 |
| R | Infield shift | 14.292 | 14.307 | 10.642 |
kable(shift_batX[,c(1:2, 15:17)])
| stand | if_fielding_alignment | mean_velo | ex_bat_velo | ex_pit_velo |
|---|---|---|---|---|
| L | Standard | 87.098 | 87.164 | 87.502 |
| L | Infield shift | 88.415 | 88.609 | 87.458 |
| R | Standard | 87.981 | 88.062 | 87.489 |
| R | Infield shift | 89.283 | 89.135 | 87.431 |
ほとんど変化がなさそうという結果. 左打者ではわずかに角度が上がっており, HR/BBEの軽度の増加と関連があるのかもかもしれない. ただし, 平均値 (成績の期待値) の平均値をとる正当性が特に怪しい部分な気もするので, もう少し別の方法で確認したほうがいいかもしれない. 例えば, 打者, 投手のmeanよりもmedianやその他の統計量を使ったほうがいいかも.
kable(shift_batX[,c(1:2, 18:20)])
| stand | if_fielding_alignment | barrel_BBE | ex_bat_barrel_BBE | ex_pit_barrel_BBE |
|---|---|---|---|---|
| L | Standard | 0.056 | 0.056 | 0.065 |
| L | Infield shift | 0.094 | 0.087 | 0.065 |
| R | Standard | 0.073 | 0.074 | 0.065 |
| R | Infield shift | 0.113 | 0.110 | 0.065 |
左打者ではほんの少し増えていた? 解釈はいろんな意味で困難だが, それほど顕著では無いだろう.
kable(shift_batX[,c(1:2, 21:23)])
| stand | if_fielding_alignment | Pull_pct | ex_bat_Pull_pct | ex_pit_Pull_pct |
|---|---|---|---|---|
| L | Standard | 43.781 | 43.238 | 40.175 |
| L | Infield shift | 44.602 | 46.142 | 40.375 |
| R | Standard | 38.446 | 38.707 | 40.061 |
| R | Infield shift | 41.825 | 42.040 | 40.436 |
期待値の方を見ると, Shiftされた選手は引っ張り傾向が強いことが伺える. これは予想通りだろう. 左では, Shift状態ではわずかに引っ張り傾向が低下しているように見えるが, 現状解釈は困難である.
打球タイプ (GB, LD, FB) などの分類ごとに計算してみるともう少し解釈しやすくなるかもしれない.
xwOBAの目的の一つは守備の影響を取り除くことであり, Shiftは守備側が持つ戦術の一つである. このため, Shiftに効果があるのであればwOBAconとxwOBAconの数値はの間の関係はShiftの有無によって乖離が生じる可能性が考えられる.
打者側.
kable(shift_batX[,c(1:4, 24:25)])
| stand | if_fielding_alignment | wOBAcon | ex_bat_wOBAcon | xwOBAcon | ex_bat_xwOBAcon |
|---|---|---|---|---|---|
| L | Standard | 0.374 | 0.377 | 0.357 | 0.358 |
| L | Infield shift | 0.389 | 0.396 | 0.401 | 0.390 |
| R | Standard | 0.387 | 0.390 | 0.372 | 0.375 |
| R | Infield shift | 0.410 | 0.418 | 0.409 | 0.409 |
Standard状態では左右ともにwOBAconはxwOBAconよりも高めに出ている (3, 5列目の比較). しかし, Shift状態ではwOBAconとxwOBAconの数値は右打者では乖離が小く, 左打者では逆転している. これは, Shiftによって効率的にアウトを稼げていたことによって説明されうる. これは, 上で示したようにBABIPが低下していたことと整合的である. Shiftという戦術が存在することはxwOBAを用いることの価値を高めていると言えるかもしれない. xwOBAconの推定式は年度によって違うらしいので, シフト頻度の変化と合わせると, それも影響があるだろう.
また, 左打者のShift状態ではxwOBAconは期待値より少し高くなっている (5, 6列目の比較). これは, Shift状態での打席では, 期待される打球に比べてより価値の高い打球が出やすい傾向があった可能性を示している. おそらくこのため, 効率的にアウトを獲得した効果は相殺されてwOBAconはあまり変化していない.
ここで計算されたxwOBAconの増加量は, 上で見積もったHR/BBEの増加によるwOBAconの増加より大きいかもしれない. やはりHR以外の打球も検討する必要がありそうだ.
投手側の期待されるwOBAcon/xwOBAconは下に別に示す.
kable(shift_batX[,c(1:2, 5, 26)])
| stand | if_fielding_alignment | ex_pit_wOBAcon | ex_pit_xwOBAcon |
|---|---|---|---|
| L | Standard | 0.377 | 0.363 |
| L | Infield shift | 0.378 | 0.363 |
| R | Standard | 0.378 | 0.364 |
| R | Infield shift | 0.379 | 0.363 |
投手側の能力の違いはほとんど影響していないようだ.
という感じで非常に単純な方法で成績の推定値を出して, それと比較することで選手能力をざっくり補正して効果を眺めてみた. wOBAレベルでみると, 左打者に対しては少し有効で, 右打者ではマイナスがやや大きかった可能性がある. これは補正方法は多少異なる, Tangoが示した結果と一致している. 打者の打球傾向をかなり詳しく調べているであろうMLBチームでこのような傾向であることは, 打者の打球傾向を利用して守備側が失点を減らすことがかなり困難であることを示していると言えるかもしれない.
Shiftの効果の打者の左右における差に関して, 打球系よりもK%が大きな影響を及ぼしている可能性は結構面白いかもしれない. 球種, 投球コースといった, 選手が比較的容易に意図的にコントロール可能な詳細な部分を調べてみるともう少しメカニズム的な部分に立ち入れるかも.
実際にはまだかなりバイアスが入っている可能性がありそう. 例えば, シフトを多く使うチームは限られるために球場が偏っている (Petriello, 2018; Albert, 2018c) とか, あるいは MGLが指摘しているようなシフトの採用判断をするタイミングに起因するバイアスなど (Tango, 2018). さらに本文中で述べた, 打者/投手能力の補正における打者と投手のタイプごとの相性 (左右あるいはGB-FBでのplatoon effects) の影響もありうる. 左右の影響の差に関しては, 球場かplatoon effectsが特に影響が大きい可能性がありそうだが, この辺りは今のところ全く検討していない.
Tangoはランナー状態に関して分けたデータも示しているが, ここではそこまでは検討していない. そこではシフトが最も効果的な状況が, 走者の存在によって1-2塁間に大きな穴ができる状況である可能性が示されている. これはシフトを敷くかどうかの判断に, 現在主に考慮されているであろう打者の能力だけではなく, それ以外の要素 (つまりランナー状況) を加えることで, シフトによる失点抑止効果を追加的に取り出せる可能性を示唆しているという点で重要である. 状況ごとにここで行ったようにwOBA構成要素の変動を確認しておくと, このような判断に有用になるかもしれない. しかし, 現状ではサンプルサイズ, 及びサンプル内での選手の多様性が足りなくなる状況が多いと思われ, もう少し時間が必要というところだろう.
補正を必要とするという性質上, サンプル数が十分に活かせない部分もあり, サンプル数が十分でない, あるいはサンプル内での選手の多様性が十分ではない可能性もありうる. 例えば, NPBのデータなどがあれば, 独立なデータとして利用可能であり, 面白いデータになりうる. しかし, 現状NPBのデータは公開されていないことだけでなく, そもそも大きなシフトをあまり取らないというところもあり, 仮に公開されてもあまり大きな寄与にはならないかもしれない.
本文中でも触れたが, ここでは特にShiftを多く受けた打者のデータを除いているため, 効果を過小評価している可能性がある. Carletonは逆にShift状態での成績をもとに期待値を求め, Standardでの実際の成績と比較し, Shiftを特に受けやすい打者 (Shift回数 >= 250) ではShift状態でLWTSが低下していたこと示している (Carleton, 2018). ややStandard状態での打席が少ないかもしれないが (PA = 9975), このような集団ではShiftに特に高い効果がある可能性は高そうである.
以上です.
Statcast dataはMLBAMが権利を保持している (Statcast data are property of MLB advanced media.)
Tom Tango, Shift v NoShift Preliminary Statcast Research, 2018.
Russell Carleton, How To Beat The Shift, Baseball Prospectus, 2018.
MLB.com, Shifts.
Bill Petti, baseballr package for R.
Jim Albert, Chance of Hit as Function of Launch Angle, Exit Velocity and Spray Angle, 2018a.
Jim Albert, Spray Charts from Statcast Data, 2018b.
MLB.com, Expected Weighted On-base Average (xwOBA).
Tom Tango et al., The Book, Potomac Books, Inc., 2007.
Wasserstein and Lazar (邦訳: 佐藤俊哉), 統計的有意性とP値に関するASA声明, 2017.
Mike Petriello, 9 things you need to know about the shift, 2018.
Jim Albert, Exploring Infield Shifting, 2018c.