🫥

WPA集計機能をリリースしました

2024/10/30に公開

野球「」型競技、キャップ野球のデータ管理のお手伝いをしています。

https://zenn.dev/ckoshien/articles/63b656f97b430e

WPA(Win Probability Added)とは

打席状況において見込まれる勝利確率をどれだけ変動させたか、という値。
回ってきたときの状況と打席を終えたときの状況の勝利確率の差分がWPAです。
1試合最大±1の間で変動します。

https://1point02.jp/op/gnav/glossary/gls_explanation.aspx?eid=20064
https://sports.yahoo.co.jp/column/detail/202203310004-spnavi

キャップ野球のWPAってどうやって計算するの?

キャップ野球のスコアブックでは打席ごとにレコードを持っており、そのレコードに1:1対応する形で打席状況のテーブルがあります。打席状況ではイニング、アウトカウント、塁上の状況、自チームと相手チームの得点状況などを持っており、試合テーブルまでリレーションが繋がっているので、打席での得点差と最終的な勝ち負けがわかります。上記をもとに打席状況ごとに先攻の勝利確率を算出することができます。

現在、打席状況が8万レコードほどあり、状況ごとにグループ化すると約4700パターンになります。具体的に勝利確率を算出すると、

  • 3回表0アウト満塁 1点ビハインドのときの勝利確率: 0.333
    • 3回表1アウト満塁 1点ビハインドのときの勝利確率: 0.429
    • 3回表0アウト満塁 同点のときの勝利確率: 0.611

3回表0アウト満塁1点ビハインドから三振やゴロ、フライアウトなどで1アウト満塁にしてしまうとWPAは +0.096 、アウトにならず出塁して同点に追いついたときのWPAは +0.278 です。

これだけ見るとやたらと偏っているように見えるのですが、おそらく公式戦の標準イニングが4回になったのがここ2年ぐらいなので、標準イニングが3回のときは3回表満塁であっても、1点ビハインドで最終回ということもあり、その状況から逆転するのが難しかったようです。特にキャップ野球は全体的に投高の状況が続いており、一般的な野球と比べると違和感を感じる方も少なくないかと思います。あとは凡退したのになぜか勝利確率が下がらないというのも統計結果の面白いところです。ローカル環境で計算式を書いてバッチを実行し、実行結果を確認したときに自分の想像した状況と違ったので「あれ?式間違えたかな...?」と悩まされました。

そのような歴史的な背景もあり、計算のための母数はだいぶ増えたものの、状況が偏っていることからまだまだ正確性には課題があります。また、数値的には回ってきた状況などに左右されることもあります。もちろん、上手い選手はやはりミスしてWPAを負にすることが少なく、全体的に正になるWPAを積み上げている印象でした。

WPAの計算の手順

  1. 約3000試合の打席状況を収集する
  2. 毎回計算しなくてもよいように計算した勝利確率を一時テーブルに格納する
  3. 打席状況テーブルに勝利確率テーブルを結合して打席間のWPAの変動を計算できるようにする
  4. 計算対象期間の打席状況をすべて計算してWPAの変動履歴テーブルに格納する

ER図(簡略)

開発タイムライン

  • 10/27
    • セイバーメトリクスの項目で初めてWPAというものを知る
    • 意外と簡単に集計できそう、と思ったが打席状況の収集などに不具合があり、機能の修正を行う
    • puppeteer(自動スクリプト)でフロントの打席状況の収集ボタンをポチポチ押す
  • 10/28 23:00 スコアブック1.60.0を本番公開
    • 試合ごとの勝利確率推移表示を実装
  • 10/29 23:00 情報局2.70.0を本番公開
    • 選手ごとのWPA履歴を掲載(レートグラフと同じ扱い)
    • 直近1年間WPA合計ランキングの掲載
  • 10/30
    • 本番環境でWPA集計ジョブ開始

Discussion