読者です 読者をやめる 読者になる 読者になる

300億円欲しい

メジャーリーグのデータ解析します

メジャーリーグのデータ解析をしたい ( とりあえずBABIPの集計 )

R 野球 セイバーメトリクス

野球の話です.

BABIPとは

「当たりは良かったのですが, セカンド正面でした」
ってよくありますよね. 飛んだところが悪かった, という打球です.

逆に,
「当たりは悪かったのですが, 内外野の間に落ちました」
もよくあります. ポテンヒットです. 飛んだところが良かった, という打球です.

頑張ってミートして芯に当てても, 打球方向が悪いとアウトになります.
逆にボテボテの当たりでも, 野手の間に飛べばヒットになることがあります.

打球方向に関して, ある程度は運要素がある気がしますね.

これを調べる, BABIPという指標があります.
BABIP (野球) - Wikipedia
Batting Average on Balls In Playの略です.
バットにあたってフィールドに飛んだボールのうち, ヒットになったものの割合です.

BABIPの値が普段よりも高い時期は, 打率も良くなりますが,
それは偶然いいところに飛んでいるだけ...と言えるかもしれません.

BABIPの計算

ここ最近首位打者を獲得した選手の, BABIPと打率の遷移を見てみます.

打者は, 現役最強打者, 3冠王ミゲル・カブレラ,
ミゲル・カブレラ - Wikipedia

知らないおじさん, 2013年首位打者マイケル・カダイアー,
マイケル・カダイアー - Wikipedia
メッツ球団初2012年首位打者, ホセ・レイエス
ホセ・レイエス - Wikipedia
の3人を選びました.

とりあえず打率から
f:id:gg_hatano:20140209000257p:plain

次にBABIP
f:id:gg_hatano:20140209000235p:plain

一番高い, 青線はカブレラです.
強いです. BABIPの変動は小さいです.

真ん中の赤線はホセ・レイエス.
首位打者を獲得した2011年はBABIPが高くなっています.
BABIPが高いから打率もいいです. 当たり前です.

緑の線で表したカダイアー.
2013年に首位打者を取りましたが, BABIPも急激に高くなっていますね.
もしかしたら相当ツイていたのかも...ということが言えます.
来年も同じくらい打てますかね? 難しいかもしれません.

続きます.

ソースコード

retrosheetから引っ張ってきたデータを弄るだけです.
pitchfxと組み合わせて, もっと詳しい解析ができそうです. あとでやります.

library(data.table)
library(plyr)
library(dplyr)
season_babip <- function(year){
  filename = paste("all", year, ".csv", sep="")  
  dat <- fread(filename)
  fields <- fread("fields.csv")
  setnames(dat, fields$Header)
 
  inplay_hit = c(20,21,22) 
  # 20, 21, 22 = single, double, triple
  not_inplay = c(3, 23)
  # 3, 23 = strike out, HR
 
  setkey(dat, AB_FL)
  dat_AB = dat[J("T")]
  dat_AB$inplay_hit = with(dat_AB, ifelse(EVENT_CD %in% inplay_hit, 1, 0))
  dat_AB$inplay = with(dat_AB, ifelse(EVENT_CD %in% not_inplay, 0, 1))
 
  # calculate BABIP and avg
  dat_babip = dat_AB %.% group_by(BAT_ID) %.% dplyr::summarise(babip =sum(inplay_hit)/ sum(inplay), 
                                                               avg = sum(H_FL!=0)/ length(H_FL),
                                                               hit = sum(H_FL!=0),
                                                               atbat = length(H_FL)
                                                               )
 
  # make name data
  master = fread("Master.csv")
  master$fullname = with(master, paste(nameFirst, nameLast))
  name_id_data = with(master, data.frame(name = fullname, BAT_ID = retroID))
  babip_name_data = merge(dat_babip, name_id_data, by="BAT_ID")
  babip_name_data$year = year
  
  return(babip_name_data)
}
 
dat = data.table()
for(N in 2010:2013){  
  dat <- rbind.data.frame(dat, season_babip(N))
}
setkey(dat, BAT_ID)
dat <- arrange(dat, BAT_ID)