- OPSがNPBのチーム成績とどの程度関係しているのか
- 出塁率と長打率を統合した指標の意味
- Pythonを使ったチーム打撃指標の簡単な分析方法
1. 導入|Introduction
野球の打撃評価指標として広く使われているものの一つが OPS(On-base Plus Slugging) である。OPSは
- 出塁率(OBP)
- 長打率(SLG)
を単純に足し合わせた指標であり、打者の攻撃力を総合的に評価する指標としてメジャーリーグを中心に広く利用されている。
セイバーメトリクスの研究では、出塁能力と長打力の両方が得点創出に重要であることが知られている。OPSはこの2つを統合することで、打者の攻撃力を簡潔に表現することができる。
しかし、OPSはあくまで経験的に広まった指標であり、リーグ環境が異なる場合でも同様に有効なのかは検証が必要である。
特にNPBはMLBと比較して
- 本塁打数が少ない
- 打撃スタイルが異なる
- 球場特性の影響が大きい
などの特徴を持つ。
そこで本記事では 2025年NPBのチーム打撃データ を用いて、OPSがチーム成績とどの程度関係しているのかを分析する。
2. 分析の問い|Research Question
本記事で検証する問いは次の通りである。
OPSはNPBにおいてもチームの攻撃力および順位と関係する指標なのか?
3. 仮説|Hypothesis
OPSは
- 出塁能力
- 長打力
という得点創出の重要要素を含んでいる。
そのため
OPSが高いチームほどリーグ順位も高くなる傾向がある
と予想される。
4. 使用データ|Data
本記事では以下のデータを使用した。
index | season | team | AB | H | 2B | 3B | HR | BB | HBP | SF | 1B | TB | OBP | SLG | OPS | rank |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2025 | OR | 4913 | 1252 | 198 | 19 | 100 | 384 | 54 | 36 | 935 | 1788 | 0.313718 | 0.363932 | 0.677651 | 3 |
| 1 | 2025 | CD | 4712 | 1092 | 189 | 25 | 83 | 338 | 38 | 26 | 795 | 1580 | 0.287055 | 0.335314 | 0.622369 | 4 |
| 2 | 2025 | EF | 4866 | 1209 | 195 | 31 | 129 | 399 | 46 | 28 | 854 | 1853 | 0.309796 | 0.380806 | 0.690601 | 2 |
| 3 | 2025 | MN | 4790 | 1153 | 199 | 20 | 73 | 337 | 65 | 33 | 861 | 1611 | 0.297608 | 0.336326 | 0.633933 | 6 |
| 4 | 2025 | SE | 4742 | 1102 | 170 | 21 | 80 | 346 | 49 | 34 | 831 | 1554 | 0.289499 | 0.327710 | 0.617209 | 5 |
| 5 | 2025 | CT | 4817 | 1184 | 211 | 21 | 71 | 325 | 44 | 22 | 881 | 1650 | 0.298195 | 0.342537 | 0.640732 | 5 |
| 6 | 2025 | YS | 4742 | 1110 | 202 | 15 | 90 | 383 | 51 | 30 | 803 | 1612 | 0.296581 | 0.339941 | 0.636522 | 6 |
| 7 | 2025 | RA | 4824 | 1179 | 146 | 26 | 70 | 422 | 54 | 46 | 937 | 1587 | 0.309577 | 0.328980 | 0.638557 | 4 |
| 8 | 2025 | DB | 4772 | 1177 | 221 | 15 | 110 | 346 | 56 | 39 | 831 | 1758 | 0.302897 | 0.368399 | 0.671296 | 2 |
| 9 | 2025 | SB | 4785 | 1229 | 186 | 29 | 101 | 436 | 50 | 33 | 913 | 1776 | 0.323341 | 0.371160 | 0.694501 | 1 |
| 10 | 2025 | YG | 4799 | 1198 | 206 | 17 | 96 | 402 | 47 | 27 | 879 | 1726 | 0.312227 | 0.359658 | 0.671886 | 3 |
| 11 | 2025 | HT | 4770 | 1168 | 192 | 24 | 93 | 441 | 41 | 25 | 859 | 1687 | 0.312678 | 0.353669 | 0.666346 | 1 |
- 対象リーグ:NPB(日本プロ野球)
- 対象シーズン:2025年
- サンプル数:12チーム
- データ内容:チーム打撃成績
| 指標 | 内容 |
|---|---|
| OBP | 出塁率 |
| SLG | 長打率 |
| OPS | 出塁率+長打率 |
| rank | リーグ順位 |
OPSは次の式で計算される。
5. 分析方法|Method
本記事では以下の方法で分析を行う。
① OPSと順位の関係
チームOPSと順位を比較する。
② OBPとSLGの分布
出塁率と長打率を2次元平面に配置し、チームの攻撃スタイルを可視化する。
Pythonコード例
import matplotlib.pyplot as plt
# リーグ分類
central = ["YG","HT","CD","YS","DB","CT"]
pacific = ["SB","OR","MN","EF","RA","SE"]
df["league"] = df["team"].apply(lambda x: "Central" if x in central else "Pacific")
# Aクラス / Bクラス
df["class"] = df["rank"].apply(lambda x: "A" if x <= 3 else "B")
# 色設定
league_color = {
"Central": "tab:green",
"Pacific": "tab:cyan"
}
# マーカー設定
class_marker = {
"A": "o",
"B": "x"
}
plt.figure(figsize=(8,6))
# プロット
for _, row in df.iterrows():
plt.scatter(
row["OBP"],
row["SLG"],
color=league_color[row["league"]],
marker=class_marker[row["class"]],
s=80
)
# チームラベル
for i, team in enumerate(df["team"]):
plt.text(df["OBP"][i], df["SLG"][i], r_team_map[team])
# 平均線
plt.axvline(df["OBP"].mean(), linestyle="--")
plt.axhline(df["SLG"].mean(), linestyle="--")
plt.xlabel("OBP[出塁率]")
plt.ylabel("SLG[長打率]")
plt.title("Team Offense Distribution (NPB 2025)")
# 凡例作成
from matplotlib.lines import Line2D
legend_elements = [
Line2D([0], [0], marker='o', color='w', label='Aクラス',
markerfacecolor='gray', markersize=8),
Line2D([0], [0], marker='x', color='gray', label='Bクラス',
linestyle='None', markersize=8),
Line2D([0], [0], marker='o', color='w', label='セリーグ',
markerfacecolor='tab:green', markersize=8),
Line2D([0], [0], marker='o', color='w', label='パリーグ',
markerfacecolor='tab:cyan', markersize=8),
]
plt.legend(handles=legend_elements)
plt.savefig('Team-Offense-Distribution-npb2025.png')
plt.show()結果を確認

このグラフにより
- 出塁型チーム
- 長打型チーム
- バランス型チーム
を視覚的に確認することができる。
6. 分析結果|Results
2025年のチームOPSと順位を整理すると次のようになる。
| Team | OPS | rank |
|---|---|---|
| 福岡ソフトバンクホークス | 0.694501 | 1 |
| 北海道日本ハムファイターズ | 0.690601 | 2 |
| オリックス・バファローズ | 0.677651 | 3 |
| 読売ジャイアンツ | 0.671886 | 3 |
| 横浜DeNAベイスターズ | 0.671296 | 2 |
| 阪神タイガース | 0.666346 | 1 |
| 広島東洋カープ | 0.640732 | 5 |
| 東北楽天ゴールデンイーグルス | 0.638557 | 4 |
| 東京ヤクルトスワローズ | 0.636522 | 6 |
| 千葉ロッテマリーンズ | 0.633933 | 6 |
| 中日ドラゴンズ | 0.622369 | 4 |
| 埼玉西武ライオンズ | 0.617209 | 5 |
このデータから以下の傾向が確認できる。
上位チームはOPSが高い
リーグ上位チームを見ると
- 福岡ソフトバンクホークス
- 北海道日本ハムファイターズ
- オリックス・バファローズ
- 横浜DeNAベイスターズ
- 読売ジャイアンツ
など、OPSが0.67以上のチームが多い。
一方でOPSが低いチームは
- 中日ドラゴンズ
- 埼玉西武ライオンズ
など、比較的順位が低い傾向にある。
OBPとSLGの分布
OBPとSLGの分布を確認すると
- 上位チームは右上に集中
- 下位チームは左下に分布
する傾向が見られる。
右上に位置するチームは
- 出塁率が高い
- 長打率も高い
つまり 総合的な攻撃力が高いチームである。
7. 考察|Discussion
今回の結果から、OPSはNPBにおいても一定の説明力を持つ指標であることが確認できた。
その理由として、OPSが以下の2つの要素を含んでいる点が挙げられる。
出塁能力
出塁率は
- 安打
- 四球
- 死球
を含むため、得点機会を直接増やす。
長打力
長打率は
- 二塁打
- 三塁打
- 本塁打
などの長打を反映する。
長打は一度に複数塁を進めるため、得点効率を高める。
OPSはこの2つを同時に評価できるため、得点力をある程度表現できる指標となっている。
ただしOPSにはいくつかの限界もある。
代表的な問題は
出塁率と長打率を単純に足している点である。
実際の得点価値では
- 出塁率の重要性
- 長打の価値
は完全に同じではない。
そのため、より精密な分析では
- wOBA
- wRC+
などの指標が使用される。
8. 追加分析|Optional
OBPとSLGの分布を4象限に分けると、チームの打撃スタイルを分類できる。
| 象限 | 特徴 |
|---|---|
| 右上 | 強力打線 |
| 左上 | 出塁型チーム |
| 右下 | 長打型チーム |
| 左下 | 攻撃力が低い |
2025年NPBでは
ソフトバンク
が
- 高いOBP
- 高いSLG
を両立しており、典型的な強力打線である。
一方で
- 出塁率は高いが長打が少ないチーム
- 長打は多いが出塁率が低いチーム
など、チームごとの打撃スタイルの違いも確認できる。
このような分析は
- チーム戦略
- 打線構成
を理解する上でも有用である。
9. 結論|Conclusion
2025年NPBのチームデータを分析した結果、
OPSはチーム順位と一定の関係を持つ指標である
ことが確認された。
特に
- 出塁率が高い
- 長打率が高い
チームはリーグ上位に位置する傾向があり、OPSは攻撃力を簡潔に表す指標として有効である。
ただしOPSは単純な合計指標であり、得点価値を完全に表現するものではない。そのため、より精密な分析では他のセイバーメトリクス指標との併用が望ましい。
データの参考
以下のブログから分析に必要なデータを利用させていただきました。
