さて、これまで、得点期待値やそれを用いた得点価値を求めるところまでできました。
今回は、Statcastのデータを分析してみようと思います
Statcastデータの分析ができるなんて夢のようです!
Statcastについて
Statcastは、試合の全プレイヤーと全打球の動きをトラッキングする新しい技術です。軍事レーダー技術を応用したもので、2015年にMLB全球場に導入されました。MLBの全球団は収集された大規模データにアクセスすることができます。
Statcastの集計されたデータはBaseball Savantから入手できます。https://baseballsavant.mlb.com/
スプレーチャート
Statcastのデータを活用して、スプレーチャート(打球位置の図)を作ってみましょう。
Statcastデータを利用するために、Bill Pettiが開発したbaseballrパッケージを利用します。
devtools::install_github("BillPetti/baseballr")
scrape_statcast_savnat関数を使用すると、指定した期間・選手に関するデータを最大4万行ダウンロードできます。
例題を参考に、2019年5月のコレア選手のデータをダウンロードします。
correa <- scrape_statcast_savant(start_date = "2019-05-01",
end_date = "2019-05-31",
playerid = 621043,
player_type = "batter")
抽出したデータを見てみます。
hc_xは打球が着地したx座標で、hc_yは打球が着地したy座標です。
correa %>%
select(events, hc_x, hc_y)%>%
head()
そうすると結果以下のようなデータ表現になります。
events hc_x hc_y <chr> <dbl> <dbl> 1 "strikeout" NA NA 2 "" NA NA 3 "" NA NA 4 "" NA NA 5 "" NA NA 6 "" NA NA
もちろんコレア選手に対する、全投球が入っています。
よって、打球:インプレーとなった打球を抽出する必要があります。
データのあるものだけ抽出
correa_hip<- correa%>% filter(type=="X") correa_hip%>% select(events, hc_x, hc_y)%>% head()
そうすると、
events hc_x hc_y <chr> <dbl> <dbl> 1 single 80.7 94.2 2 field_out 152. 119. 3 home_run 8.75 83.2 4 single 122. 94.5 5 field_out 107. 149. 6 field_out 119. 73.0
これで、インプレーの打球のみ抽出できました!
関数spray_chartを作ります。
spray_chart <- function(...) ggplot(...)+ geom_curve(x= 33, xend=223, y=-100,yend=-100, curvature = -.65)+ geom_segment(x=128, xend=33, y=-208, yend=-100)+ geom_segment(x=128, xend=223, y=-208, yend=-100)+ geom_curve(x=83, xend=173, y=-155, yend=-156, curvature=-.65, linetype = "dotted")+ coord_fixed()+ scale_x_continuous(NULL, limits = c(25, 225))+ scale_y_continuous(NULL, limits = c(-225,-25))
geom_curve・・・(33, -100)から(233,-100)までの曲線を描く。外野のライン
geom_segment・・・(128, -208)から(33, -100)までと(128, -208)から(223, -100)までの線
geom_curve・・・(83, -155)から(173, -155)への曲線。内野のライン
coord_fixed・・・軸の固定
scale_x_continuous, scale_y_continuous・・・グラフの幅を指定
spray_chart(correa_bip, aes(x = hc_x, y = -hc_y, color = events))+ geom_point()+ scale_color_grey()
はい素晴らしいグラフができました!!
内野の打球は主に3塁側が多く、外野の打球は全体に散らばっています
大谷選手の打球について
さて、このスプレーチャートを作成する仕組みを応用してみたいと思います。
データとして2022年の大谷選手のものを抽出してみようと思います。
まず、7月のデータ
ohtani2207<- scrape_statcast_savant(start_date = "2022-07-01", end_date = "2022-07-31", playerid = 660271, player_type = "batter")
そして、8月のデータ
ohtani2208<- scrape_statcast_savant(start_date = "2022-08-01", end_date = "2022-08-31", playerid = 660271, player_type = "batter")
これらをグラフ化してみます。
ちなみに、7月は打撃成績やや低調でしたが、8月は好調でした。
打率 | 本塁打 | 打点 | OPS | 出塁率 | 長打率 |
.224 | 5 | 13 | .818 | .359 | .459 |
打率 | 本塁打 | 打点 | OPS | 出塁率 | 長打率 |
.317 | 8 | 20 | 1.039 | .386 | .653 |
打球のグラフを見てみると、8月の好調時には逆方向の外野への打球が多いのが目立ちます。
このように、選手のIDや日にちを入力すればStatcastのデータが取れる!ということでもうただただ最高です。