スポーツデータサイエンスコンペティション MLB 部門の紹介動画・参加者向け資料のための、データ収集手法の調査整理。
2025〜2026年時点の MLB データ収集は、次の3系統に分けると整理しやすい。
大学生向けコンペでは、初心者には Baseball Savant CSV または pybaseball / baseballr、発展課題には MLB Stats API、歴史分析には Lahman・Retrosheet という切り分けが実用的である。
向いている用途: Statcast の投球単位データ取得/FanGraphs の打者・投手成績取得/Baseball-Reference 系データ取得/初心者向けのデータ取得演習
注意点
コード例
# 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())
pip install MLB-StatsAPI)。2025年4月に 1.9.0 がリリースされており、メンテが続いている。gamePk を使った詳細取得ができる。注意点
コード例
# 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"])
statcast_search() は日付・選手 ID・打者/投手指定ができ、返り値には投球種・球速・打球速度・xwOBA・スイング速度など多数の列が含まれる。mlb_schedule() は MLB およびマイナー等の game_pk を取得できる(MLB は sport_id = 1)。コード例
# 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()
devtools::install_github("saberpowers/sabRmetrics")data <- sabRmetrics::download_baseballsavant(
start_date = "2025-07-01", end_date = "2025-07-07"
)
Lahman 14.0-0 は「1871〜2024年」を収録する一方、SABR で配布される生データの2025年版(2026-01-02 リリース)は「1871〜2025年」を収録する。パッケージ版への最新シーズン反映はリリースサイクルの都合で遅れるため、両方の記述は矛盾せず両立する。最新シーズンが必要な場合は SABR 配布の生データ(CSV/SQLite)を使う。コード例
# 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)
baseballr::retrosheet_data() で取得・整形できるが、Chadwick CLI の cwevent が事前に必要(公式ドキュメントに明記)。cwevent・cwgame・cwbox など)。T. L. Turocy 氏(Chadwick Baseball Bureau)作。cwevent.exe 等のあるフォルダを PATH に通す。./configure → make → sudo make install)。baseballr::chadwick_path() が使える(https://billpetti.github.io/baseballr/reference/chadwick_path.html)。cwevent が見つかる状態になっていれば retrosheet_data() が動く。library(baseballr)
# Chadwick CLI を事前にインストールしておく(上記参照)
chadwick_path() # インストール確認
retro <- retrosheet_data(years_to_acquire = 2024)
events_2024 <- retro$events
head(events_2024)
requests(Python)や httr2(R)で直接取得可能。ラッパーに無い項目もこれで取れる。meta エンドポイントでは awards・eventTypes・gameStatus・pitchTypes・positions などの値を取得できる。代表的なエンドポイント例
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)
# 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())
コード例: ライブゲームフィード取得
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"])
運営者向け注意
pitch_type・game_date・release_speed などの列説明がある。メリット: ブラウザだけで取得できる/初心者向け/CSV をそのまま Excel・R・Python で読める/コンペ配布用データを作りやすい
デメリット: 1クエリ30,000行の制限があり大量データは期間分割が必要/クエリ条件を記録しないと再現性が落ちる/手作業ダウンロードは更新に弱い
CSV を読む例
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())
library(readr)
library(dplyr)
df <- read_csv("statcast_2025_april.csv")
df %>%
select(game_date, player_name, pitch_type, release_speed, launch_speed) %>%
head()
FanGraphs・Baseball-Reference・Spotrac などの Web ページから表を読む方法。
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())
注意点
| サイト | 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 | 年俸・契約データ | 基本無料 |
| サイト | 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 等)+ 日本語解説記事の組み合わせが実用的。
Jon Roegele 氏の「Tommy John Surgery List」(Google スプレッドシート)が事実上の決定版。
import pandas as pd
url = "https://docs.google.com/spreadsheets/d/1gQujXQQGOVNaiuwSN680Hq-FDVsCwvN-3AazykOBON0/export?format=csv&gid=0"
tj = pd.read_csv(url)
※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 移動を期間指定で):
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。
この形が、環境構築トラブル・API 仕様変更・過剰アクセスを避けやすい。
requests / httr2 で MLB Stats API 直叩き導入順の目安: Baseball Savant の画面操作で CSV 取得 → pybaseball / baseballr でコード取得、の2段階が挫折しにくい。
baseballr::statcast_search_* ⇔ pybaseball.statcast_* は、両言語とも同じ Baseball Savant を叩くため、部門としてどちらの言語でも同じ分析が可能。
2025〜2026年時点では、MLB データ分析の実務的な入口は Baseball Savant / Statcast + pybaseball / baseballr。試合日程やライブデータは MLB Stats API、歴史的なシーズン成績は Lahman、プレイバイプレイの長期分析は Retrosheet が有力。大学生向けコンペ資料では、まず CSV 配布で分析に集中させ、発展課題として Python・R・API 直叩きを紹介する構成が最も安全で教育効果も高い。