「分析に使っているレースが、元データの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 は、今回まさに失敗した方法です。目次からリンクされた文書に、太字で書いてありました。 同じことをもう一度やっても、半年後にまた埋もれます。
採ったのは3つ目です。
知見を、実行される検査に変える。
母集団に中央以外が1行でも混ざっていたら、例外で止まる関数を書きました。新しい分析はその関数を必ず通ります。母集団は1行も変わりません。「暗黙に落ちている」を「明示的に検査する」に変えただけです。
合成データで、地方の競馬場コードを混ぜたら実際に止まることも確認しました。
なぜ「文書」ではなく「検査」なのか
文書と検査には、決定的な違いがあります。
| 読まれなかったら | |
|---|---|
| 文書 | 何も起きない。静かに無視される |
| 検査 | 失敗する。無視できない |
前回の記事で、「基準の厳しさは効果ゼロのデータで実測する」「その基準線を結果と同じ画面に出す」と書きました。根は同じです。別の場所に置いた注意書きは読まれません。
守ってほしい約束があるなら、守らなかったときに壊れる形にするしかありません。「気をつける」も「太字で書く」も、対策ではありませんでした。
今回の要点
- 「リンクが張られている」は「読まれる」を意味しない。 自動検査が緑でも、知見が使われているとは限りません。
- 文書が増えるほど、探索コストが上がる。 書いた時点で最も目立つ場所でも、時間が経てば埋もれます。
- 偶然かかっているフィルタは、いつか外れる。 明示的に絞っていないものは、条件が変われば黙って通ります。
- 知見のうち「守らないと壊れるもの」は、検査に変える。 文書は読まれなくても何も起きませんが、検査は失敗します。
同じ発見を2度したこと自体より、2度目の発見でようやく「書いてあったのに実装していない」が見つかったことのほうが、収穫としては大きい回でした。
この記事は個人の検証記録です。投資助言でも馬券の推奨でもありません。過去のデータに対する分析結果であり、将来の成績を保証するものではありません。
品書きに書いてあっても、頼まなければ出てこない。


