1. 導入・準備

(1) baseballr パッケージでできること

  1. 野球データのスクレイピング
    1. FanGraphs.com: FanGraps社による野球のウェブサイト. MLBの歴代すべての選手のデータ.セイバーメトリクス指標(以下,セイバー指標)も多数.
    2. Baseball-Reference.com: Baseball Reference社による野球のウェブサイト.MLBの歴代すべての選手のデータ.セイバー指標も多数.
    3. baseballsavant.com: MLB公式サイトによる statcast(トラッキングデータ)等のデータ.
  2. 成績の可視化や wOBA などのセイバー指標の計算

なお,セイバー指標等の説明についてはこの資料では省略する. 日本語での説明としては,「1.02 ESSENSE OF BASEBALL」というサイト内の

や,ページ上部の6つのリンクが非常に詳しい.

また,パッケージ自体の説明は公式サイト

や,Marchi, Albert and Baumer (2018) “Analyzing Baseball Data with R, Second Edition” などを参照されたい.

なお,MLB以外のデータ(NCAA等)も一部取得可能であるが,ここでは触れない.

(2) baseballr パッケージのインストール

baseballr パッケージは CRAN にはなく,github からのインストールが必要.

devtools パッケージのインストールをした上で,以下を実行.

devtools::install_github("BillPetti/baseballr")

最新バージョンは 0.5.0(2019年6月24日リリース). 詳しくはhttp://billpetti.github.io/baseballr/を参照のこと.

ついでにいくつかのパッケージも読み込んでおく(require しているがもちろん library でも可).

require("baseballr")
require("tidyverse")
require("DT")
require("knitr")

2. データの取得

(1) データの種類

野球のデータは大きく分けて,

  • season by season(シーズンごとの)および指定日・指定期間のデータ
  • game by game(試合ごとの)データ
  • play by play(プレーごとの)データ

に分けられる.順に紹介する.

(2) season by season および指定日・指定期間のデータを取得する

チーム成績

指定シーズンの各チームの試合結果は team_results_bref 関数で取得できる.

datatable(team_results_bref("LAA", 2019))

チーム順位

指定日のチーム順位を取得する場合は standing_on_date_bref 関数を用いる.

standings_on_date_bref(date = "2019-07-16", division = "AL West", from = FALSE)
## $`AL West_up to_2019-07-16`
##    Tm  W  L  W-L%   GB  RS  RA pythW-L%
## 1 HOU 59 37 0.615   -- 493 407    0.587
## 2 OAK 54 41 0.568  4.5 497 407    0.590
## 3 TEX 50 45 0.526  8.5 511 497    0.513
## 4 LAA 50 46 0.521  9.0 501 473    0.526
## 5 SEA 39 59 0.398 21.0 486 587    0.414

打者成績

指定期間の打者のスタッツを見るには daily_batter_bref 関数を用いる. なぜか警告が出るが,一応取得できている.

bat1 <- daily_batter_bref(t1 = "2019-03-20", t2 = "2019-07-16")
datatable(bat1)

投手成績

指定期間の投手のスタッツを見るには daily_pitcher_bref 関数を用いる. 同様に警告が出るが,一応取得できている.

pit1 <- daily_pitcher_bref(t1 = "2019-03-20", t2 = "2019-07-16")
datatable(pit1)

リーダーボード(エラー)

指定期間の打者ランキング(リーダーボード)は fg_bat_leaders 関数で取得できるが,データ提供元のフォーマットが変わったのか(マニュアル上正しいが)エラーが返ってくる.

head(fg_bat_leaders(x = 2015, y = 2016, league = "all", qual = "y", ind = 0)) %>% select(Seasons:AVG)

パークファクター

全体および打者利き腕毎のパークファクターは fg_park および fg_park_hand 関数で取得できる.

park18 <- fg_park(2018)
datatable(park18)
park18hand <- fg_park_hand(2018)
datatable(park18hand)

セイバー指標計算のための定数

wOBAやFIPなどのセイバー指標を計算するために必要な定数は fg_guts 関数で取得できる.

datatable(fg_guts())

(3) game by game のデータを扱う

打者の成績

打者の各試合ごとの結果は batter_game_logs_fg 関数で取得できる. 例えば,大谷翔平選手の各試合ごとの結果を取得するには以下のようにすればよい.

ohtani2019b.fg <- batter_game_logs_fg(playerid = 19755, year = 2019)
datatable(ohtani2019b.fg)

ここで playerid には調べたい打者のfangraphsでのIDを入れる. fangraphs.com で “Shohei Ohtani” を検索すると,結果のページのURLが https://www.fangraphs.com/statss.aspx?playerid=19755&position=DH となり,そこにIDが表示されている.

あるいは,以下のようにして取得することもできる.

playerid_lookup(last_name="Ohtani", first_name="Shohei")$fangraphs_id
## [1] 19755

投手の成績

同様に投手の成績は以下のように pitcher_game_logs_fg 関数で取得できる.大谷翔平選手の投手としての2018年の成績は以下のように取得できる. 野手同様,playerid には調べたい投手のfangraphsでのIDを入れる.

ohtani2018p.fg <- pitcher_game_logs_fg(playerid = 19755, year = 2018)
datatable(ohtani2018p.fg)

(4) Play by Play のデータを扱う

MLB の Play by Play データは statcast(や以前は PITCHf/x)による トラッキングデータである.これらの取得には

  • scrape_statcast_savant 関数
  • scrape_statcast_savant_pitcher 関数
  • scrape_statcast_savant_pitcher_all 関数
  • scrape_statcast_savant_batter 関数
  • scrape_statcast_savant_batter_all 関数

を用いることができるが,ここでは汎用的な scrape_statcast_savant 関数を紹介する.なお,playeridNULL とすれば,全選手のデータを取得できる.

kikuchi <- scrape_statcast_savant(start_date="2019-03-20", end_date="2019-07-18", playerid=579328, player_type = 'pitcher')
datatable(kikuchi)

playerid は,先の FanGraphs のものとは異なり,MLBAM と呼ばれるID(baseballsavant.com で検索するとURLに表示されるもの)なので注意されたい.

なお,MLBAMは以下の関数で取得することも可能である.

playerid_lookup(last_name="Kikuchi", first_name="Yusei")$mlbam_id
## [1] 579328

打者についても同様にデータ取得できる.

ohtani <- scrape_statcast_savant(start_date="2019-03-28", end_date="2019-07-17", playerid=660271, player_type = 'batter')
datatable(ohtani)

なお,取得できるのは2008年以降である.また,複数年に渡ったデータは入手できないようである.

3. 可視化やセイバー指標の計算

(1) 順位の推移グラフ

地区ごとのチーム順位の推移はviz_gb_on_period関数で表示できる.

viz_gb_on_period("2019-07-01","2019-07-17","AL West")
## # A tibble: 10 x 7
##    League  Date       Team      W     L WLpct    GB
##    <chr>   <date>     <chr> <int> <int> <dbl> <dbl>
##  1 AL West 2019-07-01 HOU      53    32 0.624   0  
##  2 AL West 2019-07-01 TEX      46    38 0.548   6.5
##  3 AL West 2019-07-01 OAK      46    39 0.541   7  
##  4 AL West 2019-07-01 LAA      42    43 0.494  11  
##  5 AL West 2019-07-01 SEA      37    51 0.42   17.5
##  6 AL West 2019-07-17 HOU      60    37 0.619   0  
##  7 AL West 2019-07-17 OAK      55    41 0.573   4.5
##  8 AL West 2019-07-17 TEX      50    46 0.521   9.5
##  9 AL West 2019-07-17 LAA      50    47 0.515  10  
## 10 AL West 2019-07-17 SEA      39    60 0.394  22

このグラフはオンマウスで数値が表示される機能も有している.

(2) スプレー・チャート

トラッキングデータからスプレー・チャートを描く関数ggspraychartも用意されている (ggprot2 の機能を援用している).

ggspraychart(ohtani, point_alpha = .6, fill_legend_title = "Hit Type", fill_value = "bb_type", 
               fill_palette = c("1"="#A2C8EC", "2"="#006BA4", "3"="#FF940E",
                                "Out"="#595959", "4"="#C85200")) + 
  facet_wrap(~game_year, nrow = 2) +
  ggtitle("\nOhtani") +
  labs(subtitle = "Spray Charts")

ggspraychart(ohtani, point_alpha = .2, density = TRUE, bin_size = 30) + 
  facet_wrap(~game_year, nrow = 2) +
  ggtitle("\nOhtani") +
  labs(subtitle = "Spray Charts")

(3) 指標の計算

打者の指標

打者の指標として最もよく用いられる wOBAwoba_plus 関数を用いて計算できる.daily_batter_bref でスクレイピングしたデータセットから計算すればよい.

bat1w <- woba_plus(bat1)
datatable(bat1w)

投手の指標

投手の指標として代表的な FIP は,同様に daily_pitcher_bref でスクレイピングしたデータセットから fip_plus 関数で計算できる.

pit1w <- fip_plus(pit1)
datatable(pit1w)

その他

statcast のデータに得点期待値や linear weight を付加する関数が run_expectancy_code である.

ohtani1 <- run_expectancy_code(ohtani)

他にも以下のような関数などが存在する:

run_expectancy_table(ohtani1)

linear_weights_savant(ohtani1)

edge_scrape("2019-03-20", "2019-07-17", "pitcher") %>% .[, c(1:3,7:12)] %>% head(10)

team_consistency(2019)

4. statcast データ

改めて,菊池投手の statcast データを簡単に触ってみる.

datatable(kikuchi)

変数の説明は以下の通り.詳細は公式サイトを参照されたい.

変数名 説明
pitch_type 球種略称(statcast からの推定結果)
game_date 試合日
release_speed 球速の初速(2008〜16 は PITCHf/x、2017以降はstatcast)
release_pos_x リリースポイントの水平位置(捕手視点、フィート)
release_pos_z リリースポイントの垂直位置(フィート)
player_name プレイヤー名
batter 打者の MLBAM ID
pitcher 投手の MLBAM ID
events 打席結果
description 投球結果
spin_dir (現システムでは不使用)
spin_rate_deprecated (現システムでは不使用)
break_angle_deprecated (現システムでは不使用)
break_length_deprecated (現システムでは不使用)
zone キャッチャー視点のプレート上でのゾーン(1〜14、ストライクゾーン内左上から1〜9、ゾーン外左上から11〜14)
des 打席結果の説明
game_type 試合の種類(E=Exhibition、S=Spring Training、R=Regular Season、F=Wild Card、D=Divisional Series、L=League Championship Series、W=World Series)
stand 打席左右
p_throws 投手左右
home_team ホームチーム
away_team アウェイチーム
type 投球結果概要 B=ボール、S=ストライク、X=インプレー
hit_location 最初にボールに触れた野手ポジション
bb_type 打球タイプ ground_ball(ゴロ)、line_drive(ライナー)、fly_ball(フライ)、popup(ポップアップ)
balls 投球前ボールカウント
strikes 投球前ストライクカウント
game_year 試合年
pfx_x 水平方向の変化量(捕手視点、フィート)
pfx_z 垂直方向の変化量(フィート)
plate_x ホームプレート上の水平位置(捕手視点)
plate_z ホームプレート上の垂直位置
on_3b 投球前三塁ランナー
on_2b 投球前二塁ランナー
on_1b 投球前一塁ランナー
outs_when_up 投球前アウトカウント
inning 投球前イニング
inning_topbot 投球前の表裏
hc_x 打球のx座標
hc_y 打球のy座標
tfs_deprecated (現システムでは不使用)
tfs_zulu_deprecated (現システムでは不使用)
fielder_2 投球前捕手のMLBAM ID
umpire (現システムでは不使用)
sv_id ゲームごとのプレーID
vx0 リリースポイント付近(y=50フィート)での球速のx成分(フィート/分)
vy0 リリースポイント付近(y=50フィート)での球速のy成分(フィート/分)
vz0 リリースポイント付近(y=50フィート)での球速のz成分(フィート/分)
ax リリースポイント付近(y=50フィート)での球速の加速度のx成分(フィート/分)
ay リリースポイント付近(y=50フィート)での球速の加速度のy成分(フィート/分)
az リリースポイント付近(y=50フィート)での球速の加速度のz成分(フィート/分)
sz_top バッターのストライクゾーンの上端
sz_bot バッターのストライクゾーンの下端
hit_distance_sc 打球の飛距離
launch_speed 打球初速度(一部推定したものも含まれる)
launch_angle 打球角度(一部推定したものも含まれる)
effective_speed 体感球速(ピッチャーのリリースポイントを考慮)
release_spin_rate 回転速度
release_extension ピッチング・プレート前端から投球のリリース・ポイントまでの距離
game_pk 試合ID
pitcher_1 投手のMLBAM ID
fielder_2_1 捕手のMLBAM ID
fielder_3 一塁手のMLBAM ID
fielder_4 二塁手のMLBAM ID
fielder_5 三塁手のMLBAM ID
fielder_6 遊撃手のMLBAM ID
fielder_7 左翼手のMLBAM ID
fielder_8 中堅手のMLBAM ID
fielder_9 右翼手のMLBAM ID
release_pos_y リリース位置のy座標
estimated_ba_using_speedangle 打球角度と打球初速度から推定した打者の打率
estimated_woba_using_speedangle 打球角度と打球初速度から推定した打者のwOBA
woba_value プレー結果によるwOBAの値
woba_denom プレー結果によるwOBAの分母の値
babip_value プレー結果によるBABIPの値
iso_value プレー結果によるISOの値
launch_speed_angle 打球の速度/角度のゾーン(図参照)、1:Weak、2:Topped、3:Under、4:Flare/Burner、5:Solid Contact、6:Barrel
at_bat_number 打席数
pitch_number 打席ごとの投球数
pitch_name 球種
home_score 投球前のホームチームスコア
away_score 投球前のアウェイチームスコア
bat_score 投球前の攻撃側チームスコア
fld_score 投球前の守備側チームスコア
post_away_score 投球後のアウェイチームスコア
post_home_score 投球後のホームチームスコア
post_bat_score 投球後の攻撃側チームスコア
post_fld_score 投球後の守備側チームスコア
if_fielding_alignment 内野の守備隊形
of_fielding_alignment 外野の守備隊形
barrel バレルフラグ