前処理

ということで、ようやく週末でしっかり作業できそうですので、早速、データの前処理。まずは必要なデータのみに絞っていきます。

> library(data.table)
> dt<-fread("./data/SE.csv")
#直近のデータにはタイムとかが入ってないので、削ります。
> dt<-dt[V3<20150721,]
> src<-dt[,list(V4,V5,V6,V9,V10,V11,V12,V13,V15,V18,V20,V21,V22,V23,V26,V28,V30,V32,V36,V37,V38,V41,V44,V48,V49,V50,V51,V52,V53,V58,V59,V66,V73)]

ということで、最後に以下のデータ項目に絞り込みを行っています。

# ラベル 項目
1 V4 開催年
2 V5 開催月日
3 V6 競馬場コード
4 V9 レース番号
5 V10 枠番
6 V11 馬番
7 V12 血統登録番号
8 V13 馬名
9 V15 性別コード
10 V18 馬齢
11 V20 調教師コード
12 V21 調教師名略称
13 V22 馬主コード
14 V23 馬主名
15 V26 負担重量
16 V28 ブリンカー使用区分
17 V30 騎手コード
18 V32 騎手名略称
19 V36 馬体重
20 V37 増減符号
21 V38 増減差
22 V41 確定着順
23 V44 走破タイム
24 V48 1コーナーでの順位
25 V49 2コーナーでの順位
26 V50 3コーナーでの順位
27 V51 4コーナーでの順位
28 V52 単勝オッズ
29 V53 単勝人気順
30 V58 後4ハロンタイム
31 V59 後3ハロンタイム
32 V66 タイム差
33 V73 今回レース脚質判定

で、これだけだとレース情報がわからないので、レース情報の方も整形していきます。

> dt<-fread("./data/ra.csv")
#結果(月曜発表)が出ているレースに絞り込み。
> dt<-dt[V2==7,]
> src2<-dt[,list(V4,V5,V6,V9,V10,V11,V12,V18,V23,V25,V28,V29,V30,V31,V32,V33,V34,V36,V40,V41,V42,V43,V44,V60,V62,V65,V66,V67,V94,V95,V96,V97,V98,V100,V101,V103,V104,V106,V107,V109)]


レース情報は以下に絞り込み。多い・・・

# ラベル 項目 sample
1 V4 開催年
2 V5 開催月日
3 V6 競馬場コード
4 V9 レース番号
5 V10 曜日コード
6 V11 特別競走番号
7 V12 競走名本題
8 V18 競走名略称10文字
9 V23 グレードコード
10 V25 競争種別コード
11 V28 競争条件コード2歳条件
12 V29 競争条件コード3歳条件
13 V30 競争条件コード4歳条件
14 V31 競争条件コード5歳条件
15 V32 競争条件コード歳若年条件
16 V33 競争条件名称
17 V34 距離
18 V36 トラックコード
19 V40 本賞金1着
20 V41 本賞金2着
21 V42 本賞金3着
22 V43 本賞金4着
23 V44 本賞金5着
24 V60 発走時刻
25 V62 登録頭数
26 V65 天候コード
27 V66 芝馬場状態コード
28 V67 ダート馬場状態コード
29 V94 前3ハロンタイム
30 V95 前4ハロンタイム
31 V96 後3ハロンタイム
32 V97 後4ハロンタイム
33 V98 コーナー
34 V100 各通過順位
35 V101 コーナー
36 V103 各通過順位
37 V104 コーナー
38 V106 各通過順位
39 V107 コーナー
40 V109 各通過順位


ちょっと欲張りすぎたかな・・・1〜4でレースが一意に決まります。で、今回目的のデータセットを作ります。とりあえず、開催年、開催月日、レース番号、馬番、血統登録番号、馬名、確定着順、単勝人気順、後3ハロンタイム、距離、芝馬場状態コード、ダート馬場状態コードを作ります。

#まずは馬毎レースデータを東京競馬場に絞り込み
> data_train <- src[V6==5,]
#フィールドの絞り込み
> data_train <- data_train[,list(V4,V5,V9,V11,V12,V13,V41,V53,V59)]

#続けて開催年・開催月日・レース番号でキーを作成(最初からやっとけよって話ですよね・・・)。
> data_train[,key:=paste(data_train[,V4],data_train[,V5],data_train[,V9])]
> data_train <- data_train[,list(key,V11,V12,V13,V41,V53,V59)]

#次にレース情報のフィールドを絞り込み
#結局(開催年、開催月日、レース番号、レース名称、グレードコード、距離、トラックコード(芝ダ種別)、本賞金1位)にした。
> tmp <- src2[V6==5,]
> tmp <- tmp[,list(V4,V5,V9,V18,V23,V34,V36,V40)]

#同じくキー作成
> tmp[,key:=paste(tmp[,V4],tmp[,V5],tmp[,V9])]
> tmp <- tmp[,list(key,V18,V23,V34,V36,V40)]


#で、以下でjoin
> install.packages("plyr")
> library(plyr)
> data_train <- join(data_train,tmp,by="key")


で、さらにここから、各馬のそのレース以前の入賞比率のフィールドを追加します。結構悩みましたが、よくよく考えてみれば、「そのレコード以前のデータの平均」すなわち、株取引でいうところの移動平均じゃん、というところに気がつき、移動平均なら絶対誰かライブラリ作ってるやろ、ってことで探してみました。

・・・と色々探してみましたがコレというものがなく、結局、やりたかった前Nレースの入賞比率ではなく、前全レースの入賞比率を出すことにしました。

#まずは、3着以内フィールドを作成(V41が確定着順)。
> data_train <- data_train[,list(key,V11,V12,V13,V41,ifelse(data_train$V41<4,1,0),V53,V59,V18,V23,V34,V36,V40)]

#dplyrをインストール
> install.packages("dplyr")
> library(dplyr)

#説明後述
> data_train<-mutate( group_by(data_train,V12), nyusyo=cummean(V6))
> data_train[V12==2009106253,]
Source: local data table [6 x 14]

           key V11        V12

(略)

                                                     V13 V41 V6 V53

(略)

Variables not shown: V59 (int), V18 (chr), V23 (chr), V34 (int), V36 (int), V40
  (int), nyusyo (dbl)

#data.frameで出力
> data.frame(data_train[V12==2009106253,])
           key V11        V12

(略)

                                                     V13 V41 V6 V53 V59

(略)

                             V18 V23  V34 V36     V40    nyusyo

(略)

ということで、こんな感じです。サラッと書いていますが、これやるだけで数時間ググりまくりました・・・・。
で、結局、かの高名なdplyrを使ってやってみました。よくよく考えたらplyrでもできたきがしますが。data_train<-mutate( group_by(data_train,V12), nyusyo=cummean(V6))では、mutateで各要素について計算した結果を新規列として追加しています。計算式はnyusyo=cummean(V6)です。列ラベルをnyusyoとしたうえで、cummean(V6)の計算結果を入れます。group_byでは、馬コードでグルーピングしています。入賞比率は馬毎に計算しますからね。cummean(V6)ですが、今回一番のミソでしょう。詳細はよくわかりませんが、操作中の要素とそれ以前のすべての要素の平均を出してくれます。ただのmeanだと、全データの平均になってしまいます。ちなみに、cummeanはデフォの関数みたいです・・・すげー探したのに・・・orz
あと、できたデータを出力する時ですが、普通にやるとVariables not shown:が出てしまって後ろの方のフィールドが見えません。コレ調べたんですが、なにやらdplyrの仕様らしいです*1。なので、data.frameにして出力しましょう。

まぁ、とりあえず、求めていたデータセットができました。ですが、はやり東京競馬場だけに限定してしまうとややデータ不足ですね。また、全競馬場含んだものにしようと思います。

ということで、これまでの操作をまとめ。

library(data.table)
library(plyr)
library(dplyr)

#ファイル読み込み
dt<-fread("./data/SE.csv")
#未更新データ削除
dt<-dt[V3<20150721,]
#フィールド絞り込み
data_train <- dt[,list(V4,V5,V9,V11,V12,V13,V41,V52,V53,V59)]

#開催年・開催月日・レース番号からキー作成
data_train[,key:=paste(data_train[,V4],data_train[,V5],data_train[,V9])]
data_train <- data_train[,list(key,V11,V12,V13,V41,V53,V59)]


#ファイル読み込み
dt<-fread("./data/ra.csv")
#未更新データ削除
dt<-dt[V2==7,]
#フィールド絞り込み
tmp <- dt[,list(V4,V5,V9,V18,V23,V34,V36,V40)]

#開催年・開催月日・レース番号からキー作成
tmp[,key:=paste(tmp[,V4],tmp[,V5],tmp[,V9])]
tmp <- tmp[,list(key,V18,V23,V34,V36,V40)]

#data_trainとtmpをkeyでjoin
data_train <- join(data_train,tmp,by="key")

#入賞フラグ作成
data_train <- data_train[,list(key,V11,V12,V13,V41,ifelse(data_train$V41<4,1,0),V53,V59,V18,V23,V34,V36,V40)]

#入賞比率算出
data_train<-mutate( group_by(data_train,V12), nyusyo=cummean(V6))