Pythonによる野球のデータ分析は、スポーツアナリティクスの中でも特に人気のある分野です。
打者の成績や投手の投球傾向、チーム戦術の解析など、豊富なデータが活用できるため、初心者から上級者まで幅広い層に親しまれています。
以下では、Pythonを使って野球のデータ分析を行う際の基本的なステップ、主なライブラリ、実例付きのコード、さらに応用的な分析まで、段階を踏んで詳しく解説します。
目次
野球データ分析の全体像
野球に関するデータ分析は大きく次のように分類されます。
分類 | 内容の例 |
---|---|
個人パフォーマンス | 打率、OPS、投手の奪三振率、四球率など |
チーム戦略 | シフトの傾向、得点圏の打率、盗塁のタイミング |
試合予測 | 勝敗予測、スコア予測、スタメンの最適化 |
可視化 | スプレーチャート、ゾーンヒートマップ |
Pythonで使う主要ライブラリ
ライブラリ | 用途 |
---|---|
pandas | データフレーム操作(CSV読み込み、集計など) |
numpy | 数値演算 |
matplotlib / seaborn | グラフ描画(ヒートマップ、時系列チャートなど) |
scikit-learn | 機械学習モデル(分類、回帰など) |
statsmodels | 統計モデリング(回帰分析など) |
pybaseball | MLBのデータ取得(Statcast、Fangraphs等から) |
※ 日本のプロ野球(NPB)のデータは公式APIが少ないですが、スクレイピングや有志の公開データセットで代替可能です。
実例①:打者の成績分析(pandas + seaborn)
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
# 仮のデータ(打者の成績)
data = {
'選手名': ['山田', '佐藤', '鈴木', '中村', '田中'],
'打率': [0.320, 0.275, 0.305, 0.298, 0.290],
'出塁率': [0.410, 0.355, 0.380, 0.370, 0.360],
'OPS': [0.920, 0.820, 0.880, 0.870, 0.850]
}
df = pd.DataFrame(data)
# 可視化:打率とOPSの関係
sns.scatterplot(data=df, x='打率', y='OPS', hue='選手名')
plt.title('打率とOPSの相関')
plt.show()
実例②:投手のゾーンヒートマップ(pybaseball + seaborn)
# ライブラリのインストール(必要であればColabで実行)
!pip install pybaseball --quiet
# 必要なライブラリのインポート
from pybaseball import statcast_pitcher
from pybaseball import cache
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
# キャッシュの無効化(Colabでは必要なことが多い)
cache.enable()
# データ取得:2022年のダルビッシュ有の投球データ(ID: 506433)
# 通信に時間がかかる場合あり。1〜2分待つこともあります。
df = statcast_pitcher('2022-04-01', '2022-09-30', 506433)
# plate_x, plate_z(ストライクゾーン内の座標)が存在するものだけ抽出
strike_zone = df[(df['plate_x'].notna()) & (df['plate_z'].notna())]
# 描画
plt.figure(figsize=(6,6))
sns.kdeplot(
data=strike_zone,
x='plate_x', y='plate_z',
fill=True, cmap='Reds', bw_adjust=0.3, levels=100
)
plt.title('ダルビッシュの投球分布(2022年)')
plt.xlabel('横方向 (plate_x)')
plt.ylabel('縦方向 (plate_z)')
# ストライクゾーン(高さ1.5~3.5、左右-0.95~0.95)を示す線
plt.axhline(3.5, color='black', linestyle='--')
plt.axhline(1.5, color='black', linestyle='--')
plt.axvline(-0.95, color='black', linestyle='--')
plt.axvline(0.95, color='black', linestyle='--')
plt.xlim(-2, 2)
plt.ylim(0, 5)
plt.grid(True)
plt.show()
機械学習を使った勝敗予測の例(scikit-learn)
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 仮の試合データ(簡略化)
data = pd.DataFrame({
'先発投手防御率': [2.31, 4.50, 3.10, 5.20, 2.80],
'チーム打率': [0.270, 0.250, 0.285, 0.240, 0.260],
'ホーム試合': [1, 0, 1, 0, 1],
'勝利': [1, 0, 1, 0, 1]
})
X = data[['先発投手防御率', 'チーム打率', 'ホーム試合']]
y = data['勝利']
# 学習と評価
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = RandomForestClassifier()
model.fit(X_train, y_train)
pred = model.predict(X_test)
print('精度:', accuracy_score(y_test, pred))
応用的なテーマ(上級者向け)
テーマ | 内容 |
---|---|
セイバーメトリクスの導入 | WAR、wOBA、BABIPの計算と分析 |
シミュレーション分析 | モンテカルロ法による試合展開予測 |
クラスタリング分析 | 打者のタイプ分け(コンタクト型、パワー型など) |
ディープラーニング | 投球フォームの画像認識・分類(画像データも必要) |
NPBのデータ取得方法(補足)
NPBのデータは公式にはAPI提供がされていないため、以下の方法で取得します。
- 有志のGitHubリポジトリ(例:npb-data)
- スポナビやNPB公式のスクレイピング(要robots.txt確認)
- 個人ブログや統計解析コミュニティでのCSV配布
- Jupyter Notebook等での再利用を想定した整形
まとめ

Pythonによる野球のデータ分析は、豊富なデータソースと多様な解析手法によって、奥深く発展性のある分野です。
初学者はpandasやseabornでの可視化から入り、徐々に統計・機械学習・応用解析へと進むのがおすすめです。
以上、Pythonによる野球のデータ分析についてでした。
最後までお読みいただき、ありがとうございました。