Rで統計解析して解く馬券力検定 問1~5(全50問)

競馬王テクニカル 儲けの法則編(2015年 ガイドワークス)- amazon.co.jpに馬券力検定という全50問の競馬に関する問題があります。問1から5までの5問をRで解いてみました。

中央競馬データのロード

2013年1月3日から2016年5月29日までの中央競馬のレース結果データを使用します。使用するデータの取得方法は、1つ前のポスト競馬をRで統計解析する初めの一歩に書いてあります。

data <- read.csv("jra_race_result.csv", skip = 1, header = F)
colnames(data) <- c("date","venue","raceNumber","raceName","track","runDirection","distance","trackCondition","purse","headsCount","finishOrder","postPosition","horseNumber","horseName","horseSex","horseAge","jockeyName","time","margin","waypointOrder","time3F","loadWeight","horseWeight","dhorseWeight","oddsOrder","odds","isBlinkers","trainerName","commentsByTrainer","evaluationByTrainer")

問1. 1番人気の平均勝率は?

答えは、

1番人気が1着のレース数 / 全レース数

で求まります。これをRで計算すると次のようになります。

# データ期間内の全レース数
length(unique(interaction(data$date, data$venue, data$raceNumber)))
## [1] 11795
# 1番人気が1着だったレース数
length(data$odds[data$oddsOrder==1 & data$finishOrder==1])
## [1] 3716
3716/11795
## [1] 0.3150487

1番人気の平均勝率は約31.5%です。

ちなみに2番人気の勝率は約18.3%、3番人気の勝率は約12.7%です。

# 2番人気の平均勝率
length(data$odds[data$oddsOrder==2 & data$finishOrder==1])
## [1] 2154
2154/11795
## [1] 0.1826198
# 3番人気の平均勝率
length(data$odds[data$oddsOrder==3 & data$finishOrder==1])
## [1] 1503
1503/11795
## [1] 0.1274269

問2. 1番人気の平均複勝率は?

複勝は3着以内に入ることなので、答えは、

1番人気が3着以内のレース数 / 全レース数

で求まります。

# 1番人気が複勝だったレース数
length(data$odds[data$oddsOrder==1 & data$finishOrder<=3])
## [1] 7408
# 1番人気の平均複勝率
7408/11795
## [1] 0.6280627

よって答えは約62.8%です。

data_sciesotistさんのコメントで、複勝は出走頭数が少ない(7頭以下)場合は2着までしか当たりにならないことを知りました。厳密な数字を出すには頭数で場合分けをする必要がありますが、ここではそこまでしていません。

また、2番人気の平均複勝率は約50%、3番人気の平均複勝率は約40%です。

# 2番人気の平均複勝率
length(data$odds[data$oddsOrder==2 & data$finishOrder<=3])
## [1] 5858
5858/11795
## [1] 0.4966511
# 3番人気の平均複勝率
length(data$odds[data$oddsOrder==3 & data$finishOrder<=3])
## [1] 4712
4712/11795
## [1] 0.3994913

問3. 1から3番人気すべてが馬券圏外になる確率は?

馬券圏外とは、単勝・複勝・枠連・馬連・ワイド・馬単・三連複・三連単・WIN5の馬券すべての馬券が外れるということで、投票した馬が3着までに入らなかったということです(だよね?)。

よって、1番から3番人気が3着までに入らなかったレース数をすべて求めて、全レース数で割れば答えが求まります。

# 3番人気までかつ着順が4位以下のデータフレームを作る
tmp <- subset(data, data$oddsOrder<=3 & data$finishOrder>=4)

# 候補キーであるdate.venue.raceNumberの出現数をカウントしたテーブルを作る
tbl <- ftable(interaction(tmp$date, tmp$venue, tmp$raceNumber))

# 出現数0はそんなレースはない table()に drop=T オプションをつければ0はない (後で気づいた)
# 出現数1は1から3番人気のどれか1頭が4着以下だったレース数
# 出現数2は1から3番人気のどれか2頭が4着以下だったレース数
# 出現数3は1から3番人気のすべてが4着以下だったレース数
table(tbl)
## tbl      0     1      2      3
##      34038  5309   4682    851
# よって答えは
851/11795
## [1] 0.07214922

1から3番人気すべてが馬券圏外になる確率は約7.2%です。

問4. 三連複が1から5番人気で決まる確率は?

# 1から5番人気かつ3着以内のレースのデータフレームを作る
tmp <- subset(data, oddsOrder<=5 & finishOrder<=3)

# レースの度数分布を得る
tbl <- ftable(interaction(tmp$date, tmp$venue, tmp$raceNumber))

# 0はそんなレースなかったということ table()に drop=T オプションをつければ0はない (これも後で気づいた)
# 1は1から5番人気のいずれか1頭が3着以内のレース数
# 2は1から5番人気のいずれか2頭が3着以内のレース数
# 3は1から5番人気のいずれか3頭が3着以内のレース数
# 4は3と同じ ただし3着が同着で2頭いるレース数
table(tbl)
## tbl     0     1     2     3     4
##     33291  2061  5670  3856     2
(3856+2)/11795
## [1] 0.3270877

三連複が1から5番人気で決まる確率は約32.7%です。3番人気までなら約7.6%です。

# ちなみに3番人気までなら
tmp <- subset(data, oddsOrder<=3 & finishOrder<=3)
tbl <- ftable(interaction(tmp$date, tmp$venue, tmp$raceNumber))
table(tbl)
## tbl    0     1     2     3
##    33970  4740  5272   898
898/11795
## [1] 0.07613396

問5. 芝とダートで1番人気馬の複勝率が高いのは?

まず、ダートの1番人気馬の複勝率を計算します。

# ダートの全レース数
dirt <- subset(data, track=="ダート")
length(unique(interaction(dirt$date, dirt$venue, dirt$raceNumber)))
## [1] 5746
# ダートの開催地の内訳 (計算とは直接関係なし)
summary(dirt$venue[!duplicated(interaction(dirt$date, dirt$venue, dirt$raceNumber))])
## 中京  中山  京都  函館  小倉  新潟  札幌  東京  福島  阪神
## 504   939  1045  268  286   411   137   944  351   861
# ダートの1番人気が3着以内のレース数
dirt <- subset(data, track=="ダート" & oddsOrder==1 & finishOrder<=3)
length(unique(interaction(dirt$date, dirt$venue, dirt$raceNumber)))
## [1] 3722
# ダートの1番人気の複勝率
3722/5746
## [1] 0.647755

ダートの1番人気馬の複勝率は約64.8%です。

次に芝の1番人気馬の複勝率を計算します。

# 芝の全レース数
turf <- subset(data, track=="芝")
length(unique(interaction(turf$date, turf$venue, turf$raceNumber)))
## [1] 5614
# 芝の開催地の内訳 (計算とは直接関係なし)
summary(turf$venue[!duplicated(interaction(turf$date, turf$venue, turf$raceNumber))])
## 中京  中山  京都  函館  小倉  新潟  札幌  東京  福島  阪神
## 463   681   887  308   507  531  174   883   454   726
# 芝の1番人気が3着以内のレース数
turf <- subset(data, track=="芝" & oddsOrder==1 & finishOrder<=3)
length(unique(interaction(turf$date, turf$venue, turf$raceNumber)))
## [1] 3422
# 芝の1番人気の複勝率
3422/5614
## [1] 0.6095476

芝の1番人気馬の複勝率は約61%です。

ダートは約64.8%ですから芝より約3.8%高いです。

以上、馬券力検定の問1から5までRで解きました。

Kosuke Maeda / まえだこうすけ

「機械学習で競馬予想して勝てるのか?」をテーマに活動中! QiitaにはR、VBAなどのTipsを投稿しています。