この記事でわかること
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 matplotlibpandas は データ分析で最もよく使われる 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)
出塁率は次の式で計算します。
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"]コード説明
このコードでは次の順番で指標を計算しています。
- 単打(1B)を計算
- 総塁打(TB)を算出
- 出塁率(OBP)を計算
- 長打率(SLG)を計算
- OPS を算出
OPSは 出塁能力 + 長打力 を同時に評価できるため、
チーム打撃力の比較によく使われます。
6. 結果確認
チームOPSを確認してみましょう。
df[["Team", "OPS"]].sort_values("OPS", ascending=False)出力例
| Team | OPS |
|---|---|
| Giants | 0.768 |
| Swallows | 0.750 |
| Tigers | 0.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+
