2018年1月27日土曜日

フライボールの変化が得点貢献に与える影響1

今回からフライボールの変化が得点貢献に与える影響を見ていきます。今回は全体的な影響の大きさを眺めるところまで。

昨年に入ってからフライボール (FB) を打つことで打撃成績が大きく改善しうるのではないか、という話をよく見るようになりました。よくある議論としては、FBはゴロ (GB) に比べて得点価値が高いのでFBを増やすことで得点を増やすことができる、というものだと思います。下はFangraphsの打球分類ごとのwOBAを示しています。

確かにFBはGBに比べて、高いwOBAを持つことが見て取れます。年度によりますが、wOBAで0.1から0.2程度高く、これは0.1弱から0.2弱の得点価値に相当します (おおまかに得点価値 ≒ wOBA / 1.15)。この打球タイプによる価値の違いの傾向は選手別に見ても、ある程度当てはまります。下の図はMLB15-17において、FBとGBを200以上打った選手に関して、各打球のwOBAを示しています。データはStatcastから。
当然、個人差はかなりありますが、FBのwOBAがGBのwOBAよりも小さかった選手 (緑の点線の右下側の点) は、ほとんどいないことがわかります。一方で、2倍より高い選手 (マゼンタの点線の左上側の点) もそれなりにいて、この期間内では対象の選手に関しても全体の傾向通り2倍弱ぐらいになってるんじゃないかと思います。

このような背景から、例えば以下の記事では各選手のGBの20%をFBに置き換えた場合に得点価値にどれだけの効果があるか、というような計算を行っています。

小林 展久, フライ革命後の成績変化を推測する, Baseball gate, 2017.
https://baseballgate.jp/p/147346/

しかし、このような議論はやや問題があります。この推計ではその選手のFBとGBの価値だけを使って比較しているわけですが、打者がFBを増やす場合には、その選手のFBやGB自体の価値や、あるいは他の要素、例えばGB以外の打球の比率の変化、三振率、失策率、あるいは守備側のシフトであったりも変化する可能性が考えられます。そのため、何かの効果を議論する場合、可能であれば全体的な影響を評価できる数字の変化を調べることが重要になるかもしれません。実際のところ、引用した記事でも、打球速度などの変化について可能性は触れられています。

このような全体への影響を調べることの重要性を示した、典型的な例としてLichtmanらによるバントの効果に関する報告があります (注1)。バントの効果に関するよくある議論としては、ノーアウト1塁と1アウト2塁の平均的な得点価値や得点確率を比較するというものが古くからあります。しかし、これらの2つの状況は、バントを試みた場合に生じる状況の一部に過ぎないはずです。そこで、彼らはバントを試みた場合とそうでない場合で、全ての打席で最終的に起こったかを (例えばランナーを進めることができなかったより悪い場合や、失策や野選などになった良い結果も含めて) を比較することで、よくある議論に比べて、バントという行為がマシな帰結をもたらすことを示しています。これに関しては李啓充氏がブログで詳しく紹介してくれています。

李啓充, 「汝、バントするなかれ (2)」, 2010.
http://blog.livedoor.jp/goredsox-baseballnumbers/archives/50327519.html
李啓充, 「汝、バントするなかれ (3)」, 2010.
http://blog.livedoor.jp/goredsox-baseballnumbers/archives/50334948.html

もちろん、FBを増やすことがGBを減らす以外の、ネガティブな側面もありうることの言及も少なくないかもしれません。例えば下の記事では、三振が増えるかもしれないという言及があります。

内田 泰, 野球に「フライボール革命」 スポーツデータ活用最前線 データスタジアムに聞く(上), SPORTS INNOVATORS, 2017.
http://techon.nikkeibp.co.jp/atcl/feature/15/110200006/092600091/?P=2

インタビュー記事であるという記事の性質もあるのか、残念ながら根拠は示されていません。

もう一つこの手の記事で多い問題点は、具体的な数値は少数の選手に注目した記述に終始して、選手の成績変化とFBの変化をつなげるというようなものがあります。例えば、以下の記事では柳田 (SB) の打撃成績とFBの変化を議論しています。

小林 展久, 柳田悠岐の“フライボールレボリューション”, Baseball gate, 2017.
https://baseballgate.jp/p/98161/

あるいは下の記事ではYonder Alonsoの2017年途中時点でのFB%変化に注目しています。

Dave Cameron, Yonder Alonso Is the New Poster Boy for the Fly Ball Revolution, Fangraphs, 2017.
https://www.fangraphs.com/blogs/yonder-alonso-is-the-new-poster-boy-for-the-fly-ball-revolution/

しかし、打撃成績が改善した選手をすべて調べれば、FBが上昇した選手もいれば、FBが低下した選手も見つけるのは容易であり、個別のケースから一般性について議論するのは困難です。こういう特定の少数のサンプルだけをとりあげる、というのはいわゆる"チェリーピッキング"に繋がりやすくなります。全選手に対する効果が観測可能な状況においては、少数のサンプルで議論が終わってしまうのはあまり望ましくないと言っていいのではないでしょうか。

https://ja.wikipedia.org/wiki/チェリー・ピッキング

先に引用したBaseball gateの記事ではNPBにおける比多数の選手に関して、FB%とISOの関係についても示してくれています。得点産生に関してISOは重要な構成要素であることは間違いありません。しかし、打球の価値における出塁部分を無視したり、長打部分に関しても得点貢献との量的な関係性が考慮されていなかったり、三振や四球を無視したり、得点との関連を議論するためには非常に限定的な指標でもあります。

というわけで個人的な主張としては、得点への関与に関しても、選手に関しても、全体的な効果を見ていったほうが望ましい、ということです。

言うまでもなく、米国ではその点を考慮した結果を示してくれている例が早くから出ています。Tangotigerは昨年の5月に、2016→2017で見られた、個人の平均打球角度 (launch angle) などの変化と、打球だけに限った場合のwOBA (wOBAcon) の変化のプロットをツイッターで示してくれています (真ん中下段)。
https://twitter.com/tangotiger/status/862012339125702658

ここでは個別の選手に関して、打球角度が大きくなることは、全体としてほとんどwOBAconの改善に繋がっていないことが示されています。さらに、打球速度 (exit velocity) との関係についても比較されています (左下段)。速度の増加ではwOBAconのもう少しはっきりとした改善と関連していることが確認でき、少なくとも、角度を上げることは速度を上げることに比べて重要性が劣る可能性が考えられます。また、ここではライナー (LD) やポップフライ (PU) なども含めて、打球全体で調べているという点で、GBをFBに入れ替えるよりは現実的な影響を評価できています。さらに、比較に用いられたwOBAconはISOと違い、出塁部分の影響や、各イベントが持つ得点への影響の大きさが考慮されているため、ISOよりかなり優れた指標であると考えられます。

5月までの結果では心もとないので、16, 17年のフルシーズンの結果 (両年でそれぞれ打球100以上) で同様に調べました。

Tangoのツイートの図よりはポシティブな印象があるかもしれません。実際、傾きだけ見れば、平均的には、角度が5度上がることは、wOBAconが0.02上昇することと一応の関連があり、これは実のところ馬鹿にできない数字ではあります。しかし、それでも全体の関係性は非常に弱かったことがわかり (r = 0.15, p = 0.01)、各選手のwOBAconの変化は角度の変化ではほとんど説明できないことがわかります。また、ここではISO (2年間のISOをPAで重み付けして平均) を色で示していますが、長打力の高い選手で打球角度を上昇させた選手にもwOBAconが下がった選手は多く、長打力があるからと言って打球を上げればwOBAconがあがるかというと、そういうことでも無いようです。

比較のため打球速度で同様に示します。

Tangoが示した結果と同様に、角度差の結果よりも傾きも大きく、さらに、強い相関が見えます (r = 0.36, p < .001)。それでも、相関は弱いようですが (注3)。

ついでにwOBAconではなく、三振や四球などを含むwOBAを使った場合。角度は、ファールは含めていません。y軸のスケールがここまでの図と違うことに注意。

予想通りという感じですが、wOBAで見てもやはり大きな改善は見られないようです。5度の上昇で0.01強くらい、というところです。wOBAconの結果よりも傾きは下がっているようにも見えます。これは、打球以外の要素は、少なくとも打球ほどには改善していないことを教えてくれています。

wOBAconではなくwOBAを使った結果も、当然だいぶ前に既に記事で出ています。Tangoのツイートの1週間後に、Rob ArthurがFB%とwOBAの関連について記事にしてくれています。
Rob Arthur, The Fly Ball Revolution Is Hurting As Many Batters As It’s Helped, FiveThirtyEight, 2017.
https://fivethirtyeight.com/features/the-fly-ball-revolution-is-hurting-as-many-batters-as-its-helped/
この記事では、2015→2016における個人のFB%の変化とwOBAの変化について示しています。強調されているポイントは、FBが増えた選手について、wOBAが改善した選手もいれば、wOBAが低下した選手も同じくらい観測されるという点です。著者であるArthurは、既にスタイルを確立したような一部の打者にとってはFBを打つためにスタイルを変えることは大きなリスクがあるのでは、とすら示唆しています (注4)。

FBを増やすことの利点として守備シフトへの対応が挙げられます。2015から2017のほぼ最新のシフトが敷かれている状況において、少なくとも全体的に影響を見る分には、FBや角度が増えた時に得点への貢献が改善していると言えるかどうか、そもそも怪しいようです。

FB%ならば結構古くからデータがあるのでもっと昔の結果まで遡って、サンプルを増やすこともできます。下は2010-2017年について、年度間での差をプロットしています。ArthurはBIS系の打球分類を使っているFangraphsを使っていましたが、こちらはMLB系の打球分類だと思われるRetrosheetを使っています (注5)。

ここでは長打力に関連する指標としてHR/打球 (2年間の数字を打席数で重み付けした平均)を色で示していますが、やはりHR/打球が高いからと言って、FBを増やしたらwOBAが増えるかというとそれほど単純な話ではないようです 。

というわけで、角度を上げる or FBを増やすというのは、基本的にはそもそも言われてるほどの大きな効果は無いんじゃないの?、というのが全体的な効果を調べた例から窺えます (注6)。じゃあ、なぜ効果があまり無いのか、というのが当然問題になるわけですが、次に続きます。

<参考>
Marchi and Albert, Analyzing Baseball Data with R, 2013, CRC press.
Retrosheet http://retrosheet.org
Statcast  https://www.mlb.com
________________________________________________________________
注1.
Lichtmanがバントについて書いている本。いつもの。
Tango, Lichtman, and Dolphin, The Book , 2007, Potomac Books.

The Bookのバントの章を主に書いたのはMGLことLichtmanのようです。しばらく前にブログに考えをまとめてくれている。

MGL, Sac Bunting Summary and Redux, 2017.
https://mglbaseball.com/2017/04/19/sac-bunting-summary-and-redux/

特に前半が関連が強いので、一部だけちょっと引用しておきます。
第2パラグラフ目の1文目。
"First, the notion that you can analyze the efficacy (or anything really) about a sac bunt attempt by looking at what happens (say, the RE or WE) after an out and a runner advance is ridiculous. "
中盤からも非常に面白いです。

ところで、時系列系なことに注目すると、MGLによると、0アウト1塁と、1アウト2塁の得点価値を初めて比較したのは、Thorn and Palmer, The Hidden Game of Baseball, Doubleday, 1984. のようです。アウトランナー状況毎の得点期待値はLindsey and George, An Investigation of Strategies in Baseball, Operations Reserch, 11, 4, 477-501, 1963.で調べられており、同論文で安打に関してはlinear weightsも導入されていたよう (アルバート and ベネット (翻訳: 加藤貴昭), メジャーリーグの数理科学 (原題: Curve Ball), シュプリンガー, 2001 (邦訳版2004). からの孫引き) なので、そこからバントまでは20年ほどかかり、The Bookで全体の影響が調べられるまでさらに20年かかったということでしょうか。

注2.
これってよく聞く話ですがソースがわからない。一番単純な話として、リーグレベルでのK%の上昇と、FB%の上昇が関連がありそうな議論を見るような気がしますが、ある程度以上長期になると単純な年度変化における共変関係はほとんど見えないので、(何らかの調整もなしに) ここまで単純な話は流石に正当化は難しいような気がする。
https://www.fangraphs.com/leaders.aspx?pos=all&stats=bat&lg=all&qual=0&type=c,4,6,11,12,13,21,-1,34,35,45,40,41,-1,23,37,38,50,61,-1,111,-1,203,199,58&season=2017&month=0&season1=2000&ind=0&team=0,ss&rost=0&age=0&filter=&players=0
もちろん、これは関係が無いことを意味するとは限らないですが。

また、引用したDave CameronのAlonsoの記事ではAlonsoのContact%が低下していること、K%が増加していること、が書かれてます。が、あくまでこれはAlonsoのケースではこうだったということで、広く見られる傾向かどうかはわからない。

実際には選手別に見ると角度やFB%上がった年にはK%は少し増えるという結果は得ています。

注3.
15年の数値も加えた場合。
以前の記事で書いた通り、16年からPUの角度が75度以上を許容するようになったらしく、比較として大丈夫かどうか、ややあやしいです。
https://sleepnowinthenumbers.blogspot.jp/2017/12/blog-post_30.html
本文で示した16と17の比較だけのほうが良いかもしれない。

せっかくなので見せ方をちょっと変えて、速度と角度の片方のパラメータが調整された時のもう一方の影響を示します。
角度差 vs wOBAcon差。色は速度差。
 同じ角度差であれば、速度差が大きい方がwOBAconが高い傾向がはっきり見えます。つまり角度差を調整した状態で見ると、速度差が大きい方がwOBAconの上昇が大きかった。

速度差 vs wOBAcon差。色は角度差。
速度差が調整された時に、角度差が大きい方がwOBAconが上昇したかは微妙です。あったとしても影響は小さいように見えます。

このへんの結果から見ると、例えば、角度が上昇してかつ得点貢献が増加している選手を見つけてきたとして、その選手が速度を増加させていたのであれば、速度はたぶん効いている可能性が高いが、角度はそれほど影響はないかもしれない、といえるかもしれません。

注4.
中の人の現時点でのスタンス。前提として、打撃成績の改善につながる方法は色々あって、少なくとも、プロでレギュラークラスになるまでの選択圧を受けてきた選手にとって、それらは既にある程度以上適切な状態になっているはず。そのため、全体的には、(よほど大きく外的な要因が変動しない限り) それほど大きな改善をもたらすことはできない。打球角度の上昇はそんな多くの手段の一つかな、と。革命でもなければ、破壊でもない、平和な世界。打球速度は、ありうる中でも最も有効な手段という気もするので、角度の変化とそれを比較するのは、ちょっと角度に気の毒かもしれません。

注5.
打球の分類は以下の記事を参照。
https://sleepnowinthenumbers.blogspot.jp/2017/12/blog-post_30.html

本文ではRetrosheetでの結果を示しましたが、Fangraphsの数値で2010からで調べても大体同じであることは確認してあります。

注6.
もちろん、角度にしてもFB%にしても、結果的に上昇したケースを見ているので、意図的に増やそうとした場合とは違う可能性は当然ありえます。しかし、チーム関係者でもない限り、多くの場合では意図的に増やしたかどうかはよくわからないので、こういう方法を取らざるを得ない。そういう意味では、引用した記事で、FBを増やす意図を公言している柳田やAlonsoのような選手に注目するのは重要だし理にかなっているわけですが、それだけだと一般的な効果の議論からはどうしても離れていってしまう。痛し痒し。

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