Captain's Log
← Logbook
기획·개발 (개인 프로젝트)··Ongoing

F1 데이터 대시보드 — 규정이 경기에 미친 영향까지

접근 장벽이 높은 F1을 데이터로 가깝게 — 수집·분석·텔레메트리·실시간 해설·ML 예측을 한 대시보드로 묶고, 규정 변화가 실제 경기 결과에 미친 영향까지 인과적으로 추적한 개인 프로젝트.

데이터 파이프라인ML 예측데이터 시각화규정 분석풀스택개인 프로젝트
F1 데이터 대시보드 — 규정이 경기에 미친 영향까지

Overview

개인 프로젝트 · 2026.07~ · 기획·개발

"F1 경기 데이터를 수집할 수 있을까?"라는 질문에서 출발해, 규정의 장벽·전문용어 때문에 멀게 느껴지는 F1을 데이터로 가깝게 만드는 대시보드를 혼자 end-to-end로 구현했다. 기획자로서 데이터 수집부터 ML·배포까지 직접 손으로 완주한 프로젝트다.

  • Skill: 데이터 파이프라인 설계, 분석·통계, 데이터 시각화, ML(분류·회귀), 인과 추정, 배포, 제품 사고
  • Stack: Python(pandas·scikit-learn), FastF1·Jolpica(Ergast)·OpenF1, Plotly·Streamlit, Docker·GCP Cloud Run

Problem

F1은 규정이 자주 바뀌고, 전문용어와 데이터가 진입장벽이다. 결과 표는 있어도 "예선이 결과를 얼마나 결정하는지", "어떤 규정이 어느 경기에 적용됐고 결과를 어떻게 바꿨는지"를 한눈에 보여주는 도구는 드물다.

접근성을 데이터로 — 화려한 스택이 아니라, "볼거리"가 빨리 나오고 스스로 판단할 수 있는 경험을 목표로 설계했다.

Solution

상세 텔레메트리는 2018년부터만 존재한다는 데이터 제약을 반영해 2계층 수집 구조(결과 2016+, 텔레메트리 2018+)를 잡고, 소비 계층(분석·ML·시각화·해설)이 이를 나눠 쓰도록 파이프라인을 설계했다.

  1. 시즌 분석 — 챔피언십 추이, "그리드(출발) vs 결과" 상관·서킷 혼전지수
  2. 텔레메트리 시각화 — 두 드라이버 최고랩의 속도·브레이크·기어 비교 + 속도 트랙맵
  3. 실시간 해설 — OpenF1 레이스컨트롤 메시지를 한국어로 번역·요약하는 자동 중계
  4. ML 예측 — 레이스 전 정보로 포디움·완주 순위 예측 (누수 방지 시계열 검증)

시즌 챔피언십 포인트 추이 — 2021년은 마지막 라운드까지 접전이었다시즌 챔피언십 포인트 추이 — 2021년은 마지막 라운드까지 접전이었다

OpenF1 레이스컨트롤을 한국어로 자동 중계하는 실시간 해설OpenF1 레이스컨트롤을 한국어로 자동 중계하는 실시간 해설

ML은 정직하게 접근했다. 처음엔 트리 부스팅이 구시대 팀 패턴에 과적합해 "그리드 top3" 단순 베이스라인조차 못 넘겼다. 규제 로지스틱 회귀로 바꾸고 평가를 "경기당 top3 적중"으로 재정의해, 베이스라인을 실제로 상회했다.

예측 모델의 특성 중요도 — 출발 위치(grid)가 결과를 압도적으로 좌우한다예측 모델의 특성 중요도 — 출발 위치(grid)가 결과를 압도적으로 좌우한다

Result — 규정이 경기에 미친 영향

여기서 한 걸음 더 나아갔다. FIA 공식 규정 PDF를 수집(봇 차단을 우회)해 텍스트·발효일을 파싱하고, 규정 변화를 실제 경기 결과와 연결했다.

  • 규정 변화 연대기 — 스포팅·기술·재정 규정을 시즌 간 비교해 "얼마나 크게 다시 썼나"를 정규화 측정. 2022(그라운드이펙트)·2026(신 파워유닛)이 대형 개편으로 뚜렷했다.

규정 변경 규모 — 스포팅·기술·재정, 시즌별규정 변경 규모 — 스포팅·기술·재정, 시즌별

  • 페널티 → 순위 인과 추정 — 시간 페널티는 완주 기록에 이미 반영돼 있으므로, 페널티 초를 빼서 재순위(counterfactual) 해 실제로 잃은 순위를 추정했다. 흥미로운 발견: 순위 손실은 레이스의 압축도에 좌우된다 — 17대가 23.6초 안에 완주한 초압축 레이스에선 20초 페널티가 12순위를 떨어뜨렸다.

시간·스톱고 페널티의 순위 영향 — 시즌별 총 손실(인과 추정)시간·스톱고 페널티의 순위 영향 — 시즌별 총 손실(인과 추정)

  • 배포 — Streamlit 앱을 Docker로 컨테이너화해 GCP Cloud Run에 올렸다. 유휴 시 0으로 축소(scale-to-zero)돼 수요가 확인되지 않은 단계에서 비용 없이 측정할 수 있게 했다.

Retrospective

기획자가 구현까지 완주하다 — 데이터 수집·ML·배포·인과분석을 직접 손으로 끝내며, 기획이 막연한 그림이 아니라 실제 구현 가능성 위에 서게 만들었다.

정직한 엔지니어링 — "수요를 모르니 싸게 띄워 재보자"며 오버엔지니어링을 피했고, 검증 과정에서 데이터 함정(시대별 status 표기 변화, 대량 수집 시 부분 집계)을 잡아냈다. 처음엔 버그로 보였던 "20초 페널티가 12순위 손실"이 사실은 초압축 레이스의 실제 현상이었던 것처럼 — 검증이 오히려 통찰을 지켰다.

Links