2017年10月7日土曜日

状態遷移確率を用いた野球のマルコフ連鎖モデルの例

野球の解析において何らかの要因からの影響の大きさを推定する方法として、試合をシミュレーションすることが考えられます。シミュレーションは反実仮想的な状況すらも扱うこともできることから、多くの局面で有用です。

ここでは、状態の遷移確率を利用したシミュレーション (マルコフ連鎖モデル) の例についてざっと説明します (主にMarchi and AlbertのChapter. 9を参考にしている)。

このモデルでは、(ランナー+アウトカウント)ごとの状態の移行として試合の進行をモデル化します。

野球の状況は非常に定義しやすく、試合の進行は状態の遷移として表現することが可能です。ありうる状態としては、アウトカウント (0から2の3通り)  x  ランナー状況 (2^3 = 8通り)、で24通りの状態、それに加えて3アウトで25の状態があります。1イニングの得点を推定する場合、ノーアウト、ランナー無しからスタートし、なんらかの確率に従って状態を遷移させていって試合の進行を模式化します。マルコフ連鎖モデルでは、ある状態が次の状態に移行する確率は、どのようにしてその状態に至ったかによって影響を受けないことを仮定しています。

状態遷移の具体例をあげます。
ある打者がノーアウトランナー無しで打席に立った時、その打席が終わった時に、ありうる状態は、
1. 1アウトランナー無し
2. ノーアウト1塁
3. ノーアウト2塁
4. ノーアウト3塁
5. ノーアウトランナーなし (つまりHRで得点が1点入る)
が考えられます。
2011年のMLB全ての打順の平均を例に取ると、これらの状態に移行する確率はそれぞれ、
1. 0.677
2. 0.240
3. 0.050
4. 0.006
5. 0.027
となっています (Marchi and Albert, pp.215)。

打順ごとの能力差を考慮しない2011年成績を利用したモデルであれば、ノーアウトランナー無しからイニングを開始したら、上の確率に従って、新しい状態へと移行させることで1人目の打者の1打席を表現することができます。仮に、ノーアウト1塁に移行したとすると、さらに次の打者の打席では、ノーアウト1塁から新しくとり得る状態とその遷移確率が決まり、ノーアウト1塁からの確率に従って新しい状態へと移していきます。これを繰り返し3アウトに達した時点で、1イニングの終りとなります。その間に記録された得点数を数えると、ある1イニングにおける得点となります。

さらに詳しく、打順を考慮した場合の具体例を示します。

塁上と、0から2アウトの状態を4つの数字で表現します。
例えば、
"000 0": ランナー無し、ノーアウト
"100 0": 1塁、ノーアウト
"000 1": ランナー無し、1アウト
なお、3アウトはランナーを考える意味が無いので一桁の数字で"3"と表す。

# イニング1スタート
"000 0"
# 打者1の確率に従って状態を移行する
# ノーアウト1塁に移行した場合
"100 0"
# 打者2の確率に従って状態を移行する
# 1アウト1塁になった場合
"100 1"
# 打者3; 1アウトランナー無しに移行 (要するにHRが発生した場合)
# 打者+ランナーの総数2が得点として記録される
"000 1"
...略
"110 2"
# 打者8の確率に従って3アウトに移行した場合
"3"
# "3"に達したらイニング1終了
# イニング2スタート
"000 0"
# 打者9; 1アウトに移行した場合
"000 1"
# 打者1に戻る
...略
 "3"
# イニング8が終わったら35%の確率で試合終了
# 65%の確率でイニング9に入る
...略
"3"
# イニング9が終わったら試合終了
# 記録された得点の合計が1試合の得点
 イニング8で35%の確率で試合を終えているのは、公開されているssharpe42氏が書いたcodeで採用されていたため。MLBで9回に進む確率はもう少し低いけど、現実では延長があるのを無視しているので、1試合あたりの得点としてはこんな数字ぐらいを入れておくといいのかもしれない。

 下に実際に計算された1イニングの記録の例を示します。


 各列について、Innはイニング、Slotは打順、State、New_Stateはそれぞれ打者が打席に入った状態と、新しく作った状態 (25の状況を1-25でコードしています)、そしてRunsはその打席で記録された得点を示します。

 先頭の行は、8回の先頭に7番打者が"000 0" (State = 1) で入って、"001 0" (New_state = 4; ランナー3塁) という状況を作ったことを示しています。次に8番は"101 0" (New_state = 16) という状況を作り、9番が"011 1" (New_state = 11) にしています。ここで、1番で"001 2" (New_state = 6)という状況に遷移したので、1点が記録されています。その後、2番がアウトになってイニング終了 ("3", New_state = 25) となりました。

<参考>
M. Marchi and J. Albert, Analyzing Baseball Data with R, 2013, CRC press.
https://github.com/ssharpe42/BaseballMarkov

0 件のコメント:

コメントを投稿