본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 06. 15. 21:32

AI를 사용하여 2026 월드컵 경기 결과를 어떻게 예측했는가?

요약

2026 월드컵 경기 결과를 예측하기 위해 구축한 통계 기반 축구 예측 시스템의 설계 과정을 다룹니다. LLM의 한계를 지적하며, 확률 분포와 역사적 데이터를 활용한 수학적 모델링의 중요성을 강조합니다.

핵심 포인트

  • 축구는 낮은 신호 대 높은 노이즈 환경으로 예측이 매우 어려움
  • LLM은 확률 교정(Calibration)이 불가능하며 환각 위험이 있음
  • 통계적 모델은 설명 가능성, 재현성, 교정 가능성을 제공함
  • 데이터, 모델, 에이전트 계층으로 구성된 3계층 아키텍처 제안

WC 2026 경기 결과를 AI로 어떻게 예측했는가?

지난 학기에 확률 및 통계 (Probability & Statistics) 수업을 들으면서 제 머릿속에는 항상 이런 질문이 있었습니다. "이것들을 실제 생활에서 어떻게 사용할 수 있을까?" 공식들은 의미가 있었고 시험도 잘 봤지만, 실제 적용은 어디에 있을까요?

답은 예상치 못한 곳에서 왔습니다: 2026 월드컵.

이 글에서는 제가 처음부터 구축한 축구 예측 시스템에 대해 설명하겠습니다. 단순히 "이 라이브러리를 사용하세요"라고 말하는 것이 아니라, 왜 이 모델을 선택했는지, 경쟁 모델들과 어떻게 비교했는지, 수학적 원리는 어떻게 작동하는지를 단계별로 모두 설명하겠습니다.

스포일러: 모델은 현재 55%의 정확도로 작동하고 있습니다. 이것이 좋은 걸까요? 나쁜 걸까요? 글의 마지막에 이해하게 될 것입니다.

먼저 문제: 축구는 왜 이렇게 어려운가?

축구 예측은 쉬워 보입니다. 하지만 다음을 생각해 보세요:

  • 한 경기에서 평균 2.5골이 터집니다. 이는 포아송 분포 (Poisson distribution) 관점에서 낮은 람다 ($\lambda$) 값을 의미하며, 즉 무작위성이 매우 높다는 뜻입니다.
  • 우세한 팀이 항상 이기는 것은 아닙니다. 역사적 데이터를 보면 홈 팀의 승률은 약 45%에 불과합니다.
  • 90분 동안의 단 한 번의 실수가 경기를 바꿀 수 있습니다.

학자들은 이를 "낮은 신호 대 높은 노이즈 환경 (low signal, high noise environment)"이라고 정의합니다. 날씨 예측이나 주식 예측보다도 어려운데, 왜냐하면 인간 요소(동기 부여, 당일의 컨디션, 전술적 선택)가 측정하기 거의 불가능한 변수들을 포함하고 있기 때문입니다.

그래서 모델을 구축하기 전에 스스로에게 물었습니다: 얼마나 잘하는 것이 가능할까?

답변: 세계 최고의 시스템들도 **55-58%**의 정확도를 달성합니다. 이것이 우리의 목표였습니다.

왜 LLM을 사용하지 않았는가?

모두가 처음 하는 생각은 이렇습니다: "ChatGPT에게 물어보면 예측해 주겠지."

저도 시도해 보았습니다. Claude에게 "터키 대 미국 경기에서 누가 이길지 확률을 알려줘"라고 말했습니다. 답변이 왔습니다: "%40 확률로 터키가 우세합니다."

하지만 이 수치는 교정 (calibrated)되지 않았습니다. 즉, Claude가 말한 40%는 실제 상황에서 40%의 확률로 발생한다는 것을 의미하지 않습니다. 같은 질문을 10번 던지면 10개의 서로 다른 숫자를 얻게 될 것입니다. LLM은 일관되고 교정된 확률을 생성할 수 없습니다.

더욱 중요한 점은, 과거 데이터로부터 학습하지 않는다는 것입니다. 49,000개의 역사적 경기를 "알고"는 있지만, 이 정보는 내재화된 수학적 모델이 아닙니다. 환각 (Hallucination) 위험이 높습니다.

LLM: "터키는 강한 팀입니다, 승률은 40%입니다"
통계적 모델: "49,000경기, Elo 차이, 최근 폼, FIFA 랭킹 → 33%"

두 번째 방식은 설명 가능하고 (explainable), 재현 가능하며 (reproducible), 교정 가능 (calibratable) 합니다.

LLM이 정말로 유용할 수 있는 유일한 영역은 비정형 정보인 부상 뉴스, 기자 회견, 전술 분석 등입니다. 저는 미래에 이것들을 "에이전트 (agent)"로서 시스템에 추가하고 싶었습니다. 하지만 기본 모델은 통계여야 했습니다.

아키텍처: 3계층

시스템의 전체 구조를 살펴보겠습니다:

┌─────────────────────────────────────────────────────────────┐
│  데이터 계층 (DATA LAYER)                                    │
│  49k+ 역사적 경기 · FIFA 랭킹 · WC2026 대진표               │
...

각 계층을 차례대로 설명하겠습니다.

계층 1: 계층적 베이지안 포아송 모델 (Hierarchical Bayesian Poisson Model)

왜 포아송 (Poisson)인가?

득점 수는 이산적 (0, 1, 2, 3...)이며 드물게 큰 값을 가집니다. 이는 포아송 분포 (Poisson distribution)의 정의와 정확히 일치합니다:

         λᵏ · e⁻λ
P(X=k) = ─────────     (k = 0, 1, 2, ...)
            k!

하지만 어떤 람다 ($\lambda$) 값을 사용해야 할까요? 여기서 베이지안 (Bayesian) 모델이 등장합니다.

계층적 구조

각 팀은 숨겨진 (latent) 공격 (attack)수비 (defense) 능력을 가집니다:

# 수학적 표현 (PyMC로 구현됨)

attack[t]  ~ Normal(μ_att, σ_att)   # 모든 팀이 동일한 사전 분포 (prior)를 공유함
...

왜 계층적인가? 약팀에 대해서는 데이터가 적습니다. 계층적 구조는 데이터가 적은 팀의 예측치를 전체 평균으로 "수축 (shrinkage)" 시킵니다. 이는 고전 통계학에서 **스타인 역설 (Stein's paradox)**의 실질적인 응용입니다.

시간 가중치 (Time Weights)

2010년의 터키와 2025년의 터키는 같은 팀이 아닙니다. 8년 전 경기가 현재의 예측에 미치는 영향은 어느 정도여야 할까요?

반감기 가중치 (Half-life weighting):

# t일 전 경기의 가중치
weight = exp(-log(2) * days_ago / 730)
# 730일 (2년) 전 → 가중치 = 0.5
...

이 지수적 감쇠 (exponential decay)는 물리학의 방사성 붕괴 공식과 동일합니다. 수업 시간에 배웠던 내용을 여기서 볼 수 있네요, 멋진 디테일입니다.

┌──────────────────────────────────────────────────────────────┐
│                      베이즈 정리 (Bayes Theorem)                      │
│                                                              │
...

왜 빈도주의(Frequentist)가 아닌 베이지안(Bayesian)인가?

고전적 (빈도주의) 접근 방식: 최대 우도 (maximum likelihood)를 통해 파라미터를 추정하고, 단일 값을 취합니다.

베이지안 접근 방식: **사후 분포 (posterior distribution)**를 계산합니다. 즉, 파라미터가 가질 수 있는 가능한 모든 값의 분포를 얻습니다.

P(parameters | data) ∝ P(data | parameters) × P(parameters)
     posterior              likelihood               prior

이것이 실무에서 갖는 의미는 다음과 같습니다: 불확실성을 수치화할 수 있다는 것입니다. "터키의 공격력은 0.3이다"라고 말하는 대신, "터키의 공격력은 95% 확률로 [0.1, 0.5] 사이에 있다"라고 말할 수 있습니다.

PyMC를 이용한 구현:

import pymc as pm
import numpy as np

...

MCMC (Markov Chain Monte Carlo)는 이 사후 분포를 샘플링하여 계산합니다. 각 샘플링에는 약 90초가 소요됩니다. 결정론적 (deterministic)인 해법은 없으며, 샘플링을 통해 구합니다.

레이어 2: LightGBM을 이용한 머신러닝 (Machine Learning)

베이지안 모델은 강력하지만 한계가 있습니다. 오직 득점 데이터만을 사용하기 때문입니다. Elo 점수, 최근 폼 (form), FIFA 랭킹과 같은 특징량 (features)을 추가하기 위해 두 번째 모델을 구축했습니다.

특징 공학 (Feature Engineering): 23개의 시그널

FEATURE_COLS = [
    # Elo
    "elo_diff", "home_elo", "away_elo",
...

Elo 점수란 무엇인가?

체스 세계에서 유래한 순위 시스템입니다. 기본 아이디어는 간단합니다: 승리하면 상대방으로부터 점수를 얻고, 패배하면 점수를 잃습니다. 승리 확률이 낮을수록, 승리했을 때 더 많은 점수를 얻게 됩니다.

def update_elo(rating_a, rating_b, result, k=30):
    """result: 1=A 승리, 0.5=무승부, 0=B 승리"""
    expected_a = 1 / (1 + 10 ** ((rating_b - rating_a) / 400))
...

49,000개의 역사적 경기를 처음부터 끝까지 검토하여 각 팀에 대한 최신 Elo 점수를 계산했습니다. 이 특징(feature)은 LightGBM의 가장 중요한 입력값 중 하나가 되었습니다.

FIFA 랭킹: 데이터 누수(Data Leakage) 주의

여기서 저는 치명적인 실수를 저질렀고, 이를 수정했습니다.

첫 번째 버전에서는 FIFA 랭킹으로 "오늘의 랭킹"을 사용하고 있었습니다. 하지만 2018년 경기를 예측하면서 2024년 랭킹을 사용하는 것은 **데이터 누수 (data leakage)**입니다. 미래의 정보를 과거의 예측에 집어넣는 셈이기 때문입니다.

해결책: 각 경기에 대해 해당 경기가 치러진 날짜의 랭킹을 가져오세요.

def fifa_rank_at(lookup: dict, team: str, date: datetime) -> tuple[float, float]:
    """경기 날짜의 FIFA 랭킹을 반환합니다 (leakage-free)."""
    if team not in lookup:
...

이 디테일은 작아 보이지만 모델 정확도 측면에서 매우 중요합니다. 누수(leakage)를 발견하기 위해 별도의 테스트를 작성했습니다:

def test_no_future_leakage():
    """어떠한 특징(feature)도 경기 날짜 이후의 데이터를 사용해서는 안 됩니다."""
    for _, row in features.iterrows():
...

3-Way Train/Val/Test Split

시간 순서:  [──── TRAIN ────][─ VAL ─][─ TEST ─]
                2017-2023        2023-24   2024-25
                  5754경기        1062      981

왜 이렇게 하나요? 금융 시계열(financial time series)에서도 동일한 규칙이 적용됩니다: 과거로 미래를 예측하는 것이지, 미래의 정보로 과거를 학습시키는 것이 아닙니다.

여기서 무작위 분할(Random split)을 사용하면 모델이 미래를 이미 알고 있는 것처럼 보여 오해를 불러일으킬 수 있습니다.

from lightgbm import LGBMClassifier

model = LGBMClassifier(
...

레이어 3: 캘리브레이션 (Calibration)

두 모델을 결합하여 훌륭한 확률값들을 생성했습니다. 하지만 이 값들을 신뢰할 수 있을까요?

캘리브레이션 테스트 (Calibration test): 모델이 70%라고 예측한 경기에서, 팀이 실제로 70%의 확률로 승리하나요?

Isotonic Regression

대부분의 모델은 이 테스트에서 실패합니다. 특히 트리 기반 (tree-based) 모델들은 체계적으로 과잉 확신 (over-confident)하는 경향이 있습니다.

Isotonic Regression (등조 회귀)을 통한 교정:

from sklearn.isotonic import IsotonicRegression

# 각 클래스별 개별 교정기
...

Isotonic regression (등조 회귀)은 단조 (monotonically increasing) 변환을 적용합니다. 모델이 70%라고 예측했지만 실제로는 65%라면, 이를 65%로 조정합니다. 단순하지만 효과적입니다.

교정 전/후 Brier score (브라이어 점수):

  • 교정 전: 0.561
  • 교정 후: 0.538

Monte Carlo (몬테카를로) 토너먼트 시뮬레이션

이제 각 경기마다 교정된 확률을 가지고 있습니다. 토너먼트 전체를 25,000번 처음부터 끝까지 시뮬레이션했습니다.

def simulate_full_tournament(all_groups, played, model, n=25_000):
    reach = {}  # 각 팀이 어떤 단계에 몇 번 도달했는지

...

각 시뮬레이션은 32개 팀의 전체 여정을 수행합니다. 25,000 × ~100경기 = 250만 번의 가상 경기!

Wilson (윌슨) 신뢰 구간

25,000번의 시뮬레이션 결과, 터키가 결승에 진출할 확률은 0.2%로 나타났습니다. 이 예측을 얼마나 신뢰할 수 있을까요?

Wilson score interval (Wilson 점수 구간) (Wilson, 1927):

def wilson_ci(k: int, n: int, z: float = 1.96) -> tuple[float, float]:
    """k번의 성공, n번의 시행에 대한 95% 신뢰 구간."""
    p = k / n
...

정규 근사 (Normal approximation, 교과서적인 방법)은 비율이 너무 작기 때문에 여기서는 효과가 없습니다. Wilson interval (윌슨 구간)은 낮은 비율에 대해 훨씬 더 신뢰할 수 있습니다.

결과: 솔직한 평가

모델Brier score (브라이어 점수) ↓정확도 (Accuracy) ↑
결합 모델 (Ensemble Model)0.54155.2%
...

Brier score (브라이어 점수)란 무엇인가? 예측 벡터와 실제 벡터 사이의 평균 제곱 오차입니다. 0은 완벽하며, 0.667은 완전히 무작위임을 의미합니다.

우리 모델은 무작위 예측보다 19% 더 우수합니다. "항상 홈 팀이 이긴다"라고 말하는 단순한 전략보다도 앞섭니다.

55%의 정확도는 언뜻 낮아 보일 수 있습니다. 하지만 다음을 생각해 보십시오:

세계 최대 규모의 조직들, 수십억 개의 데이터 포인트와 수백 명의 분석가가 투입되는 시스템들조차 정확도가 57%를 넘는 경우가 드뭅니다.

이것이 축구입니다. 무작위성은 이 스포츠의 본질에 내재되어 있습니다. 우리 모델의 가치는 확실한 승자를 찾는 것이 아니라, 확률을 정확하게 교정(calibrate)하는 것에 있습니다.

터키의 전망

WC2026이 시작될 때 (2026년 6월 15일 기준) 우리 모델의 계산 결과는 다음과 같습니다:

단계확률
조별 예선 통과%33
......

터키는 D조(파라과이, 호주, 미국과 함께)에서 1위로 마칠 확률 1%, 2위로 마칠 확률 9%입니다. 하지만 46%의 확률로 3위를 차지할 것이며, 이 조의 가장 성적이 좋은 3위가 된다면 역시 일관성이 있습니다. 총 탈락 방지(진출) 확률: %33.

배운 점들

1. 교정 (Calibration)은 정확도 (Accuracy)보다 중요하다.

모델의 정확도는 당신을 속일 수 있습니다. 55%의 정확도를 보이지만 교정되지 않은 모델은, 52%의 정확도를 보이지만 교정된 모델보다 덜 유용합니다. 특히 확률을 바탕으로 의사결정을 내리고 있다면 더욱 그렇습니다.

2. 데이터 누수 (Data leakage)는 숨어 있는 것을 좋아한다.

FIFA 랭킹 사례처럼, 데이터 누수 (leakage)는 때때로 매우 명확하게 드러나지 않습니다. 테스트 세트 (Test set)에서 결과가 지나치게 좋게 나온다면 두 번 확인하십시오.

3. 베이스라인 (Baseline) 모델을 구축하기 전에는 시작하지 마라.

"항상 개최국이 승리한다"라는 나의 모델은 44.6%의 정확도로 작동합니다. 이 모델을 넘어서지 못하는 모델을 개발하는 것은 시간 낭비입니다. 항상 단순한 베이스라인 (naive baseline)을 먼저 구축하십시오.

4. 베이지안 (Bayesian) 방식으로 생각하는 것은 사고의 지평을 넓혀준다.

빈도주의자 (Frequentist): "파라미터 (Parameter)는 무엇인가?" → 단일 답변

베이지안 (Bayesian): "파라미터 (Parameter)는 무엇일 수 있는가?" → 분포 (Distribution)

이 차이는 실제 데이터를 다룰 때 거대한 이점이 됩니다.

코드를 보고 싶으신가요?

모든 소스 코드는 GitHub에 공개되어 있습니다:

github.com/Tuguberk/wc2026-ai

라이브 데모:

wc2026-ai.streamlit.app

다음 단계: LLM 하이브리드 아키텍처 (Hybrid Architecture)

이 시스템은 잘 작동하지만 결정적인 결함이 하나 있습니다: 부상 및 스쿼드 정보가 없다는 점입니다.

경기 전 "찰하노을루 결장"과 같은 뉴스는 모델을 완전히 바꿔놓아야 합니다. 이것은 통계적 모델만으로는 할 수 없으며, 비정형 텍스트 (unstructured text)에서 정보를 추출해야 합니다.

통계적 백본 (Statistical backbone)은 유지합니다 (교정되고, 재현 가능하며, 설명 가능함).

LLM 에이전트 (Agent)가 비정형적인 세상을 숫자로 변환합니다.

두 가지 강력한 접근 방식이 결합되는 것입니다.

참고 문헌

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0