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