Pythonで出塁率と長打率からチーム攻撃力を分析する|野球データ分析

この記事でわかること Key Points
  • Pythonで出塁率(OBP)と長打率(SLG)を計算する方法
  • OPSの構成要素からチーム打撃力を評価する方法
  • 散布図を使ってチームの攻撃タイプを分析する方法

1. 今回作るもの

野球分析では、チーム全体の攻撃力を評価することが重要です。

よく使われる指標に OPS がありますが、OPSは次の2つの指標から構成されています。

  • 出塁率(OBP)
  • 長打率(SLG)

この記事では OPSそのものではなく、この2つの指標を使ってチーム攻撃力を分析します。

今回のゴールは次の通りです。

  • 野球データを読み込む
  • 出塁率(OBP)を計算する
  • 長打率(SLG)を計算する
  • OBP × SLG の散布図でチーム打撃力を分析する

2. 必要な環境

今回使用する環境は以下です。

  • Python 3.x
  • pandas
  • numpy
  • matplotlib

インストールしていない場合は以下で導入できます。

pip install pandas numpy matplotlib

pandas は データ分析で最もよく使われる Python ライブラリです。

3. 使用するデータ

今回は チーム打撃成績データを使用します。

出塁率と長打率を計算するために、以下の項目が必要です。

データ説明
Teamチーム名
AB打数
H安打
2B二塁打
3B三塁打
HR本塁打
BB四球
HBP死球
SF犠牲フライ

データ例(CSV)

Team,AB,H,2B,3B,HR,BB,HBP,SF
Giants,5400,1500,260,20,170,480,50,45
Tigers,5400,1380,320,30,210,300,30,40
Swallows,5400,1520,210,15,120,620,55,50

このようなCSVファイルを team_batting_data.csv として保存します。

4. データ読み込み

まず CSV データを読み込みます。

import pandas as pd
df = pd.read_csv("team_batting_data.csv")

コード説明

  • read_csv() を使ってCSVデータを読み込む
  • pandas の DataFrame としてデータを扱う

DataFrameは、表形式データを扱うためのデータ構造です。

5. 指標計算

ここでは 長打率(SLG)と出塁率(OBP)を計算します。

単打の計算

まず単打(1B)を計算します。

df["1B"] = df["H"] - df["2B"] - df["3B"] - df["HR"]

総塁打の計算

df["TB"] = (
    df["1B"]
    + df["2B"] * 2
    + df["3B"] * 3
    + df["HR"] * 4
)

出塁率(OBP)

出塁率は次の式で計算します。

OBP=H+BB+HBPAB+BB+HBP+SFOBP=\frac{H+BB+HBP}{AB+BB+HBP+SF​}

Pythonでの実装は次の通りです。

df["OBP"] = (
    df["H"] + df["BB"] + df["HBP"]
) / (
    df["AB"] + df["BB"] + df["HBP"] + df["SF"]
)

長打率(SLG)

df["SLG"] = df["TB"] / df["AB"]

OPS

df["OPS"] = df["OBP"] + df["SLG"]

コード説明

このコードでは次の順番で指標を計算しています。

  1. 単打(1B)を計算
  2. 総塁打(TB)を算出
  3. 出塁率(OBP)を計算
  4. 長打率(SLG)を計算
  5. OPS を算出

OPSは 出塁能力 + 長打力 を同時に評価できるため、
チーム打撃力の比較によく使われます。

6. 結果確認

チームOPSを確認してみましょう。

df[["Team", "OPS"]].sort_values("OPS", ascending=False)

出力例

TeamOPS
Giants0.768
Swallows0.750
Tigers0.739

解釈

この結果から

  • Giants が最も打撃力が高い
  • Swallows が2位
  • Tigers が3位

ということが分かります。

7. 可視化

チーム打撃の特徴を OBP × SLG の散布図で見てみます。

import matplotlib.pyplot as plt

plt.scatter(df["OBP"], df["SLG"])
plt.axvline(df["OBP"].mean(), linestyle="--")
plt.axhline(df["SLG"].mean(), linestyle="--")

for i, team in enumerate(df["Team"]):
    plt.text(df["OBP"][i], df["SLG"][i], team)

plt.xlabel("OBP[出塁率]")
plt.ylabel("SLG[長打率]")
plt.title("Team Offense Distribution")

plt.show()

このグラフで分かること

この図ではチームの打撃タイプが分かります。

例えば

  • 右上 → 出塁も長打も強いチーム
  • 左上 → 長打型チーム
  • 右下 → 出塁型チーム

このように チーム打撃スタイルの分析ができます。

8. 分析での使い方

チーム打撃指標は、さまざまな分析に使われます。

例えば

チーム攻撃力比較

  • シーズンごとの打撃力比較
  • リーグ平均との比較

チームタイプ分析

  • 出塁型チーム
  • 長打型チーム

シーズン分析

  • 打撃力と順位の関係
  • 得点力との相関分析

このように チーム打撃データは戦力分析の基礎データになります。

9. まとめ

この記事では Pythonでチーム打撃力を比較する方法を解説しました。

ポイントを整理します。

  • pandas を使えば野球データを簡単に分析できる
  • OPSを計算するとチーム攻撃力を比較できる
  • Pythonを使うことで野球分析を自分で再現できる

今後は以下のような指標にもチャレンジしてみようと思います。

  • OPS
  • wOBA
  • wRC+