投手が取られた直後に打線が奮起. よくありますね.
取られたら取り返す. 大事です.
直前に点を取られたかどうかは, その後の攻撃に影響するんですかね?
調べてみます. 点を取られたら取り返すのかどうか.
2013年のメジャーリーグのデータを利用します.
library(data.table)
library(dplyr)
dat = fread("../../../../data/all2013.csv")
##
Read 78.6% of 190907 rows
Read 190907 rows and 97 (of 97) columns from 0.076 GB file in 00:00:03
name = fread("../names.csv", header =FALSE)
dat %>% setnames(unlist(name))
各試合, 各イニングごとに, 得点を集計します.
まずは, イニング別得点.
## 得点推移からイニングスコア計算する用のdiff
diff0 = function(x){
return(diff(c(0,x)))
}
dat_inningscore =
dat %>%
group_by(GAME_ID, INN_CT, BAT_HOME_ID) %>%
dplyr::summarise(HOME_SCORE_CT = max(HOME_SCORE_CT),
AWAY_SCORE_CT = max(AWAY_SCORE_CT)) %>%
group_by(GAME_ID) %>%
dplyr::mutate(away = diff0(AWAY_SCORE_CT), home = diff0(HOME_SCORE_CT))
dat_inningscore %>% head(9)
## GAME_ID INN_CT BAT_HOME_ID HOME_SCORE_CT AWAY_SCORE_CT away home
## 1 ANA201304090 1 0 0 3 3 0
## 2 ANA201304090 1 1 0 3 0 0
## 3 ANA201304090 2 0 0 4 1 0
## 4 ANA201304090 2 1 0 4 0 0
## 5 ANA201304090 3 0 0 4 0 0
## 6 ANA201304090 3 1 2 4 0 2
## 7 ANA201304090 4 0 2 4 0 0
## 8 ANA201304090 4 1 2 4 0 0
## 9 ANA201304090 5 0 2 4 0 0
次に, 点を取られた直後かどうかを確認します.
dat_afterscored =
dat_inningscore %>%
group_by(GAME_ID) %>%
mutate(last_away = c(0,head(away, length(away)-1)),
last_home = c(0,head(home, length(home)-1))) %>%
mutate(after_scored_flg = ifelse(BAT_HOME_ID == 1, (last_away>0), (last_home>0))) %>%
select(GAME_ID, INN_CT, BAT_HOME_ID, after_scored_flg)
dat_afterscored %>% head
## GAME_ID INN_CT BAT_HOME_ID after_scored_flg
## 1 ANA201304090 1 0 FALSE
## 2 ANA201304090 1 1 TRUE
## 3 ANA201304090 2 0 FALSE
## 4 ANA201304090 2 1 TRUE
## 5 ANA201304090 3 0 FALSE
## 6 ANA201304090 3 1 FALSE
点を取られた直後かどうかフラグを立てました.
データフレームを結合します.
dat_inning_afterscored =
dat_inningscore %>%
inner_join(dat_afterscored, by=c("GAME_ID","INN_CT","BAT_HOME_ID")) %>%
mutate(score = ifelse(BAT_HOME_ID==1, home, away)) %>%
select(INN_CT, BAT_HOME_ID, after_scored_flg, score)
dat_inning_afterscored
## Source: local data table [43,799 x 5]
## Groups: GAME_ID
##
## GAME_ID INN_CT BAT_HOME_ID after_scored_flg score
## 1 ANA201304090 1 0 FALSE 3
## 2 ANA201304090 1 1 TRUE 0
## 3 ANA201304090 2 0 FALSE 1
## 4 ANA201304090 2 1 TRUE 0
## 5 ANA201304090 3 0 FALSE 0
## 6 ANA201304090 3 1 FALSE 2
## 7 ANA201304090 4 0 TRUE 0
## 8 ANA201304090 4 1 FALSE 0
## 9 ANA201304090 5 0 FALSE 0
## 10 ANA201304090 5 1 FALSE 0
## .. ... ... ... ... ...
攻撃時に何点取れたかと, 直前に点を取られたかどうか, を用意しました.
平均点を出しましょう. 1回の攻撃で何点獲ってくれるか.
# 全体平均
dat_inning_afterscored %>%
group_by(add=FALSE) %>%
dplyr::summarise(score = mean(score))
## Source: local data table [1 x 1]
##
## score
## 1 0.4518
# 点を取られたかどうかで場合分け
dat_inning_afterscored %>%
group_by(after_scored_flg, add=FALSE) %>%
dplyr::summarise(score = mean(score))
## Source: local data table [2 x 2]
##
## after_scored_flg score
## 1 FALSE 0.4531
## 2 TRUE 0.4480
点を取られた直後だと, 平均得点は0.448点. 点を取られていないでは, 平均得点は0.453点.
あまり変わりません.
直前に点を取られたかどうかで, 打線が特別に奮起したりしない.
おまけです. 平均点に差があるのかどうかを検定します. Wilcoxonの順位和検定.
after_scored =
dat_inning_afterscored %>%
dplyr::filter(after_scored_flg == TRUE) %>%
group_by(add=FALSE) %>%
dplyr::select(score) %>% unlist
not_after_scored =
dat_inning_afterscored %>%
dplyr::filter(after_scored_flg == FALSE) %>%
group_by(add=FALSE) %>%
dplyr::select(score) %>% unlist
test_res = wilcox.test(after_scored, not_after_scored)
test_res$p.value
## [1] 0.412
点を取られた直後とそうでない場合, 打線が奮起して点を取ってくれるのかどうか.
平均点に差があるという帰無仮説は, 有意水準5%で棄却できませんでした(p値は0.412).
点をとるかどうかの2値ならどうですかね?
dat_inning_afterscored %>%
mutate(score_flg = (score > 0)) %>%
group_by(after_scored_flg, add = FALSE) %>%
dplyr::summarise(score_inning = sum(score_flg), inning = n()) %>%
mutate(score_prob = score_inning / inning)
## Source: local data table [2 x 4]
##
## after_scored_flg score_inning inning score_prob
## 1 FALSE 8459 32987 0.2564
## 2 TRUE 2730 10812 0.2525
はい.