Mujoの活用事例 競馬編

はじめに

こんにちは。
唐突ですが、競馬って当たりませんよね・・・😒
私はかれこれ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名前説明
1horseCourse競馬場の略称。アルファベット3文字。
2number開催回(2,015年中山1回3日目の1
3date開催日(2,015年中山1回3日目の3
4raceIndexレース番号(1~12など)
5titleタイトル
6horses出走馬の数
7categoryカテゴリー
8startTime出走時間
9courseType芝かダートか(D or T)
10distance距離
11condition馬場コンディション。アルファベット1文字。
12weather天気
13classクラス
14rule”(混合)牝(指定)”などの指定ルール
15kinryoRule斤量のルール(”馬齢”、”ハンデ”など)
16order順位
17popular人気
18waku
19gateゲート(馬番)
20sexB | H | S の性別を表す1文字(Sはせん馬)
21barei馬齢
22time走破タイム(秒)
23agari上がり3ハロン(秒)
24chakusa前の馬との着差
25chakusaNext次の馬との着差
26cornerOrderコーナー通過順位
27strategy戦法(逃 | 先 | 差 | 追)など、コーナー通過順位から予想して入力
28kinryo斤量
29horseWeight場体重
30increase前走からの増減であるプラスやマイナスの数値
31horseName馬名
32jockeyName騎手名
33trainerName調教師名
34horseUrlJRAさまの馬ページのURL
35keywordsフリーワード検索用のキーワード
”札幌 芝 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番人気でした。

さて、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着

せっかくですから、リダイレクトで保存した「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の予想プログラムを作ったので来週あたりから運用してみたいと思います。
自分が書いたプログラムで外すなら可愛いもんですし、毎週コードを振り返る機会があるのは素晴らしいですね。将来的には機械学習をさせてみてもテーマとしては面白いかもしれません。
それでは!