はじめに
以前の記事で、NPB選手成績予測にMarcel法を使ったシステムを紹介しました。
Marcel法は「過去3年の加重平均+平均回帰」というシンプルな手法で、投手ERA予測ではMLモデル(LightGBM/XGBoost)を上回る精度でした。しかし、いくつかの限界がありました。
| 課題 | Marcel法の扱い |
|---|---|
| 新外国人選手 | リーグ平均で代替(前リーグ成績を使えない) |
| 点推定のみ | 不確実性を表現できない |
| 年齢調整が一律 | 全選手+0.3%/年 |
| スキル指標を無視 | K%やBB%の情報を活かせない |
この限界を超えるために、ベイズ回帰(Stan/Ridge)を導入するプロジェクトを始めました。
15ステップ、約2週間の試行錯誤の記録です。
はじめての方へ:この記事で登場する用語
| 用語 | 意味 |
|---|---|
| Marcel法 | 過去3年の成績を加重平均して翌年を予測するシンプルな手法。重みは直近ほど高い(5:4:3) |
| ベイズ回帰(Stan) | データから確率分布を推定し、不確かさも含めて予測する統計手法 |
| wOBA | 重み付き出塁率。四球・単打・二塁打・本塁打などに異なる重みをつけた打撃総合指標 |
| ERA(防御率) | 9イニング当たりの自責点。投手の基本的な成績指標 |
| K%(三振率) | 全打席に占める三振の割合。年度間で安定しやすく、投手の実力を示す指標 |
| BB%(四球率) | 全打席に占める四球の割合 |
| BABIP | インプレー打球の安打率。0.300前後が平均で、大きく外れる年は「運」の影響が大きいとされる |
| MAE | 平均絶対誤差。予測と実績のずれの平均。小さいほど精度が高い |
Step 1: 外国人選手の変換係数
問題
NPBには毎年多くの外国人選手が入団します。彼らの「前リーグ成績」をNPBスケールに変換できれば、リーグ平均よりも良い初期予測ができるはずです。
やったこと
-
2015-2025年のNPB外国人選手365名を特定
- カタカナ名検出 + 出身地 + ロスター初登場年で抽出
-
FanGraphsの前リーグ成績とマッチング(231名成功)
- 名前正規化(アクセント除去、Jr/Sr除去)
- pykakasi でカタカナ→ローマ字変換
-
リーグ間変換係数を算出
| リーグ | wOBA比(打者) | ERA比(投手) | サンプル数 |
|---|---|---|---|
| MLB→NPB | 1.235 | 0.579 | 56打者 / 74投手 |
| AAA→NPB | 1.271 | 0.462 | 9打者 / 6投手 |
打者のwOBAは約24%向上、投手のERAは約42%改善する傾向があります。
教訓
変換係数単独ではベースライン(リーグ平均)より悪い結果に。 wOBA/ERAは環境依存の「結果指標」なので、単純な比率変換では精度が出ません。モデルの事前分布(prior)として使う設計に切り替えました。
Step 2-4: PyMCからStanへ — スキル指標の発見
PyMC階層モデル(失敗)
PyMCで前リーグのwOBA/ERAを特徴量にshrinkage weight wを学習。結果: w ≈ 0.12で前リーグ成績をほぼ無視。
Stan v1 — K%/BB%の導入(成功)
wOBA/ERAが環境依存の「結果指標」であるのに対し、**K%/BB%は環境依存が低い「スキル指標」**です。
打者: npb_wOBA = lg_avg + β_woba·z_woba + β_K·z_K + β_BB·z_BB + noise
投手: npb_ERA = lg_avg + β_era·z_era + β_fip·z_fip + β_K·z_K + β_BB·z_BB + noise
外国人モデルの結果(2020-2025バックテスト)
| モデル | MAE | ベースライン | 改善率 |
|---|---|---|---|
| 打者 v0 (wOBAのみ) | 0.0330 | 0.0337 | -2.1% |
| 打者 v1 (+K%/BB%) | 0.0325 | 0.0337 | -3.8% |
| 投手 v0 (ERAのみ) | 0.749 | 0.749 | ±0% |
| 投手 v1 (+K%/BB%/FIP) | 0.736 | 0.749 | -1.7% |
Step 5: データ充実
- Deep Researchで22名を追加特定 → master 393名
- FanGraphsマッチ: 231 → 253名
- 打者改善率: -3.8% → -5.1%(データ増の効果)
Step 6: チーム順位予測(Monte Carlo シミュレーション)
手法
- 各選手の予測値に個人ノイズ(σ = Marcel MAE)を加える
- チーム RS/RA を集計
- ピタゴラス勝率(exp=1.83)で勝利数に変換
- 10,000回繰り返して分布を得る
バックテスト(2018-2025, 96チーム年度)
| 指標 | 値 |
|---|---|
| 点予測 MAE | 6.41勝 |
| 80%CI カバレッジ | 86.5% |
2021年は MAE 10.3勝と大外れ(両リーグで前年最下位が優勝した異常年)。
Step 7-9: 日本人選手Stanモデル
外国人モデルは初年度のみ。本丸は日本人選手1,300人以上の予測改善です。
モデル設計
打者: actual_wOBA = Marcel_wOBA + δ_K·z_K + δ_BB·z_BB + δ_BABIP·z_babip + noise
投手: actual_ERA = Marcel_ERA + δ_K·z_K + δ_BB·z_BB + noise
Marcel予測をベースに、K%/BB%/BABIPで補正するアプローチです。
発見: 打者K%/BB%はwOBAに既に含まれている
wOBAの計算式にBBが直接入るため、K%/BB%の追加効果はほぼゼロ。代わりに**BABIP(ラッキー成分)**が有効でした。δ_BABIP = -0.006(高BABIPは翌年回帰する)。
スケーリング問題と解決
RS/RAを独立にスケーリングするとStanの系統的改善が消える問題を発見。marcel_anchored スケーリングを開発して解決。ΔMAE が -0.063 → -0.154(2.4倍改善)。
Step 10-11: 統計的有意性への挑戦
Ridge回帰でStanベイズモデルを近似し、高速LOO-CVを実施。
選手レベル(2018-2025)
| 指標 | n | Marcel MAE | Stan MAE | p値 | Bootstrap |
|---|---|---|---|---|---|
| 打者 wOBA | 2,208 | 0.05023 | 0.04980 | 0.060 | 97.1% |
| 投手 ERA | 2,164 | 1.23008 | 1.22241 | 0.057 | 97.1% |
5特徴量モデルの発見
投手にK/9・BB/9を追加:
| モデル | p値 | Bootstrap |
|---|---|---|
| ERA (3feat: K%, BB%, age) | 0.607 | 68.9% |
| ERA (5feat: +K/9, BB/9) | 0.012 | 99.3% |
p = 0.012 で有意差達成。 K%(打席対比率)とK/9(イニング対比率)は異なる情報を持っていると考えられます。
Step 12-14: チーム予測の精度改善
- FA帰属修正: 移籍選手の成績を正しいチームに帰属
- リーグ平均補完: カバーできない選手をリーグ平均で埋める
- カバー率改善: 生年月日14名補完で PA_cov +2pp
- 4新特徴量追加: pa_stability, ip_stability, prev_babip_p, prev_woba_dev_sq
Step 15: 限界到達
矛盾
- 選手レベル: Stan > Marcel(p=0.06, Bootstrap 97%)
- チームレベル: Stan < Marcel(+0.198W 悪い)
原因:PA加重の構造
| 四分位 | PA範囲 | Stan勝率 |
|---|---|---|
| Q1(低PA) | 30-64 | 55%(Stan最強) |
| Q2 | 65-157 | 46% |
| Q3 | 158-361 | 44% |
| Q4(高PA) | 362-685 | 49% |
Stanは低PA選手に効くが、チームRSはPA加重でQ4(レギュラー)が支配。 レギュラーにはMarcelの3年加重平均で十分な精度が出ます。
min_pa_team sweep 実験
| min_pa_team | Marcel MAE | Stan MAE | Δ |
|---|---|---|---|
| 0(現状) | 6.725 | 6.923 | +0.198 |
| 50 | 6.682 | 6.903 | +0.221 |
| 100 | 6.644 | 6.868 | +0.224 |
Marcel MAEは改善するが、Stan-Marcelの差はむしろ悪化。フィルタでは構造的問題は解決できません。
結論と学び
最終結果
| レベル | Marcel MAE | Stan MAE | 判定 |
|---|---|---|---|
| 選手(wOBA) | 0.05023 | 0.04980 | Stan優位(p=0.06) |
| 選手(ERA) | 1.23008 | 1.22241 | Stan優位(p=0.06) |
| チーム(勝) | 6.725 | 6.923 | Marcel優位 |
4つの学び
- Marcel法は驚くほど強いベースライン。高PA選手に対して非常に正確
- K%/BB%は「環境非依存のスキル指標」として有効。特に低PA選手の予測で力を発揮
- 選手レベルの改善がチームレベルに伝わるとは限らない。PA加重集計が高PA選手(Marcel精度高い層)に支配される
- Statcastのような打球品質データがなければ、次の壁は越えられない
今後
MLBでStatcastデータ(バレル率、EV、Whiff率、Stuff+等)を特徴量に使い、NPBの限界を超えられるか検証する予定です。
データ提供元:プロ野球データFreak、NPB公式サイト