
2026년 월드컵 예측 대시보드를 구축한 방법
요약
2026년 월드컵 토너먼트 결과를 예측하는 상호작용형 대시보드 구축 과정을 다룹니다. 데이터 수집부터 LightGBM 모델링, Streamlit을 활용한 프론트엔드 구현 및 배포 전략을 설명합니다.
핵심 포인트
- 데이터 파이프라인을 수집, 피처 스토어, 검증, 인터페이스 4단계로 모듈화
- 정형 데이터의 비선형 관계 처리에 최적화된 LightGBM 모델 채택
- Streamlit과 커스텀 CSS를 결합하여 반응형 토너먼트 대진표 구현
- Streamlit Community Cloud를 활용한 무료 배포 및 운영 팁
솔직해집시다. 지저분한 로컬 Jupyter Notebook에서 머신러닝 (Machine Learning) 모델을 꺼내 인터넷상에서 살아 움직이고 클릭 가능한 상태로 구현하는 기분만큼 짜릿한 것은 없습니다.
몇 주 전, 저는 재미있는 도전에 나서기로 했습니다. 바로 다가오는 2026 FIFA 월드컵의 토너먼트(Knockout stages) 단계를 예측하는 것이었습니다. 단순히 터미널에 뜨는 표준 텍스트 출력물을 보는 대신, 누구나 직접 플레이해 볼 수 있는 완전하고 상호작용 가능한 시각적 경험을 구축하고 싶었습니다.
데이터 파이프라인 (Data pipeline)을 어떻게 구축했는지, 왜 특정 모델을 선택했는지, 그리고 앱을 24시간 내내 무료로 온라인 상태로 유지하기 위해 사용한 영리한 트릭은 무엇인지 그 이야기를 들려드리겠습니다.
🏗️ 파이프라인 분해하기
저는 이 작업 공간을 모듈화(Modular)하고 깔끔하게 유지하고 싶었습니다. 모든 것을 수행하는 하나의 거대한 스크립트 대신, 워크플로우를 네 가지 전용 단계로 나누었습니다:
- 데이터 수집 (The Ingestion,
01_data_alignment.ipynb): 원시 데이터를 정제하고 과거 경기 기록을 정렬합니다. - 피처 스토어 (The Feature Store,
02_historical_feature_store.ipynb): 마법이 일어나는 곳입니다. 팀의 컨디션, "공격 속도 (Attacking velocity)", 그리고 시간에 따른 수비 안정성을 추적하기 위한 지표들을 엔지니어링했습니다. - 베이스라인 (The Baseline,
03_local_validation_and_baseline.ipynb): 모델이 단순히 맹목적으로 추측하는 것이 아님을 보장하기 위해 교차 검증 (Cross-validation) 루프를 설정합니다. - 인터페이스 (The Interface,
app.py): 시뮬레이션 로직을 처리하고 프론트엔드 (Front-end) 레이아웃을 렌더링하는 최종 프로덕션 스크립트입니다.
🤖 엔진: 왜 LightGBM인가?
예측을 위한 핵심 작업에는 LightGBM을 선택했습니다.
국제 축구 데이터는 매우 정형 데이터 (Tabular data) 형태를 띠지만, 까다롭고 비선형적인 관계(예: 팀의 현재 공격 컨디션이 상대 팀의 특정 수비 구조와 충돌하는 방식)로 가득 차 있습니다. LightGBM은 이러한 상호작용을 훌륭하게 처리합니다. 게다가 학습 속도가 믿을 수 없을 정도로 빠르며, 단순히 지루한 이진 "승/패" 결과가 아닌 정밀한 경기 확률 분포 (Probability distributions)를 출력할 수 있게 해줍니다.
🎨 Streamlit 및 CSS와의 사투
저는 이 앱이 기술 전문가뿐만 아니라 일반 축구 팬들에게도 직관적이기를 원했습니다.
저는 어떤 두 본선 진출국이든 맞대결을 붙여보고, "변동성 슬라이더 (volatility sliders)"를 조절하여 대규모 언더독 (underdog)의 이변을 시뮬레이션할 수 있는 사이드바 플레이그라운드 (sidebar playground)를 구축했습니다.
하지만 가장 어려웠던 부분은 무엇이었을까요? 바로 대진표 (bracket)였습니다. Streamlit은 놀라운 도구이지만, 표준 컴포넌트만을 사용하여 완전히 반응형(responsive)이고 깔끔한 16강 토너먼트 트리를 그리는 것은 매우 어렵습니다. 이를 해결하기 위해, 저는 레이아웃에 직접 로우 커스텀 CSS (raw custom CSS) 블록을 주입했습니다. 이제 앱은 16강부터 최종 우승자를 축하하는 금색 테두리의 포디움 (podium)까지 진행 과정을 매핑하는 선명한 벡터 그리드 라인 (vector grid lines)을 그려냅니다.
😴 "잠들지 않는" 비밀
저는 Streamlit Community Cloud를 사용하여 앱을 무료로 배포했습니다. 정말 놀라운 서비스이지만, 한 가지 함정이 있습니다. 앱에 12시간 동안 트래픽이 발생하지 않으면 서버가 앱을 휴면 상태 (sleep)로 전환한다는 점입니다. 그러면 다음 방문자는 "이 앱은 휴면 중입니다 (This app is hibernating)"라는 느린 로딩 화면을 보게 됩니다.
제 포트폴리오를 위해 이 문제를 우회하고자, 간단한 GitHub Actions 워크플로우 (.github/workflows/keep_alive.yml)를 설정했습니다. 10시간마다 자동으로 저장소에 보이지 않는 빈 커밋 (empty commit)을 푸시합니다. 이는 클라우드 서버가 활발한 개발이 진행 중인 것으로 착각하게 만들어, 휴면 타이머를 0으로 초기화합니다. 결과는 어땠을까요? 앱이 24시간 내내 깨어 있게 되었습니다!
🎮 직접 체험해 보세요!
전체 프로젝트는 공개되어 있으며, 여러분이 직접 이것을 가지고 놀아보셨으면 좋겠습니다.
- 🌍 라이브 앱 (Live App): Test Your 2026 World Cup Predictions
- 📂 GitHub 소스 (GitHub Source): MouroshK/World_cup_2026
🏆 최종 예측
대시보드가 실제로 작동하는 모습을 미리 보여드리기 위해, 파이프라인 (pipeline)의 베이스라인 실행으로 생성된 전체 토너먼트 대진표를 소개합니다:
2026년 월드컵 예측 대진표 시뮬레이션
보시다시피, LightGBM 엔진은 결승전에서 절대적인 헤비급 맞대결을 예측하며, 최종적으로는 **프랑스 (France)**가 **아르헨티나 (Argentina)**를 간발의 차로 제치고 우승 트로피를 들어 올릴 것으로 예측하는 한편, **잉글랜드 (England)**와 브라질 (Brazil) 같은 국가들은 준결승에서 아쉽게 탈락할 것으로 예측합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기