競馬 回帰分析。 競馬を始めた

競馬のデータ分析で失敗しない方法

競馬 回帰分析

まずは回収率85%以上 あるいは75%未満 のデータを探す これまでこのブログでは様々な角度からデータを分析し、その結果を紹介してきました。 それらのデータは1つ1つでは回収率が85%程度しかありませんが、複数データを組み合わせることで回収率は比較的簡単に100%を超えてしまうこともお伝えしました。 これらの記事を読んでさっそくご自身でデータ分析をされている方が大勢いらっしゃいます。 回収率85%のデータを探せばよいのですから難易度は高くないと思いますし、自分で有効なデータを見つけた時の喜びは何とも言えないものがあるので病みつきになってもおかしくはありません。 また同様に、回収率が75%未満のデータを組み合わせることで期待回収率が低いデータをあぶりだすことができることもおわかりいただけたかと思います。 これによって人気馬の評価を客観的に下げることが可能になります。 これらについての詳細はこちらの記事を読んでみて下さい。 今後は回収率85%以上のデータ、あるいは75%未満のデータを見つけていくことでどんどん予想精度が上がると思いますので、ぜひそうやってオリジナルの予想を確立してほしいと思います。 それは 「本当にその回収率は信頼できる数字なのか」を確認することです。 どういうことなのか具体例を見てみましょう。 下の成績は2014年1月~2018年12月の5年間のある騎手の成績です いつもの通り、単勝2~8番人気に絞っています。 ご覧のように単勝回収率は85%を超えています。 データ数も1000を超えており、一見「この騎手は買い」というようなルールを追加したいと思ってしまうかもしれません。 この騎手が誰なのかは記事の最後でご紹介します。 では、次にこれを年別に分けて見てみたいと思います。 この結果を見ても果たしてこのデータは有効だと言えるでしょうか。 2014年から2018年にかけて単勝回収率は下降一直線です。 最初の2年ではめざましい回収率を叩き出していたものの、最後の2年は60%割れです。 さすがにこれでは 「この騎手は買い」というルールを採用する気にはなれないのではないでしょうか。 このように全体で85%を超えているかどうかの確認とは別に、データを細分化したチェックも行うようにしてください。 その際、よく利用されるのがここで行ったような年で分けるような方法です。 単にデータを分けて見れるだけでなく、年ごとの傾向をつかめる可能性もあり、なかなか理にかなった分け方だと思います。 そうやって分けたデータを見た上で「これならルールとして追加しても問題なさそうだ」と判断できた時のみ追加するようにしてください。 安易なルールの追加はこれまでの努力を台無しにする 上のような手順で検証を行うのは、最初のうちはかなり面倒くさいと感じるかもしれません。 しかし、 有効でない条件をルールとして採用してしまうと、これまで積み上げてきたルールの精度を大きく落としてしまう可能性があります。 有効な加点・減点ルールを1つずつ見つけて採用していくというのは、実はかなり地道な作業です。 仮説を立てて実際にデータを調べるという作業を繰り返し、ようやく有効なものが一件ようやく見つかるような世界です この過程は楽しくもあるのですがとにかく時間はかかります。 そうやって苦労の末に得たプラス1点と、上記の例のように深く検証せずに追加してしまう1点。 この2つが同じ価値として扱われて良いはずがありません。 そして 苦労して作り上げてきた評価ルールに無価値な情報が紛れ込んでしまうことによって、本来は期待値が高くない馬券を買ってしまうことにもつながります。 だから条件の追加は極めて慎重に行わなければならないのです。 そのためには あなた自身がルール採用に関する厳格な基準を設けると良いと思います。 例えば、上で挙げたように年別で集計した上で、「5年のうち4年以上で回収率が85%以上あれば採用」とか「どの年も70%以上ないとダメ」など自分の中でしっくりくる基準を決め、あとは例外なくそれを守るということです。 基準にあと一歩で到達するのに…というデータも出てくると思いますが、そこは鉄の意志を持って切り捨てて下さい。 私が年別の評価をしない理由 先ほどの例では年ごとに分けて集計することがなかなか理に適っていると言いましたが、実は私は年ごとの成績ではなく別の分け方でデータを確認しています。 なぜ年ごとに分類しないかというと、主に以下の3点の理由からです。 その年特有の要因の存在 例えば、ある競馬場で改修が入って他の競馬場で代替開催したような年はデータの傾向が全く変わっても不思議ではありません。 あるいはリーディング上位のジョッキーがケガ等で長期間離脱していたらその騎手はもちろんのこと他の騎手成績には多少なりとも影響があるでしょう。 また、特定の年だけ「払い戻し還元率アップ」のようなキャンペーンを行っていれば回収率に影響があるかもしれません。 このようにその年だけ起こりうる要因というのは少なからず存在すると思っています。 直近の年を強く意識してしまうという主観の排除 2つ目の理由が、年ごとにデータを分けると直近の傾向を重んじてしまうことがあるためです。 例えば先ほどの騎手の例で言えば、直近の2年の回収率が低いのでルールとして採用する可能性は低そうですが、もしデータの並びが逆で古い年から最近にかけて回収率が上昇していた場合は少し見え方が違うのではないでしょうか? もちろんそれでも最初の2年の回収率が低すぎるのでこのケースはルールとしては採用はしないかもしれませんが、実際にはもっと判断に迷う「5年のうち4年は有効だけど1年だけ有効ではない」というようなデータなんてザラにあります。 そしてその有効でない1年が、最初の1年である場合と直近の1年である場合とでは、ルールとして採用したくなる気持ちに違いが出てきても不思議ではないと思いませんか? 私も客観的にデータを判断しているつもりでも、直近1年で有効でないとわかってしまうとルールとして採用するのをためらってしまいます。 しかし、本当はこのような「確率的に起こりうる範囲内でたまたま直近1年だけ有効でなかった」というようなデータを自分の主観によって排除したくはないのです。 もちろんそれが実際の傾向の変化を表している可能性もあるので、直近データを重視することが必ずしも誤りとは言えないのが難しいところですが、私は対象期間中であればすべてのデータを平等に見るという方針を採っています。 分類の数が5個では物足りない 過去5年のデータ分析をしている以上、年ごとで区切ると当然5個にしか分けられないのですが、私はデータの有効性を判断するのには5個の集計データでは不十分だと考えています。 というのも私はデータの有効性を検証するのに最終的にちょっとした統計の手法を利用しているのですが、10個程度はデータがないとその手法がきちんと機能しないのです。 これについては次の記事でもう少し詳しく述べたいと思います。 以上3点が私が年で分類をしない主な理由なのですが、実際には「他の多くの人と同じような基準で分析をしたくない」という私自身のちょっとひねくれた性格による部分もあります。 年ごとにデータを分割する方法でも、何もやらないよりは絶対にやった方が良いので、あまり気にせずに実践してください。 実際に私がどんな検証をしているか知りたいという場合だけ、以下のメルマガ読者限定記事をご覧ください。

次の

確率統計で競馬予想

競馬 回帰分析

基本的に競馬なんてやるべきではないと私は思っている。 胴元の取り分が多いからだ。 しかし今回は、ちょっと思い立って競馬の予測をやってみることにした。 理由は馬券の安さだ。 私は現在、量が少ない人間でも不利にならない投資先を探しているのだが、馬券の一枚100円という安さは魅力的に映る。 株の場合にはどんな安い株であれ最低購入額は数万円以上なので、ある程度まとまったが必要になる。 また、競馬には技術介入の余地(努力次第で勝利できる可能性)がある。 例えばこんな例がある。 彼らは統計解析によって競馬で勝っており、その所得を隠していたらしい。 こういうニュースが出るということは、解析者の腕次第では競馬で勝てる可能性があるということだ。 まずはデータを集める ということで、競馬の統計解析をしたいわけなのだが、解析するためのデータがなければ何も始まらない。 まずは、競馬のデータを以下のサイトからして取ってくることにする。 でスピード指数(ある基準を元に走破タイムを数値化したもの)や馬場指数(馬場コンディションを数値化したもの)を閲覧するには有料会員に登録する必要がある。 私は有料会員に登録した上でスピード指数や馬場指数まで含めてを行った。 以下に&素性作成用のコードを公開する。 ちなみにデータ解析はデータを解析できる形に持っていくまでが全工程の九割を占めると言われている。 実際私もこの&素性作成用を作成するのに数週間はかけている。 このを無料で使える皆さんは幸運である。 作成された素性は最終的にに格納されるようになっている。 このコードを使うのにの有料会員に登録する必要はないが、その場合はスピード指数や馬場指数のカラムにはNULL値が入ることになるので気をつけて欲しい。 しかし本記事では、まずは後者の方法を使うことにしよう。 なんとなくそのほうが面白そうだから。 (駄目だったら前者の方法も試します) つまり、個別の馬に関するデータを入力とし、その馬がレースで一着になるかどうかの二値を出力とする統計モデルを作成するわけである。 なお今回は、 予測するのはレースの着順ではなくあくまでも「一着になるかどうか」の二値だけにする。 つまり、着順が上位ならばその馬には実力があると言えるが、着順が下位だからといって必ずしも実力が無いとはいえないのだ。 だから「厳密な着順の数値」ではなく「一着になるかどうかの二値」だけを予測するシンプルなモデルを作成したほうがうまくいくようだ。 (参考:) 気をつけないといけないのは、一着になった馬は少ない一方で、一着にならなかった馬はたくさんいるということだ。 このままだと学習データが不均衡になってしまい、予測モデルを作成すると偏ったモデルが出来てしまう。 不均衡データを扱う方法はいくつかあるが、今回は面倒臭いので多い方のクラス(一着にならなかった馬)のデータをサンプリングで減らしてしまうことにする。 何を統計モデルの入力とするのか 次に問題なのは、統計モデルの入力に何の変数を使うかだ。 このモデルの入力として、私は以下の素性を使うことにした。 他の変数を使った場合にどうなるか気になるという方は自分でコードを弄って試すべし。 randomForestを使って予測してみる 予測モデルの作成にはRのrandomForestパッケージを使うことにする。 random forestとは2001年にLeo Breiman によって提案された教師あり学習のである。 このブログを見に来るような人には解説の必要はないかもしれないが、ざっくり言うと、decision treeはbias-variance分解で言うところのvariance(学習結果の不安定性)が高いのでbaggingと素性のsamplingを適用してみたらvarianceが下がって汎化性能アップしました、というがrandom forestである。 それでは、実際にRのrandomForestパッケージを使って予測モデルを作成してみよう。 s allData. 57124 grade 191. 53030 age 210. 04150 avgsr4 545. 24005 avgWin4 526. 77427 dhweight 296. 32679 disRoc 443. 31973 distance 232. 20557 dsl 371. 28809 enterTimes 332. 80342 eps 682. 54396 hweight 393. 27570 jwinper 417. 62300 owinper 366. 49348 preSRa 536. 27096 sex 62. 81792 surface 45. 83353 surfaceScore 361. 17891 twinper 348. 52685 weather 123. 82181 weight 165. 54897 winRun 246. 36929 jEps 603. 00998 jAvgWin4 140. 99460 preOOF 870. 35176 pre2OOF 475. 39642 month 737. 97377 runningStyle 456. 73422 preLastPhase 408. 51575 lateStartPer 250. 49252 course 42. 43917 placeCode 564. 57604 weightper 430. しかし本番はここからである。 問題は、このモデルの予測力が他の馬券購入者達の予測力に勝てるかどうかだ。 「他の馬券購入者達の予測」を表すモデルとして、以下の素性だけを用いて学習したモデルを使用する。 変数名 説明 support オッズから逆算した支持率 オッズから逆算された支持率は「他の馬券購入者達の予測」そのものである。 だから、もし競馬市場が効率的であるならば、この支持率を使ったモデルを超える予測精度は生み出せないはずである。 なので、このモデルの予測精度を超えられるかどうかが競馬市場の効率性を測る一つの目安となる。 レース毎の相対的な能力差を素性にしてみる ある馬がレースで勝てるかどうかは、その馬の絶対的な能力ではなく、他の馬との相対的な能力差で決定される。 ということは、 絶対的な能力値ではなく、同じレースに出る他の馬との相対的な能力差の情報を使うことで予測精度を向上できるのではないか? 具体的にどうするのかというと、同じレースにでる馬のデータだけを集めて正規化(平均0分散1にする操作)すればいい。 そうすれば、同じレースに出る他の馬との能力差だけを考慮することができる。 (参考:) このアをRのコードに落とし込んでみよう。 nan. df scaled. allData [is. nan. df scaled. allData scaled. train scaled. model3 MeanDecreaseGini age 138. 15954 grade 157. 86619 distance 192. 87544 sex 55. 18635 weather 92. 09389 course 33. 38138 month 529. 20000 surface 33. 58647 surfaceScore 287. 12282 placeCode 537. 98961 avgsr4 858. 85621 avgWin4 726. 16178 dhweight 345. 24014 disRoc 371. 22814 dsl 363. 05980 enterTimes 357. 92536 eps 1005. 00112 hweight 366. 85535 jwinper 471. 85535 owinper 367. 94282 preSRa 890. 83216 twinper 381. 33466 weight 336. 16596 jEps 530. 81950 jAvgWin4 352. 48784 preOOF 794. 77337 pre2OOF 500. 63913 runningStyle 358. 16418 preLastPhase 383. 60317 lateStartPer 338. 66961 weightper 359. 51054 winRun 264. やはり相対的な能力差の情報を使うことで精度が向上するようだ。 支持率を素性に加えてみる 最後のひと押しに、支持率を私のモデルの素性に加えてしまうことにしよう。 というのも、人間の予測力はかなりのものだが、同時に人間には心理学的なバイアス(アンカリングとか)があることもわかっている。 一方で、機械ははっきりと数値化できる素性しか考慮できないが、その代わりに機械には心理学的なバイアスは存在しない。 つまり、人間が得意な領域と機械が得意な領域は異なっているわけである。 ということは、 それぞれが弱点を補い合えばより良い予測ができるのではないか? 支持率は人間の予測の結果なので、私のモデルと支持率を組み合わせれば予測精度を向上できるかもしれない。 というわけで、絶対的能力値モデルと相対的能力差モデルの両方の素性に支持率を加えてみた。 その結果が以下である。 7457017 両モデルとも0. まぁこの程度の予測力向上では、が高い競馬では儲けることができないだろうけれど、今回は競馬市場の効率性が完全ではないとわかっただけでも良しとしよう。 次回に続きます。 今後の予定• のデータを使う。 JRDBには、や馬の体格、蹄など、他にはないデータが豊富に含まれているので、予測精度向上の余地がありそう。 ちなみにJRDBのデータは外れ馬券裁判で話題になった卍氏も使用している。 今回は最終支持率をそのまま素性に追加したが、実際に利用可能なデータはレース開始直前の支持率であり、最終支持率とはズレがあるかもしれない。 レース開始直前のオッズがJRDBの直前情報データに含まれているのでこれを使うようにする。 今回はのデータを使っているが、の方が儲けられる可能性が高そう。 なぜならのほうが注目度が低く、市場の効率性が低そうなので。 (その代わりにレース開始直前のオッズの変動が激しいみたいだけど…)• 血統のデータを活用する。 血統をどう数値化するかがちょっと悩ましいが、多分がやっている親馬をカテゴリ変数にしてしまう方法が一番簡単。 レースが荒れるかどうかを予測するほうが簡単らしいので、後でそっちの方法も試そう…と思って今ちょっとだけやってみたけどあんまりうまくいかないぞこれ…• そもそもの目的は競馬で儲けることであり、そのためには予測力ではなく回収率を高めなければならない。 なので強化学習やを使って回収率が高くなるように学習させる方が望みがありそう。 (教師あり学習とは違い強化学習やであれば回収率の高さそのものを最大化するように学習させることができる) : ランダムに馬券を買った場合の話 : もっと安く買えるなどもあるが、こちらは手数料が高め : もちろん彼らの運が良かっただけの可能性もあるけど : これだけをやっていたわけではないけれど : 他にも走破タイムを予測する方法もあるようだが、結局は予測されたタイムを元にして何着かを予測するのだから、後者の方法に含まれる扱いにした : 私は実際に実験したわけではないので「厳密な着順の数値」を予測することによりどれだけのバイアスが入るのかは知らない。 ひょっとしたら無視できるほどに小さい量かもしれない。 しかし仮にそうだったとしても、まず最初はシンプルな方法を試すべきだと思うので、ここでは「一着になるかどうかの二値」を予測する方法を採用する。 : 正例と負例の比率が偏っているデータ、例えば正と負の比率が1対99となっているようなデータのこと : ちなみに私は分類問題にはランダムフォレストばかり使っているランダムフォレスト信者だ。 1 という式で計算できる : ちなみに、馬の相対的な能力差を使う方法にはのような方法もある stockedge.

次の

エクセルを用いた統計処理のやり方って?分析ツール…|Udemy メディア

競馬 回帰分析

機械学習で競馬分析 ドワンゴの主催している電脳賞を始めとしてAIに競馬予想をさせてみようという試みが機械学習の盛り上がりをともに再燃してきており、ちょっと古いですが競馬予想ソフトで30億稼いで1億脱税して捕まった人もいました。 まぁこれは大成功な例ですが、電脳賞にも回収率に応じて賞金がでますし、 JRA-DATALABでも人気ソフトには報奨金が出ます。 予想ツールを作って当たれば儲かる、作ったツールを人に使ってもらってもお金がはいる・・・。 やろう!! ということで今回は12月23日中山競馬場で開催されるG1有馬記念の着順予想をしてみようと思います。 データ取得 やろうといってもデータがなければ始まらないのでJRA-VANデータラボ からデータを取得してきます。 月額2052円で最古データは1986年から30年近いデータを取得することができます。 とはいえこれが厄介でAPIはVBしか対応していないらしい・・・。 なので今回はJRA-VANデータラボで提供されているデータベースソフトのひとつpckeibaを使用してSQLiteにてデータを取得します。 が、約30年分のデータ重い、遅い・・・。 ここまで2週間近く取得に費やして今20120599なので2012年の5月開催のデータまで取得できてるということ・・・。 使用環境 Google Colaboratory ブラウザ上でjyupiternotebookが使用できpython、Numpy、Tensolflowも特にインストールせず使用でき、GPUも利用可能、なおかつ無料で利用できるGoogle Colaboratoryを使用します。 で本題 一般的には、多層パーセプトロンで抽出したあとSVMにかけてゴニョゴニョするっていうのが競馬分析で多い手法のようです。 とはいえ、今回は競馬分析に合っている手法とは言えませんが線形回帰で分析をしようと思います。 show upload dialog from google. csv' ]. Lasso clf. fit X , Y print pd. columns , "coef" : clf. csv' ]. 有料データとなるので一部のみ記載しています。 csvを作成します。 csvは以下の通り。 出力してみる [14. 4199213 13. 67719624 13. 41511762 14. 07644514 14. 28232161 14. 05559027 14. 98255294 13. 8792095 14. 46912673 14. 35686541 14. 69296645 14. 23888201 15. 62113876 14. 67513616 15. 26724555 15. 69717164] 馬番順に並んでいます。 3.モズカッチャン、2. クリンチャー、8. ブラストワンピース 一番人気のレイデオロやキセキ、注目馬のオジュウチョウサンは入っていないものの モズカッチャン、クリンチャーはあってもおかしくないのではっていう結果でちょっと驚いてます。 ブラストワンピースは過去2回G1で賭けてはずしたので期待薄・・・。 2018年の有馬記念は3-2-8で各単勝、複勝、3連複、3連単で賭けてみましょう。 ブラスワンピース、レイデオロ、シュバルグラン というわけで 単勝、複勝当たり!! 期待薄なんて言ってすいませんでしたーーーー!! まぁただし、予想順位が上位であったモズカッチャン、クリンチャーは8着、15着と沈んでいるので精度が高いものとは言えないでしょう。 もうちょっと理論を精査して多層パーセプトロン等での実装が将来的にはできるようにしたいなぁ。 今回の収支?今回の収支は結果を信じ切れずレイデオロ軸でもろもろ買ったけどシュバルグラン入ってなくて撃沈したので総収支ではマイナスでした!!!.

次の