背景と目的

wOBAは現在野球の統計において, 特に打者による打撃成績の評価において最も重要な指標の一つとなっている. TangoらによるThe Bookでは, wOBAを主な指標として用い, 効果の有無を推測する基準として標準偏差SDを利用している.

本稿では主にサンプリングを利用して, wOBAに関連する真の打席結果頻度が既知の場合に, 打席数に伴って年度レベルでまとめられたwOBAにどの程度のサンプリングエラーが生じるのかを, SDを使って眺める. 成績表的なものからのSDの導出も行う.

多項分布からのサンプリング例

rmultinom関数でサンプリングする.

# 確率が異なる多項分布から取り出す
prob <- c(2, 1, 1) # 起こりやすさの相対的な違い. totalは1でなくてもOKで, サンプル数の数列でよい.
rmultinom(9, # 繰り返し回数
          4, # 繰り返し1回あたりの試行 
          prob) 
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
## [1,]    3    3    1    3    1    1    3    3    3
## [2,]    0    0    1    1    1    1    0    0    1
## [3,]    1    1    2    0    2    2    1    1    0

この例ではイベントが3種類 (行) あり, それらは2:1:1で起こりやすい. 4回のサンプリングの結果が列にまとめられて, 9回 (列) 繰り返されている.

400 x 3回繰り返して集計. 見づらいので行列を転置. 適当な名前をつける.

# 見づらいので転置
x <- data.frame(t(rmultinom(4, 400, prob)))
names(x) <- c("Pull", "Cent", "Oppo")
x%>%
  gt()
Pull Cent Oppo
212 108 80
197 108 95
191 101 108
195 93 112

なんとなく打球方向が2:1:1の打者の打球方向を, 400打球 x 4シーズンシミュレートした感じに見える?

打席結果頻度データ

多項分布のそれぞれの項の起こりやすさは実際のデータを利用する.

statcastでwoba_denomeが1の行について集計 (非常に珍しいwOBA valueが正の値を取るイベントであるcatcher_interfは簡単のため除いた). 下は2017におけるMLB全体.

gt(average.hitter)%>%
  tab_header(
    title = "平均的打者用のデータ"
  )
平均的打者用のデータ
events N woba_value PA total_woba_value woba_value_per_PA
single 26913 0.9 183394 24221.7 0.132074659
double 8397 1.2 183394 10076.4 0.054944000
triple 795 1.6 183394 1272.0 0.006935887
home_run 6105 2.0 183394 12210.0 0.066577969
field_error 1579 0.9 183394 1421.1 0.007748890
walk 14858 0.7 183394 10400.6 0.056711779
hit_by_pitch 1763 0.7 183394 1234.1 0.006729228
woba_0 122984 0.0 183394 0.0 0.000000000
sum(average.hitter$woba_value_per_PA)
## [1] 0.3317224

サンプリングに使うのはN列だけである.

下は2017のAaron Judge.

judge.2017%>%
  gt()%>%
  tab_header(
    title = "Judgeっぽい打者用のデータ"
  )
Judgeっぽい打者用のデータ
events N woba_value PA total_woba_value woba_value_per_PA
single 75 0.9 667 67.5 0.101199400
double 24 1.2 667 28.8 0.043178411
triple 3 1.6 667 4.8 0.007196402
home_run 52 2.0 667 104.0 0.155922039
field_error 4 0.9 667 3.6 0.005397301
walk 116 0.7 667 81.2 0.121739130
hit_by_pitch 5 0.7 667 3.5 0.005247376
woba_0 388 0.0 667 0.0 0.000000000
sum(judge.2017$woba_value_per_PA)
## [1] 0.4398801

PAと書いているが実際にはStatcastにおけるwOBAの分母 (woba_denome) を集計したもので, 公式のPAと同じものではない. ほとんどの目的ではwoba_denomをPAとして使っても大した問題にはならないはず.

gt(mcCutchen.2017)%>%
  gt()%>%
  tab_header(
    title = "McCutchenっぽい打者用のデータ"
  )
McCutchenっぽい打者用のデータ
events N woba_value PA total_woba_value woba_value_per_PA
single 99 0.9 645 89.1 0.138139535
double 30 1.2 645 36.0 0.055813953
triple 2 1.6 645 3.2 0.004961240
home_run 28 2.0 645 56.0 0.086821705
field_error 3 0.9 645 2.7 0.004186047
walk 68 0.7 645 47.6 0.073798450
hit_by_pitch 4 0.7 645 2.8 0.004341085
woba_0 411 0.0 645 0.0 0.000000000
sum(mcCutchen.2017$woba_value_per_PA)
## [1] 0.368062

平均的打者のシミュレーション

関数の設定.

# dfを与えてその列Nの値からイベントをサンプリングしてwOBAを計算する関数
sim.wOBA <- function(df = average.hitter, 
                     PA = 100,
                     season = 200){
  seasons <- data.frame(t(rmultinom(season, PA, df$N)))
  seasons$year <- 1:nrow(seasons)
  names(seasons) <- c(as.character(df$events), "year")
  season.stats <- seasons %>%
     group_by(year)%>%
     mutate(woba_value = single * 0.9 + double * 1.2 + triple * 1.6 + home_run * 2.0 +
             field_error * 0.9 + walk * 0.7 + hit_by_pitch * 0.7 + woba_0 * 0)%>%
     dplyr::summarise(PA = PA,
                      wOBA = sum(woba_value) / PA)
  return(season.stats)
}

定義した関数を使って平均的な打者の結果をシミュレーション.

c(40, 100)%>%
  map(~sim.wOBA(df = average.hitter,
                PA = .,
                season = 5))%>%
  bind_rows()%>%
  gt()%>%
  tab_header(title = "関数のテスト結果例")
関数のテスト結果例
year PA wOBA
1 40 0.1650
2 40 0.2850
3 40 0.2875
4 40 0.2325
5 40 0.3300
1 100 0.3440
2 100 0.3880
3 100 0.3250
4 100 0.3940
5 100 0.3530

(40PA or 100 PA) x 5シーズンの計算例を示した.

PAを20, 40, 60, 100, 200, 400, 600, 6000と変化させて, 平均的な打者の200,000シーズンをシミュレートする.

# まとめて計算
# sim.data.avg <- c(20, 40, 60, 100, 200, 400, 600, 6000)%>%
#   map(~sim.wOBA(df = average.hitter, PA = ., season = 200000))%>%
#   bind_rows()
# sim.data.judge <- c(20, 40, 60, 100, 200, 400, 600, 6000)%>%
#   map(~sim.wOBA(df = judge.2017, PA = ., season = 200000))%>%
#   bind_rows()
# sim.data.mcCutchen <- c(20, 40, 60, 100, 200, 400, 600, 6000)%>%
#   map(~sim.wOBA(df = mcCutchen.2017, PA = ., season = 200000))%>%
#   bind_rows()

# まとめて保存
# save(list=c("sim.data.avg", "sim.data.judge", "sim.data.mcCutchen"),
#      file="woba_error_ranges_results.Rdata")

# 計算しておいた結果を呼び出す
load("woba_error_ranges_results.Rdata") 

得られたwOBAを密度分布で示す.

sim.data.avg %>%
  mutate(PA = factor(PA))%>%
  filter(PA != 6000)%>%
  ggplot(aes(x = wOBA, colour = PA,fill = PA)) + 
  geom_density(
    stat = "density",
    position = "identity",
    alpha = 0.5,
    adjust = 1)+ 
  xlim(0, 1)+
  facet_wrap(~PA, ncol = 2)+
  theme_bw(base_family = "HiraKakuPro-W3") +
  labs(x =  "wOBA", y =  "確率密度", 
       title =  "様々なPAにおける, 平均的な打者のwOBAの分布",
       subtitle =  "多項分布からのサンプリング. 200,000シーズン.")

当然サンプルが増えるにつれて, 平均の周りにデータが集まっている. つまり, 推定が正確になっている.

平均値とSDを計算し, 平均±1SD or ±2SDの範囲内の割合を計算する.

sim.data.avg %>%
  group_by(PA)%>%
  dplyr::summarise(Avg = mean(wOBA),
                   SD = sd(wOBA))%>%
  mutate_if(is_numeric, funs(round), 3)%>%
  gt()%>%
  tab_header(title = "平均的打者wOBAの平均とSD")
平均的打者wOBAの平均とSD
PA Avg SD
20 0.332 0.116
40 0.332 0.082
60 0.332 0.067
100 0.332 0.052
200 0.332 0.037
400 0.332 0.026
600 0.332 0.021
6000 0.332 0.007
sim.data.avg2 <- sim.data.avg %>%
  group_by(PA)%>%
  dplyr::summarise(N = n(),
                   Avg = mean(wOBA),
                   SD = sd(wOBA))

sim.data.avg %>%
  left_join(sim.data.avg2)%>%
  group_by(PA)%>%
  mutate(diff = abs(Avg - wOBA),
         within_SD_FL = ifelse(diff < SD, 1, 0),
         within_2SD_FL = ifelse(diff < SD * 2, 1, 0))%>%
  dplyr::summarise(within_SD_pct = mean(within_SD_FL) * 100,
                   within_2SD_pct = mean(within_2SD_FL) * 100)%>%
    mutate_if(is_numeric, funs(round), 3)%>%
  gt()%>%
  tab_header(title = "SD範囲内の割合")
SD範囲内の割合
PA within_SD_pct within_2SD_pct
20 67.654 95.508
40 68.485 95.639
60 68.602 95.561
100 68.166 95.447
200 68.252 95.445
400 68.143 95.474
600 68.477 95.416
6000 68.145 95.407

基本的にはmean±1SD範囲内に68%, mean±2SD範囲内に95%. 2SD (危険率αが両側5%) を基準にするなら60PAで± 0.13程度, 600打席で±0.04のばらつきはサンプリングエラーでよく起こる程度の差ということになる.

平均的な打者の平均± 1SD or 2SD範囲を示す.

avg.hitter.range <- sim.data.avg %>%
  group_by(PA)%>%
  dplyr::summarise(Avg = mean(wOBA),
                   SD = sd(wOBA),
                   Low_2SD = Avg - 2*SD,
                   Low_1SD = Avg - SD,
                   Up_1SD = Avg + SD,
                   Up_2SD = Avg + 2*SD)%>%
  select(- Avg)
avg.hitter.range <- round(avg.hitter.range, 3)
names(avg.hitter.range) <- c("PA", "SD", "平均-2SD", "平均-SD", "平均+SD", "平均+2SD")

avg.hitter.range%>%
  gt()%>%
  tab_header(title = "平均的打者のwOBA誤差範囲", subtitle = "平均は0.332")
平均的打者のwOBA誤差範囲
平均は0.332
PA SD 平均-2SD 平均-SD 平均+SD 平均+2SD
20 0.116 0.099 0.216 0.448 0.565
40 0.082 0.167 0.250 0.414 0.496
60 0.067 0.197 0.265 0.399 0.466
100 0.052 0.228 0.280 0.384 0.436
200 0.037 0.258 0.295 0.369 0.405
400 0.026 0.280 0.306 0.358 0.384
600 0.021 0.289 0.310 0.353 0.374
6000 0.007 0.318 0.325 0.338 0.345

Tangoらによる“The Book”を持っている人はTable 13 (pp.49) のほぼまるパクリのテーブルであることがおわかりだろう. 200PAあっても, 平均的な打者がwOBA0.4弱の強打者になる, あるいは0.26強のアウト製造機になることは, 両側5%水準では起こりうる (平均的な打者が20人いれば, 期待値としては1人くらいはそれぐらいの成績になる).

ここで示した値は常に一定の能力+成績を持った打者を想定しているが, 実際には対戦相手の能力が一定ではなく, また本人の能力も怪我などによって変動するため, ここで求めたものよりばらつきは大きくなるはずである.

平均と異なる能力を持った打者のシミュレーション

2017のJudgeの打撃結果を真の分布として持つ打者についてシミュレート.

同様に平均とSDを示す.

sim.data.judge %>%
  group_by(PA)%>%
  dplyr::summarise(Avg = mean(wOBA),
                   SD = sd(wOBA))%>%
    mutate_if(is_numeric, funs(round), 3)%>%
  gt()%>%
  tab_header(title = "Judge的打者wOBAの平均とSD")
Judge的打者wOBAの平均とSD
PA Avg SD
20 0.44 0.135
40 0.44 0.096
60 0.44 0.078
100 0.44 0.060
200 0.44 0.043
400 0.44 0.030
600 0.44 0.025
6000 0.44 0.008

下はSD範囲内の割合を示す

SD範囲内の割合
PA within_SD_pct within_2SD_pct
20 68.864 95.835
40 68.321 95.549
60 68.214 95.457
100 68.269 95.443
200 68.262 95.524
400 68.372 95.474
600 68.303 95.520
6000 68.305 95.389

2SDを基準にするなら60PAで±0.15程度, 600PAで±0.05のばらつきは誤差範囲. 平均的な打者よりも全体的にSDは大きい.

Judge的な打者の平均± 1SD or 2SD範囲を示す.

Judge的打者のwOBA誤差範囲
平均は0.44
PA Low_2SD Low_1SD Up_1SD Up_2SD
20 0.169 0.305 0.575 0.711
40 0.248 0.344 0.536 0.632
60 0.283 0.362 0.518 0.596
100 0.319 0.379 0.500 0.561
200 0.354 0.397 0.483 0.526
400 0.379 0.409 0.470 0.500
600 0.390 0.415 0.465 0.489
6000 0.424 0.432 0.448 0.456

NPBにおいてwOBAが非常に高いことが期待され, かつそのNPBでのwOBAのスキルが不明な打者としては, 外国人選手が多くあてはまるだろう. これを見ると, 新外国人選手が100PAでwOBAが0.319でもまだまだ嘆くには早い, かもしれない (外国人選手の場合, さらに環境への適応の問題もあるのでもっと安全を取りたいぐらいだが, 枠の問題があるので他に試すべき選手がいるならそっちを試したほうがいいことも多分間違いない).

平均的打者と同様に一応作図.

平均との比較

ここまではある能力一定の打者のwOBAが, 最低限どれぐらいばらつくのかを見てきた. しかし, 多くの場合, 興味があるのは何かと何かの間に差があるのかどうか, 差があるとしたらどれだけの差があると推定できるのか, ということ. 打者Aと打者Bの間の比較かもしれないし, 打者Cにおける状況aと状況bかもしれない.

平均的な打者と, JudgeやMcCuthenっぽい打者の比較を行う.

sim.data.avg$Type <- "Avg"
sim.data.judge$Type <- "Judge_2017"
avg.judge.df <- bind_rows(sim.data.avg, sim.data.judge)
avg.judge.df.short <- bind_cols(sim.data.avg, sim.data.judge)%>%
  mutate(wOBA_diff = wOBA1 - wOBA)

sim.data.mcCutchen$Type <- "McCutchen_2017"
avg.mc.df <- bind_rows(sim.data.avg, sim.data.mcCutchen)
avg.mc.df.short <- bind_cols(sim.data.avg, sim.data.mcCutchen)%>%
  mutate(wOBA_diff = wOBA1 - wOBA)

平均的な打者とJudgeっぽい打者の比較

平均的な打者とJudgeっぽい打者の分布を比較する. これは, 平均的な打者の通常の状況と, wOBAが0.108程度上がるような状況を大まかに近似しているとも言えるかもしれない.

avg.judge.df %>%
  mutate(PA = factor(PA))%>%
  filter(PA != 6000)%>%
  ggplot(aes(x = wOBA, colour = Type,fill = Type)) + 
  geom_density(
    stat = "density",
    position = "identity",
    alpha = 0.5,
    adjust = 1)+ 
  xlim(0, 1)+
  facet_wrap(~PA, ncol = 2)+
  theme_bw(base_family = "HiraKakuPro-W3") +
  labs(x =  "wOBA", y =  "確率密度", 
       title =  "様々なPAにおける, 平均的な打者と
       Aaron Judgeっぽい打者のwOBAの分布の比較",
       subtitle =  "多項分布からのサンプリング. 200,000シーズン.")

200PAもあれば, 分布の重なりはかなり小さくなっている. 40PA程度ではJudgeと平均的な打者の間ほどの大きな違いも安定的に検出することはできなさそうだ.

どれぐらいの大きさの差があるかを議論する上で野球の統計において最も持ち出されるのは, 単純な差分だろう. 平均的な打者とJudgeっぽい打者の差を計算し, その平均とSDを計算する.

avg.judge.df.short %>%
  group_by(PA)%>%
  dplyr::summarise(Avg = mean(wOBA_diff),
                   SD = sd(wOBA_diff))%>%
  mutate_if(is_numeric, funs(round), 3)%>%
  gt()%>%
  tab_header(title = "平均的打者とJudgeっぽい打者におけるwOBA差の平均とSD")
平均的打者とJudgeっぽい打者におけるwOBA差の平均とSD
PA Avg SD
20 0.108 0.178
40 0.108 0.126
60 0.108 0.103
100 0.108 0.080
200 0.108 0.057
400 0.108 0.040
600 0.108 0.033
6000 0.108 0.010

このモデルでは真の差は0.108ほどという個人間での差としても破格な大きさなわけだが, 60PAでは効果の大きさは1SD程度であり, 効果の正確な推定はかなり難しいことがわかる. 200PAあっても実際の値よりも±50%以上程度の差が出ることはかなりよくある.

平均 ± 1SD or 2SD範囲の割合を示しておく.

PA within_SD_pct within_2SD_pct
20 67.654 95.508
40 68.485 95.639
60 68.602 95.561
100 68.166 95.447
200 68.252 95.445
400 68.143 95.474
600 68.477 95.416
6000 68.145 95.407

各打者の結果にくらべると, それらの差分それほどきれいな分布ではないと思われるが, 概ね正規分布的な性質はありそう.

平均± 1SD or 2SD範囲を示す.

平均的打者とJudgeっぽい打者におけるwOBA差の誤差範囲
平均は0.108
PA SD Low_2SD Low_1SD Up_1SD Up_2SD
20 0.178 -0.248 -0.070 0.286 0.464
40 0.126 -0.144 -0.018 0.234 0.361
60 0.103 -0.098 0.005 0.211 0.314
100 0.080 -0.051 0.028 0.188 0.268
200 0.057 -0.005 0.052 0.165 0.221
400 0.040 0.028 0.068 0.148 0.188
600 0.033 0.043 0.076 0.141 0.173
6000 0.010 0.088 0.098 0.118 0.129

密度分布でも示しておく.

200PA程度あっても効果が半分以下 (赤の破線) に見えてしまうことは, ある程度起こることが図でも確認できる.

平均的な打者とMcCutchenっぽい打者の比較

McCutchenで同様に比較していく. Judgeと平均との差に比べて, McCutchenと平均との差は小さい. そのため, その差の検出はより難しくなると予想される.

600打席あっても分布の重なりは大きく, 平均的な打者との違いを検出することの困難さが伺える.

もちろんさらにサンプルを増やしていけば, その差は明らかである.

差の平均値及びSD.

平均的打者とMcCuthcenっぽい打者におけるwOBA差の平均とSD
PA Avg SD
20 0.036 0.169
40 0.036 0.119
60 0.037 0.097
100 0.037 0.075
200 0.036 0.053
400 0.036 0.038
600 0.036 0.031
6000 0.036 0.010

この比較では効果がJudgeとの比較に比べて1/3程度となるため, 400打席あっても効果の大きさ (Avg) はSDと同程度である.

ちなみにwOBAで約0.04というのはかなり大きな効果である. 例えば, よく知られた効果として左打者が右投手に対して強い (左投手に弱いのと同じ) というものがあるが, The Bookではこの効果は0.025であると示されている (pp.86; 実際には2000年代の中頃から効果はもう少し大きくなり, 現在は0.035前後ほどになっているようだが). 上の結果などから, 平均的な左右の相性においても, 効果を正確に定量することは個人打席レベルのサンプル数では困難であることが予想される (The Book, Chap. 6では選手間で意味のあるほどの効果の違いがあると言えるかについても検討されている). しかし, 通常の左右の相性の計算では投手と打者を左右でグルーピングするためサンプルサイズが大きくなるために, 差の検出, 効果の測定が容易に可能となる. 基本的に単年程度のデータサイズでは, wOBAの違いについて定量的に見て妥当性のある推論を出せるケースはかなり限られている.

平均± 1SD or 2SD範囲を示す.

平均的打者とMcCutchenっぽい打者におけるwOBA差の誤差範囲
平均は0.036
PA SD Low_2SD Low_1SD Up_1SD Up_2SD
20 0.169 -0.301 -0.133 0.205 0.373
40 0.119 -0.202 -0.083 0.155 0.274
60 0.097 -0.157 -0.060 0.134 0.231
100 0.075 -0.114 -0.039 0.112 0.187
200 0.053 -0.070 -0.017 0.089 0.142
400 0.038 -0.039 -0.001 0.074 0.111
600 0.031 -0.025 0.005 0.067 0.098
6000 0.010 0.017 0.027 0.046 0.056

成績からのSDの計算

SDの大きさをいちいちサンプリングして計算するのもばからしい. 個人成績から計算する方法がThe Bookのappendix (pp.372) に記述されているのでこれを使って計算する.

judge.2017%>%
  gt()%>%
  tab_header(title = "Judgeっぽい打者用のデータ (再掲)")
Judgeっぽい打者用のデータ (再掲)
events N woba_value PA total_woba_value woba_value_per_PA
single 75 0.9 667 67.5 0.101199400
double 24 1.2 667 28.8 0.043178411
triple 3 1.6 667 4.8 0.007196402
home_run 52 2.0 667 104.0 0.155922039
field_error 4 0.9 667 3.6 0.005397301
walk 116 0.7 667 81.2 0.121739130
hit_by_pitch 5 0.7 667 3.5 0.005247376
woba_0 388 0.0 667 0.0 0.000000000
judge.2017%>%
  mutate(value_squared = woba_value ^ 2, # 重み付け係数の2乗
         value_squared_per_PA = value_squared * N /PA)%>% 
  # 各イベント (打席結果) ごとの重み付け係数の2乗の1打席あたりの値
  # Nは各イベントの数で, PAは総イベント数
  select(-events, - PA)%>%
  summarise_all(funs(sum))%>% # 列に関してsum. 打席結果ごとに分離されていたのをまとめている.
  mutate(SD = sqrt((value_squared_per_PA - woba_value_per_PA ^ 2) / N))%>%
  select(N, SD)%>%
  gt()
N SD
667 0.02344107
  # 多分合ってると思う
  # valueの2乗を価値に持つwOBAっぽいものから, wOBAの2乗を引いて, 
  # それのsqrtを取る感じ
  # 長打はvalue^2が大きくなるので長打力のある打者ではSDが大きくなる傾向がある

上で示したサンプリングの結果と概ね一致している (600打数で0.0248).

ちなみにThe Bookではさらに簡便な近似計算として以下を紹介している.

\[ SD\,\, =\,\, \sqrt\frac{wOBA(1.1-wOBA)}{N} \] これは平均的な打者の打撃結果頻度の比を利用しており, 長打力の高い選手などではそれなりに誤差が出そうな印象である. しかし, 平均的な打者からみてどれくらい離れているか, を考える目的には十分役立つだろう.

まとめと議論

ここでは多項分布からのサンプリングでデータを生成することで, wOBAの各打席結果の確率が既知の場合に, 繰り返し測定によってどの程度ばらつくのかを主にSDを使って表現した. wOBAの実測値は起こったことの記述としては必要十分と言えるかもしれないが, 実際には打席数が少ない状況では偶然の影響が大きく信頼性が低い. このため, 例えば200打席以下などの少ない打席数に基づいてなにがしかの推測を行う場合, 実際には差がないにもかかわらず偶然によって生じた大きな変化に意味を見出してしまう可能性が高い (偽陽性, type I error). 推測においては, なんらかの方法で不確実性を評価, 記述することが重要である. このような理屈上発生するSDの大きさはスキルにおける差の大きさを考える上でも利用される.

少ない打席数で判断せざるを得ない状況としては, 例えば特定の打者と投手の相性がある. MLBでは特にチーム数が多いために対戦数が少なく, 3年間でもたかだか30PA程度にとどまる. TangoらはThe BookのChapter. 3で相性の予測力について検討し, 3年間の成績で打者がカモにした組み合わせを集めても, あるいは投手がカモにした組み合わせを集めても, 次の年にはそれらの成績に差がないことを示した. 彼らは, 個別の対戦が200か300くらいの打席数になってからもう一度話そうか, 的なことを記している (pp.78; 平均で25-30年ほど現役でやることが当たり前にならない限り, このサンプルサイズをクリアする組み合わせを十分得ることはおそらく難しいだろう; 個人的な感覚ではありうる効果の大きさを考慮するとこれでもサンプルサイズが小さい可能性が高いように思える).

測定された差が統計的に意味があるかどうかを判断するためには, なんらかの方法でばらつきの大きさを基準にして比較されることが多い. 最後に示したようにwOBAがどれくらいばらつくかを示すSDは成績表から比較的容易に計算が可能である. 例えば, 理屈上最低限生じるSDの大きさを基準として比較する方法は, 単純で応用の幅も広く, 厳密とは言えないだろうがある程度の桁感は得られると思われる. ただし, このような比較においては多重に比較していることを意識しておくことは重要である. 例えば, 100人の選手がいれば, 期待値としては5人は偶然の影響だけで±2SDよりも極端な結果になる. p値に変換して多重性の補正をかける事もできるが, 打席数が少なく選手数が多いために検出力が非常に小さくなるので, 少なくともここで挙げた例に対して多重比較の補正を単純に適用するのは方法論として問題がある. 野球っぽいデータでの多重性の補正については次の次のポストで検討する.

SD以外の方法としては, 何らかの形で母平均値を推定することができるだろう. 例えばよく使われるものとしては95%信頼区間があり, これは誤差範囲を含んだ形で母平均の値を区間推定できる. 95%信頼区間は実データから楽に計算することができるので馴染みやすいかもしれない (これはこれで案外扱いにくい気もしないでもないが; これは次のポストで検討する). あるいは事前の情報を利用する事もできるだろう. 平均への回帰の大きさがわかっているようなものであれば, 回帰の効果の大きさを取り込めばより妥当性の高い点推定値を求めることできるだろうし, ベイズ的にサンプルサイズの小ささを考慮することもできるかもしれない.

ここではwOBAに関して方法を示したが, 集計データを適切に得ることができれば, 他の指標についても同様に計算が可能である. ここでは元データとしてStatcastを用いたが, 一部の指標の計算は難しいこともあり得る. そのような場合はRetrosheetなどを使うと良いだろう. 同じPAでも指標によって信頼性が異なることはよく知られており, Fangraphsは回帰の大きさも含めて, 各指標についてまとめてくれている.

平均との比較で示したように, 差があるか無いか, あるいは, どの程度の大きさの差があるかを正確に推定できるかは, 真の効果の大きさにも依存する. 効果が大きければ大きいほど小さいサンプルサイズでも妥当な結論が得られるが, 効果が小さい場合は大きなサンプルサイズを要する. 野球の文脈において効果の小さいことがはっきりしているものとしては, 例えば“勝負強さ”として測定されるものの個人差がある (蛭川, 2018). これは相関係数0.5程度の違いを検出するには6,000から7,000 の打席数を要するとされ, 現在のMLBにおけるサンプルサイズでは現実的に意味を持たない. 真の効果が小さいにもかかわらず, 小さいサンプルサイズで効果を認めると, 非常に高い確率で偽陽性となる. 多くの場合, 実際の効果の大きさはわからないため, 結論を出すために必要なサンプルサイズを事前に決定することは困難かもしれない (臨床試験などであれば必要な効果の大きさが設定しやすいのでちゃんと計算する. 例えば 新谷, 2011) . とはいえ, 慣習に比べて小さいサンプルサイズで推論を行うのであれば, それが可能なほど効果が大きいと主張する理由や, どの程度不確実性が増加しているのかの見積もりを提供したほうが望ましいだろう.

参考文献

Statcast data are property of MLBAM.

蛭川 皓平 (baseballconcrete), イチからわかるwOBAのすべて.

Tango, MGL, and Dolphin, The Book, Potomac Books, 2007.

Tango, コメント in “On correlation, r, and r-squared, Sabermetric Research, 2006

蛭川 皓平 (baseballconcrete), 指標の信頼性と平均への回帰.

山本陵平, Clinical Journal Club 1. 多重比較.

Tango, Regression equations for pitcher events, 2010.

David Robinson, Understanding empirical Bayes estimation (using baseball statistics)

Fangraphs, Sample Size

蛭川 皓平 (baseballconcrete), 勝負強さの研究 in プロ野球を統計学と客観分析で考える デルタ・ベースボール・リポート2, 2018.

Tango, The color of clutch, The Hard Ball Times, 2009.

新谷歩, サンプルサイズとパワー計算, 週刊医学界新聞, vol.2937, 2011.