単一の数値に全てを賭けるな
2026年ワールドカップを前に、一つの問いが頭から離れませんでした。「果たして誰が優勝するのか?」
単なる好奇心を超えて、この問いはML実務者として見逃せない課題でした。限られたデータ、多様なモデル、そして各モデルが生み出す異なる『世界』 —— これらが交わると何が起こるのか。
結論から言うと、私は11の異なるモデルを構築し、優勝候補は4チームに分かれました。
- スペイン (Elo、ポアソン、ロジスティック回帰など)
- アルゼンチン (ランダムフォレスト、XGBoost)
- フランス (ニューラルネットワーク)
- オランダ (Colley)
この結果は単なる娯楽を超えて、『アンサンブル予測』の本質を示しています。同じデータで学習したのに異なる結論に達する理由、そしてその不一致がなぜより正直な回答なのかという物語です。
本記事は、358の実際の国際試合データ(2010-2022 W杯、2020/2024ユーロ)に基づいています。根拠資料で全ソースとコードを確認できます。
11のエンジン、一つのインターフェース
全てのモデルを公平に比較するため、各モデルは同一のコントラクト(契約)に従うよう設計しました。
def match_probs(model, team_a, team_b):
"""
全てのモデルはこの関数を実装する。
戻り値: (勝利確率, 引き分け確率, 敗北確率)
"""
...
def simulate_tournament(model, n_sims=20000):
"""
グループステージ -> 3位チーム比較 -> 32強トーナメント -> 優勝チーム決定
全てのシミュレーションはNumPyベクトル演算で処理される。
"""
...
核心は各モデルが match_probs をどう埋めるかです。この部分こそが不一致の源泉になります。
モデルタイプ1: レーティングシステム(結果ベース)
- Elo: 自己修正される数値。試合後に
R' = R + K(S - E)で更新されます。期待勝利確率はE = 1/(1 + 10^(−Δ/400))です。 - Colley: 時系列を無視し、全試合の勝敗関係を一つの線形システムで解きます。対角成分に+2を加え、常に解が存在することを保証します。
- PageRank: 試合を有向グラフと見なし、敗者が勝者に『支持(Endorsement)』を送る構造です。GoogleがWebページランキングに使用したアルゴリズムと同一です。
これら3モデルはチームの評判や最近のフォームではなく、データに存在する結果のみでチームの強さを評価します。その結果、オランダが市場の期待よりもはるかに高く評価されました。
モデルタイプ2: ゴールモデル(得点ベース)
これらのモデルは結果自体ではなく、得点数を予測します。
import statsmodels.api as sm
# ゴール数 ~ exp(beta0 + beta1 * チーム間の実力差)
# ログリンク関数を使用したポアソンGLMの適合
fit = sm.GLM(goals, sm.add_constant(strength_diff),
family=sm.families.Poisson()).fit()
# 適合結果: lambda = exp(0.167 + 0.00164 * strength_diff)
# このlambdaを通じて2チームの得点分布を作成し、
# 外積(Outer Product)を計算して勝/分/敗確率を導出する。
- ポアソン: 得点平均が分散と等しいと仮定します。
- 負の二項分布: 平均と分散が異なることを許容します。実データへの適合の結果、分散係数 α ≈ 0.008 と非常に小さく、国際試合の得点はほぼ等分散に近いことが確認できました。
モデルタイプ3: 分類器(特徴ベース)
機械学習分類器は3つの特徴(実力差、結合強度、トーナメントフラグ)を入力として、勝/分/敗を直接予測します。
- ロジスティック回帰
- K近傍法(KNN)
- ランダムフォレスト
- XGBoost
- ニューラルネットワーク(MLP)
なぜ結果が割れるのか: 不一致の3つの理由
単一の試合でもモデル間の意見の差は歴然としていました。スペイン vs モロッコ戦では、スペインの勝利確率はPageRankの69%からXGBoostの25%まで広がりました。
| モデル | スペイン勝 | 引き分け | モロッコ勝 |
|---|---|---|---|
| PageRank | 69% | 24% | 7% |
| ポアソン | 63% | 22% | 15% |
| ロジスティック | 61% | 24% | 15% |
| Elo | 61% | 26% | 13% |
| Colley | 57% | 26% | 17% |
| ニューラルネット | 56% | 20% | 24% |
| KNN | 47% | 27% | 27% |
| ランダムフォレスト | 40% | 39% | 22% |
| XGBoost | 25% | 64% | 11% |
これらの違いは単なる誤差ではなく、同じゲームに対する異なる理論です。その原因は大きく3つに要約されます。
- 情報の源泉 (Information Source): Eloは最近の成績(フォーム)を、Colley/PageRankはデータ内の結果のみを反映します。
- ゴール vs 結果 (Goals vs. Outcomes): ポアソン系は得点を、分類器は結果を直接モデリングします。拮抗した試合では引き分け確率の与え方が異なります。
- バイアス vs バリアンス (Bias vs. Variance): XGBoostのような柔軟なモデルは、358という少ないデータでノイズまで学習するリスクがあります。これは交差検証で最も柔軟なモデルの性能が最も低く出た結果からも確認できます。
アンサンブルの教訓: 合意は『正直なグレーゾーン』にある
10モデルの平均(コンセンサス)は依然としてもっともらしいです。スペイン約20%、フランスとアルゼンチン約14%、そしてオランダとイングランドが続きます。
しかし重要なのは**グレーバー(Grey Bar)**です。モデル間の最小値と最大値の範囲が非常に広いのです。
誰かが「W杯優勝国はスペインだ」と単一の数値を提示したなら、その人はこのグレーバーを隠しています。そして、そのバーこそが最も正直な部分です。
日本の開発者への実務的インサイト 🇯🇵
このプロジェクトは単なるサッカー予測を超えて、AI/MLプロジェクトを進める全ての開発者に重要なメッセージを与えます。
- モデルの『独立性』を疑え: 複数のモデルを使っても、全てが『独立した証人』ではありません。同じ特徴量と事前確率を共有しているなら、その合意は機械的な結果に過ぎません。日本のプロジェクトでも複数モデルを比較する際、異なる情報を使っているかを確認すべきです。
- 過学習は『小さいデータ』の敵: XGBoostの性能が良いからといって闇雲に導入すると、データが少ない時はむしろ毒になります。交差検証の結果を信じ、単純なモデルから始めることが長期的には早道です。
- 『単一の数値』より『不確実性の範囲』を提示せよ: ビジネスミーティングで「弊社モデルの精度は85%です」と言う代わりに、「モデルによって78%〜90%まで差があります」と言う方が正直で、意思決定に有効です。
この技術の限界または注意点
- データバイアス: 学習データがW杯とユーロに偏っており、非ヨーロッパチームの実力が過小評価される可能性があります。
- 中立試合の仮定: シミュレーションは全試合を中立地で行うと仮定しています。
- モデル間の相関: ゴールモデルと分類器は同一のEloベースの事前確率を使用するため、それらの合意は『独立した検証』ではありません。真の独立性を持つのはColleyとPageRankのみです。
次のステップ学習方向
このプロジェクトで終わらせず、より深い世界へ進んでみてください。
- ベッティング市場との比較: モデルの予測確率をベッティング市場のマージン除去(De-vig)確率と比較してみてください。市場が非効率なのか、それともモデルが見逃している情報があるのかが分かります。
- 時系列モデリング: 試合結果は時間の経過とともに変化します。現在は静的ですが、
試合日付を特徴量として入れ、時間的重み付けを行う方法を検討してみてください。 - Python実務スキル: NumPyベクトル演算で2万回のトーナメントシミュレーションを高速に処理する方法は、データ処理性能が重要な実務で大いに役立ちます。
合わせて読みたい記事
- Claude Managed Agents × Cloudflare: 脳と手を分離したAIエージェントの進化
- CSS相対色(Relative Color)でアニメーションテーマを終わらせる OKLCH実践ガイド
