重回帰分析を使って競馬の予測モデルを作ってみた

※本記事のアップデート、続編をこちらで書いています。

前回、2017年は統計学を使った競馬の予測にチャレンジしてみようなんてことを書いてしまいました。まだまだ試行錯誤中なのですが、どのように予測をするのかが今回の記事になります。よろしくどうぞ。しつこいですが「よろしくどうぞ」はスーパー競馬の吉田均さんのオマージュです。

おおまかにはこんなステップです。

予測モデル作成のステップ
 1.競馬予想のファクターを整理する
 2.データを準備する
 3.タイムの予測式を作る
 4.出走馬のタイムを導き出す

 

1.競馬予想のファクターを整理する

まずは「競馬予想」についてあらためて考え、整理していきます。ここが予測のすべてを決めるといっても過言ではありません。勝ち馬をどう予測するのか(したいのか)を決めます。考案者の視点や思想が大いに繁栄される魂の作業です。ただし、何が勝ち馬への道しるべになるのかまだ見当がつきません。ですからまずは考えられる要素をできるだけ数多く出していきます。思いついたものはなんでもいいです。この段階では。
仕事でも何か新しい企画を考えるとき、まずはみんなでブレストしてアイデアを出し合う、良し悪しはともかくとにかく数を出してみる。それと同じです。

競馬書籍、競馬新聞、知り合いの競馬予想ラジオ、フジテレビONEでやっている競馬予想TV!などを参考にしながら、競馬予想のファクターを書き出していきました。統計学や重回帰分析という言葉と比べるととてもアナログな作業です。場外馬券場にいるおじさん達にも協力してもらいたかったです。

デフォルメしてますがざっくりまとめるとこうです。なんとなく「まあこんな感じで予想するよね」になっているかと思います。この「まあこんな感じ」は大事です。ここで出てきた要素でモデルを作っていくわけですから。場外馬券場にいるおじさんが必要というのは冗談でもなんでもなく、本来は何人かの競馬好きで集まってワイワイやるのがいいと思います。色んな視点から考えて何か足りないなと感じればまた要素を足していきます。

%e4%ba%88%e6%83%b3%e3%83%95%e3%82%a1%e3%82%af%e3%82%bf%e3%83%bc

魂の完成です。こちらをベースに予測モデルを組み立てていきます。

 

2.データを準備する

この図をアップロードすると人工知能が画像解析してJRA-VANと照合し勝ち馬を導き出してくれる、なんてことは残念ながら今のところできません。(5年後くらいはわからないと思います)
個々の項目に対応する具体的なデータを検討します。ズバリのデータもありますが、データを変換するもの、自分で作るものもあります。詳しい方ならば簡単に抽出できたと思うのですが文系の私には難しく、JRA-VANにある競馬予想支援ソフト「TARGET」からデータを出力しExcelやAccessで加工しました。

分析対象は過去5年分のレースにしました。約25万頭分のデータになります。ダウンロードをしているとあらためて競馬のデータ量の膨大さに驚かされます。

そもそも勝ち馬を予測するといっても、具体的に何を予測するかを決めなくてはいけません。が、この段階ではまだ絞り切れていませんでした。大きく分けると「着順」か「タイム」なのですが、自分は後者を想定していました。前回のブログにも書きましたが、走破タイムが予測できれば超カッコいいわけですよ。1000m時点のタイムなどに置き換えれば展開予想とかもできるわけですから予測に深みが増すかなとも思いました。ですが、最終的にモデルを組む中で走破タイムそのものを予測することはあきらめました。当然なのですが、予測の根拠の大半を占めるであろう馬の実力以外に左右される要素が多すぎました。ペース、出走メンバーのレベル、芝の状態などですね。となると着順になるのですが、できればレースレベルみたいなものも反映したい、指数的なものにして「おーこのタイムはG1級だ!」みたいなことも言いたくて(これも超カッコいいから)最終的にはTARGETで公開している馬場差を考慮した補正タイムを予測することにしました。これは「100=1000万下を勝てるレベル」「1は0.1秒」という基準値があり、過去データも豊富にあるので、こちらを予測対象とすることで勝ち馬とレースレベルの推測が両立できます。最初は自分で補正タイム作っていたのですが更新が大変なので挫折しました。使える2次データはありがたくどんどん使っていきます。

過去5年の競争成績をダウンロードしたり
%e9%81%8e%e5%8e%bb5%e5%b9%b4%e3%81%ae%e7%ab%b6%e4%ba%89%e6%88%90%e7%b8%be

前5走のデータを結合したり
%e5%89%8d5%e8%b5%b0%e3%81%ae%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e7%b5%90%e5%90%88

騎手と調教師を年度ごとの成績でランク付けしたり
%e9%a8%8e%e6%89%8b%e8%aa%bf%e6%95%99%e5%b8%ab

種牡馬、母父を産駒の能力やコース適性でランク付けしたり
%e7%94%a3%e9%a7%92%e5%b9%b3%e5%9d%87%e6%8c%87%e6%95%b0

%e3%82%b3%e3%83%bc%e3%82%b9%e9%81%a9%e6%80%a7

しながら分析用データを完成させていきました。
最終的に過去5年約25万頭分について以下のデータを用意しています。まだ追加検討したい項目はありますが、まずは極力シンプルにしています。

属性レース条件能力
牡馬過去5走の3コーナー位置取り
牝馬1走前の3コーナー位置取り
セン馬コース1走前の上り3F 1位経験
年齢レースの格1走前の対2走前指数変化
調教師能力馬齢限定1走前の対過去平均指数変化
種牡馬能力牝馬限定1走前の指数
種牡馬コース適性     馬場状態2走前の指数
母父能力騎手能力3走前の指数
母父コース適性斤量4走前の指数
出走頭数5走前の指数
枠番過去5走の上がり3F1位経験
馬番過去5走の平均指数
乗り替わり騎手能力変化過去5走のベスト指数
前走からの距離変化
前走からの斤量変化
前走からの枠順変化
前走からの馬番変化
前走からの芝・ダ変化

 

3.タイムの予測式を作る

ようやく分析のスタートラインです。タイトルにもある通り「重回帰分析」という手法を使います。こちらのサイトの説明を引用させていただきます。

例としてある店の顧客に対する販売実績と、顧客の属性の関係を分析します。目的変数として、ある年の各顧客の購入額をとります。説明変数として、顧客の属性(年齢、性別、家族人数、年収など)を用いることとします。すなわち、(購入額)= a ×(年齢)+ b ×(性別)+ c ×(家族人数)+ d ×(年収)+(誤差)という式において、a,b,c,d (これを偏回帰係数といいます)の値と、誤差項の値を求めます。この式に、新しい顧客の属性データを入れれば、購入額が推定できるというのが、(重)回帰分析の考え方です。

ここでいう(購入額)がタイム、(年齢)(性別)(家族人数)(年収)が過去の成績、斤量、馬場状態、鞍上強化、種牡馬などになります。それぞれの要素に係数をかけ算することで、過去走った馬のタイムに近くなるような式を作ります。そして、この式にこれから走る馬の情報を代入してタイム、勝ち馬を予測します。長くなりましたがこれがやりたかったんです。

計算には統計ソフトを使って行います。IBMの予測分析ソフトSPSSを使いました。各データを投入していきます。

spss1

例えば、京都芝1600mの過去5年出走馬4021頭のデータを使って計算すると、こんな式ができます。競馬ファンが知っている用語に謎の数値がかけられてタイムが計算されます。あらためて見ると不思議な式ですが、もしかしたらある競馬ファンの脳内を可視化するとこんな風になっているのかもしれません。

京都芝1600mのタイム(TARGET補正タイム)=(新馬戦)*-16.7+(未勝利戦)*-13.2+(500万下)*-7.1+(1000万下)*-5.2+(2歳限定戦)*-1.6+(3歳限定戦)*-3.5+(牝馬限定戦)*1.7+(重馬場)*-4.5+(不良馬場)*-8.9+(牡馬)*1.8+(騎手ランク)*0.2+(調教師ランク)*0.1+(種牡馬適性)*0.1+(母父適性)*0.03+(出走頭数)*-0.2+(馬番)*-0.2+(前走ダート)*-2.7+(距離変化)*-0.003+(乗り替わり騎手能力変化)*-0.1+(斤量変化)*-0.6+(1走前のポジション)*-1.3+(前5走上がり1位経験)*1.2+(1走前のタイム指数)*0.1+(前5走平均タイム指数)*0.2+(前5走ベストタイム指数)*0.2

複雑な式ですが、それぞれの(  )に出走各馬のデータを当てはめていけばいいのです。レース条件など「該当/非該当」形式なら「1 or 0」、タイム指数や斤量などはそのままの数値をかけていきます。計算しやすくするために出馬表データを加工する必要がありますが変換表を作ってしまえば問題ありません(スキル不足によりたくさんミスしましたが)。コース別に式を作りました。ちなみにこの京都芝1600mの決定係数は0.71となっています。1に近い方が予測モデルとしては優秀です。明確な基準はないのですが0.71は「なかなか上手くタイムが予測できているね」です。

上記の式を見て「なぜこの観点、あの観点は計算式に入ってないの?」と思われるかもしれません。実はこの倍以上の項目を投入しているのですが、重回帰分析の手法で、精度高くタイムを予測する上で変数が仕分けされていき、最終的に残った項目がこの式になります。

 

4.出走馬のタイムを導き出す

ちなみにこのブログを書いているのは2017年1月7日(土)です。明日は同条件の重賞レース「シンザン記念」が行われますので、この数式に出走馬データを入力してタイム予測をしてみました。

%e3%82%b7%e3%83%b3%e3%82%b6%e3%83%b3%e8%a8%98%e5%bf%b5

過去5年の結果にある勝ち馬の指数を見ると、今回導き出されたスコアのトップ「ペルシアンナイト:102」は十分勝利できるレベルにあることがわかります。出走馬のスコアを見るとその年のレベルや混戦具合を推し量ることもできそうです。過去2年よりもややレベルの高いレースになるかもしれません。

統計の専門家から見ると穴があるかもしれませんが、このような考え方で競馬の予測式を作ってみました。レースの結果と照らし合わせながらモデルは修正していこうと思いますし、精度が落ちなければ違った視点のデータも加えてみたいと思っています。血統の特徴をより出すためにダビスタの種牡馬データをそのまま使ってみるとか。

はい。こんな感じでしばらくはこのブログやTwitterで競馬予測をしていこうと思います。
とりあえず明日のシンザン記念はいい結果になってほしいものですが、カスリもしなかった場合は上記のレース予測部分の記事だけが違うレースにひっそり更新されていきますのでその点は何卒ご了承ください。

最後まで読んでいただきありがとうございました。
よろしくどうぞ。

※追記
シンザン記念の結果です。
バチっと決めたかったところですが追加変数を検討して予測精度をさらに高めたいと思います。