【随時更新】野球シミュレータの概要
ソースコードを公開しました
以下で説明するシミュレータのソースコードをGitHubに公開しています。よかったらぜひ!
シミュレーションの強み
本ブログでは何かしらの検証を行う際に度々、自作した野球シミュレータを使用しています。シミュレーションを行う強みとしては、
- 現実ではあり得ないような状況を想定できる
- 試行数を増やすことでノイズによる影響を小さくできる
の2つが挙げられるかと思います。
例えば「全員が出塁することだけに専念したら得点にどのような影響が出るのか」を調べたいとき、過去にそのような方針をとったチームがあればよいのですが、現実にはおそらく存在せず、実際に起きたことを基にしてその影響を調べることには限界があります。シミュレータを使用することにすることによって、実際にはあり得ないような状況を再現することができ、そのことを通じて野球の構造や性質を知ることができます。
また、十分な試行数を確保できることもシミュレーションの大きな強みです。現実に起きたデータを細かく見れば見るほど、そのデータの大きさは小さくなり、ノイズによる影響が大きくなってしまうため、そこから説得力のある情報を取り出すことが難しくなります。シュミレーションでは試行数を確保することによって、ノイズによる影響を極限まで小さくすることができます。
しかしながら、シミュレーションはシミュレーションでしかなく、シミュレータによって野球を完璧に再現することは不可能です。筆者自身も過信してしまうことがあるので、この部分には細心の注意を払いたいと思います。
野球シミュレータの仕様
野球シミュレータを使用した検証の際の参照用として、野球シミュレータの仕様をまとめておきます。
ブログ中での野球シミュレータとは、筆者が自作した野球シミュレータのことを指します。実際の野球の試合とは違い、攻撃のみを9イニング繰り返します。
1試合を動かす流れの中で、詳しい仕様の説明を行います。なお、主要な現実と違う部分は赤字で示すことにします。
1、打線の決定
1番~9番まで、どのような選手を打線として組むかをユーザーの入力で決定します。なお、1人の選手が持つデータは、
の7つです。
バントは含まれないため、野球シミュレータ上では基本的にバントをしません。
打席数から他の項目の合計を引いた数を「凡打の数」として扱います。データ収集の都合上、この凡打の中に犠牲フライ、失策出塁等が含まれます。
実在の選手を使用したい場合は、NPB等からデータを引っ張ってきて、入力することになります。
2、試合開始
(1)打撃イベントの決定
打者がどのような打撃イベントを起こすかは、打者が持つデータのみに依存します。
そのため投手力や守備力は試合を通してある一定の能力で固定されることになります。
好投手や守備力の高いチームとの対決を想定するときは、打者が持つデータのうち、三振の数を増やしたり、ヒットの数を減らしたりすることで再現します。
各打撃イベントが起きる確率は(あるイベントが起きる数)÷(打席数)で求めることができます。
打者ごとに各打撃イベントが起きる確率を求め、その確率に従ってランダムに打撃イベントを発生させます。
この際注意したいのは、打撃イベントの決定時に、アウトカウントやランナー等の試合状況が考慮されない点です。ランナーなしだろうが、ランナー満塁だろうが、打撃イベントが発生する確率は変化しません。
(2)アウトカウントとランナーがどう変化するかを決定
打撃イベントが発生した際、アウトカウントとランナーがどのように変化するのかを決定する必要があります。
あるアウトカウント、あるランナーの状況、発生した打撃イベント、この3つの情報のみから、打撃イベント発生後のアウトカウントとランナーの状況を決定します。
そのため、打者やランナーの走力は考慮されず、イニング・点差による守備側の守備位置変更等も考慮されません。
アウトカウントとランナーの決定方法についてですが、2016~2017年のNPB公式戦で実際に起きた遷移を集計し、あるアウトカウントとあるランナーに遷移する確率を求めます。そして、その確率に従ってランダムに遷移を発生させます。
なお、打撃イベントが発生したときにのみアウトカウントとランナーの変化があるため、盗塁や牽制死などの、打撃イベント以外でアウトカウントやランナーが変化するようなイベントは起きません。
(3)ループ
(1), (2)を繰り返し、3アウトになったらそのイニングの得点を記録します。
アウトカウントやランナーをリセットしたら、再び(1)(2)を繰り返し、9イニング分実行します。
9イニング分終了したら、試合終了です。
以上が主な野球シミュレータの概要になります。
なお、2018年シーズンにおけるNPBの平均的な打者9人で打線を組み、シミュレータで100万試合を行ったところ、その平均得点は約4.24点を記録しました。
2018年シーズンのNPBの平均得点が約4.30点であることを考えると、ある程度妥当な結果を返していることが言えるかと思います。