#はじめに
元は、ExcelVBA習得の一環として、
プロ野球のマジックナンバーの算出方法ってどうやっているんだろうと
計算式を追っていったのが始まりです。
処理の流れとしては、
試合日程を生成し、日程に従って試合をシミュレーションしていき、
勝敗の記録から順位の決定とマジックの算出などを行います。
シミュレータとしての使用だけでなく、本来の目的である、
現実のペナントレースの試合数・勝ち数・負け数・引き分け数と残試合数を入力することで、
現時点でのマジックナンバーの算出・自力優勝の検証も行えます。
交流戦を考えていないため、まだ現実のペナントレースからマジックを求めることができません。
元は個人的な野球観戦のツールとして作ったものなので、
自分以外の方が使う場合、意味不明なところもあるかと思います。
コメントを頂ければ、励みになります。
青枠のボタンを使って日程進行や、クリアを行います。
緑枠の部分は、日程作成に関するパラメータです。
デフォルトでは、とりあえず試合数を145試合にしてみたかったため、
総当たり回数29回(1チームがリーグ戦全体で特定の相手と何試合戦うか)、
1カードの試合数3回としています。29×(6-1)=145。
#ダウンロード
dropboxにアップロードしました。
以下のURLからダウンロード可能です。
https://www.dropbox.com/s/u231v34uj2nag99/leagueVBA_0107.xlsm?dl=0
#処理
##日程生成
入力されたチーム名からリーグ戦の日程を生成します。
チーム数が偶数である場合と、奇数である場合で、
日程生成のアルゴリズムが異なるため、その設計が大変でした。
##試合進行
前項で生成した日程表をもとに、試合を行います。
試合におけるチームの得点は、負の二項分布の乱数生成器で算出しています。1
イニングごとの得点を算出していって試合を進行します。2
延長戦と引き分けも考慮しています。
「日程表」シートの得点欄にカーソルを合わせることで、
すでに行われた試合の試合経過をExcelのコメント形式で表示できます。
#今後の課題
##日程生成
- チーム数偶数の場合に、ホームチームが全日程で固定となるチームがある。これは正しくない。野球では、ホームとビジターチームで、延長でサヨナラの機会がある分、ホーム側が有利である。なのでリーグ戦の結果も、この常にホームであるチームが有利となってしまう。
##試合進行
- 年間総得点の確率分布は負の二項分布に近いかもしれないが、年間イニング別得点の確率分布は全く異なる。確率分布の再検討と、乱数生成器の再設計。
- 連勝・連敗に応じて得点力アップや失点増加など考慮したら面白いかも。ただ、本来の目的である、マジックの仕組みが理解できてしまったので、そこまでするモチベーションを維持できるかが課題。
##順位決定
- 2位以降で勝率が同率である場合に、順位に関する規定の2番の条件を適用させていない。
##マジック算出
- 現実世界にある交流戦を考慮していないため、現実のペナントレースの結果からマジックを求めるといったことがまだできないorz
-
負の二項分布を用いた理由は、野球の1チームの1年における合計得点をヒストグラムにして考察しているサイトがあり、その形が負の二項分布に近いかな?と感じたためです。直感で決めてしまったため、確率分布の妥当性は全く考慮していません。その妥当性の検証は、プログラム作成時の目的であるマジックの算出から外れてしまうため、とりあえずは後回しにして開発を行った次第です。 ↩
-
2015年イニング別平均得点をパラメータとして、乱数を生成しています。データは「プロ野球 ヌルデータ置き場」より引用いたしました。(http://lcom.sakura.ne.jp/NulData/)
##順位決定
前項で得られた試合結果をもとに、勝ち負けを記録していき、
順位通りにチームを並び替えます。
勝率が同率である場合の並び替え方法は、
2015年のセ・リーグの順位に関する規定に対応しています。
1.勝利数が多い球団
2.当該球団間の対戦勝率が高い球団
(3.前年度順位が上位の球団)
##マジックナンバー・自力優勝可能性計算
本プログラムの、本来の目的の部分です。
シミュレーションした順位表の各数値、または現実の順位表をもとに、
マジックナンバーと自力優勝を計算します。
1位以外の自力優勝が消滅した場合に、マジック点灯をあらわすような表示にしています。 ↩