メジャーリーグのデータ解析をしたい ( とりあえずBABIPの集計 )
野球の話です.
BABIPとは
「当たりは良かったのですが, セカンド正面でした」
ってよくありますよね. 飛んだところが悪かった, という打球です.
逆に,
「当たりは悪かったのですが, 内外野の間に落ちました」
もよくあります. ポテンヒットです. 飛んだところが良かった, という打球です.
頑張ってミートして芯に当てても, 打球方向が悪いとアウトになります.
逆にボテボテの当たりでも, 野手の間に飛べばヒットになることがあります.
打球方向に関して, ある程度は運要素がある気がしますね.
これを調べる, BABIPという指標があります.
BABIP (野球) - Wikipedia
Batting Average on Balls In Playの略です.
バットにあたってフィールドに飛んだボールのうち, ヒットになったものの割合です.
BABIPの値が普段よりも高い時期は, 打率も良くなりますが,
それは偶然いいところに飛んでいるだけ...と言えるかもしれません.
BABIPの計算
ここ最近首位打者を獲得した選手の, BABIPと打率の遷移を見てみます.
打者は, 現役最強打者, 3冠王ミゲル・カブレラ,
ミゲル・カブレラ - Wikipedia
知らないおじさん, 2013年首位打者マイケル・カダイアー,
マイケル・カダイアー - Wikipedia
メッツ球団初2012年首位打者, ホセ・レイエス
ホセ・レイエス - Wikipedia
の3人を選びました.
とりあえず打率から
次にBABIP
一番高い, 青線はカブレラです.
強いです. 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)