AIでJRAの回収率110%を目指す検証(第20回)|同じことを2度発見した — 記録は残っていて、リンクも張られていたのに

同じことを2度発見した 実験ログ

「分析に使っているレースが、元データの58%しかない。4割どこへ消えたのか」——この疑問を、2人が別々のタイミングで持ちました。答えは2週間前に書かれた設計文書に、数字つきで書いてありました。しかもその文書は、プロジェクトの目次からリンクされていました。今回はその話と、そこで見つかった別の、本物の問題です。

何が起きたか

この検証では、レース情報のテーブルから条件を満たすレースだけを取り出して分析しています。ある日、その母集団の件数を数え直したところ、こうなっていました。

元テーブル   23,636 レース
分析に使用   13,822 レース   (58%)

4割が落ちています。 分析の土台なので、何が落ちたか分からないままでは結果の解釈が定まりません。「調べる」とタスクに積みました。

調べ始めて数分で、答えが見つかりました。2週間前に、自分たちで書いていました。

答えは既に書かれていた

別の枝で進めていた研究の設計文書に、こうありました。

種別 年平均
中央10場 約3,385 ← JRAの年間約3,400と一致
地方・海外 約2,590

レース情報のテーブルには、中央競馬以外のレースが混ざっていたというだけの話でした。

数字を当てはめると、そのまま合います。

23,636 ÷ 4年 = 年5,909
              = 中央3,385 + 地方2,590

さらに、同じ文書にはこう書かれていました。

クラスを表すコードが「000」になっているレースの正体は地方競馬。
そのレースの競馬場コードは全て中央以外だった。

これも今回、別に「クラスコードの4割が000で、意味が分からない」として報告されていた件でした。2つの疑問が、1つの文書の同じ節で、2週間前に解決済みでした。

「リンクが無かった」わけではない

このプロジェクトでは以前、枝で出した結果が目次から辿れなくなる事故を起こしています。設計は作業開始時に書くので目次に載るけれど、結果は後から生まれるので誰も追記しない、という構造でした。

その反省から、「枝の成果物が目次から辿れるか」を機械で検査する仕組みを入れてあります。毎回走らせていて、ずっと緑でした。

そして今回の文書も、目次からちゃんとリンクされていました。

辿れる状態にはなっていた。読まれなかっただけです。

機械が見られるのは「リンクが存在するか」までで、「読まれたか」「使われたか」は見られません。リンクを張ることは、必要条件ではあっても十分条件ではありませんでした。

長く続くプロジェクトでは、文書は増え続けます。増えるほど、「どこかに書いてあるはず」の探索コストが上がります。書いた時点では最も目立つ場所にあった知見が、半年後には埋もれます。

そして本物の問題が出てきた

再発見そのものは、時間の損失で済みます。問題はその先にありました。

同じ文書には、答えの直後にこう書いてあったのです。

→ 母集団は競馬場コードで明示的に絞る。暗黙に頼らない。

確認したところ、本線のコードに、その明示的な絞り込みはありませんでした。

では、なぜ地方のレースは落ちていたのか。調べると、こうでした。

地方のレースには、単勝オッズがそもそも記録されていない。 分析側は「オッズがある行だけ使う」という別の条件で絞っていて、そこに偶然かかっていただけでした。

つまり、こうです。

地方のレースに1件でもオッズが入った瞬間、母集団に黙って混入する。
しかも混入しても誰も気付かない。件数が少し増えるだけだから。

2週間前の自分は、この危険を正確に予見して「暗黙に頼るな」と書いていました。書いた本人が実装しませんでした。

対処:文書ではなく、検査に変えた

ここで選択肢が2つありました。

  1. 本線のコードに明示的な絞り込みを足す
  2. 文書にもっと目立つように書く

どちらも採りませんでした。

1 は、過去の結果を出したコードを書き換えることになります。後で数字が変わったときに「実装を直したせいか、実体か」が分からなくなるので、この検証では原則として触りません。

2 は、今回まさに失敗した方法です。目次からリンクされた文書に、太字で書いてありました。 同じことをもう一度やっても、半年後にまた埋もれます。

採ったのは3つ目です。

知見を、実行される検査に変える。

母集団に中央以外が1行でも混ざっていたら、例外で止まる関数を書きました。新しい分析はその関数を必ず通ります。母集団は1行も変わりません。「暗黙に落ちている」を「明示的に検査する」に変えただけです。

合成データで、地方の競馬場コードを混ぜたら実際に止まることも確認しました。

なぜ「文書」ではなく「検査」なのか

文書と検査には、決定的な違いがあります。

読まれなかったら
文書 何も起きない。静かに無視される
検査 失敗する。無視できない

前回の記事で、「基準の厳しさは効果ゼロのデータで実測する」「その基準線を結果と同じ画面に出す」と書きました。根は同じです。別の場所に置いた注意書きは読まれません。

守ってほしい約束があるなら、守らなかったときに壊れる形にするしかありません。「気をつける」も「太字で書く」も、対策ではありませんでした。

今回の要点

  1. 「リンクが張られている」は「読まれる」を意味しない。 自動検査が緑でも、知見が使われているとは限りません。
  2. 文書が増えるほど、探索コストが上がる。 書いた時点で最も目立つ場所でも、時間が経てば埋もれます。
  3. 偶然かかっているフィルタは、いつか外れる。 明示的に絞っていないものは、条件が変われば黙って通ります。
  4. 知見のうち「守らないと壊れるもの」は、検査に変える。 文書は読まれなくても何も起きませんが、検査は失敗します。

同じ発見を2度したこと自体より、2度目の発見でようやく「書いてあったのに実装していない」が見つかったことのほうが、収穫としては大きい回でした。


この記事は個人の検証記録です。投資助言でも馬券の推奨でもありません。過去のデータに対する分析結果であり、将来の成績を保証するものではありません。

品書きに書いてあっても、頼まなければ出てこない。

この後の実験は、地方競馬に舞台を移しています。

地方競馬の市場について測った事実は連載「地方競馬の解体新書」に、当方の価格モデルによる買い目の配信(準備中)は先行案内のページにまとめています。