2018年1月6日土曜日

RでMLBのデータを集める

何となく週1で更新していましたが、現実逃避する時間が無くなってきているので、ペースを落とします。俺の代わりに解析してくれ、ということで、RでMLBのデータを落とす方法のリンクをまとめてみます。

まずデータの種類を整理します。

1. Season-by-season data
シーズンごとのデータ。
代表的なものはLahman database。

2. Play-by-play data
打席単位 + α (盗塁 etc.) のデータ。
代表的なものはRetrosheet。このブログで最もよく使っているのはRetrosheetです。恐ろしく管理が大変であろうデータベースがボランティアで動いているあたりに、個人的には彼の国の科学的基礎の真髄を見る思いがします。
http://www.retrosheet.org/about.htm

3. Pitch-by-pitch data
投球ごとのデータ。特に、普通は球種、速度、変化量などの詳細なデータを持つものを指すような気がします。
代表的なものはPITCHf/xとStatcast。Trackman関連のデータはStatcastでのみ提供されています。PITCHf/xは投球やそれに関連したイベントのデータだけでなく、Play-by-play dataやgamelog的な部分も充実していること、比較的古くからありサンプルサイズを稼げる (2008から本格運用) という利点があります。

大まかにはこの3種類に分けられるんじゃないかと思います。

まずはSeason-by-season dataから。

Lahman
RにはLahmanというそのもののパッケージがあります。
https://cran.r-project.org/web/packages/Lahman/Lahman.pdf
パッケージを使わなくても普通にダウンロードして使うのも簡単です。
http://www.seanlahman.com/baseball-archive/statistics/
中の人はダウンロード・解凍して使っています。オールスターや殿堂入りとか色々マニアックなものまでありますが、正直master.csvをretrosheetのidを名前に変換するため使っている程度です。年度成績は、Retrosheetから計算するか、Fangraphsから取得しています。

Fangraphs/Baseball references
FangraphsやBaseball referencesのデータもSeason-by-season dataがメインでしょうか。これらにはLahmanよりも詳しくDay-by-dayなんかも調べることができます。
Fangraphsのデータは表の右上の"Export Data"をポチるとダウンロードできます。
https://www.fangraphs.com/leaders.aspx?pos=all&stats=bat&lg=all&qual=y&type=8&season=2017&month=0&season1=2017&ind=0&team=0&rost=0&age=0&filter=&players=0
また、splits leaderboard
https://www.fangraphs.com/leaderssplits.aspx?splitArr=&strgroup=season&statgroup=1&startDate=2017-03-01&endDate=2017-11-01&filter=&position=B&statType=player&autoPt=true&players=&sort=22,1&pg=0
はかなり細かく条件も設定でき、もちろんcsvも取得できます。非常に良くできていると思います。

FangraphsやBaseball referencesのデータの一部は、baseballrパッケージの関数でも取得できます。
http://billpetti.github.io/baseballr/data-acquisition-functions/
最新版はうちの環境では少なくともfg_bat_leadersは動いていないようです。結構便利だったんですが。単に入れているRのversionの問題かもしれません。wOBAやFIPの係数を得るためにfg_gutsはよく使っています。

次にPlay-by-play data。

Retrosheet
Retrosheetはそのままダウンロードしても、なんじゃこりゃという感じで情弱である中の人には理解できません。
http://www.retrosheet.org/game.htm

Marchi and Albertによる教科書でcsvに変換するRの関数が記述されています。
Analyzing Baseball Data with R
https://www.amazon.co.jp/Analyzing-Baseball-Data-Chapman-Hall/dp/1466570229
控えめに言って非常に良い本です。データをどう扱うかに加えて、結果の解釈でも結構しっかりした記述がなされています。また、実データの解析だけでなく、マルコフ連鎖モデルによる試合のシミュレーション、Bradley-Terryモデルを用いたシーズンのシミュレーションなども解説されています。中の人が紙とkindleで両方持っている唯一の本で、The Bookと並ぶ必読本だと思います。出版が2013年で、使われている関数がもはや一部古いのが欠点。主要な著者と思われるMarchiがインディアンスに雇われている
https://it.linkedin.com/in/max-marchi-84592638
ようなので、新版は少なくとも当分は出る可能性は低いと思います。一部のスクリプトはAlbertのブログを漁るとdplyrを使って書き換えられたバージョンがあったりします。日本語版については、どう考えてもニッチすぎるので絶望的でしょう。

2018 11/6 追記
予測は見事に外れました。Ben Baumerを著者に加えて新版が出るようです。
https://www.amazon.co.jp/Analyzing-Baseball-Data-Second-Chapman/dp/0815353510/ref=dp_ob_title_bk

csv取得手順は以下のAlbertのgithubにおける記事でも紹介されています。
https://bayesball.github.io/VB/Getting_Retrosheet_Files.html
特定の目的に特化した記述なのでわかりにくいかもしれません。教科書買いましょう。

csvの列名に使えるファイルは教科書のサイトなどにあります。
https://github.com/maxtoki/baseball_R
教科書を買うと、どのファイルなのかわかります。コードも置いてあるならその中で指定されているはず、などと考えてはいけません。教科書買いましょう。

中の人はつかっていませんがretrosheetパッケージを利用して取得することもできるはずです。
https://www.rdocumentation.org/packages/retrosheet/versions/1.0.2
更新は多分止まっているのではないかと思います。教科書買いましょう。

MLB GameDay
Play-by-play dataのソースとしてはMLBのGameDayもあります。年一回更新のRerosheetと違って毎日更新されているんじゃないでしょうか。

openWARパッケージにはこのデータをダウンロードする関数が用意されています。
https://www.rdocumentation.org/packages/openWAR/versions/0.2.2.9001/vignettes/intro.Rmd
openWARはほとんど触っていないのであまり理解していませんが、どちらかというと近似的な方法を用いてWARを計算することでその過程を理解しようというようなものだと思われます。GameDayの中のダウンロード可能な全てのデータなのか、この目的に必要なデータだけなのかもわかっていません。一部の列はいかにも得点期待値の計算に必要なものなので、GameDayそのものではなく処理した結果のような気がします。
開発者のBenjamin BaumerはAlbertのブログに幾つか記事を書いてくれています。
Introduction to openWAR
https://baseballwithr.wordpress.com/author/bbaumer21/page/9/
データの取得だけでなく、可視化の関数なども紹介されています。

後述のPITCHf/xも詳細なPlay-by-play dataとして利用可能です。

最後にPitch-by-pitch data。

Statcast
Statcastデータは先述のbaseballrパッケージの
http://billpetti.github.io/baseballr/data-acquisition-functions/
scrape_statcast_savant_batter
scrape_statcast_savant_pitcher
関数で驚くほど非常に簡単に取得できます。

パラメータの詳細については、開発者のBill Pettiによる以下の記事を参照。
https://www.fangraphs.com/tht/research-notebook-new-format-for-statcast-data-export-at-baseball-savant/

なんとスポーツ報知のネット記事でも紹介されています。
http://www.hochi.co.jp/baseball/mlb/20171202-OHT1T50191.html
http://weblog.hochi.co.jp/r_baseball/2017/11/baseballr-2458.html
タイトル+xlab+ylabはlabsの中にまとめたらいいんじゃないかと思いますね。
labs(title = "xx", subtitle = "xx", colour = "xx", x = "xx", y = "xx", caption = "xx")

PITCHf/x
こちらはCarson Sievertが開発しているpitchRxパッケージで取得できます。
https://cran.r-project.org/web/packages/pitchRx/pitchRx.pdf
SievertもやはりAlbertのブログにデータの取得から可視化までいろいろと寄稿しています。
Starting and updating a PITCHf/x database with pitchRx and dplyr
https://baseballwithr.wordpress.com/2014/03/24/422/
データの取得はsqlとの連携が前提になっています。

PITCHf/xデータのパラメータの説明についてはMike Fastのこの記事が大変参考になります。
https://fastballs.wordpress.com/category/pitchfx-glossary/

PITCHf/xについてはMarchi and Albertの教科書でパラメータの解説があったり、実際に使った解析例が色々とあります。当然、同様にPitch-by-pitch dataであるStatcastの解析の参考にもなります。教科書買(ry

最後に
紹介した各パッケージのGithubページ
cdalzell/Lahman
https://github.com/cdalzell/Lahman

BillPetti/baseballr
https://github.com/BillPetti/baseballr
Bill PettiによるRを用いたMLBの解析に関する基礎的な記事も有用です。
A Short(-ish) Introduction to Using R Packages for Baseball Research
https://www.fangraphs.com/tht/a-short-ish-introduction-to-using-r-for-baseball-research/

rmscriven/retrosheet
https://github.com/rmscriven/retrosheet

beanumber/openWAR
https://github.com/beanumber/openWAR

cpsievert/pitchRx
https://github.com/cpsievert/pitchRx

0 件のコメント:

コメントを投稿