階層ベイズで
プロ野球各球団の
「本当の強さ」を
推定してみる
@who_you_me
2016年
いろいろなことがありました
ショッキングな出来事
http://www.nikkansports.com/baseball/news/1730991.html
(2017年1月8日閲覧)
ちょっと待ってほしい
日本シリーズ勝者 = 一番強いチーム
なのか?
私怨で言ってるんじゃなくて
統計の話がしたいんですよ私は
●
Cの真の勝率が0.6、Fの真の勝率が0.4のと
き、4勝2敗以上の成績でFが勝者となる確率
– 0.1792
私怨で言ってるんじゃなくて
統計の話がしたいんですよ私は
●
「本当はCの方が強い場合でも17.9%の確率で
起こる現象」が実際に起こったからといってF
の方が強いって言えますか奥さん
– フォーマルに言うと「Cの真の勝率が0.6という帰
無仮説を有意水準0.05で棄却できない」
私怨で言ってるんじゃなくて
統計の話がしたいんですよ私は
●
日本シリーズは「先に4勝した方が勝ち」
●
(引き分けを考慮しないと)最大7試合しかな
いので、日本シリーズ勝者 = 真の強者である
と主張することは難しい
そもそも今はクライマックスシリーズがあるので議論はさらに面倒なことに
ではどうすればよいか
ではどうすればよいか
●
半年かけて年間143試合もやっているので、
「シーズン順位(勝率) = 真の強さを反映」
とは言えそう
●
ではシーズン勝率を見ればいいのか?
よくない
よくない理由
●
リーグ間には実力差があるので(パ>>>セ)
異なるリーグ間で勝率を単純に比較することは
できない
●
交流戦はあるが、1チームあたり18試合しかな
いので「交流戦順位 = 真の強さを反映」とも
言えない
– (だからこそ日本シリーズがある)
シーズンの全勝敗情報を活かしつつ、
直接対決が少ないチーム同士でも
実力を比較できるような方法は
ないのだろうか……
ある
ベイズモデリングだ!!!
こんなデータセットを作る
●
1試合が1行の勝敗データ
●
F対Hの対戦成績が15-9のとき、LoserがF、
WinnerがHの行が9個、逆の行が15個ある
こうモデリングする
松浦(2016) p. 189 モデル式10-4を一部改変
こうモデリングする
「ベースの強さ」
●
各チームごとに「ベースの強さ」がある
– 「ベースの強さ」はチームごとに異なる
●
「ベースの強さ」は正規分布に従う
– 「身長は正規分布する」と似たような感じ
チームtの「ベースの強さ」(μt)は平均0、分散σμの正規分布に従う
Tはチーム数(今回は12)
パフォーマンス
●
毎試合「ベースの強さ」どおりのパフォーマン
スが出せるわけではない
●
試合ごとのパフォーマンスは「ベースの強さ」
を平均とする正規分布に従う
g試合目のチームtのパフォーマンスは平均μt(チームtの「ベースの強さ」)、
分散σtの正規分布から生成される
Gは試合数(今回は840)
σtの分布については識別性の話をしなければならなくなるので
ここではスルーさせてください
勝敗
●
パフォーマンスが高い方が勝つ
– パフォーマンスは確率的に決まるので、たまたま
「調子の悪い日」と「調子の良い日」が重なれば、
弱者が強者に勝つこともある
g試合目の勝者(W)のパフォーマンスは、敗者(L)のパフォーマンスを上回っている
引き分けはモデルに組み込むのが大変そうだったので除外しています
再掲
松浦(2016) p. 189 モデル式10-4を一部改変
パラメータを推定する
●
以上のストーリーに沿いモデルを作成
●
実際の勝敗データで学習し、「ベースの強さ」
のパラメータ(と他のパラメータ)を推定する
パラメータの分布についての議論はより高度な知識が必要になるのでここでは割愛し、
事後分布の平均値で点推定しています
σtの推定値についても今回の議論の本筋とはあまり関係がないので割愛します
実際にやってみた
●
データは手入力
– 12x12のセルを埋めるだけなので
●
前処理やグラフ描画はPython
●
パラメータの推定にはStan
– ベイズ推定が得意な確率的プログラミング言語
– PyStanを使ってPythonから扱う
●
pandasでごにょごにょしたデータをまんま渡せて便利
結果
考察
●
リーグの実力差を反映したスコアになっている
– 日本ハム(パ勝率.621) > 広島(セ勝率.631)
– オリックス(パ勝率.407) > 中日(セ勝率.414)
参考文献
東京大学教養学部統計学教室(1992)『自然科学の統計学』
東京大学出版会
松浦健太郎(2016)『StanとRでベイズ統計モデリング』 
共立出版
おしまい

階層ベイズでプロ野球各球団の「本当の強さ」を推定してみる