- Pythonを使って出塁率(OBP)を計算する方法
- セイバーメトリクスにおけるOBPの意味
- 野球データ分析でOBPを活用する基本的な方法
1. 今回作るもの
出塁率(OBP:On-Base Percentage)は
打者がどれだけ塁に出たかを表す打撃指標です。
安打だけでなく
- 四球
- 死球
も含めて評価するため、打率よりも打者の得点貢献をより正確に反映する指標とされています。
この記事ではPythonを使って次の処理を実装します。
- 野球データを読み込む
- 出塁率(OBP)を計算する
- 結果を確認する
セイバーメトリクス分析では、こうした指標計算を自分で再現できることが重要です。
2. 必要な環境
今回使用する環境は以下です。
- Python 3.x
- pandas
- numpy
- matplotlib(可視化する場合)
野球データ分析では pandas が最もよく使われるデータ分析ライブラリです。
インストールしていない場合は以下のコマンドで導入できます。
pip install pandas numpy matplotlib3. 使用するデータ
出塁率(OBP)は以下のデータを使って計算します。
OBPの計算式
OBPの計算式は次の通りです。
OBP = (H + BB + HBP) / (AB + BB + HBP + SF)意味は次の通りです。
- H:安打
- BB:四球
- HBP:死球
- AB:打数
- SF:犠牲フライ
つまり、
出塁した回数 ÷ 出塁機会
で計算されます。
必要なデータ項目
| データ | 説明 |
|---|---|
| AB | 打数 |
| H | 安打 |
| BB | 四球 |
| HBP | 死球 |
| SF | 犠牲フライ |
データ例
| Player | AB | H | BB | HBP | SF |
|---|---|---|---|---|---|
| Aoki | 500 | 150 | 60 | 3 | 5 |
| Suzuki | 480 | 140 | 40 | 2 | 4 |
| Tanaka | 420 | 120 | 70 | 1 | 3 |
CSVデータとして保存すると次のようになります。
Player,AB,H,BB,HBP,SF
Aoki,500,150,60,3,5
Suzuki,480,140,40,2,4
Tanaka,420,120,70,1,34. データ読み込み
まずはCSVファイルをPythonで読み込みます。
import pandas as pd
df = pd.read_csv("batting_data.csv")コード説明
pandasをインポートread_csv()でCSVデータを読み込む- データは DataFrame として扱われる
読み込んだデータを確認します。
df.head()出力例
| Player | AB | H | BB | HBP | SF | |
|---|---|---|---|---|---|---|
| 0 | Aoki | 500 | 150 | 60 | 3 | 5 |
| 1 | Suzuki | 480 | 140 | 40 | 2 | 4 |
| 2 | Tanaka | 420 | 120 | 70 | 1 | 3 |
DataFrameは、野球のような表形式データの分析に適した構造です。
5. 指標計算
次に出塁率(OBP)を計算します。
df["OBP"] = (df["H"] + df["BB"] + df["HBP"]) / (
df["AB"] + df["BB"] + df["HBP"] + df["SF"]
)コード説明
このコードではDataFrameの列を使ってOBPを計算しています。
分子(出塁回数)
H + BB + HBP分母(出塁機会)
AB + BB + HBP + SF計算結果は OBP列 としてDataFrameに追加されます。
結果を確認してみましょう。
df例
| Player | AB | H | BB | HBP | SF | OBP | |
|---|---|---|---|---|---|---|---|
| 0 | Aoki | 500 | 150 | 60 | 3 | 5 | 0.375000 |
| 1 | Suzuki | 480 | 140 | 40 | 2 | 4 | 0.346008 |
| 2 | Tanaka | 420 | 120 | 70 | 1 | 3 | 0.386640 |
6. 結果確認
出塁率が高い打者を確認してみます。
df[["Player", "OBP"]].sort_values("OBP", ascending=False)出力例
| Player | OBP |
|---|---|
| Tanaka | 0.387 |
| Aoki | 0.375 |
| Suzuki | 0.346 |
このようにすると、出塁能力の高い打者ランキングを簡単に作ることができます。
7. 可視化(任意)
OBPの分布を可視化してみます。
import matplotlib.pyplot as pltplt.hist(df["OBP"])
plt.xlabel("OBP")
plt.ylabel("Players")
plt.title("OBP Distribution")
plt.show()
可視化の意味
ヒストグラムを作ることで
- 打者の出塁能力の分布
- リーグ平均との差
- 上位打者の偏り
などを視覚的に確認できます。
8. 分析での使い方
出塁率(OBP)はセイバーメトリクス分析の基本指標です。
打者評価
打率よりも出塁能力を正確に評価できるため、
- 打者の得点貢献
- 打線の質
を分析する際によく使われます。
OPSの計算
OPSは次の式で計算されます。
OPS = OBP + SLGそのためOBPは、より高度な打撃指標の基礎要素になります。
チーム分析
チーム単位でOBPを分析することで
- チームの出塁力
- 打線構成
- 得点期待値
などを評価できます。
9. まとめ
この記事ではPythonを使って出塁率(OBP)を計算する方法を解説しました。
ポイント
- 出塁率(OBP)は打者の出塁能力を評価する重要指標
- Python + pandasで簡単に計算できる
- セイバーメトリクス分析の基礎となる指標
野球データ分析では
- OPS
- wOBA
- wRC+
などの高度な指標も同じようにPythonで再現できます。
まずは今回のような基本的な指標計算を実装することが、野球データ分析を理解する第一歩になります。
