Pythonによる野球のデータ分析について

Python,イメージ

AI実装検定のご案内

Pythonによる野球のデータ分析は、スポーツアナリティクスの中でも特に人気のある分野です。

打者の成績や投手の投球傾向、チーム戦術の解析など、豊富なデータが活用できるため、初心者から上級者まで幅広い層に親しまれています。

以下では、Pythonを使って野球のデータ分析を行う際の基本的なステップ、主なライブラリ、実例付きのコード、さらに応用的な分析まで、段階を踏んで詳しく解説します。

目次

野球データ分析の全体像

野球に関するデータ分析は大きく次のように分類されます。

分類内容の例
個人パフォーマンス打率、OPS、投手の奪三振率、四球率など
チーム戦略シフトの傾向、得点圏の打率、盗塁のタイミング
試合予測勝敗予測、スコア予測、スタメンの最適化
可視化スプレーチャート、ゾーンヒートマップ

Pythonで使う主要ライブラリ

ライブラリ用途
pandasデータフレーム操作(CSV読み込み、集計など)
numpy数値演算
matplotlib / seabornグラフ描画(ヒートマップ、時系列チャートなど)
scikit-learn機械学習モデル(分類、回帰など)
statsmodels統計モデリング(回帰分析など)
pybaseballMLBのデータ取得(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,イメージ

Pythonによる野球のデータ分析は、豊富なデータソースと多様な解析手法によって、奥深く発展性のある分野です。

初学者はpandasやseabornでの可視化から入り、徐々に統計・機械学習・応用解析へと進むのがおすすめです。

以上、Pythonによる野球のデータ分析についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次