打てる投手がいると得点力はどれくらいあがるのか
AIにコードを書いてもらってシミュレーションしてみます。
カープファンなのでカープの選手たちで打てる投手と打てない投手の時にどれくらい得点力に差が出るのかを見てみます。
方法
・打者の打撃結果をアウト率、四球率、単打率、二塁打率、ホームラン率で規定(三塁打、死球、エラー、犠打、犠飛は無視してパラメータをテキトーに振り分け)
・1番から8番までの打順は固定
・9番の投手を打てる投手と打てない投手にわけてそれぞれの1試合当たりの得点期待値をモンテカルロシミュレーションで出力(1万試合)
・データは1.02 ESSENCE of BASEBALL(DELTA社)から
・Chat GPTに得点期待値のコードをPythonで書いてもらいGoogle colabで計算
2024年度のカープの選手で打順を組みます。
1.秋山(中) 2.野間(右) 3.菊池(二) 4.小園(三) 5.末包(左) 6.坂倉(一) 7.矢野(遊) 8.會澤(捕)
※一塁手がいない(泣)
各選手の成績(アウト率、四球率、単打率、二塁打率、ホームラン率の順)
1.秋山 0.67 0.05 0.24 0.03 0.01
2.野間 0.66 0.10 0.20 0.04 0.00
3.菊池 0.73 0.05 0.16 0.04 0.02
4.小園 0.69 0.05 0.22 0.04 0.00
5.末包 0.72 0.04 0.16 0.05 0.03
6.坂倉 0.67 0.07 0.19 0.04 0.03
7.矢野 0.68 0.09 0.19 0.04 0.00
8.會澤 0.77 0.05 0.14 0.04 0.00
うーん。やっぱり怖さがない打線と感じますね。新しい発見は菊池と末包の打撃スタッツがほぼ同じだったこと。三振率とか守備の貢献度はだいぶ違うと思いますが・・
ここに打てる投手として森下、打てない投手として大瀬良を9番に入れてみます
9.森下 0.74 0.02 0.22 0.02 0.00
9.大瀬良 0.95 0.00 0.05 0.00 0.00
import numpy as np
# 各打者の打撃結果の確率 投手森下パターン
batters_probabilities = {
"Batter1": {"out": 0.67, "walk": 0.05, "single": 0.24, "double": 0.03, "homerun": 0.01},
"Batter2": {"out": 0.66, "walk": 0.10, "single": 0.20, "double": 0.04, "homerun": 0.00},
"Batter3": {"out": 0.73, "walk": 0.05, "single": 0.16, "double": 0.04, "homerun": 0.02},
"Batter4": {"out": 0.69, "walk": 0.05, "single": 0.22, "double": 0.04, "homerun": 0.00},
"Batter5": {"out": 0.72, "walk": 0.04, "single": 0.16, "double": 0.05, "homerun": 0.03},
"Batter6": {"out": 0.67, "walk": 0.07, "single": 0.19, "double": 0.04, "homerun": 0.03},
"Batter7": {"out": 0.68, "walk": 0.09, "single": 0.19, "double": 0.04, "homerun": 0.00},
"Batter8": {"out": 0.77, "walk": 0.05, "single": 0.14, "double": 0.04, "homerun": 0.00},
"Batter9": {"out": 0.74, "walk": 0.02, "single": 0.22, "double": 0.02, "homerun": 0.00}
}
# 固定された打順
batting_order = ["Batter1", "Batter2", "Batter3", "Batter4", "Batter5", "Batter6", "Batter7", "Batter8", "Batter9"]
# シミュレーションパラメータ
num_innings = 9 # 9イニング
simulations = 10000 # 1万回の試行
def simulate_game():
"""1試合分の得点をシミュレーションする"""
score = 0
batter_index = 0 # 打順のインデックス
for _ in range(num_innings):
bases = [0, 0, 0] # [1塁, 2塁, 3塁]
outs = 0
while outs < 3:
batter = batting_order[batter_index] # 現在の打者
result = np.random.choice(
list(batters_probabilities[batter].keys()),
p=list(batters_probabilities[batter].values())
)
if result == "out":
outs += 1
elif result == "walk":
if bases[0] == 1:
if bases[1] == 1:
if bases[2] == 1:
score += 1 # 満塁なら押し出し
bases[2] = 1
bases[1] = 1
bases[0] = 1
elif result == "single":
score += bases[2] # 3塁ランナー生還
bases = [1, bases[0], bases[1]] # 走者進塁
elif result == "double":
score += bases[2] + bases[1] # 2,3塁ランナー生還
bases = [0, 1, bases[0]] # 1塁ランナーは3塁へ
elif result == "homerun":
score += 1 + sum(bases) # すべてのランナーが得点
bases = [0, 0, 0] # 塁をクリア
# 次の打者へ(打順は固定)
batter_index = (batter_index + 1) % 9
return score
# モンテカルロシミュレーションの実行
scores = [simulate_game() for _ in range(simulations)]
# 結果の出力
expected_runs = np.mean(scores)
print(f"1試合あたりの得点期待値: {expected_runs:.2f} 点")
投手森下の場合の1試合当たりの得点期待値:1.99点
投手大瀬良の場合の1試合当たりの得点期待値:1.61点
1試合当たり0.3点の違いがあることがわかりました。
大きな違いといえるかどうかは不明ですが個人的には1点におさえないと勝てない、のか2点まではOKなのかは大きな違いだと感じます。