Featured image of post 【pybaseball基礎編②】シーズン単位のデータ取得

【pybaseball基礎編②】シーズン単位のデータ取得

pybaseballを使ってMLBのシーズン単位のデータを取得し、大谷翔平選手の成績、打球速度などを分析する方法を解説します。

pybaseballで取得可能なデータや、どのような分析ができるかをシリーズで紹介していきます。

本記事は、pybaseball基礎編②として、シーズン単位のデータ取得について解説します。

前回の記事では、pybaseballの概要やインストール方法、Statcastデータの基本的な取得方法を紹介しました。

今回は一歩進んで、取得したシーズンデータをpandasで加工し、ランキングや選手比較まで行います。

今回の記事では、以下のような分析を題材にします。

  • 大谷翔平選手のシーズン成績を確認する
  • シーズンの打球速度ランキングを作る
  • シーズンの4シーム平均球速ランキングを作る
  • 大谷翔平選手が受けた球種の使用割合を調べる

単にデータを取得して終わりではなく、取得したデータを pandas で加工して、ランキングや比較表を作るところまでを本記事のゴールとします。

記事のシリーズ

  1. pybaseball基礎編① pybaseballのライブラリの概要とインストール
  2. pybaseball基礎編② シーズン単位のデータ取得【本記事】
  3. pybaseball基礎編③ 試合単位のデータ取得(予定)
  4. pybaseball基礎編④ 打席単位のデータ取得(予定)
  5. pybaseball基礎編⑤ 1球単位のデータ取得(予定)
  6. pybaseball基礎編⑥ 打球単位のデータ取得(予定)
  7. 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:wOBA
  • est_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のバージョンを確認してください。

Hugo で構築されています。
テーマ Stack は Jimmy によって設計されています。