2014年5月6日火曜日

野球シミューレーションを作る時に大事なこと

FanGraph今月のまとめ!みたいな記事に乗ってた、シミュレータを作る上で学んだ10のこととかいう最近ネットでありがちなタイトルの記事がなかなかおもしろいことを書いてあったので、ちょっとメモ

#1,#2に書いてあることは要するに、「現実の野球ほど細かい要素を入れなくてもだいたいを表現する上では問題がないよ。」ということで、まこれはわりかし知られていることなのかなあと思います。自分が作ってる簡易的なシミュレータでもそれなりに得点がばらけたり、チームの強さが現れてたりしますから、厳密には現実とは違う簡易的なルールであったとしても、おおまかな説明をする上ではそれでいいんじゃないの、と言う発想ですね。

個人的におもろいなーと思ったのは#3の「打者と投手の対戦を考えるのは、思ったより結構複雑でムズいよ」というセクション

これ自分でシミュレータを作ってる時にもかなり悩んだ部分です。この記事では例として、かの有名なアダム・ダンとキンブレルが対戦した場合を考えます。アダム・ダンの三振率(三振数を打席数で割った数)は31%で、キンブレルの奪三振率は47%です。どっちもすさまじい値ですね。

じゃあアダム・ダンとキンブレルが対戦した時の奪三振が起こる確率を計算しようと思った時、単純にこの平均の40%ぐらいかっていうと、冷静に考えれば明らかにおかしいことがわかります。だって平均以上の三振を食らうアダム・ダンが相手なのに、平均以上の奪三振率を誇るキンブレルが自分の平均よりも三振を取れないってことになるわけですから。

じゃーこういうときどうすればいいのよ、というときに登場するのがBillJamsの提案したLog5という考え方です。 Log5 : Wikipedia The Origins of Log5 : chances is…

このLog5は、もともとチームA、Bの対戦結果をそれぞれのチームの勝率から算出することを目的にした指標です。具体的には、あるチームA,Bがそれぞれ勝率$p_a,p_b$を持っているとき、チームAがBに勝つ確率${ P }_{ A,B }$が $${ P }_{ A,B }=\frac { { P }_{ A }-{ P }_{ A }{ P }_{ A } }{ P_{ A }+P_{ B }-2P_{ A }P_{ B } }$$ によって表すことが出来るというものです。 詳しくはWikipediaを参照して欲しいのですが、これらは$P_A$が1,0,1/2,もしくは$P_B$とおなじになる時、常識的な値を返すような関数となっています。 (例えば、$P_A=1$であれば、チームAの勝率は100%ということですからチームBの勝率にかかわらず$P_A,B=1$となり必ずAがBに勝つという結果を返しますし、$P_A=P_B$の時はおなじ勝率のチーム同士の対戦、すなわち互角の勝負となるので$P_{A,B}=\frac{1}{2}$となります。要するに上手いことできてる関数なんですね)

なぜこの不思議な関数がこのようなきれいな性質を持つかというと、Oddsという考え方に基づいて算出されているからです。Oddsとは、競馬のオッズとにたような感覚の数字で、あることがらが起こる確率がPである時、その起こる確率と起こらない確率との比で表される数字で $$Odds = \frac{P}{1-P}$$ で表されます。例えば、確率1/3で起こる事象のOddsは1/2となり、起こる確率とおこらない確率の比率によってある現象のおこりやすさを表すことが出来るようになります。(このOddsという考えは統計や情報理論などの世界でもよく使われている数値です。)

これを用いると先ほどのLog5は起こる確率$P_{A,B}$と起こらない確率$Q_{a,b}(=1-P_{A,B})$を用いて $$Odds_{A,B} = \frac{P_{a,b}}{1-P_{a,b}}= \frac{P_{A}}{Q_A}\frac{Q_{B}}{P_B}=\frac{Odds_A}{Odds_B}$$ と変形できます。(細かい変形は省略しましたが3,4行変形すればそこまで難しくなく証明できると思います)

これは Log5で出したAがBに勝つ確率のOddsが、チームAのOddsと、チームBの負けるOddsを掛け算して計算されていることを表しています。

要するにAとBの勝負を独立な事象として扱って、同時に起こる確率を積で計算してやろうというわけです。このように、Odds同士を割り算して計算したものをOddsRatioと呼び、これを用いるとそれぞれのOddsでの起こりやすさを比較する事ができるようになります。(なので先の$Odds_{A,B}$という表記は正確には$OddsRatio_{A,B}$となります。まあ正直A,Bって書いとけば分かるんですけど一応定義は定義なので…)

ちょっとややこしいので具体例を上げて考えてみましょう。例えばチームAの勝率が.600,チームBが.400だとします。 すると先の定義から$Odds_A = 0.6 / (1-0.6) = 1.5, Odds_B = 0.4 / (1-0.4)=2/3$となり、OddsRatioは $$OddsRatio_{A,B} = \frac{3/2}{2/3}=\frac{9}{4}$$ となります。このOddsRatioから確率を計算すれば、 $$P_{A,B}=Odds_{A,B}/(1+Odds_{A,B})=9/13(\approx 0.69)$$ となり「あー勝率6割のチームだし、平均以下の実力しか無い勝率4割のチームと対戦したら勝つ確率は6割より上になるだろうなぁ」と感覚的にも納得できるんじゃないかと思います。

しかしこの計算には一つ特徴があります。それは、Oddsという指標が起こる確率$P=1/2$を中心として評価しているという点です。

どういう意味かというと、OddsRatioを考えた時、OddsRatioの結果に影響を与えないAやBのOddsを考えると、当然Odds=1の時です。これをOddsの定義式に代入すると $$1 = p/(1-p)\Leftrightarrow p=1/2$$ を得ます。すなわち以下のことが成り立ちます

  • $Odds>1 \rightarrow P>1/2$
  • $Odds<1 \rightarrow P<1/2$

言い換えれば、オッズの大きさの基準は常に確率が1/2の点にあるということです。このため、チームAとBの勝負のような全体の平均を取れば必ず1/2になるような指標では、先のOddsRatioはうまく働きます。なぜなら、Odds同士の割り算をすることで、その値は比率になります。そして比率が1を超えることはすなわち勝利の平均1/2を超えることになるためです。

こんなややこしい説明をした理由は、これをを打率や被本塁打といった平均値が.500ではない指標に対して適用することを考えるときに一筋縄では行かないからです。

例えば、バッターAが打率.400,投手Bが被打率.200であるとしましょう. この時.400は$P_A$に、.200は$Q_B$に相当します。(なぜ$P_B$ではないかというと、Bが勝つということは、すなわち抑えることであって打たれる率すなわち被打率は$1-P_B$に相当するからです) これらを用いてOddsRatioを計算すると $$OddsRatio_{AB}=\frac{(0.4/0.6)}{(0.8/0.2)}=\frac{1}{6}$$ すなわち、期待される打率は$1/(1+1/6)=0.144...$となります。 打率4割のバッターが相手なのに、被打率2割のピッチャーが実力以上の結果を発揮するなんてありえるでしょうか。おかしいですね。

なぜこうなるかというと、この確率の基準が1/2で固定されているからです。いいかえると、チーム勝率4割のチームとチーム勝率8割のチームの対戦とまったくおなじ理論による計算となっているために、このようなおかしな結果になるわけです。普通に考えれば、打率4割というのはかなり傑出した打率ですから、この値は平均以上の値として評価してあげなくてはかわいそうです。

これらを修正するために、リーグ平均の打率($Odds_{LG}$)を導入します。

具体的にどのようにリーグ平均を用いるかというと、$Odds_{LG}$を打者と投手のOdds計算にわり算として追加します。数式として表すと以下のようになります。 $$rOddsRatio_{A,B}=\frac{( \frac{Odds_A}{Odds_{LG}})}{Odds_B}$$ この理由は、Oddsが平均からの突出度を表していることを考えるとイメージしやすいと思います。リーグ平均のOddsでの割り算によって、打者のOddsをリーグ平均からの突出度に変換し、それと投手のヒットを防ぐ能力のOddsで割り算することで、結果としてリーグ平均を考慮した確率を得ることが出来ます。

先の例で言うと、リーグ平均打率を$P_{LG}=0.300$とすれば$Odds_{LG}=0.3/(1-0.3)=3/7$となりますから、修正されたOddsRatioは $$rOddsRatio_{A,B}=\frac{( \frac{Odds_A}{Odds_{LG}})}{Odds_B}=\frac{1}{6}\frac{7}{3}=\frac{7}{18}$$ となり、$rP_{A,B}\doteqdot0.280$となり、感覚的にも良い数値を与えている事がわかります。 あー長かった。

他にもおなじWARを持つチームではOBP(出塁率)とSLG(長打率)どちらが重要視されるべきか、とかリリーバーが良いチームはシミュレータ的にも勝率を上げることが出来る、とか言った興味深い話題がとりあげられているので、そういうの興味がある人は見てみると面白いかも。

今回参考にしたサイトたち
  1. 10 Lessons I Learned from Creating a Baseball Simulator:今回の記事の大本。なんか自分がやりたかったJavaScriptでのかっちょいいシミュレータを作っちゃってるのでちょっとめげてます。
  2. The Odds Ratio Method : TangotigerによるOddsRatioの解説
  3. http://en.wikipedia.org/wiki/Odds_ratio : Wikipedia先生
  4. http://en.wikipedia.org/wiki/Bradley-Terry-Luce
  5. http://en.wikipedia.org/wiki/Elo_rating_system

0 件のコメント:

コメントを投稿