Courses
サッカーの予測は難しい。得点が少ない競技で、1本のコースが変わったシュートが結果をひっくり返すこともあるし、どの試合にもそれなりの運の要素がある。代表戦はさらに難しい。各国代表は年間に本気の試合を数えるほどしか行わないため、クラブリーグに比べて学習に使えるデータがはるかに少ないからだ。
それに拍車をかけるように、今年のワールドカップではFIFAがタスクを一段と難しくした。48チームに拡大されたワールドカップでは新たな方式が導入され、12グループそれぞれの上位2チームに加えて、3位のうち成績上位12チーム中8チームが進出する。これにより、グループステージの行方は読みづらくなる。難題(とサッカー)が好きな私にとって、まさに取り組むにふさわしいテーマだ。
これはEURO 2024の予測プロジェクトの続編で、ほぼゼロから作り直した。前回はJupyterノートブックだけで作業し、各試合について最も起こりそうなスコアラインを1つだけ予測した。今回は、最新の結果を取り込み、自動で再学習し、トーナメント全体を1万回モンテカルロ・シミュレーションするエンドツーエンドのMLOpsパイプラインを構築し、試合単位の予測を各チームがどこまで勝ち進むかの確率へと変換した。
本記事では、プロジェクトの全体像を順に説明する。データと特徴量、再現性を支えるMLOpsの実践、パイプライン設計、そして代表サッカーの予測に最も適したモデルはどれか。コードはすべてプロジェクトのリポジトリで公開している。そしてもちろん、モデルが優勝と見る国もお伝えする。(ネタバレ:スペインとアルゼンチンをそれぞれ約16%で推している。ただし面白いのは、その結論に至る過程だ。)
トーナメント気分が高まってきたら、Data & AI World Cupウィークもおすすめだ。データとAIがサッカーをどう変えるかを扱うセッションを、ライブでもオンデマンドでも無料で視聴できる。
要点
- これは2026年FIFAワールドカップを予測するエンドツーエンドのMLOpsパイプラインで、大会期間中は2時間ごとに、Google Cloud上で最新の代表戦結果を取得し自動再学習する。
- API-FootballとEloレーティングのデータは、Bronze–Silver–Goldのメダリオン・アーキテクチャで処理され、完全な再現性のためにDVCでバージョン管理される。
- 5系統からの10モデルを347試合のホールドアウトで比較。XGBoostが僅差で首位、上位5モデルはほぼ互角で、チーム間のElo差が予測の大半を担う。
- モンテカルロ・シミュレーションが大会全体を1万回回し、試合レベルのゴール予測を各チームの勝ち上がり・優勝確率へと変換する。
- 2026年6月10日時点での本命はスペインとアルゼンチンで、いずれもおよそ16%。2時間ごとに更新されるStreamlitダッシュボードでライブ予測を追える。
予測を支えるデータ
予測の良し悪しは、投入するデータ次第だ。まずは素材から見ていこう。モデルは2つのライブデータソースから学習し、それらを1つの整然とした特徴量テーブルに変換する。
データの出どころ
すべては2つの情報源から構築している。API-Footballは対戦表と試合ごとの統計(誰が誰と、いつ、どこで戦い、どう終わったか)を提供する。eloratings.netは各国代表のEloレーティングを提供する。
Eloレーティングは、チームの強さを1つの数値で表す。各チームはスケール上のどこかに位置し、試合のたびに更新される。格上に勝てば大きく加点、格下に負ければ大きく減点。チェスに由来する考え方で、サッカーにもきれいに適用できる。詳しい直感は、以前のDataCamp記事が2022年ワールドカップの文脈で解説している。
この2つを組み合わせると、2018年以降の国際試合およそ6,900試合分のGoldデータセットが得られ、そこから学習できる。
モデルが予測するもの
ここが重要な設計判断だ。勝ち・引き分け・負けといった結果を直接予測するのではなく、もっと粒度の細かいもの、つまり各チームがその試合で挙げる得点数を予測する。サッカーの得点数は概ねポアソン分布に従い、一定時間内に比較的まれな事象が何度起こるかを表現する標準的な手法だ。
結果ではなくゴール数を予測するからこそ、この後の処理が可能になる。いったん任意の対戦のもっともらしいスコアラインが出せるようになれば、誰がグループを抜けるか、誰がトロフィーを掲げるかといった本当に知りたい問いに、スコアラインを何千回とシミュレーションすることで答えられる。
効く特徴量
各試合は、厳選した少数の特徴量で記述する。
- Elo差:2チームのレーティングの差。これはモデルで群を抜いて重要な特徴量で、次点の特徴量に比べておよそ2桁分も重要度が高い。直感にも合う。2チームの力の差が、他のほとんどの要素より結果をよく物語るからだ。
- Elo和:2つのレーティングを足したもの。対戦全体の質の代理変数。差だけでは、スペイン対アルゼンチンとサンマリノ対アンドラの違い(どちらも拮抗しているがレベルはまったく別)を区別できないが、和を使えばその情報が戻る。
- 直近5試合のElo変化(ローリング):各チームのレーティングが最近どのくらい動いたか。相手の強さを織り込んだうえで、調子(フォーム)を捉える。
- 直近5試合の得点・失点(ローリング):各チームの直近の攻撃・守備のアウトプット(絶対値)。
- 試合コンテクスト:大会の格(ワールドカップ本大会か、予選か、ネーションズリーグかなど)、ノックアウトかどうか、中立地開催かどうか。
すべての特徴量は厳密にリーケージ対策を施しており、キックオフ前に入手できた情報だけを使っている。自明に聞こえるが、テストでは優秀に見えて実運用で崩れるモデルをうっかり作ってしまう典型的な落とし穴だ。
ボツ案も1つ:当初、試合内スタッツからチームをクラスタリングして作る「プレースタイル」特徴量(教師なし学習)を予定していた。しかし実際には意味のあるグループに分かれず、ノイズを入れるくらいならと採用を見送った。否定的な結果もまた結果である。
データの再現性を保つ
2つのソースから継続的にデータが入る以上、生のファイルから学習用特徴量に至る経路は、毎回まったく同じでなければならない。そこでメダリオン・アーキテクチャの出番だ。データを3層に整理する。
- Bronze:到着したままの生データ。手を加えない。
- Silver:クリーニングと標準化。ここで2つのソース間でチーム名の表記揺れをマッピングし(たいてい一致しない)、スキーマを検証し、Eloを試合レコードに結合し、不足や不整形を処理する。
- Gold:モデリング層。試合ごとに1行の整然データで、学習に必要な特徴量がすべて計算済み。
各層が次の層に供給されるため、異常があっても一度に全部をほぐすのではなく、1段ずつ遡って原因を突き止められる。経路全体の再現性確保にはDVC(Data Version Control)を使う。新しい結果が入るたびに、dvc repro1発でSilverとGoldをBronzeから再構築し、入力が変わったステップだけを再実行、生成されたデータセットにバージョンを付け、過去の状態を完全に復元できるようにする。
最良のモデルを選ぶ
得点数の予測は研究が進んだテーマで、単独で明白な解はない。そこで最初から1手法に賭けるのではなく、10モデルを作って競わせた。
候補モデル
10モデルは5系統+単純なベースラインにまたがる。各モデルの内部まで知る必要はない。ゴールがどのように生まれるかについて、前提が大きく異なる点が肝だ。
| 系統 | モデル | 中核となる考え方 |
|---|---|---|
| ベースライン | 平均率ポアソン | あらゆるチームが長期的な平均得点をただ挙げると仮定し、特徴量を無視。ほかが上回るべき下限。 |
| 統計モデル | 二変量ポアソン、負の二項 | 2チームの得点数を、事象のカウントに適した確率分布で直接モデリング。 |
| ベイズ | ベイズ・ポアソン(MCMC) | 発想は同じだが、各推定値の不確実性の全範囲を返す。計算負荷は大きく、学習は他の約100倍遅い。 |
| 時系列 | SARIMAX | チームの結果を時系列として捉え、先へ投影する。 |
| 機械学習 | Ridge、Random Forest、XGBoost | 固定の方程式に縛られず、特徴量から直接パターンを学習。 |
| ディープラーニング | LSTM、1D CNN | 時系列や局所的パターンを探索するニューラルネット。 |
評価方法
10候補から目分量で勝者を選ぶのは無理だ。代わりに、各モデルは3段階を通過し、先に進むかどうかをコードが判断する。これがコードベースのデプロイの意味だ。モデルは手動調整ではなく自動チェックにより環境を昇格していくので、選定過程は再現可能で監査もしやすい。
- 実験。すべてのモデルは2022年ワールドカップ前の国際試合だけで学習する。ただしすべてが同じ重みではない。新しい試合や格の高い大会ほど重みを高くする(時系列減衰と重要度重み付け)。よって最近の本気の結果は、昔の親善試合より強くモデルに反映される。各モデルの設定は、交差検証でポアソン負の対数尤度(NLL)を最小化するように調整する。NLLは、予測したゴール率が実際の得点にどれだけ合っているかを測るスコアで、低いほど良い。その結果、各モデルの最良設定が得られる。
- 品質保証。調整済みモデルを未見データで検証する。対象は2022年ワールドカップと、その後に開催された主要6大会(EURO、アフリカネイションズカップ2回、コパ・アメリカ、アジアカップ、ゴールドカップ)の計347試合。ここでは指標を順位付き確率スコア(RPS)に切り替える。負け・引き分け・勝ちのように自然な順序を持つ確率予測の良さを測り、おおむね正しい方向に自信を持つほど報われる。ここでも低いほど良い。最強モデルが挑戦者となる。RPSが適切なのは、狙いが単なる得点合計ではなく、チームがどこまで勝ち進むかの予測だからだ。
- デプロイ。挑戦者を現チャンピオンと比較し、勝てば昇格。利用可能な全試合で再学習し、大会に臨む時点で最新の全データを学習済みにする。
勝者はどれか
どの手法が頂点に立ったか。RPS(低いほど良い)で評価したホールドアウトの全順位は以下のとおり。
| モデル | ホールドアウトRPS |
|---|---|
| XGBoost | 0.18289 |
| ベイズ・ポアソン | 0.18316 |
| 負の二項 | 0.18373 |
| 二変量ポアソン | 0.18389 |
| Random Forest | 0.18392 |
| SARIMAX | 0.18583 |
| Ridge | 0.18813 |
| LSTM | 0.19299 |
| 1D CNN | 0.20916 |
| 平均率ポアソン(ベースライン) | 0.22872 |
ここから見えてくるのは4点。
- XGBoostは勝ったが僅差。上位5モデル(XGBoost、ベイズ・ポアソン、負の二項、二変量ポアソン、Random Forest)は互いに約0.0011 RPS差の範囲に収まった。アプローチが大きく異なる5つがここまで接近するのは、天井がモデルではなくデータと特徴量で決まっているサインだ。ここではElo差が仕事の大半を担い、モデル選択の影響はごく小さい。
- 1つの特徴量が支配的。最も重要な予測因子はElo差で、次点の特徴量より約100倍も影響が大きい。驚きではなく安心材料だ。1試合では、2チームの力量差が物語の大半を占める。
- ディープラーニングは最下位(ベースラインを除く)。1D CNNとLSTMは、素朴なベースラインを除けば最も弱かった。学習に使える試合が約7,000と少ないため、パラメータが多いネットワークを養うにはデータが不足している。古典的な手法のほうが、小規模で構造化されたデータに強い。
- 古典手法に過学習の気配なし。通常は訓練より未見データで少し悪化するが、ここではほぼすべて(LSTM以外)が交差検証よりホールドアウト大会で良いスコアを出した。大会サッカーは日常の代表戦より予測可能性が高い(賭け金が高く、強豪・お馴染みの顔ぶれ、中立地)ため、ランダム性がそぎ落とされるのが理由だろう。
本番のトーナメントでは10モデルすべては回さない。参戦メンバーは絞り、基準点として平均率ベースライン、そして上位3モデルを使う。XGBoostとベイズ・ポアソンが上位2枠を占める。
3位は実質引き分け。負の二項と二変量ポアソンは0.0002 RPS差の範囲で、乱数シード次第で入れ替わる。統計的に区別のつかない2候補なら、サッカー予測の文献上の裏付けが強い(二変量の定式化、Karlis & Ntzoufras, 2004)二変量ポアソンを選んだ。
最終メンバーは、XGBoost(機械学習)、二変量ポアソン(古典統計)、ベイズ・ポアソン(ベイズ推論)。次節では、これらのモデルをどう動かし、再学習し、単一試合の予測を大会全体の予報へと変えるかを述べる。
本番運用へ
ノートブックの中にとどまるモデルは、目の前にいる間しか役に立たない。1か月続く大会の全試合を予測するには、すべてが自律で動く必要がある。新しい結果を取り込み、再学習し、再シミュレーションし、誰も触らずに予報を更新する。それがパイプラインの役割だ。
GCPでの2時間ごとのパイプライン
プロジェクト全体は、Google Cloud Run上の1つのスケジュールジョブとして走る。大会前は1日1回、6月11日の開幕以降は2時間ごとに起動する。各実行は同じサイクルをたどる。
- 新規データの確認。前回実行以降に終了した試合がなければ、やることはないので早期に終了。
- 取り込みと再構築。新しい結果があればデータソースから取得し、
dvc repro1回でSilverとGoldを再構築して特徴量を最新化。 - 再学習・予測・シミュレーション。メンバーのモデルを最新化(詳細は後述)し、今後の全対戦を予測し、大会全体をシミュレーション。
- 採点。試合が確定したら、その試合に対して出していた予測を採点し、後述のモニタリングに反映。
すべてのステップがスケジュールに従ってコードで起動するため、大会中に手動でボタンを押す必要はない。新しい結果が入れば、新しい予報が出る。
2モード:固定 vs. ラウンドごと
ここで本プロジェクトは実験も兼ねる。大会中、メンバーは並行する2つのモードで走り、両者の違いこそデータから確かめたい問いだ。すなわち、大会の進行に合わせて再学習すると予測は良くなるのか。
- 固定(Frozen)。開幕の瞬間にモデルを凍結し、再学習しない。結果には反応する。各シミュレーションは更新されたトーナメント表から始まるためだが、モデルパラメータ自体は変えない。
- ラウンドごと(Per-round)。ハイパーパラメータ(上位の設定)は固定だが、学習されるパラメータは、各グループ節の終了後と各ノックアウトラウンド後に、利用可能な全データで再フィットし続ける。大会の進行に合わせて学習を継続する。
両者を並走させることで、大会後に2つの観点で比較できる。純粋な予測精度と、勝ち残りが絞られるにつれて不確実性がどれだけ早く収束するか。ラウンドごとが勝てば、定期的な再学習の手間は回収できる。固定が互角なら、追加の仕組みは割に合わないかもしれない。
予測から大会へ:モンテカルロ・シミュレーション
単一試合の予測と、「そのチームの優勝確率」は別物だ。そこでモンテカルロ・シミュレーションの出番となる。
まず推論。判明している対戦だけに予測を出すのではなく、48チーム間のあらゆる組み合わせを予測する。一見やり過ぎだが、ノックアウトではどのチームも理屈の上では他のどのチームとも当たり得るため、すべてのペアに対する予測が必要だ。
次にルールの実装。2026年方式は特に厄介だ。12グループの上位2チームは自動的に進出するが、3位のうち上位8チームも進む。そしてその8チームがどのノックアウト枠に入るかは、どのグループから来たかで決まる。
12グループから8つを選ぶ組み合わせは495通り(12C8)あり、それぞれで32強の組み合わせが変わる。きれいな公式はなく、FIFAが表を公表しているだけだ。そこで私(正確には優秀な同僚Cursor)が、公式表を元に495通りすべてをマッピングとしてハードコードした。
"best_third_mappings": {
"EFGHIJKL": {
"74": "3F",
"77": "3G",
"79": "3E",
"80": "3K",
"81": "3I",
"82": "3H",
"85": "3J",
"87": "3L"
},
"DFGHIJKL": ...
EFGHIJKLのようなキーは、3位通過チームを輩出した8つのグループを表し、値はそれぞれのチーム(3E、3Fなど)を32強の特定の試合番号へ割り当てる。これは1エントリで、全体ではこの対応が495通り分繰り返される。
開催国3か国(アメリカ、カナダ、メキシコ)には特別な処理がある。自国開催の試合ではホームアドバンテージ補正を適用し、それ以外は中立地として扱う。
予測とルールが整えば、シミュレーションは大会全体を1万回走らせる。各回での手順は以下。
- ホーム・アウェーの得点を、モデルが予測した分布からサンプリングしてスコアラインを引く
- 実際の勝点・タイブレーク規定でグループステージを進める
- 3位の成績表を確定する
- 上のマッピングからノックアウトの山を埋める
- 決勝まで進めて優勝チームを1つ決める。
1万回の擬似トーナメントにおいて、あるチームが決勝に進む、あるいは優勝する割合が、そのチームの確率になる。1回は当てずっぽう、1万回は予報だ。
MLflowでの追跡
これまで説明したすべての実行(両モード)は、MLflow(DagsHub上でホスト)に記録される。実験追跡とは、各実行の入力、設定、結果、出力を体系的に記録し、相互比較や完全な再現を可能にすることだ。ここでは特に次の点が重要だ。
- 再現性。シミュレーションにはトーナメントのラウンドに基づく固定シードを用い、固定モードとラウンドごとモードで同じシードを共有する。つまり両者の違いは、シミュレーション内の運ではなく、モデルそのものに由来する。また各実行は見たデータスナップショット(Goldの行数とタイムスタンプ)を記録し、結果を入力へと辿れるようにする。
- 実験。各実行にはモード(固定/ラウンドごと)とライフサイクルの段階(実験・QAから、本番推論・再フィットまで)がタグ付けされ、前節の昇格フローに対応する。
- 比較。選定指標としてホールドアウトRPSを記録し、系譜として現在のチャンピオン実行への参照も残す。学習時間も記録し、ベイズモデルが約100倍遅い学習である事実が数字に現れる。
学習済みモデルと予測ファイル(大会確率、グループ順位、試合予測)は、実行アーティファクトとして保存され、ライブダッシュボードはまさにそれらのファイルを読み込む。これでループが閉じる。生の結果から、学習・シミュレーションを経て、オンラインで見られる数値へ。
ドリフト監視
最後のピースは、試合が確定した後に動く。実際の結果が入ると、その試合に対して出していた予測を採点し、単純な平均率ベースラインと比較する。もし完全モデル群が、チーム情報を何も知らないモデルに対して劣後し始めたら、それはドリフトの警告だ。大会前に学習したパターンが、ピッチ上の現実と合わなくなっている可能性がある。
これはライブ予測を行うあらゆるシステムでの標準的な実践で、検知方法の詳細はデータドリフトとモデルドリフトのガイドで読める。
では、ワールドカップの優勝国は?
ここまでの仕組みは、すべてこのためにある。
本命
開幕前日の2026年6月10日現在、最上位は明確で、その直後は混戦だ。スペインとアルゼンチンがそれぞれ約16%でトップに立つ。現世界王者(アルゼンチン)と現欧州王者(スペイン)が首位に来るのは、モデルが現実に足をつけていることの健全なチェックと言える。
その後ろにはフランス、イングランド、ブラジル、コロンビアが続く有力候補。これらはライブの数値であり、実際の結果が入り次第動く。固定予言ではなく、6月10日のスナップショットとして受け取ってほしい。ダッシュボードは最大2時間の遅延で常に最新を表示する。
ライブダッシュボード
念のため:この記事の数値はすべて、パイプラインの実行に合わせて自動更新されるStreamlitアプリに基づく。wc2026-predictions.streamlit.appで開いて、大会を通じて追いかけられる。主なビューは4つ。
- トーナメント概要:各チームがどこまで行きそうかを一目で。
- グループ順位:各グループで、各チームが1位・2位・3位(ベストサード通過と敗退に分割)・4位になる確率。
- 試合予測:各グループ戦でのホーム勝ち・引き分け・アウェー勝ちの確率と、最も起こりそうなノックアウトの山。
- ノックアウトのよくある対戦:シミュレーションで頻出する組み合わせ。
試合ビューで1点注意:一部のチームは32強の2つのスロットに同時に現れることがある。バグではない。グループがあまりに拮抗して、モデルがそのチームの通過順位を自信を持って割り切れない場合に起こる。ベストサードの不確実性と相まって、2通りの結果が異なるスロットに結び付く。トルコのケースでは、ラウンド16に2回登場することにさえなった。
以下の図は、開幕前にXGBoostモデルが投影した準々決勝以降(決勝まで)の対戦を示している。

コイントスのチーム:アメリカ合衆国
この種のモデルの面白さは、目測を裏切るチームにある。最も分かりやすい例がアメリカだ。ダッシュボードのトーナメント概要を見ると、アメリカが色で際立っているのがすぐに分かる。
開催国として地元の声援を受けるのだから楽なスタートを期待したくなるが、モデルははるかに慎重だ。オーストラリア、パラグアイ、トルコと同組で、極端に拮抗しているため、グループ突破確率は約54.6%と全48チーム中13番目に低い(3分の2が突破することを思い出してほしい)。
面白いのはその先だ。何とか突破した後は、各ラウンドがほぼコイントス。コイントスを積み重ねると、優勝確率は約2%で全体の13番目に高い。
グループ突破では下から13番目、優勝では上から13番目というのは、まさにコイントスのチームだ。常に本命ではないが、常に望みがある。
締めくくり
このプロジェクトは手間がかかったし、1本の記事ではとても収まりきらない。リポジトリには、ここに載せきれなかった内容が多い。候補モデル一式、特徴量エンジニアリング、そして全体を動かし続けるオーケストレーションなどだ。
今のところ、モデルは予想を示し、大会が審判を下す。MLOps目当てでもサッカー目当てでも、私と同じくらい楽しく見届けてもらえたら嬉しい。試合結果が入るたびに更新されるライブ予報で、予測の当たり具合を追ってほしい。
本文で触れた概念をさらに深掘りしたい方は、MLOps Conceptsコースをぜひ受講してほしい。