セイバーメトリクス

Rによるセイバーメトリクス入門 をじっくり学ぶ Statcastの打球データ①

さて、これまで、得点期待値やそれを用いた得点価値を求めるところまでできました。

今回は、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()
2019年5月にコレア選手が放った打球

はい素晴らしいグラフができました!!

内野の打球は主に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")

これらをグラフ化してみます。

2022年7月に大谷選手が打った打球
2022年8月に大谷選手が打った打球

ちなみに、7月は打撃成績やや低調でしたが、8月は好調でした。

打率本塁打打点OPS出塁率長打率
.224513.818.359.459
2022年7月の成績
打率本塁打打点OPS出塁率長打率
.3178201.039.386.653
2022年8月の成績

打球のグラフを見てみると、8月の好調時には逆方向の外野への打球が多いのが目立ちます。

このように、選手のIDや日にちを入力すればStatcastのデータが取れる!ということでもうただただ最高です。

-セイバーメトリクス