⚾ 全球野球シミュレーションによる打順及び戦術の研究

💡 本シミュレータの特徴


詳細なビジュアル表示のイメージ例

ダウンロードと結果確認

以下のリンクから実行ファイルおよびHTMLファイルをzip圧縮したファイルをダウンロードできます。
battingordersim20260619.zip 解凍しますと、npbscraper.exe , battingordersim.exe , analyzebunt.exe , viewdetailgame.html , viewlineupranking.html , viewseries.html , viewstats.htmlが出来ますので、任意のフォルダに配置してください。

npbscraper.exe : NPB.jp日本野球機構サイトの公開記録から選手データを参照してExcelファイルを自動生成します(DH制として生成します)。ただし2025年以降のみ対応。執筆時点が2026年のため、2025年および2026年のみ実行確認済です。2024年以前は非対応です。

battingordersim.exe : シミュレーションアプリ本体です。

analyzebunt.exe : バント解析に特化したシミュレーションアプリ本体です。内部的にbattingordersim.exeを実行します。

どれもWindowsのコマンドプロンプトまたはWindows Power Shellで実行できます。--helpオプションで各コマンドラインパラメータの説明が表示されます。

viewdetailgame.html : 1球ごとの詳細な結果detailgame.xmlを表示します。ゲームを行うどの実行モードでも生成されますが、高速化のために初めの1試合のみしか保存されません。全試合はおなじような全球処理は行いますが、どのような内容かを確認するためのサンプルの目的となってます。

viewlineupranking.html : --gameperlineupの打順の全パターン実行のモードで生成されるlineupranking.xmlを表示します。打順ベスト100、ワースト100が表示されます。少ない試合数ですと統計的誤差が大きいですから1打順につき2000試合はやったほうがいいです。時間がかかります。

viewseries.html : --seriesと--save-series指定での複数試合実行モードで結果series.xmlが表示できます。勝率や得失点グラフなどが表示されます。1000試合は5秒程度でシミュレーション実行できます。

viewstats.html : --series指定での複数試合実行モードでの結果stats.xmlが表示できます。viewseries.htmlにも選手スタッツは表示されますが項目数が少ないです。こちらの画面のほうが項目数が多いです。

シミュレーション動作環境

x86系CPUのWindowsのOS上のローカル環境で動作します。コマンドプロンプトもしくはWindows Power Shellでご利用ください。

Windows Power Shellの場合は、./npbscraper.exeや./battingordersim.exeのように./と実行ファイル名の前にパス記述が必要です。

結果確認環境

HTMLファイルの表示はOSを問いません。ブラウザで表示してご利用ください。ローカル環境で動作します。ネット上のサービスは利用しておりません。

実行方法

コマンドプロンプト画面またはWindows Power Shell画面を開きます。
cd 解凍フォルダ
として作業フォルダに移動してください。

※Windows Power Shellでは実行ファイルの前に./を付けて実行してください。

2025年の選手データをダウンロードしてエクセルファイルを作成します。

npbscraper.exe --year 2025

これでroster2025@作成日時.xlsxファイル(主力選手)とroster2025@作成日時others.xlsx(その他の選手)が作成されます。roster2025@作成日時.xlsxファイルのみがシミュレーションで使用する入力ファイルとなります。

各球団ごとにシートが分かれてます。順番はセリーグ、パリーグの順で、順位の順番になってます。

シーズン途中でのデータ取得の場合はその時点までのデータとなります。

このExcelファイルは必要に応じて編集していただいても結構です。本アプリでは主力選手として1チームで出場試合数の多い18人のみが選定されてます。

特に先発ピッチャーはエース級一人と平均的ピッチャー一人の2人のみが主力選手となってます。追加する場合はroster2025@作成日時others.xlsxから選手の行をコピペしてご利用ください。

選手のID番号はチームごとに連番になってます。編集する場合も重複しないようにしてください。

スターティングオーダーの打者9人の役割は”スタメン”となってます。編集する場合は”スタメン”は9人のみとしてください。”スタメン”の守備位置も重複しないようにしてください。

2025年,2026年のセリーグはDH制ではありませんが、DH制としてエクセルファイルは生成されます。

”スタメン”ではない打者は”控え”としてください。

次にシミュレーションを実行します。まずは1試合のみやってみます。対戦する2チームとしてExcelシート名の番号を2つ指定します(セリーグは1から6、パリーグは7から12。順位順となってます)。シミュレーションではDH制のみを扱います。

battingordersim.exe 11 7 --input roster2025@作成日時.xlsx

として実行しますと1ゲームだけの詳細な結果がdetailgame.xmlに保存されます。

結果確認

シミュレーションを実行しますと各種XMLファイルが作成されます。各XMLファイルの表示ができるHTMLファイルがあります。実行モードによって生成されるXMLファイルは異なります。

ブラウザのアドレス欄にHTMLファイルをドロップして表示します。すると、ファイルドロップ枠が表示されますので、指定されたXMLファイルをドロップすると表示されます。

viewdetailgame.htmlの画面にdetailgame.xmlをドロップしますと球場表示での確認ができます。

再生ボタンなどのボタン類がありますので、押すと打者などの状態が遷移します。

スコアボードをクリックしますと任意のイニングへジャンプできます。

一番下に検索パネルがあります。ここで任意のイベントを検索できます。検索結果をクリックすることで該当打席にジャンプできます。


直近1か月のエクセルを作成する方法

2025シーズン開始からシーズン中に頻繁に複数回以下を実行しておいたとします。例えば1週間おきに定期的に実行しておいたとします。

npbscraper.exe --year 2025

を実行していたとしますと、html_cacheというキャッシュフォルダに2025@取得日時というフォルダが作成されていきます。今日も同様に取得したとします。また1か月前に生成したキャッシュ内サブフォルダがあるとします。

シーズン中の場合には公式記録は随時更新されていくため、試合数が増えていくごとに打席数などの数値が増えていきます。

npbscraper.exe --sub 2025@今日の日時 2025@1か月前の日時

--subに続いてhtml_cache内のサブフォルダ名を2つ指定します。

そうしますと、今日のデータから1か月前以上のデータを引き算してデータがマージされます。つまり、直近1か月のデータのみでExcelファイルが生成されます。

出力ファイル名は1つ目のサブフォルダ名_sub_2つ目のサブフォルダ名.xlsxとなります。

この例の場合は1か月でしたがキャッシュのサブフォルダの日付次第で、さまざまな期間のデータを抽出できます。

--addオプションの場合は引き算ではなく足し算を行います。--addまたは--subを指定した場合はキャッシュを利用するため、インターネット上の公式サイトにはアクセスしません。

--subや--addは1つ目に指定したデータに対して、2つ目に指定したデータで引き算/足し算を同じ選手名の行で演算します。各種率に関しては、再計算してます。

ただし、--subの場合は、データ不足となる場合があります。また先発投手や中継ぎ投手などが自動選出されない場合があります。先発投手で30イニング以上、中継ぎ投手で3ホールド以上、抑え投手で1セーブ以上が必要です。

キャッシュを消去するには、エクスプローラでhtml_cache内のサブフォルダを削除してください。

--subや--addオプション指定で、サブフォルダ名を1つのみ指定で実行しますと、キャッシュからエクセルファイルをオフラインで生成します。

実行モード

1試合実行

battingordersim.exe 11 7 --input roster2025@作成日時.xlsx

のように実行します。11 7というのが対戦する2つのチームの番号で、これはエクセルファイルでのチームが掲載されているシート番号です。シート名に番号がありますのでそれを指定します。

はじめに指定したほうのチームが後攻となります。

複数試合実行

battingordersim.exe 11 7 --input roster2025@作成日時.xlsx --series 1000 --save-series

のように実行します。1000試合は5秒程度で実行できます。detailgame.xmlは初めの1試合のみの出力となります。

打順全パータン実行

battingordersim.exe 11 7 --input roster2025@作成日時.xlsx --gameperlineup 2000

のように実行します。デフォルトでは打順1番から6番までのスタメン6人の打順を総当たりで実行します。1パターンにつき上記では2000試合実行します。detailgame.xmlは初めの1試合のみの出力となります。

1パターンにつき2000試合の場合は6の階乗(720パターン)の2000倍の試合数となります。

1パターンにつき1000以下ですと統計的誤差が結構ありますので、あまり結果に信頼性はありません。統計的な誤差を少なくするために2000以上はほしいところです。

--exchangeオプションを使用することで任意の複数の打順番号のみをパターン対象にして計算量を劇的に少なくすることができます。--exchange 345としますと6パターンとなります。

その他のオプション

--list : --inputで指定されたエクセルファイルからチーム名と番号を読み取りダンプします。

--pitcher-aまたは--pitcher-b : はじめ/2番目に指定したチームの先発ピッチャーを指定します。aceであればエース級、backupであれば平均的投手(デフォルト),数値であればエクセルの番号列が一致する投手の指定となります。

--perm-aまたは--perm-b : はじめ/2番目に指定したチームの打順の数値列を指定します。123456789がデフォルトです。213456789としますと、打順1番と2番が入れ替わります。--gameperlineupで全パターン実行する場合、--perm-aで指定した初期打順から全パターンが生成されます。

--exchange : --gameperlineupで全パターン実行する際に、変更対象とする打順位置を指定します。
デフォルトは123456(上位6位置)です。セイバーメトリクス的には下位打者(7,8,9番)の打順変更は得点への影響が小さいため、上位6打者のみの全パターン(6! = 720パターン)を計算することで、計算量を9全パターン(9! = 362,880パターン)から大幅に削減できます。
全パターン実行時には720パターン × ゲーム数となるため、計算時間が各段に短くなります。789と指定すると7,8,9位置のみを変更して3! = 6パターンを生成します。
--perm-aと組み合わせることで、指定した初期打順から、指定位置のみをシャッフルした全パターンを実行できます。

--seed : 番号を指定すると乱数のシード値が変わります。同じ設定で異なる内容の試合を行う場合に使用します。複数試合を自動的に行う場合は内部処理で自動的にシードの番号が連番となります。

--no-steal-aまたは--no-steal-b : はじめ/2番目に指定したチームの盗塁を禁止します。

--no-bunt-aまたは--no-bunt-b : はじめ/2番目に指定したチームのバントを禁止します。

--no-handedness : 打者の左右打ちとピッチャーの左右投げの相性で安打する確率を変更するかどうかの設定です。デフォルトでは変更します。オプション指定で無効にできます。ただし、打者やピッチャーの過去データは使用してません。一般的に右打ち打者は左投げより右投げピッチャーを不得意とする傾向があり、左打ち打者は右投げより左投げピッチャーを不得意とする傾向がありますから、平均的な調整を行ってます。実際は個人によっては逆の傾向となるのですが、本シミュレーションでは一律の調整となってます。

--pattern-limit : 通常は使用しません。--gameperlineupでの実行が時間がかかるパターン数の制限を行うデバッグ用オプションです。数値を指定するとそのパターン数以降は処理しません。

--verbose : 通常は使用しません。デバッグ用のダンプ表示用です。

--dump-order-teamおよび--sort-by : --inputでファイル指定は必要ですが、通常の実行と異なり2チームの番号指定はしません。--dump-order-teamでチーム番号を1つ指定します。--sort-byで打順の構成方法を指定すると、打順の数値列および選手名およびソートに使用した率をダンプします。--perm-aまたは--perm-bで利用できる数値列です。--sort-byには以下のキーワードが使用できます。

batting(打率順), batting-reverse(打率逆順), obp(出塁率順), obp-reverse(出塁率逆順), ops(OPS順), ops-reverse(OPS逆順), slg(長打率順), slg-reverse(長打率逆順), hr(本塁打率順), hr-reverse(本塁打率逆順),sabemetrics(従来型セイバーメトリクス理論順), sabemetrics-reverse(従来型セイバーメトリクス理論逆順)

本シミュレーションで考慮されているイベント

ストライク/ボール/ファウル

四球、死球

打率、長打率、本塁打率、出塁率

防御率

平均投球回数

守備範囲(走力で判定)

エラー、パスボール、ワイルドピッチ

犠牲バント、犠牲フライ、タッチアップ

盗塁、走塁でのランナー走力

シングルヒット、2塁打、3塁打、ホームラン

ダブルプレー

打球方向、ゴロ、ライナー、フライ、ファウルフライ

ピッチャー交代。負けゲーム、勝ちゲーム、点差が離れた勝ちゲームでの交代

球数でのピッチャー交代

代打。打力が低い打者に打力の高い代打

代走。走力の低いランナーに走力の高い代走

本シミュレーションで考慮されていないこと

延長戦。延長戦は常になしで実行されます。つまり9回同点の場合は引き分けとして処理されます。

球速、球種、コース

フィルダースチョイス

エラー率の個人差

ピッチャーの疲労度。1試合内での疲労度も、複数試合での連投の疲労度も考慮されません。

左右打ちと左右投げの選手ごとの相性の個人差

投手と打者の個人的相性

ピッチャーの打席。常にDH制として処理されます。

牽制球

キャッチャーの盗塁阻止率

野手の肩の強さ

カウントによるバットスイングの違い

控え選手、投手の多さ。交代の多さ。限定的な人数でシミュレーションは実行されます。

--exchangeオプションの活用と打順最適化の効率化

本シミュレーションにおいて、全打順パターンの検証は計算量が膨大になるという課題があります。
例えば、スタメン9人の全順列は9! = 362,880パターンです。これに各パターンで複数試合を実行すると、実行時間が非常に長くなります。

打順人数別パターン数一覧

変更対象人数 変更位置 パターン数
9人(全員) 123456789 9! = 362,880
8人(上位8位) 12345678 8! = 40,320
7人(上位7位) 1234567 7! = 5,040
6人(上位6位) 123456 6! = 720
5人(上位5位) 12345 5! = 120
4人(上位4位) 1234 4! = 24
3人(上位3位) 123 3! = 6
2人(上位2位) 12 2! = 2

セイバーメトリクス理論に基づく最適化戦略

従来型セイバーメトリクス理論によりますと、打順の下位の打者(特に7,8,9番)の打順変更は得点への影響が相対的に小さいとされています。全パターンを実行する際に--exchangeオプションで上位打順の123456や12345を指定することで計算量を劇的に減らすことが可能です。。

--exchangeオプションの活用例

実行時間の削減効果

本プロジェクトでの適用例

従来型セイバーメトリクス理論での打順(--dump-order-team --sort-by sabemetricsで得られた打順数値列を--perm-aで指定)を、上位5位置(--exchange 12345)のシャッフルで5000ゲーム実行する場合、5! = 120パターン × 5000ゲーム = 60万ゲームの検証が実現可能になります。この方法により、統計的に十分な信頼性を保ちながら、計算時間を実用的なレベルに抑えることができます。

従来型セイバーメトリクスとの違い

従来のセイバーメトリクスは過去の大量の実績データを元にして、調査対象となる場面に適合するデータを抽出する統計学的調査が必要でした。

そのため過去事例が少ない場合には統計的誤差が大きくなるという問題がありました。

結局、計算シミュレーションと併用する必要がありました。

また、完全に同じ前提での過去事例を得ることが難しいことも問題です。例えば、ノーアウトランナー1塁で犠牲バントをするかどうかは、バントをしたデータとしないデータを比較する必要があります。

ところが、バントをしたデータというのはバントをしたほうがいいと判断した場面であり、バントをしなかったデータというのはバントをしないほうがいいと判断した場合のデータです。対戦チームもピッチャーも異なります。データが導出される前提が異なるのです。

本シミュレーションでは打者や投手の能力値(打率や防御率など)があれば、結果が得られるという点が異なります。バント禁止も戦略として指定できます。

また、従来のセイバーメトリクスでは特定の場面に対しての確率分布は細かく出せるものの、ゲームが進んだ後はどのような影響が出るのかといった、未来の影響まで測ることは困難でした。

本シミュレーションではゲーム全体をそのまま行いますので、ゲーム全体に及ぶ影響も結果に含まれます。

大量の試合数をこなすことにより統計的誤差を小さくすることができます。

必要試合数の算定

シミュレーション結果の信頼性は試合数に大きく依存します。本シミュレーションで要求される試合数は、結果に求める精度(許容誤差)によって異なります。実際のテスト結果から以下のような関係が確認されています。

実験結果:埼玉西武ライオンズ vs 福岡ソフトバンクホークス (2025年の全公式戦データを利用 以降検証も同じ)

異なるシード値での複数実行により、試合数による勝率の安定性を検証。

試合数 シード値 西武勝率 ソフトバンク勝率 勝敗内訳(西武) 平均勝率
10試合 1000001 12.5% 87.5% 1W - 7L - 2D 12.5%
100試合 2000001 33.8% 66.2% 26W - 51L - 23D 33.8%
1,000試合 3000001 31.3% 68.7% 277W - 607L - 116D 31.3%
2,000試合 4000001 32.4% 67.6% 569W - 1188L - 243D 32.4%
5,000試合 5000001 31.1% 68.9% 1365W - 3021L - 614D 31.1%
10,000試合 6000001 30.6% 69.4% 2673W - 6068L - 1259D 30.6%

結果解釈と収束特性

上表から、試合数による勝率の推移が確認できます。10試合から10,000試合への拡大過程で、以下の特性が観察されます:

統計計算式と応用

1. 標準誤差(Standard Error)の計算:

SE = √[p(1-p)/n]

ここで:

例:n=1,000の場合
SE = √[0.306 × 0.694 / 1000] = √0.000212 = 0.0146 = ±1.46%
解釈:1,000試合での勝率観測値は、真の値(30.6%)から約±1.46%のぶれを持つ

2. 信頼区間(Confidence Interval)の計算:

信頼区間 = p ± z × SE

ここで:

例:n=1,000、95%信頼度の場合
下限 = 0.306 - 1.96 × 0.0146 = 0.277 = 27.7%
上限 = 0.306 + 1.96 × 0.0146 = 0.335 = 33.5%
解釈:1,000試合の結果から、「真の勝率は27.7%~33.5%の範囲にある」と95%信頼度で言える

3. 必要試合数(Sample Size)の計算:

n = z² × p(1-p) / E²

ここで:

例:95%信頼度で±2%の精度が必要な場合
n = (1.96)² × 0.306 × 0.694 / (0.02)²
n = 3.8416 × 0.212 / 0.0004 = 2,036試合
解釈:勝率を30.6% ± 2%(28.6%~32.6%)の精度で測定するには、約2,036試合が必要

許容誤差別の必要試合数

許容誤差 必要試合数 信頼度(95%)での意味
±5% (大まかな傾向把握) 約325試合 勝率 25.6% ~ 35.6% の範囲で測定可能
±3% (複数パターン間の差を検出) 約908試合 勝率 27.6% ~ 33.6% の範囲で測定可能
±2% (打順パターン間の有意差を検出) 約2,036試合 勝率 28.6% ~ 32.6% の範囲で測定可能
±1% (高精度な比較) 約8,141試合 勝率 29.6% ~ 31.6% の範囲で測定可能

実務的推奨:試合数の選択

試合数選択ガイドライン(実測データに基づく):

  • --series 100以下:信頼区間が±4~5%と非常に広く、統計的信頼性が低い。予備調査に留める。
  • --series 1,000:信頼区間±1.46%。複数パターン間の大きな差(3%以上)を検出可能。
  • --series 2,000:信頼区間±1.03%。打順パターン間の明確な差(2%以上)を検出可能。大まかな勝率を調べたい検証に最適
  • --series 5,000:信頼区間±0.66%。わずかな打順の差(1.5%程度)でも検出可能。打順検証に最適。
  • --series 10,000:信頼区間±0.46%。最高レベルでの測定。シード値による変動も最小化される。検証結果確定用。

統計的結論:試合数を増やすことで誤差は 1/√n に比例して減少します(nは試合数)。

📋 従来型セイバーメトリクス理論における2番最強打者説

1番打者(リードオフマン)

2番打者(最強打者)

3番打者(クリーンアップの核)

4番打者(長打のある主砲)

5番打者(第2の主砲)

6番打者(第2のリードオフ)

7番・8番・9番打者(下位打線)

📊 --sort-by sabemetrics(従来型セイバーメトリクス理論順)の算出ロジック

オプションで --sort-by sabemetrics を指定した際、シミュレータ内部でどのように打者能力を評価し、1〜9番の初期打順数値列を出力しているかのロジック解説です。一般的なセイバーメトリクスで言われる「打席の多さ」と「得点期待値」を最大化するアルゴリズムに基づいています。

ステップ1:打者の総合貢献度(OPS・出塁率など)でランキングを作成

まず、対象チームのスタメン候補の中から、出塁率(OBP)および長打率(SLG)をベースとした「出塁能力と長打能力のバランス」をもとに打者を序列化します。

ステップ2:重要度の高い打順へ上位選手を配置

セイバーメトリクスにおける「打順の重要度」は、一般的に 2番 > 1番 > 4番 > 3番 > 5番 > 6番 > 7番 > 8番 > 9番(※諸説あり、本システムでの調整ベース)とされます。この重要度と性質に従って、以下のルールで自動配置を行います。

このロジックによって出力された打順(例:743852961)を基準点(--perm-a)とし、そこから --exchange で上位をシャッフルすることで、さらにそのチーム固有の「真のベスト打順」を効率的に探索できるよう設計されています。

ベスト打順 vs ワースト打順 vs セイバーメトリクス理論値の比較検証

gameperlineup 5000 で見つけたベスト打順とワースト打順、さらに従来型セイバーメトリクス理論に基づいた打順について、それぞれ series 10000 での性能を比較検証しました。

実験条件

実験結果:3つの打順の勝率比較

打順パターン 打順配列 seed=1000001 seed=2000001 seed=3000001 平均勝率 従来型セイバーメトリクス順との差
ベスト打順 784532961 32.4% 32.4% 32.7% 32.5% +0.5%
従来型セイバーメトリクス理論値の打順 743852961 31.5% 32.4% 32.1% 32.0% 基準点
ワースト打順 853472961 31.4% 30.9% 31.8% 31.4% -0.6%

結論:gameperlineup による実証的最適化の有効性

本実験により、以下のことが実証されました:

📊 OPS逆順打順の影響検証

OPSの逆順で打順を組み、明らかに悪い戦術がどれだけの悪影響を及ぼすかを検証します。 この結果を従来型セイバーメトリクス理論値の打順および gameperlineup で発見したベスト/ワースト打順と比較することで、 打順最適化の実践的な価値を定量的に証明します。

実験設定

埼玉西武ライオンズ vs 福岡ソフトバンクホークスにおいて、西武の OPS 逆順打順での勝率を30000試合で求めました。勝率は30.9%となりました。

# 西武(OPS逆順): 216359874
battingordersim.exe --input roster2025@20260605114559.xlsx --dump-order-team 11 --sort-by ops-reverse
# 西武 vs ソフトバンク
battingordersim.exe 11 7 --input roster2025@20260605114559.xlsx --perm-a 216359874 --series 30000

OPS逆順と gameperlineup 最適化の比較

OPS逆順はスタメン9人の最悪ケース想定であり、勝率30.9%となりました。前述の1番から5番並び替えでのワースト1での勝率が31.4%と比較して-0.5%となり、打順最適化は勝率に統計的に有意な影響を与えることが証明されました。
しかしながら、実戦で最悪ケースに近い打順を組むことは考えにくく、旧来の考え方での打順でも最適に近い打順になっているものと考えられます。打順最適化効果は限定的であることも確認できました。
本シミュレーションのように短時間でベストケースを算出できるツールは実運用でも有用であると考えられます。

打順最適化の効果:チーム力による検証

検証概要

gameperlineupオプションを用いた大規模シミュレーション分析により、チーム力の拮抗度が打順最適化の効果に与える影響を検証しました。実力差が大きい対戦と拮抗した対戦での差異を明らかにしています。

1. 西武 vs ソフトバンク(実力差が大きい対戦)

実験条件

結果

パターン 勝率(seed別平均) 特性
最良打順 32.8% gameperlineup ランク1
セイバーメトリクス理論値 32.4% ランク20位(中位)
最悪打順 31.2% gameperlineup ランク最下位
最高・最低の差:1.6%

2. 楽天 vs ロッテ(拮抗した対戦)

実験条件

結果

パターン 勝率(seed別平均) 特性
最良打順(634792158) 49.8% gameperlineup ランク1
セイバーメトリクス理論値(943672158) 48.2% 理論値
最悪打順(436792158) 47.6% gameperlineup ランク最下位
最高・最低の差:2.2%

3. 比較分析:実力差による打順効果の変化

対戦 チーム力 最良打順 セイバー値 最悪打順 効果の差
西武 vs ソフト 実力差大(32% vs 68%) 32.8% 32.4% 31.2% 1.6%
楽天 vs ロッテ 拮抗(~50%) 49.8% 48.2% 47.6% 2.2%
重要な発見:拮抗したチーム間では打順の効果がより大きい

楽天 vs ロッテの拮抗した対戦では、最良打順と最悪打順の差が2.2%。一方、西武 vs ソフトバンクの実力差が大きい対戦では、その差が1.6%に留まります。

4. 詳細な分析結果

セイバーメトリクス理論値の位置付け

シード値による変動の安定性

5. 結論:打順最適化の実務的含意

打順最適化の効果はチーム力の拮抗度によって変わる
  1. 拮抗したチーム間では打順が重要

    チーム力が同等に近いほど、わずかな打順の工夫が勝率に大きく影響します。楽天 vs ロッテのような互角な対戦では、2.2%の効果差となり比較的大きな意味を持ちます。

  2. 実力差が大きい場合は他要因が支配的

    西武 vs ソフトバンクのように実力差が大きい場合、チーム全体の実力が結果を決定する大きな要因となり、打順最適化の相対的な重要性は低下します。

  3. gameperlineup による最適化は実力が近いチーム間で特に価値

    打順最適化ツールの活用は、同一リーグ内の拮抗したライバルチーム対戦での競争優位を生む可能性があります。

  4. 従来型セイバーメトリクス理論値の汎用性

    従来型セイバーメトリクスの理論値は、瞬時に算出可能で無難です。

📋 バントと盗塁の効果の検証

検証目的

実力差のある対戦(西武 vs ソフトバンク)と拮抗した対戦(楽天 vs ロッテ)における、 バント禁止、盗塁禁止、での実行結果を比較分析します。 チーム力差によって戦略の効果がどのように異なるかを検証します。

🔬 西武 vs ソフトバンク(実力差が大きい対戦)

西武の視点での戦略効果

基準値勝率:西武 36.7%(311-536-153)、ソフトバンク 63.3%(536-311-153)

# 西武:バント禁止 vs ソフトバンク通常
battingordersim.exe 11 7 --input roster2025@20260605114559.xlsx --no-bunt-a --series 1000

# 西武:盗塁禁止 vs ソフトバンク通常
battingordersim.exe 11 7 --input roster2025@20260605114559.xlsx --no-steal-a --series 1000

# 西武通常 vs ソフトバンク:エース投手
battingordersim.exe 11 7 --input roster2025@20260605114559.xlsx --pitcher-b ace --series 1000

# 西武:バント禁止 vs ソフトバンク:エース投手
battingordersim.exe 11 7 --input roster2025@20260605114559.xlsx --no-bunt-a --pitcher-b ace --series 1000

# 西武:盗塁禁止 vs ソフトバンク:エース投手
battingordersim.exe 11 7 --input roster2025@20260605114559.xlsx --no-steal-a --pitcher-b ace --series 1000
戦略 西武勝率 基準値からの差 143試合での勝敗数差
📊 ソフトバンク通常投手の場合
基準値(ソフトバンク通常投手) 36.7% 基準点 基準点
西武:バント禁止 40.4% +3.7% 約5.3試合改善
西武:盗塁禁止 30.2% -6.5% 約9.3試合低下
🎯 ソフトバンクがエース投手の場合
基準値(ソフトバンク:エース投手) 19.3% 基準点 基準点
西武:バント禁止 22.8% +3.5% 約5.0試合改善
西武:盗塁禁止 15.2% -4.1% 約5.9試合低下

ソフトバンクの視点での戦略効果

基準値勝率:ソフトバンク 66.3%(570-290-140)、西武 33.7%(290-570-140)

# ソフトバンク:バント禁止 vs 西武通常
battingordersim.exe 7 11 --input roster2025@20260605114559.xlsx --no-bunt-a --series 1000

# ソフトバンク:盗塁禁止 vs 西武通常
battingordersim.exe 7 11 --input roster2025@20260605114559.xlsx --no-steal-a --series 1000

# ソフトバンク通常 vs 西武:エース投手
battingordersim.exe 7 11 --input roster2025@20260605114559.xlsx --pitcher-b ace --series 1000

# ソフトバンク:バント禁止 vs 西武:エース投手
battingordersim.exe 7 11 --input roster2025@20260605114559.xlsx --no-bunt-a --pitcher-b ace --series 1000

# ソフトバンク:盗塁禁止 vs 西武:エース投手
battingordersim.exe 7 11 --input roster2025@20260605114559.xlsx --no-steal-a --pitcher-b ace --series 1000
戦略 ソフトバンク勝率 基準値からの差 143試合での勝敗数差
📊 西武通常投手の場合
基準値(西武通常投手) 66.3% 基準点 基準点
ソフトバンク:バント禁止 71.9% +5.6% 約8.0試合改善
ソフトバンク:盗塁禁止 57.3% -9.0% 約12.9試合低下
🎯 西武がエース投手の場合
基準値(西武:エース投手) 41.6% 基準点 基準点
ソフトバンク:バント禁止 49.3% +7.7% 約11.0試合改善
ソフトバンク:盗塁禁止 35.7% -5.9% 約8.4試合低下

🔬 楽天 vs ロッテ(拮抗した対戦)

楽天の視点での戦略効果

基準値勝率:楽天 43.5%(383-498-119)、ロッテ 56.5%(498-383-119)

# 楽天:バント禁止 vs ロッテ通常
battingordersim.exe 10 12 --input roster2025@20260605114559.xlsx --no-bunt-a --series 1000

# 楽天:盗塁禁止 vs ロッテ通常
battingordersim.exe 10 12 --input roster2025@20260605114559.xlsx --no-steal-a --series 1000

# 楽天通常 vs ロッテ:エース投手
battingordersim.exe 10 12 --input roster2025@20260605114559.xlsx --pitcher-b ace --series 1000

# 楽天:バント禁止 vs ロッテ:エース投手
battingordersim.exe 10 12 --input roster2025@20260605114559.xlsx --no-bunt-a --pitcher-b ace --series 1000

# 楽天:盗塁禁止 vs ロッテ:エース投手
battingordersim.exe 10 12 --input roster2025@20260605114559.xlsx --no-steal-a --pitcher-b ace --series 1000
戦略 楽天勝率 基準値からの差 143試合での勝敗数差
📊 ロッテ通常投手の場合
基準値(ロッテ通常投手) 43.5% 基準点 基準点
楽天:バント禁止 50.2% +6.7% 約9.6試合改善
楽天:盗塁禁止 38.1% -5.4% 約7.7試合低下
🎯 ロッテがエース投手の場合
基準値(ロッテ:エース投手) 27.9% 基準点 基準点
楽天:バント禁止 34.3% +6.4% 約9.2試合改善
楽天:盗塁禁止 23.4% -4.5% 約6.4試合低下

ロッテの視点での戦略効果

基準値勝率:ロッテ 51.7%(461-431-108)、楽天 48.3%(431-461-108)

# ロッテ:バント禁止 vs 楽天通常
battingordersim.exe 12 10 --input roster2025@20260605114559.xlsx --no-bunt-a --series 1000

# ロッテ:盗塁禁止 vs 楽天通常
battingordersim.exe 12 10 --input roster2025@20260605114559.xlsx --no-steal-a --series 1000

# ロッテ通常 vs 楽天:エース投手
battingordersim.exe 12 10 --input roster2025@20260605114559.xlsx --pitcher-b ace --series 1000

# ロッテ:バント禁止 vs 楽天:エース投手
battingordersim.exe 12 10 --input roster2025@20260605114559.xlsx --no-bunt-a --pitcher-b ace --series 1000

# ロッテ:盗塁禁止 vs 楽天:エース投手
battingordersim.exe 12 10 --input roster2025@20260605114559.xlsx --no-steal-a --pitcher-b ace --series 1000
戦略 ロッテ勝率 基準値からの差 143試合での勝敗数差
📊 楽天通常投手の場合
基準値(楽天通常投手) 51.7% 基準点 基準点
ロッテ:バント禁止 57.9% +6.2% 約8.9試合改善
ロッテ:盗塁禁止 44.5% -7.2% 約10.3試合低下
🎯 楽天がエース投手の場合
基準値(楽天:エース投手) 31.9% 基準点 基準点
ロッテ:バント禁止 35.7% +3.8% 約5.4試合改善
ロッテ:盗塁禁止 26.3% -5.6% 約8.0試合低下

盗塁の有効性

盗塁禁止時の勝率低下は、逆に盗塁が使用可能な時の価値を示します。つまり、盗塁禁止で-4.9%の悪化が発生するということは、盗塁が実行可能であることで+4.9%の優位性を持つということです。

対戦 チーム 盗塁禁止時の悪化幅 盗塁使用可能時の相対的価値 チーム力による影響
西武 vs ソフトバンク
(実力差32.6%)
西武 -6.5% 盗塁価値:+6.5% 弱いチームにとって盗塁は必須戦術
ソフトバンク -9.0% 盗塁価値:+9.0% 強いチームでも盗塁は重要な選択肢
楽天 vs ロッテ
(実力差8.2%)
楽天 -5.4% 盗塁価値:+5.4% 拮抗チーム間では盗塁が重要
ロッテ -7.2% 盗塁価値:+7.2% 拮抗チーム間では盗塁が重要

バント戦略の効果検証:2000サンプル比較分析

ノーアウト1塁およびノーアウト1塁2塁の状況で、バント実行とバント禁止の戦略効果を定量的に検証しました。 チーム最多バント打者(西武:ID2、ソフトバンク:ID5)を対象に、エース投手対決と平均的投手対決の両シナリオで実施。

分析ツール:analyzebunt.exe

本分析は analyzebunt ツールで実施されました。このツールは、指定した走塁状況でのバント戦略の効果を詳細に検証します。 バント実行モードとバント禁止モード(--no-bunt-a オプション)の両モードを自動実行し、勝率と得点を比較します。

analyzebunt.exe の動作メカニズム

analyzebunt.exe は以下のように動作します:

  1. 1試合実行の反復呼び出し: 内部的に battingordersim.exe の1試合実行を呼び出します。 指定したサンプル数(--target-count)に到達するまで、繰り返し実行を続けます。
  2. detailgame.xml の分析: 各試合終了後、生成された detailgame.xml ファイルを分析します。 指定された走塁状況(ノーアウト1塁、ノーアウト1塁2塁)でのイベントを抽出し、 その回での得点、勝敗、バント成功・失敗などの統計情報を収集します。
  3. バント実行モードの実行: --pitcher-a / --pitcher-b で指定された投手の下で、 バント実行を許可した状態(--no-bunt-a フラグなし)で上記を繰り返します。 特定の選手のみに打者を限定して統計を得ることができます。
  4. バント禁止モードの実行: 同一の投手設定で、battingordersim.exe に --no-bunt-a フラグを付けて実行し、 バントを完全に禁止した状態での統計を収集します。
  5. 結果の集計と出力: 両モードで収集した統計データを集計し、JSON 形式と テキスト形式で出力します。 テキスト形式の出力には、局面別の勝率、得点差、バント成功率などが日本語で記載されます。

analyzebunt.exe - コマンドラインオプション

基本的な使用方法:

analyzebunt.exe [options]

オプション一覧:

オプション 説明
--target-count N 各走塁状況でのサンプル数を指定します。
デフォルト: 100
例:2000 → 2000試合分析
--team-a NUM チームAの番号を指定します(統計対象チーム)。
デフォルト: 11(2025年ではパリーグ5位の埼玉西武ライオンズに該当)
例:7 → ソフトバンク
--team-b NUM チームBの番号を指定します(対戦相手チーム)。
デフォルト: 7(2025年ではパリーグ1位の福岡ソフトバンクホークスに該当)
例:11 → 西武
--batter-id ID 分析対象の打者IDを指定します。
指定しない場合は、すべての打者を対象にします。
例:2 → ID2の打者のみ分析
--input FILE 入力する Excel ファイルのパスを指定します。
このファイルに各チームの選手情報が含まれています。
--pitcher-a ID チームA の先発投手を指定します。
数値(選手ID)または文字列で指定可能:
• "ace" → エース級投手
• "backup" → 平均的投手
• 数値 → 特定の選手ID
--pitcher-b ID チームB の先発投手を指定します。
数値(選手ID)または文字列で指定可能:
• "ace" → エース級投手
• "backup" → 平均的投手
• 数値 → 特定の選手ID
--help ヘルプメッセージを表示して終了します。
--version バージョン情報を表示して終了します。

出力ファイル:

本分析での実行コマンド(4パターン)

以下の4つのコマンドで、バント実行とバント禁止の両モードを分析しました:

1. 西武 (ID2) - エース投手対決
analyzebunt.exe --input roster2025@20260605114559.xlsx --team-a 11 --team-b 7 --batter-id 2 --target-count 2000 --pitcher-a ace --pitcher-b ace

結果:バント実行時 1,902点 → バント禁止時 2,261点(差分:-359点)

2. 西武 (ID2) - 平均的投手対決
analyzebunt.exe --input roster2025@20260605114559.xlsx --team-a 11 --team-b 7 --batter-id 2 --target-count 2000 --pitcher-a backup --pitcher-b backup

結果:バント実行時 2,321点 → バント禁止時 3,062点(差分:-741点)

3. ソフトバンク (ID5) - エース投手対決
analyzebunt.exe --input roster2025@20260605114559.xlsx --team-a 7 --team-b 11 --batter-id 5 --target-count 2000 --pitcher-a ace --pitcher-b ace

結果:バント実行時 1,980点 → バント禁止時 2,922点(差分:-942点)

4. ソフトバンク (ID5) - 平均的投手対決
analyzebunt.exe --input roster2025@20260605114559.xlsx --team-a 7 --team-b 11 --batter-id 5 --target-count 2000 --pitcher-a backup --pitcher-b backup

結果:バント実行時 2,890点 → バント禁止時 4,121点(差分:-1,231点)

打率データ取得のための再現コマンド(battingordersim)

分析に使用した打者とスタメン平均の打率は、以下の2つのコマンドで5000試合シミュレーションを実行し、 生成されたstats.xmlファイルから打率データを抽出しました。

平均的投手対決での打率取得(5000試合)
battingordersim 11 7 --input roster2025@20260605114559.xlsx --series 5000 --save-series --pitcher-a backup --pitcher-b backup

出力ファイル:stats.xml → statsbackup.xml にリネーム

エース投手対決での打率取得(5000試合)
battingordersim 11 7 --input roster2025@20260605114559.xlsx --series 5000 --save-series --pitcher-a ace --pitcher-b ace

出力ファイル:stats.xml → statsace.xml にリネーム

分析対象

チーム 打者ID エース対決での打率 平均的投手対決での打率 バント成功数
打者 スタメン平均 打者 スタメン平均 (全試合)
埼玉西武ライオンズ 2 .186 .233 .246 .258 819回
福岡ソフトバンクホークス 5 .179 .265 .210 .320 820回

先発投手の防御率

シナリオ 西武先発投手 防御率 ソフトバンク先発投手 防御率
エース級 ID14(エース級投手) 1.85(5000試合先発、投球回数 35,612.3) ID14(エース級投手) 1.30(5000試合先発、投球回数 36,883)
平均的投手 ID15(平均的投手) 3.32(5000試合先発、投球回数 33,204) ID15(平均的投手) 1.94(5000試合先発、投球回数 35,736.7)

エース投手対決(西武エース vs ソフバンクエース)

総試合数:西武 123,155試合 / ソフトバンク 102,594試合

バント実行モード

チーム ノーアウト1塁
勝率
ノーアウト1塁2塁
勝率
バント成功 バント失敗 成功率 得点合計
西武(ID2) 639勝-968負-393分
31.9%
703勝-903負-394分
35.1%
3,323回 802回 80.6% 1,902点
ソフトバンク(ID5) 1,121勝-506負-373分
56.0%
1,340勝-356負-304分
67.0%
2,372回 575回 80.5% 1,980点

バント禁止モード

チーム ノーアウト1塁
勝率
ノーアウト1塁2塁
勝率
得点合計
西武(ID2) 662勝-967負-371分
33.1%
807勝-841負-352分
40.4%
2,261点
ソフトバンク(ID5) 1,276勝-435負-289分
63.8%
1,479勝-291負-230分
74.0%
2,922点

平均的投手対決(西武BP vs ソフバンクBP)

総試合数:西武 96,394試合 / ソフトバンク 74,548試合

バント実行モード

チーム ノーアウト1塁
勝率
ノーアウト1塁2塁
勝率
バント成功 バント失敗 成功率 得点合計
西武(ID2) 591勝-1,192負-217分
29.6%
674勝-1,078負-248分
33.7%
4,836回 1,138回 81.0% 2,321点
ソフトバンク(ID5) 1,303勝-481負-216分
65.2%
1,481勝-334負-185分
74.0%
2,309回 585回 79.8% 2,890点

バント禁止モード

チーム ノーアウト1塁
勝率
ノーアウト1塁2塁
勝率
得点合計
西武(ID2) 686勝-1,087負-227分
34.3%
795勝-945負-260分
39.8%
3,062点
ソフトバンク(ID5) 1,420勝-376負-204分
71.0%
1,562勝-291負-147分
78.1%
4,121点

統合分析:バント戦略の効果

対戦シナリオ チーム 得点(実行) 得点(禁止) 得点差
エース対決 西武 1,902 2,261 -359点
ソフトバンク 1,980 2,922 -942点
平均的投手対決 西武 2,321 3,062 -741点
ソフトバンク 2,890 4,121 -1,231点
全体平均 2,273 3,092 -819点
バント禁止戦略の優位性が一貫して確認される

4つのシナリオすべてで、バント実行よりもバント禁止戦略が得点が多くなっています。 平均で819点の差が生じており、これはバント試行が直接的な得点獲得につながりにくいことを示唆しています。

エース対決と平均的投手対決での両方で同じ傾向

ソフトバンクの場合、平均的投手対決でのバント禁止の優位性(-1,231点)がエース対決(-942点)よりやや大きいです。 どちらも投手の質によらずバントをする戦略はマイナス効果であることを示してます。

バント成功率が高くても得点に結びつかない

西武ID2は全試合でバント成功率が80.6~81.0%の高い水準を保っていますが、 バント実行による得点はバント禁止より319~741点も低くなっています。 これは「バント成功 ≠ 得点」という関係を示してます。

バントをしない戦略が有利

既存のセイバーメトリクス理論との違い

従来のセイバーメトリクス理論ではピッチャーがバントをするケースを論じることが多いです。
本シミュレーションはDH制を前提としているため打率の低いピッチャーがバントするケースはありません。
従来のセイバーメトリクス理論では打率が著しく低い打者がバントする場合はバントしない場合よりも得点期待値が高くなるとされてます。また1点をとる場合はバントが有利な戦術であるケースもあるとされてます。
本シミュレーションでは1点をとる場合でもバントはしないほうがいいという結果ですので、既存の理論とは結論が異なります。本シミュレーションで考慮されていない部分の影響かどうかは不明です。

※検証や考察は本シミュレーションから導かれた結果からの推定ですが、実際のゲームとは異なる可能性もあります。