はじめに
こんにちは。
唐突ですが、競馬って当たりませんよね・・・😒
私はかれこれ4,5年ほど毎週Win5を買っているのですが、4/5の的中が最高成績で普段はカスリもしません。
宝くじ感覚で1点だけを予想して購入していますが、今のところJRAさまにお布施しているだけの人生ですね😢
さて、私の手元に2,015年から2,024年1月21日までの全レース結果を収めたTSV(タブ区切)のファイルがあります。このファイルは43万9356行のデータが含まれています。
約2週間ほどかけて、JRAさまのサイトからクローリングという手法を用いて、ご迷惑をおかけしないように、ゆっくりゆっくり収集させていただきました。
当ブログはTSVファイルの添付ができないため、10件ほどデータを掲載します。
SPR 1 1 1 サラ系2歳未勝利 10 サラ系2歳 2015-08-01 09:55 T 1500 R 晴 未勝利 (混合)[指定] 馬齢 1 4 2 2 B 2 89.5 36.1 クビ 4,5,4 差 54.0 466 -2 マカーオーン 勝浦 正樹 古賀 史生 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102013102966/87 札幌 芝 1500m 良 サラ系2歳未勝利 サラ系2歳 未勝利 マカーオーン 1着
SPR 1 1 1 サラ系2歳未勝利 10 サラ系2歳 2015-08-01 09:55 T 1500 R 晴 未勝利 (混合)[指定] 馬齢 2 5 8 10 B 2 89.5 36.4 クビ 4 1,1,1 逃 54.0 488 -4 ショウザイシンホー 三浦 皇成 相沢 郁 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102013106468/34 札幌 芝 1500m 良 サラ系2歳未勝利 サラ系2歳 未勝利 ショウザイシンホー 2着
SPR 1 1 1 サラ系2歳未勝利 10 サラ系2歳 2015-08-01 09:55 T 1500 R 晴 未勝利 (混合)[指定] 馬齢 3 3 7 7 B 2 90.2 37.1 4 クビ 2,2,2 先 54.0 508 0 インジャスティス C.ルメール 藤沢 和雄 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102013105712/D6 札幌 芝 1500m 良 サラ系2歳未勝利 サラ系2歳 未勝利 インジャスティス 3着
SPR 1 1 1 サラ系2歳未勝利 10 サラ系2歳 2015-08-01 09:55 T 1500 R 晴 未勝利 (混合)[指定] 馬齢 4 1 6 6 B 2 90.3 36.5 クビ 3 9,8,6 追 54.0 466 0 ルミナスエレメント 福永 祐一 安田 隆行 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102013106165/48 札幌 芝 1500m 良 サラ系2歳未勝利 サラ系2歳 未勝利 ルミナスエレメント 4着
SPR 1 1 1 サラ系2歳未勝利 10 サラ系2歳 2015-08-01 09:55 T 1500 R 晴 未勝利 (混合)[指定] 馬齢 5 2 8 9 H 2 90.8 37.7 3 1/2 4,2,3 先 51.0 444 4 ジュアンマリエ 加藤 祥太 池上 昌弘 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102013104911/D6 札幌 芝 1500m 良 サラ系2歳未勝利 サラ系2歳 未勝利 ジュアンマリエ 5着
SPR 1 1 1 サラ系2歳未勝利 10 サラ系2歳 2015-08-01 09:55 T 1500 R 晴 未勝利 (混合)[指定] 馬齢 6 6 1 1 B 2 90.9 37.0 1/2 5 8,8,8 差 54.0 476 0 コスモベガス 黛 弘人 上原 博之 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102013106308/A3 札幌 芝 1500m 良 サラ系2歳未勝利 サラ系2歳 未勝利 コスモベガス 6着
SPR 1 1 1 サラ系2歳未勝利 10 サラ系2歳 2015-08-01 09:55 T 1500 R 晴 未勝利 (混合)[指定] 馬齢 7 8 7 8 H 2 91.7 38.2 5 2 4,5,5 差 54.0 420 -6 ネクストヒロイン 嶋田 純次 成島 英春 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102013100085/9D 札幌 芝 1500m 良 サラ系2歳未勝利 サラ系2歳 未勝利 ネクストヒロイン 7着
SPR 1 1 1 サラ系2歳未勝利 10 サラ系2歳 2015-08-01 09:55 T 1500 R 晴 未勝利 (混合)[指定] 馬齢 8 9 4 4 B 2 92.0 38.3 2 4 4,7,8 先 54.0 422 0 マイネルアクティヴ 丹内 祐次 蛯名 利弘 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102013100135/7E 札幌 芝 1500m 良 サラ系2歳未勝利 サラ系2歳 未勝利 マイネルアクティヴ 8着
SPR 1 1 1 サラ系2歳未勝利 10 サラ系2歳 2015-08-01 09:55 T 1500 R 晴 未勝利 (混合)[指定] 馬齢 9 10 5 5 B 2 92.7 38.5 4 2+1/2 9,10,10 追 54.0 410 -6 サフランナイト 松岡 正海 高橋 義博 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102013106368/03 札幌 芝 1500m 良 サラ系2歳未勝利 サラ系2歳 未勝利 サフランナイト 9着
SPR 1 1 1 サラ系2歳未勝利 10 サラ系2歳 2015-08-01 09:55 T 1500 R 晴 未勝利 (混合)[指定] 馬齢 10 7 3 3 H 2 93.1 39.9 2+1/2 2,4,6 先 54.0 470 0 ジュンノキボウ 田中 博康 二本柳 俊一 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102013102963/2E 札幌 芝 1500m 良 サラ系2歳未勝利 サラ系2歳 未勝利 ジュンノキボウ 10着
レースと出走馬は原則として1:Nの関係にありますが、非正規形の形で持たせています。
1レースあたりに18頭の出走馬がいれば、これだけで18レコードとなり、31,287レースありましたので、全体としては前述した43万9356レコードとなっています。
今回は、このTSVをMujoの初期データとしてみましょうというお話です。
TSVの列
列がやや多いですが、TSVの列の定義を全て記載します。
Mujoの場合は、これらすべてが検索条件になり得ますし、属性としての抽出が可能です。
No | 名前 | 説明 |
1 | horseCourse | 競馬場の略称。アルファベット3文字。 |
2 | number | 開催回(2,015年中山1回3日目の1) |
3 | date | 開催日(2,015年中山1回3日目の3) |
4 | raceIndex | レース番号(1~12など) |
5 | title | タイトル |
6 | horses | 出走馬の数 |
7 | category | カテゴリー |
8 | startTime | 出走時間 |
9 | courseType | 芝かダートか(D or T) |
10 | distance | 距離 |
11 | condition | 馬場コンディション。アルファベット1文字。 |
12 | weather | 天気 |
13 | class | クラス |
14 | rule | ”(混合)牝(指定)”などの指定ルール |
15 | kinryoRule | 斤量のルール(”馬齢”、”ハンデ”など) |
16 | order | 順位 |
17 | popular | 人気 |
18 | waku | 枠 |
19 | gate | ゲート(馬番) |
20 | sex | B | H | S の性別を表す1文字(Sはせん馬) |
21 | barei | 馬齢 |
22 | time | 走破タイム(秒) |
23 | agari | 上がり3ハロン(秒) |
24 | chakusa | 前の馬との着差 |
25 | chakusaNext | 次の馬との着差 |
26 | cornerOrder | コーナー通過順位 |
27 | strategy | 戦法(逃 | 先 | 差 | 追)など、コーナー通過順位から予想して入力 |
28 | kinryo | 斤量 |
29 | horseWeight | 場体重 |
30 | increase | 前走からの増減であるプラスやマイナスの数値 |
31 | horseName | 馬名 |
32 | jockeyName | 騎手名 |
33 | trainerName | 調教師名 |
34 | horseUrl | JRAさまの馬ページのURL |
35 | keywords | フリーワード検索用のキーワード ”札幌 芝 1500m 1着 マカーオーン”など |
注目すべきは35番の「keywords」というカラムで、たとえば府中競馬場の芝1,800mで一着になったレースデータが見たい場合は、「東京芝1800m1着」という日本語による検索が可能になります。
MujoのCLI活用
MujoにはCLIがありますので、これを使って検索を実行してみます。
まずは、前述したTSVファイルを読み込んで起動させたMujoに接続して、クエリー用のファイルを作成します。

「東京芝1800m1着」というフリーワードで検索しますので、今回は1番「searchByPhrase」の出番です。(1番の検索コマンド用のファイルを-cオプションで作成しています)
出力されたファイルをeditコマンドで編集します。

Linux環境の場合は、vimが開きますので、クエリー用のファイルを編集して、先ほどのキーワードを入力していきます。筆者の環境はWSL2です。(WindowsとMacの場合はデフォルトでVS Codeが開きますが、環境変数のパスが通っていれば–editorオプションでファイルを開くエディターを変更することが可能です)
編集前

編集後

vimを保存して終了すると、ふたたびCLIに戻りますので、キーボードの上キーなどを利用してコマンドラインを編集し、クエリーファイルを実行してみます。


今回のクエリーのように件数を指定しなければ、デフォルトでスコアの高い20件のデータが返ります。
スクリーンショットは、メイクデビューで見事1着となった「ロッタチャンセズ」号の2020年2月15日のレース結果のデータで、この日の天気は晴れで良馬場、1分51秒5、上がり3ハロンは34.2、先行して見事にクビ差で勝利したようです。
4番人気でした。
たとえば、未勝利戦やメイクデビューのデータは参考にしたくないので除外したい場合は、
“東京芝1800m1着 -メイクデビュー -未勝利”
などと指定することもできます。
さて、JSONで出力されても集計作業の難易度が高いため、CLIのバッチモードから検索結果をTSVとして保存してみます。

先ほど、MujoのCLIが自動的に生成したクエリーファイルは「tokyo_1800_freeword_query.json」とうい名前にリネームしています。
“-b”オプションでバッチモードを指定し、”-t”オプションを指定することにより、TSVファイルに出力することができます。今回はリダイレクトで、「tokyo_1800_result.tsv」という名前で結果を保存しました。
先頭の10件のデータを見てみると、問題なく東京の芝1800mの勝ち馬のデータだけがTSV形式で取得できています。(全体では512行です。これらは1着のレースデータだけですので、つまるところ、2,015年以降、2024年の1月21日までに、東京の芝1800mのレースは512回行われていた、ということになります。)
horseCourse number date raceIndex title horses category startTime courseType distance condition weather class rule kinryoRule order popular waku gate sex barei timeagari chakusa chakusaNext cornerOrder strategy kinryo horseWeight increase horseName jockeyName trainerName horseUrl keywords
TKY 1 4 6 メイクデビュー東京 16 3歳 2020-02-09 13:00 T 1800 R 晴 新馬 (混合)[指定] 馬齢 1 6 8 16 H 3 109.5 34.3 クビ 3,3,3 先 54.0 482 0 アクロアイト 丸山 元気 大竹 正博 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102017105222/21 東京 芝 1800m 良 メイクデビュー東京 3歳 新馬 アクロアイト 1着
TKY 1 5 6 メイクデビュー東京 14 3歳 2020-02-15 13:00 T 1800 R 晴 新馬 [指定] 馬齢 1 4 3 4 H 3 111.5 34.2 クビ 4,4,4先 54.0 390 0 ロッタチャンセズ 石橋 脩 堀 宣行 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102017105063/72 東京 芝 1800m 良 メイクデビュー東京 3歳 新馬 ロッタチャンセズ 1着
TKY 1 7 6 メイクデビュー東京 12 3歳 2020-02-22 13:00 T 1800 R 晴 新馬 (混合)[指定] 馬齢 1 3 6 8 H 3 110.1 35.8 クビ 9,9,9 差 54.0 456 0 レッドサーシャ 内田 博幸 黒岩 陽一 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102017106193/C2 東京 芝 1800m 良 メイクデビュー東京 3歳 新馬 レッドサーシャ 1着
TKY 3 4 5 メイクデビュー東京 11 2歳 2019-06-09 12:30 T 1800 Y 曇 新馬 (混合)[指定] 馬齢 1 1 7 8 B 2 111.0 33.2 2+1/2 5,5,7 差 54.0 484 0 ワーケア C.ルメール 手塚 貴久 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102017105422/83 東京 芝 1800m 稍重 メイクデビュー東京 2歳 新馬 ワーケア 1着
TKY 3 7 5 メイクデビュー東京 16 2歳 2019-06-22 12:25 T 1800 R 雨 新馬 [指定] 馬齢 1 1 6 11 B 2 110.1 33.9 4 10,10,7 差 54.0 506 0 ブルトガング C.ルメール 手塚 貴久 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102017105412/73 東京 芝 1800m 良 メイクデビュー東京 2歳 新馬 ブルトガング 1着
TKY 5 8 5 メイクデビュー東京 16 2歳 2019-11-24 12:15 T 1800 F 晴 新馬 [指定] 馬齢 1 4 2 4 H 2 110.2 35.6 1+3/4 5,8,5差 54.0 430 0 バルトリ C.ルメール 藤沢 和雄 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102017106612/C4 東京 芝 1800m 不良 メイクデビュー東京 2歳 新馬 バルトリ 1着
TKY 1 3 6 メイクデビュー東京 13 3歳 2021-02-06 13:05 T 1800 R 晴 新馬 (混合) 馬齢 1 2 6 8 B 3 107.6 34.9 2+1/21,1,1 逃 56.0 452 0 カイザーバローズ 津村 明秀 中内田 充正 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102018100401/D1 東京 芝 1800m 良 メイクデビュー東京 3歳 新馬 カイザーバローズ 1着
TKY 3 4 5 メイクデビュー東京 12 2歳 2020-06-14 12:35 T 1800 F 雨 新馬 (混合)[指定] 馬齢 1 4 1 1 H 2 112.6 35.3
ハナ 10,5,4 追 54.0 458 0 ユーバーレーベン 戸崎 圭太 手塚 貴久 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102018102167/2E 東京 芝 1800m 不良 メイクデビュー東京 2歳 新馬 ユーバーレーベン 1着
TKY 3 7 5 メイクデビュー東京 16 2歳 2020-06-27 12:25 T 1800 R 晴 新馬 馬齢 1 5 2 3 H 2 109.7 35.0 3/4 3,3,3先 54.0 432 0 スライリー 石川 裕紀人 相沢 郁 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102018100487/03 東京 芝 1800m 良 メイクデビュー東京 2歳 新馬 スライリー 1着
TKY 5 3 4 メイクデビュー東京 7 2歳 2020-11-14 11:25 T 1800 R 晴 新馬 (混合)[指定] 馬齢 1 2 7 7 B 2 111.7 33.6
クビ 5,4,2 差 55.0 490 0 アンダープロット M.デムーロ 加藤 征弘 https://www.jra.go.jp/JRADB/accessU.html?CNAME=pw01dud102018105274/E3 東京 芝 1800m 良 メイクデビュー東京 2歳 新馬 アンダープロット 1着
たとえば、今回は東京の芝1800mの1着のレースデータを抽出したいわけですが、取得件数を多くすればするほど、なるべく多くの結果を返そうとしますので、京都の芝1800mの1着馬のレース結果が含まれる可能性があるわけです。(Googleさんも後ろのページまで行くと、検索キーワードにあまり関係のないサイトが含まれてきてしまいますよね・・・)
ただし、Mujoの場合は複合条件でクエリーを書くことで厳密にデータを抽出することができます。
論理設計の段階で、まず、競走馬、競馬場、調教師、騎手、、、パッと思いつく限り、これらのエンティティが必要ですね。
また、それらを事前に登録してIDを採番しないと肝心の「レース結果」を格納するエンティティにデータを追加することができません。
そして、競走馬や騎手はデビューする度に、これらを新規に登録しなければなりませんが、入力となるデータが外部にあり、表記ルールが判然としないので、日本語の文字列のみで登録済みかどうかを判定するのは、少し心もとない感じもします(馬名は概ねユニークかもしれませんが・・・)。
ですが、Mujoのような検索エンジンがあれば、これらの設計を省くことができ、欲しいデータを簡単に取り出すことができるのです。
せっかくですから、リダイレクトで保存した「tokyo_1800_result.tsv」をExcelで読み込んでみます。

うまく読み込むことができました。
私は競馬場とコース、距離ごとにゲート(馬番)による有利不利があるのではないかと考えていますので、東京芝1,800mで、最も勝っているゲートは何番なのかピボットテーブルにしてみました。

なんと、4番ゲートが勝ち星として最も多くをあげていて、次に7番ゲート、外枠ではあまり勝てていないようです。(出走頭数によりますが・・・)
続いて作戦(脚質)です。
このデータは出走頭数とコーナーの追加順位、最終的な順位から作戦を判断するプログラムを書いて、私が補完したデータですが、それっぽくできているので、こちらも集計してみます。

先行馬、差し馬の勝ち星がもっとも高いようですね。
東京芝1800mでは、外枠に人気の逃げ馬、追い込み馬がいる場合、馬番の4と7を買ってみると馬券的には美味しいかもしれません😊
ちなみに最も多く勝っている騎手はC.ルメール様でした。

最後に
Mujoでは、検索パフォーマンスに影響することなく、すべての列を検索条件に指定できますので、試しにイクイノックスのJRAの全レース成績を眺めてみたいと思います。
クエリーは以下のようになり、順位とレースタイトル、日付、次の馬との着差、タイム、上り3ハロンを抽出してみます。

結果をTSVで出力してみます。
murayama@Murayama:~/mujo_queries$ mujo -b --host localhost search 3 -t -f bamei_query.json
order title startTime chakusaNext time agari
1 メイクデビュー新潟 2021-08-28 12:25 6 107.4 34.5
2 皐月賞 2022-04-17 15:40 1+1/4 119.8 34.6
1 有馬記念 2022-12-25 15:25 2+1/2 152.4 35.4
1 東京スポーツ杯2歳ステークス 2021-11-20 15:30 2+1/2 106.2 32.9
2 東京優駿 2022-05-29 15:40 2 141.9 33.6
1 天皇賞(秋) 2022-10-30 15:40 1 117.5 32.7
1 天皇賞(秋) 2023-10-29 15:40 2+1/2 115.2 34.2
1 ジャパンカップ 2023-11-26 15:40 4 141.8 33.5
1 宝塚記念 2023-06-25 15:40 クビ 131.2 34.8
2023年ジャパンカップ4馬身差圧勝、天皇賞における衝撃のレコード勝ちの時計が取得できています。
(2022年に勝ったときから、2秒3も縮めたんですねー😯 なお、データの取得元がJRAさまであるため、ドバイシーマクラシックの結果は検索結果に含まれません)
このように、コースの傾向と対象レースに出ている出走馬の過去の成績が取得できるのであれば、今までnetkeibaさんとにらめっこしながら目視とヤマ勘に頼って買っていたWin5も、もう少し的中率があがりそうな気がしてきます。
良馬場に限ったとき、出走馬がX頭のとき、天気が雨のとき、あるいは~~ステークスのように冠のついたレースに絞ったとき、などなど、データの活用方法は無限大ですが、Mujoを使えばこららのデータが一瞬で取得できます。
私はちょっとだけMujoのクライアントコードを書いて、Win5の予想プログラムを作ったので来週あたりから運用してみたいと思います。
自分が書いたプログラムで外すなら可愛いもんですし、毎週コードを振り返る機会があるのは素晴らしいですね。将来的には機械学習をさせてみてもテーマとしては面白いかもしれません。
それでは!