2026년 축구 월드컵, 누가 우승할까?

발행: (2026년 6월 7일 AM 12:00 GMT+9)
11 분 소요

Source: Towards Data Science

2026년 6월 11일에 48팀, 104경기, 그리고 늘 그렇듯 뜨거운 의견들이 쏟아지는 월드컵이 시작됩니다. 저는 실제로 방어할 수 있는 예측을 원했습니다. 멋진 결과만 내는 머신러닝 모델이 아니라, 모든 숫자가 명확히 논의할 수 있는 가정에 기반한 모델이 필요했습니다.

이 글에서는 그런 예측을 처음부터 직접 구축합니다. 의도적으로 단순하게: 각 팀을 평가하고, 각 경기 매치를 골 득점 분포로 변환한 뒤, 토너먼트를 수만 번 시뮬레이션합니다.

축구에만 국한된 내용처럼 보일 수 있지만, 이 글의 방법론부터 결과 해석까지 거의 모든 부분은 데이터 과학에 보편적으로 적용됩니다. “팀”을 영업 사원, 배송 날짜, 서버 부하, 혹은 이탈 코호트 등으로 바꾸면 같은 세 단계가 점 추정치가 아닌 방어 가능한 예측을 제공합니다.

여기서 진정한 전이 가능한 기술은 모든 숫자가 논의 가능한 가정에 뿌리를 두는 파이프라인을 구축하는 것이며, 블랙박스 머신러닝 모델이 숨기는 추정이 아니라는 점입니다.

축구 사례에서는 트래킹 데이터도 없고, 딥러닝도 없으며, 오후에 다시 만들 수 있는 수준만 사용합니다. 하지만 여기서 멈추지 마세요! 핵심은 복잡함이 아니라 투명한 파이프라인을 구축해 블랙박스가 숨기는 모델링 선택을 직접 마주하게 하는 것입니다. 우리는 모델을 세 단계로 만들고 각 단계마다 가정을 검토할 것입니다.

Step 1: Rate every team with Elo

경기 결과를 예측하려면 각 팀의 실력을 숫자로 표현해야 합니다. 국가대표팀에 가장 깔끔하게 적용할 수 있는 기존 옵션은 World Football Elo rating 으로, 아르파드 엘로(Arpad Elo)의 체스 시스템을 축구에 맞게 변형한 것입니다.

엘로는 자체 교정 방정식 하나로 이루어집니다. 각 팀은 R이라는 레이팅을 가지고 있습니다. 경기 전, 팀 A가 팀 B를 상대로 얻을 기대 점수(0–1 스케일, 1이 승리)는 레이팅 차이에 대한 로지스틱 함수로 계산됩니다:

E_A = 1 / (1 + 10^(-(R_A - R_B) / 400))

경기 후에는 실제 결과에 따라 레이팅을 조정합니다:

R_A' = R_A + K * (S_A - E_A),

여기서 S_A는 실제 결과(승리 1, 무승부 0.5, 패배 0)이고, K는 레이팅 변동 속도를 조절합니다. 축구용 변형에서는 두 가지 추가 요소가 있습니다: K가 승리 차이(예: 4–0이 1–0보다 레이팅 변동을 크게 함)와 친선 경기보다 공식 경기의 가중치를 반영합니다. 상수 400은 스케일 선택으로, 400점 차이가 대략 10:1 선호도(E ≈ 0.91)에 해당합니다.

모델에서는 현재 레이팅만 필요하므로, 이를 사전(dictionary) 형태로 저장합니다. 저는 2026년 6월 초에 공개된 무료 Kaggle 데이터셋에서 가져온 사전 스냅샷을 사용합니다:

# World Football Elo Ratings, pre-tournament snapshot (early June 2026).
# Source: "2026 FIFA World Cup — Historical Elo Ratings" (Kaggle, CC BY-SA 4.0),
# compiling data from World Football Elo Ratings (eloratings.net).
ELO = {
    "Spain": 2155, "Argentina": 2113, "France": 2062,
    "England": 2020, "Brazil": 1988, "Portugal": 1984,
    "Colombia": 1977, "Netherlands": 1944, "Germany": 1925,
    # ... all 48 qualified teams
}

Assumption check: 엘로는 폼, 스쿼드 퀄리티, 피로도 등을 하나의 숫자로 압축하고, 팀 강점이 단기적으로는 대체로 정적인 것으로 가정합니다. 이는 강한 단순화이지만, 투명하고 검증 가능한 가정이며, 단일 피처로서 엘로를 능가하기는 어렵습니다.

Step 2: Turn a rating gap into a goal distribution

레이팅 차이는 승리 확률을 제공하지만, 토너먼트를 시뮬레이션하려면 점수가 필요합니다. 점수는 골 차이, 조별 승점 차이, 그리고 경기의 전체적인 흐름을 결정합니다. 축구 분석에서 표준적인 접근은 각 팀의 득점을 포아송 과정으로 모델링하는 것입니다. 포아송 분포는 평균 발생률 λ가 일정한 독립 사건이 k번 발생할 확률을 제공합니다:

P(k goals) = λ^k * e^(-λ) / k!

골은 이론적으로 잘 맞습니다: 이산적이고, 비교적 드물며, 경기 내에서는 메모리리스(과거와 무관) 특성을 보입니다. 두 팀의 골 수를 평균 λ_homeλ_away를 갖는 독립 포아송 변수로 취급하면, 전체 점수 분포는 두 확률 질량 함수(PMF)의 외적이며, 승·무·패 확률은 해당 셀들을 합산해 구할 수 있습니다:

from scipy.stats import poisson
import numpy as np

def match_probs(lam_home, lam_away, max_goals=10):
    h = poisson.pmf(np.arange(max_goals + 1), lam_home)
    a = poisson.pmf(np.arange(max_goals + 1), lam_away)
    grid = np.outer(h, a)             # grid[i, j] = P(home i, away j)
    p_home = np.tril(grid, -1).sum()  # home goals > away goals
    p_draw = np.trace(grid)
    p_away = np.triu(grid, 1).sum()
    return p_home, p_draw, p_away

Assumption check: 독립 가정은 편리하지만 완벽하지 않습니다—실제 점수는 상관관계가 존재하고 0–0, 1–1 같은 저득점 무승부가 과다하게 나타납니다. 표준적인 보정 방법은 Dixon–Coles 조정으로, 저득점 보정 항과 과거 경기의 시간 가중치를 추가합니다. 여기서는 명료성을 위해 생략했으며, 이는 제 곧 출간될 책의 포아송 장에서 자세히 다룹니다.

Step 3: Connect ratings to goals

이제 레이팅 차이를 λ_homeλ_away로 변환해야 합니다. 축구 모델링 전설에 따르면, 약 400점의 엘로 차이는 대략 한 골 차이에 해당합니다. 따라서 평균 약 2.7골(국제 경기 평균)이라는 기본값을 레이팅 차이에 따라 두 팀에 나눠줍니다:

GOALS_BASE = 2.7
GOALS_PER_400_ELO = 1.0

def lambdas(elo_a, elo_b):
    diff = (elo_a - elo_b) / 400.0 * GOALS_PER_400_ELO
    la = max(0.15, GOALS_BASE / 2 + diff / 2)
    lb = max(0.15, GOALS_BASE / 2 - diff / 2)
    return la, lb

0.15의 최소값은 언더독에게 비현실적인 음수 득점률이 할당되는 것을 방지합니다. 보다 원칙적인 방법은 실제 경기 데이터를 이용해 log(λ) = β₀ + β₁·Δrating 형태의 포아송 GLM을 적합하는 것이지만, 위의 선형 휴리스틱은 대략적인 추정으로 선호팀에 대해 비슷한 결과를 제공합니다.

Step 4: Simulate the tournament 10,000 times

한 번의 시뮬레이션은 예측이 아니라 단지 가능한 2026년 중 하나일 뿐입니다. 예측은 수천 번 시뮬레이션한 분포입니다. 따라서 전체 토너먼트를 실행하고 각 팀이 우승할 확률을 집계합니다.

2026년 포맷은 새롭고 정확히 다음과 같습니다: 48팀이 12개 조(각 4팀)로 나뉘며, 각 조 상위 2팀과 가장 좋은 8팀의 3위 팀이 32팀 싱글 엘리미네이션 토너먼트에 진출합니다.

3위 규칙은 조별전이 모두 끝나야 누가 진출할지 결정할 수 있기 때문에 조합적인 복잡성을 추가합니다. 따라서 시뮬레이션은 각 조의 승점과 골득실을 추적하고, 조별 3위 팀들을 비교해 상위 8팀을 선발합니다. 녹아웃 라운드에서는 무승부 시 승부차기로 승자를 가리며, 이는 강한 팀에게 약간 유리하게 조정된 동전 던지기로 모델링합니다.

0 조회
Back to Blog

관련 글

더 보기 »

실험 플랫폼 선택: 회고

, in every company that wants to ship products people love, when “we should experiment more” becomes “we cannot keep experimenting like this.” Hand-tuned holdou...