データ元

http://dokoka.org/wiki.cgi?page=R%A4%C8%B6%A5%C7%CF%A5%C7%A1%BC%A5%BF%A4%C7%B3%D8%A4%D6%C5%FD%B7%D7%B3%D8%A1%A1%C2%E81%B2%F3%A1%A1%A5%C7%A1%BC%A5%BF%A5%BD%A1%BC%A5%B9%A4%C8%A4%B7%A4%C6%A4%CE%B6%A5%C7%CF%A4%CE%CC%A5%CE%CF

考え方

http://introndatalab.com/blog/7

データクレンジング

> jra <- read.csv("jra_race_result.csv")
> #str(jra)
> # install.packages("lubridate")
> library(lubridate)
> jra$date <-  ymd(jra$開催日)
> # install.packages("BH")
> # install.packages("dplyr")
> library(dplyr)
> n.t.2500 <- filter(jra,競馬場=="中山") %>% filter(コース=="芝") %>% filter(距離=="2500")
> 
> n.t.2500$isIn2nd <- 0
> n.t.2500$isIn2nd[which(n.t.2500$着順 %in% 1:2)] <- 1
> 
> n <- nrow(n.t.2500)
> 
> UmaNyusyoRatio <- c()
> KisyuNyusyoRatio <- c()
> for(i in 1:n){
+   uma <- n.t.2500$馬名[i]
+   kishu <- n.t.2500$騎手[i]
+   time <- n.t.2500$date[i]
+   d1 <- filter(jra,馬名==uma)
+   p <- nrow(d1)
+   if(length(which((time - d1$date)>0))>0){
+     d2 <- d1[which((time - d1$date)>0),]
+     UmaNyusyoRatio[i] <- sum(d2$着順 %in% 1:2)/p
+   }
+   d3 <- filter(jra,騎手==kishu)
+   p <- nrow(d3)
+   if(length(which((time - d3$date)>0))>0){
+     d4 <- d3[which((time - d3$date)>0),]
+     KisyuNyusyoRatio[i] <- sum(d4$着順 %in% 1:2)/p
+   }
+ }

ロジスティック回帰

> dat <- data.frame(isIn2nd=n.t.2500$isIn2nd, UmaNyusyoRatio,KisyuNyusyoRatio)
> dat.glm <- glm(isIn2nd ~ UmaNyusyoRatio + KisyuNyusyoRatio, family = binomial,data=dat)
> print(dat.glm)

Call:  glm(formula = isIn2nd ~ UmaNyusyoRatio + KisyuNyusyoRatio, family = binomial, 
    data = dat)

Coefficients:
     (Intercept)    UmaNyusyoRatio  KisyuNyusyoRatio  
          -2.421             2.054             3.999  

Degrees of Freedom: 408 Total (i.e. Null);  406 Residual
  (20 observations deleted due to missingness)
Null Deviance:      344.6 
Residual Deviance: 334.5    AIC: 340.5

2016有馬記念で

> arima2016 <- read.csv("arima2016.csv")
> n <- nrow(arima2016)
> 
> UmaNyusyoRatio <- c()
> KisyuNyusyoRatio <- c()
> for(i in 1:n){
+   uma <- as.character(arima2016$uma[i])
+   kishu <- as.character(arima2016$kishu[i])
+   time <- ymd("2016-12-25")
+   d1 <- filter(jra,馬名==uma)
+   p <- nrow(d1)
+   if(length(which((time - d1$date)>0))>0){
+     d2 <- d1[which((time - d1$date)>0),]
+     UmaNyusyoRatio[i] <- sum(d2$着順 %in% 1:2)/p
+   }
+   d3 <- filter(jra,騎手==kishu)
+   p <- nrow(d3)
+   if(length(which((time - d3$date)>0))>0){
+     d4 <- d3[which((time - d3$date)>0),]
+     KisyuNyusyoRatio[i] <- sum(d4$着順 %in% 1:2)/p
+   }
+ }
> KisyuNyusyoRatio[which(is.na(KisyuNyusyoRatio))]<-0
> dat2 <- data.frame(Intercept = 1, UmaNyusyoRatio, KisyuNyusyoRatio)
> y <- as.matrix(dat2) %*% as.matrix(coef(dat.glm))
> p <- exp(y)/(1+exp(y))
> dat3 <- data.frame(no = arima2016$no, name = arima2016$uma,p)
> library(knitr)
> kable(arrange(dat3,desc(p)))
no name p
11 サトノダイヤモンド 0.6769046
8 ミッキークイーン 0.5713719
1 キタサンブラック 0.5012729
14 シュヴァルグラン 0.4950787
6 サウンズオブアース 0.4747347
2 ゴールドアクター 0.4118978
15 アルバート 0.3760604
13 デニムアンドルビー 0.3419766
10 アドマイヤデウス 0.3270356
16 マリアライト 0.3223782
5 サムソンズプライド 0.2804364
4 ヤマカツエース 0.2626928
7 マルターズアポジー 0.2139982
9 ヒットザターゲット 0.2035992
3 ムスカテール 0.1755617
12 サトノノブレス 0.1531960