pybaseballで取得可能なデータや、どのような分析ができるかをシリーズで紹介していきます。
本記事は、pybaseball基礎編②として、シーズン単位のデータ取得について解説します。
前回の記事では、pybaseballの概要やインストール方法、Statcastデータの基本的な取得方法を紹介しました。
今回は一歩進んで、取得したシーズンデータをpandasで加工し、ランキングや選手比較まで行います。
今回の記事では、以下のような分析を題材にします。
- 大谷翔平選手のシーズン成績を確認する
- シーズンの打球速度ランキングを作る
- シーズンの4シーム平均球速ランキングを作る
- 大谷翔平選手が受けた球種の使用割合を調べる
単にデータを取得して終わりではなく、取得したデータを pandas で加工して、ランキングや比較表を作るところまでを本記事のゴールとします。
記事のシリーズ
- pybaseball基礎編① pybaseballのライブラリの概要とインストール
- pybaseball基礎編② シーズン単位のデータ取得【本記事】
- pybaseball基礎編③ 試合単位のデータ取得(予定)
- pybaseball基礎編④ 打席単位のデータ取得(予定)
- pybaseball基礎編⑤ 1球単位のデータ取得(予定)
- pybaseball基礎編⑥ 打球単位のデータ取得(予定)
- pybaseball基礎編⑦ 投球単位のデータ取得(予定)
1. シーズン単位のデータとは?
野球データ分析では、「1試合」や「1打席」だけを見るのではなく、1シーズンを通してどのような成績だったのかを比較することがあります。
例えば、
- 2025年に最も打球速度が速かった選手は誰か
- 大谷翔平選手のxBAは実際の打率とどのくらい違うのか
- 4シームを最も速く投げた投手は誰か
- 大谷選手に対して、相手投手はどの球種を多く投げたのか
- 選手によって打球速度やBarrel%にどのような違いがあるのか
といった分析です。
2. 今回は2025年シーズンを分析する
この記事を公開する2026年9月時点では、2026年シーズンはまだ終了していません。
そのため、記事内の「シーズン比較」では、完了したシーズンである2025年を基本的な分析対象とします。
また、コード中の YEAR を変更すれば、別のシーズンにも同じ考え方で利用できます。
YEAR = 2025
例えば2024年を分析したい場合は、
YEAR = 2024
と変更するだけです。
3. Google Colabで環境を準備する
Google Colabを使用する場合は、まずpybaseballをインストールします。
!pip install -q git+https://github.com/jldbc/pybaseball.git
インストール後、バージョンを確認します。
import sys
import pybaseball
print("Python:", sys.version)
print("pybaseball:", pybaseball.__version__)
記事を書いた時点と、読者がコードを実行する時点ではpybaseballのバージョンが異なる可能性があります。
また、Statcastデータ自体も過去シーズンを含めて更新される場合があります。
そのため、「記事と同じ数字にならない=コードが間違っている」とは限りません。
分析記事では、使用した年と環境を残しておくことが重要です。
4. 大谷翔平選手のシーズン成績を見る
まずは「シーズン単位のデータ取得」のイメージをつかむため、大谷翔平選手の2025年シーズンを見てみます。
ここでは、StatcastのExpected Statsを利用します。
from pybaseball import statcast_batter_expected_stats
YEAR = 2025
expected_stats = statcast_batter_expected_stats(
YEAR
)
ohtani_expected = expected_stats[
expected_stats["last_name, first_name"] == "Ohtani, Shohei"
].copy()
display(ohtani_expected)
出力結果
| index | last_name, first_name | player_id | year | pa | bip | ba | est_ba | est_ba_minus_ba_diff | slg | est_slg | est_slg_minus_slg_diff | woba | est_woba | est_woba_minus_woba_diff |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2 | Ohtani, Shohei | 660271 | 2025 | 727 | 426 | 0.282 | 0.274 | 0.0079999999999999 | 0.622 | 0.649 | -0.027 | 0.418 | 0.425 | -0.007 |
statcast_batter_expected_stats() は、指定したシーズンの打者について、
ba:実際の打率est_ba:期待打率(xBA)slg:実際の長打率est_slg:期待長打率(xSLG)woba:wOBAest_woba:期待wOBA(xwOBA)
などを取得できます。
ここで登場する xBA や xSLG は、実際の結果だけを見るのではなく、打球の質などから「期待される成績」を考えるための指標です。
例えば、
実際の打率 .282
期待打率(xBA) .274
のように比較することで、
「実際の成績と、打球内容から期待される成績に差があるのか?」
という分析につなげられます。
5. 大谷翔平選手の打球速度を見る
次は、Statcastらしいデータを見てみます。
pybaseballには、シーズン単位で打球速度やBarrelなどを取得できる statcast_batter_exitvelo_barrels() があります。
from pybaseball import statcast_batter_exitvelo_barrels
YEAR = 2025
exitvelo = statcast_batter_exitvelo_barrels(
YEAR
)
ohtani_exitvelo = exitvelo[
exitvelo["last_name, first_name"] == "Ohtani, Shohei"
].copy()
display(ohtani_exitvelo)
出力結果
| index | last_name, first_name | player_id | attempts | avg_hit_angle | anglesweetspotpercent | max_hit_speed | avg_hit_speed | ev50 | fbld | gb | max_distance | avg_distance | avg_hr_distance | ev95plus | ev95percent | barrels | brl_percent | brl_pa |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 57 | Ohtani, Shohei | 660271 | 426 | 15.0 | 35.9 | 120.0 | 94.9 | 106.1 | 100.4 | 88.0 | 454 | 196 | 406.0 | 250 | 58.7 | 100 | 23.5 | 13.8 |
このデータには、例えば次のような項目があります。
- avg_hit_speed(平均打球速度)
- max_hit_speed(最高打球速度)
- ev95percent(95mph以上の打球割合) アメリカではHard hit打球と呼び打者の調子を測る指標
- barrels(Barrel数)
- brl_percent(Barrel%)
- avg_hit_angle(平均打球角度)
Barrel数/Barrel%はホームランや長打になりやすい「最高の打球速度と角度の組み合わせ」で打てた数と割合です。
6. 打球速度ランキングを作る
取得したデータを並び替えるだけで、ランキングを作ることができます。
exitvelo_rank = (
exitvelo[
[
"last_name, first_name",
"attempts",
"avg_hit_speed",
"max_hit_speed",
"brl_percent"
]
]
.sort_values("avg_hit_speed", ascending=False)
.reset_index(drop=True)
)
display(exitvelo_rank.head(10))
| index | last_name, first_name | attempts | avg_hit_speed | max_hit_speed | brl_percent |
|---|---|---|---|---|---|
| 0 | Cruz, Oneil | 302 | 95.8 | 122.9 | 17.9 |
| 1 | Judge, Aaron | 388 | 95.4 | 118.1 | 24.7 |
| 2 | Ohtani, Shohei | 426 | 94.9 | 120.0 | 23.5 |
| 3 | Wood, James | 380 | 94.3 | 118.0 | 16.3 |
| 4 | Schwarber, Kyle | 408 | 94.3 | 117.2 | 20.8 |
| 5 | Soto, Juan | 447 | 93.8 | 115.0 | 18.1 |
| 6 | Devers, Rafael | 419 | 93.5 | 114.5 | 16.0 |
| 7 | Alonso, Pete | 471 | 93.5 | 115.9 | 18.9 |
| 8 | Tatis Jr., Fernando | 467 | 93.3 | 113.4 | 10.9 |
| 9 | Olson, Matt | 453 | 93.3 | 114.0 | 14.3 |
これで、2025年シーズンの平均打球速度が高い選手TOP10を確認できます。
大谷選手は3位です。
7. 最高打球速度でランキングする
平均ではなく、「一番速い打球」を比較したい場合は、
max_ev_rank = (
exitvelo[
[
"last_name, first_name",
"attempts",
"max_hit_speed",
"avg_hit_speed",
"brl_percent"
]
]
.sort_values("max_hit_speed", ascending=False)
.reset_index(drop=True)
)
display(max_ev_rank.head(10))
とします。
出力結果
| index | last_name, first_name | attempts | max_hit_speed | avg_hit_speed | brl_percent |
|---|---|---|---|---|---|
| 0 | Cruz, Oneil | 302 | 122.9 | 95.8 | 17.9 |
| 1 | Guerrero Jr., Vladimir | 499 | 120.4 | 92.0 | 12.2 |
| 2 | Ohtani, Shohei | 426 | 120.0 | 94.9 | 23.5 |
| 3 | Marte, Ketel | 400 | 119.6 | 90.8 | 13.5 |
| 4 | Judge, Aaron | 388 | 118.1 | 95.4 | 24.7 |
| 5 | Wood, James | 380 | 118.0 | 94.3 | 16.3 |
| 6 | Naylor, Josh | 465 | 117.9 | 89.2 | 6.7 |
| 7 | Walker, Jordan | 238 | 117.9 | 92.3 | 10.9 |
| 8 | Duran, Jarren | 455 | 117.7 | 91.8 | 9.7 |
| 9 | Witt Jr., Bobby | 505 | 117.5 | 93.3 | 12.5 |
大谷選手はこちらでも3位です。
ここで重要なのは、
.sort_values("avg_hit_speed", ascending=False)
の部分です。
ascending=False にすると、大きい数字から順番に並びます。
逆に小さい順にしたい場合は、
ascending=True
とします。
この「取得 → 必要な列を選択 → 並び替え → 上位を表示」という流れは、今後の野球データ分析でも非常に使いやすいパターンです。
8. 4シーム平均球速ランキングを作る
次は投手側のデータです。
「球速ランキング」と一言で言っても、
- 4シームの平均球速
- 4シームの最高球速
- シンカーの平均球速
- スライダーの平均球速
など、いろいろな定義があります。
今回は、4シーム(FF)のシーズン平均球速ランキングを作ります。
pybaseballには、投手のシーズンごとの球種別平均球速を取得する statcast_pitcher_pitch_arsenal() があります。
from pybaseball import statcast_pitcher_pitch_arsenal
YEAR = 2025
pitcher_arsenal = statcast_pitcher_pitch_arsenal(
YEAR
)
display(pitcher_arsenal.head())
出力結果
| index | last_name, first_name | pitcher | ff_avg_speed | si_avg_speed | fc_avg_speed | sl_avg_speed | ch_avg_speed | cu_avg_speed | fs_avg_speed | kn_avg_speed | st_avg_speed | sv_avg_speed |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Webb, Logan | 657277 | 92.8 | 92.6 | 91.0 | NaN | 86.5 | NaN | NaN | NaN | 84.6 | NaN |
| 1 | Rodón, Carlos | 607074 | 94.1 | 91.9 | 92.4 | 85.9 | 85.0 | 80.3 | NaN | NaN | NaN | NaN |
| 2 | Crochet, Garrett | 676979 | 96.4 | 96.0 | 90.9 | NaN | 87.7 | NaN | 93.1 | NaN | 82.8 | NaN |
| 3 | Gallen, Zac | 668678 | 93.5 | 93.2 | 92.4 | 88.7 | 86.3 | 81.1 | NaN | NaN | NaN | NaN |
| 4 | Fried, Max | 608331 | 95.9 | 94.0 | 93.6 | 85.5 | 85.2 | 75.2 | NaN | NaN | 81.5 | NaN |
取得したデータには、
ff_avg_speed
si_avg_speed
fc_avg_speed
sl_avg_speed
ch_avg_speed
cu_avg_speed
...
のように、球種ごとの平均球速が入っています。
ここで ff は4シーム・ファストボールを表します。
9. 4シーム平均球速ランキングTOP10
4シームを投げている投手について、平均球速の高い順に並べます。
ff_speed_rank = (
pitcher_arsenal[
[
"last_name, first_name",
"pitcher",
"ff_avg_speed"
]
]
.dropna(subset=["ff_avg_speed"])
.sort_values("ff_avg_speed", ascending=False)
.reset_index(drop=True)
)
display(ff_speed_rank.head(10))
出力結果
| index | last_name, first_name | pitcher | ff_avg_speed |
|---|---|---|---|
| 0 | Miller, Mason | 695243 | 101.2 |
| 1 | Henriquez, Edgardo | 683618 | 100.9 |
| 2 | Duran, Jhoan | 661395 | 100.6 |
| 3 | Martinez, Justin | 679885 | 100.0 |
| 4 | Halvorsen, Seth | 678020 | 100.0 |
| 5 | Peguero, Joel | 666711 | 99.9 |
| 6 | Uribe, Abner | 682842 | 99.8 |
| 7 | Palencia, Daniel | 694037 | 99.6 |
| 8 | Greene, Hunter | 668881 | 99.5 |
| 9 | Alvarado, José | 621237 | 99.4 |
これで、
「2025年に4シームを平均で最も速く投げた投手は誰か?」
というランキングを作れます。
10. 大谷翔平選手に対する球種の使用割合を見る
続いて、打者側から見た球種別データを見てみます。
具体的には「相手投手は大谷翔平選手に対して、どの球種を多く投げているのか?」という分析をしてみます。
from pybaseball import statcast_batter_pitch_arsenal
YEAR = 2025
ohtani_arsenal = statcast_batter_pitch_arsenal(
YEAR
)
ohtani_arsenal = ohtani_arsenal[
ohtani_arsenal["last_name, first_name"] == "Ohtani, Shohei"
].copy()
display(ohtani_arsenal)
出力結果
| index | last_name, first_name | player_id | team_name_alt | pitch_type | pitch_name | run_value_per_100 | run_value | pitches | pitch_usage | pa | ba | slg | woba | whiff_percent | k_percent | put_away | est_ba | est_slg | est_woba | hard_hit_percent |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 28 | Ohtani, Shohei | 660271 | LAD | FF | 4-Seam Fastball | 1.6 | 13 | 855 | 29.8 | 209 | 0.258 | 0.602 | 0.398 | 28.4 | 25.8 | 26.3 | 0.283 | 0.715 | 0.446 | 68.4 |
| 423 | Ohtani, Shohei | 660271 | LAD | SI | Sinker | 2.5 | 10 | 394 | 13.8 | 97 | 0.329 | 0.659 | 0.46 | 21.3 | 21.6 | 26.9 | 0.28 | 0.646 | 0.435 | 52.5 |
| 441 | Ohtani, Shohei | 660271 | LAD | CH | Changeup | 2.4 | 9 | 371 | 12.9 | 95 | 0.256 | 0.593 | 0.385 | 35.4 | 31.6 | 24.6 | 0.266 | 0.535 | 0.371 | 50.0 |
| 512 | Ohtani, Shohei | 660271 | LAD | CU | Curveball | 3.6 | 11 | 304 | 10.6 | 87 | 0.304 | 0.58 | 0.442 | 41.9 | 34.5 | 25.4 | 0.254 | 0.529 | 0.404 | 48.7 |
| 552 | Ohtani, Shohei | 660271 | LAD | SL | Slider | 3.2 | 13 | 398 | 13.9 | 83 | 0.329 | 0.729 | 0.494 | 41.7 | 21.7 | 15.0 | 0.293 | 0.707 | 0.455 | 56.6 |
| 1062 | Ohtani, Shohei | 660271 | LAD | FC | Cutter | 1.6 | 4 | 220 | 7.7 | 55 | 0.304 | 0.761 | 0.484 | 32.8 | 18.2 | 22.7 | 0.341 | 0.899 | 0.544 | 69.4 |
| 1113 | Ohtani, Shohei | 660271 | LAD | ST | Sweeper | 1.2 | 2 | 192 | 6.7 | 53 | 0.239 | 0.478 | 0.354 | 41.0 | 34.0 | 26.9 | 0.217 | 0.515 | 0.356 | 60.7 |
このデータには球種ごとの、
- 投球数
- 使用割合
- 打率
- 長打率
- wOBA
- Whiff%
- Run Value
などが含まれます。
特に今回注目するのが、
pitch_usage
です。
これは、各球種がどのくらいの割合で投げられたかを見るための項目です。
11. 大谷翔平選手への球種使用割合をランキングにする
例えば使用割合の高い順に並べると、
pitch_usage_rank = (
ohtani_arsenal[
[
"pitch_name",
"pitch_type",
"pitches",
"pitch_usage",
"ba",
"woba"
]
]
.sort_values("pitch_usage", ascending=False)
.reset_index(drop=True)
)
display(pitch_usage_rank)
出力結果
| index | pitch_name | pitch_type | pitches | pitch_usage | ba | woba |
|---|---|---|---|---|---|---|
| 0 | 4-Seam Fastball | FF | 855 | 29.8 | 0.258 | 0.398 |
| 1 | Slider | SL | 398 | 13.9 | 0.329 | 0.494 |
| 2 | Sinker | SI | 394 | 13.8 | 0.329 | 0.46 |
| 3 | Changeup | CH | 371 | 12.9 | 0.256 | 0.385 |
| 4 | Curveball | CU | 304 | 10.6 | 0.304 | 0.442 |
| 5 | Cutter | FC | 220 | 7.7 | 0.304 | 0.484 |
| 6 | Sweeper | ST | 192 | 6.7 | 0.239 | 0.354 |
これだけで、**「大谷翔平選手が2025年シーズンに、どの球種をどのくらい投げられていたのか」**を確認できます。
12. 球種別の使用割合をグラフにする
表だけでも分かりますが、割合の比較はグラフにするとさらに分かりやすくなります。
import matplotlib.pyplot as plt
plot_data = (
ohtani_arsenal[
[
"pitch_name",
"pitch_usage"
]
]
.sort_values("pitch_usage", ascending=True)
)
plt.figure(figsize=(8, 5))
plt.barh(
plot_data["pitch_name"],
plot_data["pitch_usage"]
)
plt.xlabel("Pitch Usage (%)")
plt.ylabel("Pitch Type")
plt.title("大谷翔平選手に対する球種使用割合(2025年)")
plt.tight_layout()
plt.show()
出力結果

13. シーズン単位データで作れる分析
ここまでのコードを組み合わせると、かなり多くの分析ができます。
打者
- 打球速度ランキング
- 最高打球速度ランキング
- Barrel%ランキング
- xBAランキング
- xSLGランキング
- xwOBAランキング
- 走塁速度ランキング
- 球種別の打率
- 球種別のWhiff%
- 球種別の使用割合
投手
- 4シーム平均球速ランキング
- 球種別平均球速
- 球種別使用割合
- xERAランキング
- 被打球速度ランキング
- 被Barrel%ランキング
- 球種別Whiff%
- 球種別Run Value
といった分析に発展できます。
つまり、シーズン単位のデータを取得できるようになると、選手ランキングや選手比較の記事をかなり作りやすくなります。
14. まとめ
今回は、pybaseballを使ったシーズン単位のデータ取得について解説しました。
この記事で扱った主な関数は次のとおりです。
| 関数 | 主な用途 |
|---|---|
statcast_batter_expected_stats() |
打者のxBA・xSLG・xwOBAなど |
statcast_batter_exitvelo_barrels() |
打球速度・Barrelなど |
statcast_pitcher_pitch_arsenal() |
投手の球種別平均球速 |
statcast_batter_pitch_arsenal() |
打者が受けた球種別成績・使用割合 |
シーズン単位のデータを使えば、
「2025年のMLBで誰が最も速い打球を打ったのか?」
「大谷翔平選手には、どの球種が多く投げられているのか?」
といった、読者が興味を持ちやすいテーマにも発展できます。
次回からは、シーズンよりもさらに細かい単位に降りて、試合ごとのデータを扱っていきます。
次回の記事
次回は、試合単位のデータ取得について解説します。
シーズン単位では分からなかった、
- 特定の試合で大谷選手はどうだったのか
- 1試合の投球内容
- 試合ごとの球速
- 試合ごとの球種
- 試合ごとの打球
といった分析につなげていきます。
データ参照元
本記事では、MLBのStatcastデータを利用しています。
主なデータ参照元は以下のとおりです。
- Baseball Savant / Statcast
- pybaseball公式GitHub
- Baseball Savant Statcast CSV Documentation
Statcastの各項目の詳しい定義については、Baseball Savantの公式ドキュメントを参照してください。
また、Statcastのデータは更新される場合があるため、記事公開後に読者が同じコードを実行した場合、取得結果が記事掲載時と完全に一致しない場合があります。
動作環境
本記事ではGoogle Colabを利用しています。
Pythonとpybaseballのバージョンは、以下のコードで確認できます。
import sys
import pybaseball
print("Python:", sys.version)
print("pybaseball:", pybaseball.__version__)
出力結果
Python: 3.13.15 (main, Aug 6 2026, 11:06:22) [GCC 13.3.0]
pybaseball: 2.2.7
記事を再現する場合は、使用したPythonおよびpybaseballのバージョンを確認してください。