はじめに
Pythonのライブラリでpybaseballというのがあり、これはMLBが公開しているStatcastのデータらしいので、このデータを使ってデータ解析してみました。
使用ライブラリ
pip install pybaseball pandas matplotlib seaborn
データ解析の目的
今回はヒットになりやすい打球速度と打球角度があるかどうかを調べてみました。
データ解析スクリプト
import pybaseball as pb
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Statcastからデータを取得する期間を設定します(例: 2023年4月1日から2023年4月30日まで)
start_date = '2023-04-01'
end_date = '2023-07-30'
# Statcastデータを取得します
statcast_data = pb.statcast(start_date, end_date)
# 安打かどうかを示す列を作成します
# 安打(シングル、ダブル、トリプル、ホームラン)に該当する場合は1、その他は0
statcast_data['is_hit'] = statcast_data['events'].apply(lambda x: 1 if x in ['single', 'double', 'triple', 'home_run'] else 0)
# 必要な列を抽出し、欠損値を削除します
data = statcast_data[['launch_speed', 'launch_angle', 'is_hit']].dropna()
# データをビン(区間)に分けて、打球速度と角度の組み合わせごとにヒット率を計算します
data['speed_bin'] = pd.cut(data['launch_speed'], bins=10)
data['angle_bin'] = pd.cut(data['launch_angle'], bins=10)
# 各ビンごとのヒット率を計算します(observed=Falseを明示的に指定)
hit_rate = data.groupby(['speed_bin', 'angle_bin'], observed=False).mean().reset_index()
# 最適な打球速度と角度を特定します
best_combination = hit_rate.loc[hit_rate['is_hit'].idxmax()]
print(f"最適な打球速度範囲: {best_combination['speed_bin']}")
print(f"最適な打球角度範囲: {best_combination['angle_bin']}")
# データを可視化します
plt.figure(figsize=(12, 8))
pivot_table = hit_rate.pivot(index='angle_bin', columns='speed_bin', values='is_hit')
sns.heatmap(pivot_table, cmap="YlGnBu", annot=True, cbar=True)
plt.title("Hit Probability by Launch Speed and Launch Angle")
plt.xlabel("Launch Speed (mph)")
plt.ylabel("Launch Angle (degrees)")
plt.show()
結果
すごく当たり前かもしれませんが、打球速度が100mph前後で打球角度が-18°〜54°だとヒットになりやすいことがわかりました。打球速度が85mphを切ると、打球角度によらずヒットになる確率が低くなるので、日本からMLBへ行く打者は100mphの打球速度が出せないと厳しいということなのかも。
感想
APIでアクセスするのかと思いましたが、Pythonのライブラリが提供されていて簡単にデータ解析が始められました。データはダウンロードする必要があり、1ヶ月分くらいは適度な時間でダウンロードできますが、2ヶ月くらいになるとワーニングがでます。長期間のデータ解析をする場合は、1ヶ月単位くらいで細切れにダウンロードしたほうがよいかもしれません。いろいろがんばってたらMLBからデータアナリストとしてのジョブオファーがくるのかもしれない。