SDSC2026  /  MLB 部門 資料

MLB データ収集方法の調査まとめ

スポーツデータサイエンスコンペティション MLB 部門の紹介動画・参加者向け資料のための、データ収集手法の調査整理。

作成日  2026-07-11 用途  SDSC(スポーツデータサイエンスコンペティション)MLB 部門の紹介動画・参加者向け資料

01概要: MLB データの3系統

2025〜2026年時点の MLB データ収集は、次の3系統に分けると整理しやすい。

  1. Statcast / Baseball Savant 系
    投球1球単位のトラッキングデータ(球速・回転数・打球速度・打球角度・xwOBA・スイング速度など約118項目)。MLB 公式の Baseball Savant から CSV 取得でき、Python/R ライブラリも主にここを利用する。MLB 公式用語集では Statcast を「大量の野球データを収集・分析する追跡技術」と説明している(https://www.mlb.com/glossary/statcast )。データは2008年以降(打球トラッキングの充実は2015年以降)。
  2. MLB Stats API 系
    試合日程・ロースター・選手情報・ライブゲームフィード・ボックススコア・プレイ単位データなど。API キー不要の公開 JSON API で、コミュニティ製ラッパー(MLB-StatsAPI 等)経由で使われることが多い。公式に長期安定保証された研究用 API とは言いにくい点に注意。
  3. 集計済み・歴史データ系
    FanGraphs・Baseball-Reference・Retrosheet・Lahman Database など。WAR・wRC+・FIP、過去シーズン成績、プレイバイプレイ、歴史的データの分析に向く。Retrosheet は2025年時点で1910〜2025年の AL/NL プレイバイプレイを収録している。

大学生向けコンペでは、初心者には Baseball Savant CSV または pybaseball / baseballr、発展課題には MLB Stats API、歴史分析には Lahman・Retrosheet という切り分けが実用的である。

02Python でのデータ収集方法

2.1 pybaseball(定番・最有力)

  • 公式ドキュメント:
  • Baseball Savant(Statcast)・Baseball Reference・FanGraphs をまとめてスクレイピングしてくれるパッケージで、MLB データ収集の事実上の標準。Statcast、投手・打者成績、順位、表彰データなどを取得でき、投球単位からシーズン集計まで扱える。
  • 投球1球単位の Statcast データを pandas DataFrame で取得できる。
  • Baseball Savant 側に1クエリ30,000行の制限があるが、pybaseball が自動で分割リクエストして結合してくれる。

向いている用途: Statcast の投球単位データ取得/FanGraphs の打者・投手成績取得/Baseball-Reference 系データ取得/初心者向けのデータ取得演習

注意点

  • 内部的には Web サイトや CSV エンドポイントへのアクセスに依存するため、サイト仕様変更で動かなくなることがある。
  • Statcast は行数が多く、長期間を一度に取得すると時間がかかる。

コード例

python
# pip install pybaseball pandas

from pybaseball import statcast, statcast_batter, playerid_lookup
from pybaseball import batting_stats, pitching_stats

# 期間指定で全球データ取得(team 指定も可)
data = statcast('2025-08-01', '2025-08-07')
sc_lad = statcast("2025-04-01", "2025-04-07", team="LAD")

# 選手IDを調べて特定打者のデータ取得(例: 大谷翔平)
pid = playerid_lookup('ohtani', 'shohei')  # key_mlbam を確認
ohtani = statcast_batter('2025-04-01', '2025-09-30', player_id=660271)

# シーズン打撃・投手成績(FanGraphs 由来)
bat = batting_stats(2025, qual=100)
print(bat[["Name", "Team", "PA", "HR", "AVG", "OBP", "SLG", "WAR"]].head())

pit = pitching_stats(2025, qual=50)
print(pit[["Name", "Team", "IP", "ERA", "FIP", "WAR"]].head())

2.2 MLB-StatsAPI(公式 Stats API のラッパー)

注意点

  • pybaseball よりも「公式試合情報・ライブデータ」に強い。Statcast の詳細な打球・投球トラッキング分析は pybaseball や Baseball Savant の方が使いやすい。
  • PyPI ページにも、MLB や球団とは非提携であり、データ利用は MLB 側の notice に従う旨が書かれている。

コード例

python
# pip install MLB-StatsAPI

import statsapi

# 試合日程・順位表
sched = statsapi.schedule(start_date='2025-07-01', end_date='2025-07-07')
standings = statsapi.standings(season=2025)

# 2026年4月1日のMLB試合日程 → gamePk でボックススコア
games = statsapi.schedule(start_date="2026-04-01", end_date="2026-04-01", sportId=1)
for g in games[:5]:
    print(g["game_id"], g["away_name"], "vs", g["home_name"], g["status"])

game_pk = games[0]["game_id"]
box = statsapi.boxscore_data(game_pk)
print(box["teamInfo"])

2.3 python-mlb-statsapi(新しめの公式 API ラッパー)

2.4 その他の Python パッケージ

03R でのデータ収集方法

3.1 baseballr(定番・最有力)

  • 公式ドキュメント:
  • Bill Petti 作。R で MLB データを取得する中心的パッケージ。MLB Stats API・Baseball Savant(Statcast)・FanGraphs・Baseball Reference・Retrosheet・Chadwick 登録簿(選手 ID 変換)・NCAA(大学野球)・ESPN など広範なソースに対応。
  • wOBA・FIP などセイバーメトリクス指標の計算関数も同梱。CRAN 版は 2026-05 にも更新されており、現在もメンテが続いている。
  • statcast_search() は日付・選手 ID・打者/投手指定ができ、返り値には投球種・球速・打球速度・xwOBA・スイング速度など多数の列が含まれる。mlb_schedule() は MLB およびマイナー等の game_pk を取得できる(MLB は sport_id = 1)。

コード例

r
# install.packages("baseballr")
library(baseballr)
library(dplyr)

# Statcast: 期間指定の全球データ
sc <- statcast_search(start_date = "2025-04-01", end_date = "2025-04-07")
sc %>%
  select(game_date, player_name, pitch_type, release_speed, events) %>%
  head()

# Statcast: 特定打者の期間データ(例: 大谷翔平)
ohtani <- statcast_search_batter(
  start_date = "2025-04-01", end_date = "2025-09-30",
  batterid = 660271
)

# MLB Stats API: 1試合の全投球データ (play-by-play)
pbp <- mlb_pbp(game_pk = 745340)

# MLB Stats API: 日程・game_pk 取得
schedule <- mlb_schedule(season = 2026, level_ids = "1")  # MLB

# FanGraphs: シーズン打撃リーダー
bat <- fg_batter_leaders(startseason = 2025, endseason = 2025)
bat %>%
  select(Season, PlayerName, team_name, PA, HR, AVG, OBP, SLG, WAR) %>%
  head()

3.2 sabRmetrics(新興・研究者発)

  • 公式ドキュメント:
  • 元 Dodgers アナリストの Scott Powers 作(2024年公開)。Baseball Savant と MLB Stats API からのダウンロードに特化し、正規化された複数テーブルで返す設計。
  • 投手のアームアングルなど最新の公開項目にも追随。塁・アウト状況ごとの得点期待値やカウント価値の推定、投球軌道の復元など研究向け機能あり。
  • インストール: devtools::install_github("saberpowers/sabRmetrics")
r
data <- sabRmetrics::download_baseballsavant(
  start_date = "2025-07-01", end_date = "2025-07-07"
)

3.3 Lahman パッケージ(歴史データ)

  • 公式ドキュメント:
  • 1871年以降の打撃・投手・守備・順位・チーム成績を収録した Lahman Database の R パッケージ版。インストールするだけで data.frame として使えるため、初学者の演習素材として最適。SQL/データベース教育や正規化されたテーブル構造の学習、長期トレンド分析にも向く。
  • 収録年に関する注記(両調査の食い違いの整理): CRAN パッケージ版 Lahman 14.0-0 は「1871〜2024年」を収録する一方、SABR で配布される生データの2025年版(2026-01-02 リリース)は「1871〜2025年」を収録する。パッケージ版への最新シーズン反映はリリースサイクルの都合で遅れるため、両方の記述は矛盾せず両立する。最新シーズンが必要な場合は SABR 配布の生データ(CSV/SQLite)を使う。
  • Statcast のような1球単位・打球速度・回転数データは含まない。

コード例

r
# install.packages("Lahman")
library(Lahman)
library(dplyr)

# 2024年の打者本塁打ランキング
Batting %>%
  filter(yearID == 2024) %>%
  group_by(playerID) %>%
  summarise(HR = sum(HR), AB = sum(AB), .groups = "drop") %>%
  arrange(desc(HR)) %>%
  left_join(People, by = "playerID") %>%
  select(playerID, nameFirst, nameLast, AB, HR) %>%
  head(10)

3.4 baseballr + Retrosheet(プレイ単位の歴史分析)

  • 公式ドキュメント:
  • Retrosheet は長期のプレイバイプレイ・ボックススコアデータを提供する重要ソース。baseballr::retrosheet_data() で取得・整形できるが、Chadwick CLI の cwevent が事前に必要(公式ドキュメントに明記)。
  • 打席・プレイ単位の歴史分析、得点期待値・勝率期待値・走塁・守備イベント分析、Statcast 以前の時代を含む分析に向く。

Chadwick CLI のインストール方法

r
library(baseballr)

# Chadwick CLI を事前にインストールしておく(上記参照)
chadwick_path()  # インストール確認

retro <- retrosheet_data(years_to_acquire = 2024)
events_2024 <- retro$events
head(events_2024)

3.5 参考ブログ

  • Exploring Baseball Data with R: https://baseballwithr.wordpress.com/ — baseballr / sabRmetrics / Retrosheet の実践記事が豊富(『Analyzing Baseball Data with R』著者陣)。

04その他の手法(API 直叩き・CSV ダウンロード・スクレイピング)

4.1 MLB Stats API を直接叩く

  • 公式ドキュメント:
  • API キー不要の JSON API。requests(Python)や httr2(R)で直接取得可能。ラッパーに無い項目もこれで取れる。meta エンドポイントでは awards・eventTypes・gameStatus・pitchTypes・positions などの値を取得できる。
  • ライブラリに依存しない直叩きは、「API とは何か」を教える教材、必要な項目だけの抽出、ライブラリ不具合時の代替、再現性の高い取得スクリプト作成に有用。
  • 利用は個人・非商用の分析用途に限る点に注意(MLB の利用規約)。

代表的なエンドポイント例

text
https://statsapi.mlb.com/api/v1/schedule?sportId=1&startDate=2026-04-01&endDate=2026-04-01
https://statsapi.mlb.com/api/v1/teams?sportId=1
https://statsapi.mlb.com/api/v1/people/{personId}
https://statsapi.mlb.com/api/v1.1/game/{gamePk}/feed/live
https://statsapi.mlb.com/api/v1/game/{gamePk}/boxscore

コード例: 日程取得(requests + pandas)

python
# pip install requests pandas

import requests
import pandas as pd

url = "https://statsapi.mlb.com/api/v1/schedule"
params = {
    "sportId": 1,
    "startDate": "2026-04-01",
    "endDate": "2026-04-01",
    "hydrate": "team,linescore"
}

res = requests.get(url, params=params, timeout=30)
res.raise_for_status()
data = res.json()

rows = []
for date_block in data.get("dates", []):
    for game in date_block.get("games", []):
        rows.append({
            "gamePk": game["gamePk"],
            "date": game["gameDate"],
            "away": game["teams"]["away"]["team"]["name"],
            "home": game["teams"]["home"]["team"]["name"],
            "status": game["status"]["detailedState"],
        })

df = pd.DataFrame(rows)
print(df.head())

コード例: ライブゲームフィード取得

python
import requests

game_pk = 746001  # 実際のgamePkに置き換える
url = f"https://statsapi.mlb.com/api/v1.1/game/{game_pk}/feed/live"

data = requests.get(url, timeout=30).json()

print(data["gameData"]["datetime"]["officialDate"])
print(data["gameData"]["teams"]["away"]["name"])
print(data["gameData"]["teams"]["home"]["name"])

運営者向け注意

  • API キー不要で取得できるエンドポイントが多い一方、公式に長期安定保証された研究用 API とは言いにくい。コンペ資料では「エンドポイント仕様は変わる可能性がある」と明記するのが安全。
  • 大量アクセスは避け、キャッシュ済み CSV を配布する方が参加者に優しい。

4.2 Baseball Savant の CSV ダウンロード

  • 公式ドキュメント:
  • Statcast Search で投球単位・試合単位・選手単位・チーム単位・シーズン単位の条件検索をし、画面から CSV を直接ダウンロードできる。プログラミング不要なので、コンペ初心者への導入として使いやすい。
  • CSV 仕様書には pitch_typegame_daterelease_speed などの列説明がある。

メリット: ブラウザだけで取得できる/初心者向け/CSV をそのまま Excel・R・Python で読める/コンペ配布用データを作りやすい

デメリット: 1クエリ30,000行の制限があり大量データは期間分割が必要/クエリ条件を記録しないと再現性が落ちる/手作業ダウンロードは更新に弱い

CSV を読む例

python
import pandas as pd
df = pd.read_csv("statcast_2025_april.csv")
print(df[["game_date", "player_name", "pitch_type", "release_speed", "launch_speed"]].head())
r
library(readr)
library(dplyr)
df <- read_csv("statcast_2025_april.csv")
df %>%
  select(game_date, player_name, pitch_type, release_speed, launch_speed) %>%
  head()

4.3 Retrosheet の CSV 一括ダウンロード

  • 公式ドキュメント: https://www.retrosheet.org/
  • ほぼ全史の試合の play-by-play をボランティアが復元した無料データ(1910〜2025年の AL/NL プレイバイプレイを収録)。
  • 近年は CSV 形式での配布が始まり、専用ツール(Chadwick)なしで全シーズン一括ファイル(約1,585万レコード・約20万試合)が入手可能になった。

4.4 静的データベース(一括 DL 系)

4.5 Web スクレイピング

FanGraphs・Baseball-Reference・Spotrac などの Web ページから表を読む方法。

python
import pandas as pd

url = "https://www.baseball-reference.com/leagues/majors/2025-standard-batting.shtml"
tables = pd.read_html(url)

batting = tables[0]
print(batting.head())

注意点

  • robots.txt・利用規約・アクセス頻度(待機時間)に注意。
  • ページ構造変更に弱い。JavaScript 描画や Cloudflare 等で取得できない場合がある。
  • 有料・会員限定データをスクレイピングして再配布するのは避けるべき。
  • コンペ運営では、参加者に直接スクレイピングさせるより、運営側がライセンス確認済みデータを配布する方が安全。

05よく使われている MLB データサイト一覧

5.1 英語サイト

サイトURL主なデータ・特徴料金
Baseball Savant baseballsavant.mlb.com MLB 公式の Statcast データ検索・可視化・CSV ダウンロード。トラッキングデータの本丸。2026年時点では Bat Tracking や Swing Timing などの新しい指標も扱う 無料
MLB.com Stats mlb.com/stats 公式の基本スタッツ・リーダーボード 無料
MLB Stats API statsapi.mlb.com (docs: docs.statsapi.mlb.com 公式 JSON API。日程・試合・選手・ロースター・ライブフィード。キー不要のエンドポイント多数。仕様変更リスクあり 無料 (非商用)
FanGraphs fangraphs.com WAR・wRC+・FIP などセイバー指標が最充実。リーダーボードの CSV 出力可。プロスペクト・RosterResource も 基本無料 (会員は2026年時点で月15ドル・年80ドル等)
Baseball Reference baseball-reference.com 歴史データの百科事典。標準成績・WAR・カウント別などの細かい集計。統計表のエクスポート可 基本無料 (Stathead は有料)
Retrosheet retrosheet.org 全史 play-by-play・ボックススコアの無料配布。1910〜2025年の AL/NL プレイバイプレイ。CSV 対応 無料
Lahman Database sabr.org/lahman-database 1871年以降のシーズン集計 DB(打撃・投球・守備・順位等)。R パッケージ版あり 無料
Baseball Databank github.com/chadwickbureau/baseballdatabank Lahman 系の GitHub 配布版 無料
Baseball Prospectus baseballprospectus.com PECOTA・DRA・DRC+ など独自指標・予測・分析記事。PECOTA 詳細ダウンロードは Premium 以上が必要 一部無料・
Spotrac spotrac.com 年俸・契約データ 基本無料

5.2 日本語サイト・情報源

サイトURL特徴料金
MLB 公式 日本語版 mlb.com/ja 公式ニュース・スタッツの日本語版。生データ分析というより試合・選手情報確認向け 無料
スポーツナビ MLB baseball.yahoo.co.jp/mlb 日本語での MLB 試合速報・個人成績 無料
1.02 Essence of Baseball (DELTA) 1point02.jp WAR・UZR 等のセイバーメトリクス指標の日本語データベース・分析コラム。NPB 中心だが指標を日本語で学ぶ入口として有用 無料会員 + 有料プラン
プロ野球データFreak baseball-data.com NPB のセイバー指標を無料公開(NPB との比較素材に) 無料
スタメンデータベース sta-men.jp NPB のスタメン記録(NPB 側の素材) 無料
Lean Baseball (blog) shinyorke.hatenablog.com Statcast データの日本語入門記事(Baseball Savant CSV 項目の日本語解説 statcast-csv-docs-ja など)。野球×データサイエンスの定番ブログ 無料
鯖茶漬 (note) note.com/nana_metrics Baseball Savant の使い方(CSV 取得編・Search 機能編)を日本語で丁寧に解説(例: nc74cd3d95f16 無料
note の MLB データ解説記事 note.com FanGraphs や Baseball Savant を巡回する使い方の紹介記事など(例: n15f9ba110dcb 無料/有料混在
Zenn: スポーツデータサイト一覧 (野球編) zenn.dev/genki_morph/articles/485bc82ffe975b 野球データサイトの日本語まとめ記事 無料
Qiita: セイバーメトリクスで利用できる MLB データ qiita.com/RWKiryu/items/d8de38004d369edaa53b R での MLB データ利用の日本語解説。同著者による Baseball Savant CSV ダウンロード解説 8337b3eee0983458ce9b 無料
We Love Baseball まとめ wlbaseball.com/4421 NPB・MLB データサイトの保存版まとめ 無料

※日本語圏のデータベースサイトは NPB 中心のものが多く、MLB の生データ取得は英語サイト(Baseball Savant 等)+ 日本語解説記事の組み合わせが実用的。

06けが・手術データ(トミー・ジョン手術・IL)

6.1 トミー・ジョン手術リスト

Jon Roegele 氏の「Tommy John Surgery List」(Google スプレッドシート)が事実上の決定版。

python
import pandas as pd
url = "https://docs.google.com/spreadsheets/d/1gQujXQQGOVNaiuwSN680Hq-FDVsCwvN-3AazykOBON0/export?format=csv&gid=0"
tj = pd.read_csv(url)

6.2 IL (故障者リスト) 入りのデータ

※DL (Disabled List) は2019年に IL (Injured List) へ改称。

ソースURL特徴料金
MLB Stats API /transactions statsapi.mlb.com/api/v1/transactions?startDate=...&endDate=... IL 入り・復帰を含む全トランザクション。10日/60日 IL の別と故障内容が description に入る。期間・チーム・選手で絞り込み可。キー不要 無料
Pro Sports Transactions prosportstransactions.com 歴史的な DL/IL 移動の検索データベース。多くの研究・データセットの元ネタ 無料
Spotrac Injured Tracker spotrac.com/mlb/injured シーズン別にチーム・選手・故障理由別の欠場日数・欠場給与額まで集計済み 閲覧無料 (一部premium)
GitHub: robotallie/baseball-injuries github.com/robotallie/baseball-injuries Pro Sports Transactions から収集した 2000〜2016年の DL データ CSV (約18,000行) 配布 無料
Baseball Heat Maps DL Data baseballheatmaps.com/disabled-list-data MLB.com トランザクション由来の 2010〜2016年 DL データ 無料
FanGraphs RosterResource Injury Report fangraphs.com/roster-resource/injury-report 現在進行中の故障者状況 (速報系) 無料
MLB.com Injury Report mlb.com/injury-report 公式の現在の故障者情報 無料

プログラムでの取得例 (公式 API 経由・全 IL 移動を期間指定で):

python
import statsapi  # MLB-StatsAPI
tx = statsapi.get('transactions', {'startDate': '2025-03-01', 'endDate': '2025-10-01'})
il_moves = [t for t in tx['transactions'] if 'Injured List' in t.get('description', '')]

使い分けの目安: 過去の網羅データ分析なら「Roegele リスト + MLB Stats API transactions (または robotallie の CSV)」、欠場日数・金額のインパクトを見せたいなら Spotrac。

07コンペ運営向け推奨

7.1 初心者向けに最も扱いやすい構成

  1. 運営側が Baseball Savant から CSV を取得
  2. 列名説明を日本語で付ける(Lean Baseball の CSV 項目日本語解説が参考になる)
  3. 参加者には CSV を配布
  4. Python/R の読み込みテンプレートを用意
  5. 発展課題として pybaseball / baseballr による追加取得を紹介

この形が、環境構築トラブル・API 仕様変更・過剰アクセスを避けやすい。

7.2 参加者に直接取得させる場合の推奨順

  1. Python: pybaseball
  2. R: baseballr
  3. API 学習: requests / httr2 で MLB Stats API 直叩き
  4. 歴史分析: Lahman
  5. 発展分析: Retrosheet + Chadwick CLI

導入順の目安: Baseball Savant の画面操作で CSV 取得 → pybaseball / baseballr でコード取得、の2段階が挫折しにくい。

7.3 R と Python の対応関係

baseballr::statcast_search_*pybaseball.statcast_* は、両言語とも同じ Baseball Savant を叩くため、部門としてどちらの言語でも同じ分析が可能。

7.4 利用上の注意

  • MLB 公式データ(Stats API・Statcast)は非商用・個人分析用途での利用が前提。
  • 有料サイトのデータを無断で再配布しない。
  • スクレイピング系関数は利用規約・robots.txt・アクセス頻度(連続リクエストの待機時間)を確認する。FanGraphs 等は利用規約を確認。
  • API キーや個人アカウント情報を資料・GitHub に含めない。
  • コンペでは、データの取得日・取得元 URL・クエリ条件・ライセンス注意を明記する。
  • 大量アクセスを避けるため、同じデータを全員が API から取得する設計ではなく、運営側の配布 CSV を基本にする。
  • Statcast の打球データは2015年以降が充実。年をまたぐ指標比較では計測仕様の変更(例: 2023年のボール・ストライクゾーン関連項目追加、2024年のアームアングル公開)に留意。

7.5 まとめ

2025〜2026年時点では、MLB データ分析の実務的な入口は Baseball Savant / Statcast + pybaseball / baseballr。試合日程やライブデータは MLB Stats API、歴史的なシーズン成績は Lahman、プレイバイプレイの長期分析は Retrosheet が有力。大学生向けコンペ資料では、まず CSV 配布で分析に集中させ、発展課題として Python・R・API 直叩きを紹介する構成が最も安全で教育効果も高い。

付録: ライブラリ・データベース別 公式ドキュメント早見表

対象公式ドキュメント
pybaseballGitHub: github.com/jldbc/pybaseball / docs: docs/statcast.md
MLB-StatsAPIGitHub: github.com/toddrob99/MLB-StatsAPI / Wiki: Endpoints / PyPI: pypi.org/project/MLB-StatsAPI
python-mlb-statsapiGitHub: github.com/zero-sum-seattle/python-mlb-statsapi
baseball_scraperGitHub: github.com/spilchen/baseball_scraper
baseball-stats-pythonPyPI: pypi.org/project/baseball-stats-python
baseballrpkgdown: billpetti.github.io/baseballr / CRAN: cran.r-project.org/…/baseballr
sabRmetricspkgdown: saberpowers.github.io/sabRmetrics / GitHub: github.com/saberpowers/sabRmetrics
Lahman (R パッケージ)CRAN: cran.r-project.org/package=Lahman / マニュアル: Lahman.pdf
Lahman Database (生データ)SABR: sabr.org/lahman-database
Baseball DatabankGitHub: github.com/chadwickbureau/baseballdatabank
Chadwick CLI (cwevent 等)GitHub: github.com/chadwickbureau/chadwick / マニュアル: chadwick.readthedocs.io / バイナリ配布: releases
MLB Stats APIdocs: docs.statsapi.mlb.com / ベース: statsapi.mlb.com
Baseball SavantStatcast Search: statcast_search / CSV 仕様書: csv-docs
Retrosheetretrosheet.org

§主な情報源