AI로 읽는 가상축구: 시뮬레이션 알고리즘의 비밀

경기장에 울리는 휘슬 소리 대신 확률과 코드는 조용히 굴러간다. 가상축구 엔진은 경기장을 수학적 상태 공간으로 바꾸고, 매 순간을 사건들의 연쇄로 뿌려낸다. 수천 번의 가상 킥오프 끝에 남는 것은 점수표가 아니라 구조에 대한 통찰이다. 어떤 입력이 어떤 결과를 만들어내는가, 플레이어 특성이 전술과 어떻게 얽히는가, 불확실성은 어디에서 증폭되고 어디에서 상쇄되는가. 실전에서는 이 질문들이 게임 밸런스, 팬터지 리그의 추천, 북메이킹 위험관리, 심지어 지도자의 사전 시나리오 훈련까지 이어진다. 표면만 보면 가상축구는 화려한 인터페이스와 스코어 예측으로 보이지만, 안쪽에서는 세밀한 설계와 끝없는 검증이 품을 판다.

몇 해 전, 추적 데이터가 충분치 않은 2부 리그를 대상으로 간단한 시뮬레이터를 만들었던 경험이 있다. 누적 6시즌의 이벤트 로그와 선수 평점, 경기별 날씨를 얕게나마 갖췄지만, 팀별 전술 지표는 듬성듬성했다. 첫 버전은 평균 득점을 곱셈처럼 환산하는 빤한 포아송 모델을 벗어나지 못했는데, 승무패 배분은 그럴싸했지만 각 팀이 특정 상대에게 유독 약하거나 강한 패턴을 설명하지 못했다. 두 번째 버전에서 하는 수 없이 점유 전환의 체인 구조를 도입하고, 압박 강도와 전환 속도를 추정 파라미터로 넣자 비로소 특이점이 살아났다. 모델이 축구를 이해하기 시작한 셈이다. 다만 계산비용이 늘어나 매치 1회 시뮬레이션에 평균 280밀리초가 걸렸다. 수만 회 몬테카를로를 돌리려면 병렬화와 캐시가 필수였다. 여기서 얻은 교훈은 한 가지, 알고리즘은 결국 타협의 예술이라는 점이다.

무엇을, 얼마나, 어떻게 시뮬레이션하는가

가상축구를 구현하는 방식은 여러 갈래로 갈린다. 대략 물리 기반의 애니메이션 엔진과 사건 기반의 상태 전이 엔진으로 구분할 수 있다. 전자가 패스 궤적과 접촉을 정교하게 풀며 볼과 몸의 미세한 상호작용을 살린다면, 후자는 패스 성공, 압박 돌파, 슈팅 선택과 같은 의미 있는 사건만을 뽑아 시간축을 압축한다. 후자 안에서도 해상도는 다층적이다. 어떤 엔진은 소유권과 구역만 가지고 움직이는 반면, 다른 엔진은 선수 간 거리, 각도, 시야, 체력의 미세 변화를 초마다 업데이트한다. 어느 쪽이 옳다는 정답은 없다. 목적에 맞게 설계하는 일이 전부다.

영상 게임처럼 움직임의 질감이 중요하면 물리 엔진의 비중이 커진다. 반대로 결과와 패턴의 그럴듯함이 목적인 가상축구에서는 사건 기반 상태 전이가 낫다. 특히 대규모 몬테카를로를 통해 분포를 보고자 한다면, 초 단위 업데이트조차 무겁다. 이벤트 중심으로 사고하는 쪽이 학습과 해석 모두 유리하다.

입력 데이터의 품질이 모델의 지평을 결정한다

기본은 누구나 안다. 선수 능력치, 포지션, 주발, 체력과 부상 이력, 최근 출전 시간. 거기에 팀 전술의 경향, 예를 들어 수비 라인의 높이, 압박 트리거, 빌드업에서의 중원 배치. 더 나아가면 경기 맥락 데이터가 있다. 날씨와 잔디 상태, 원정 거리, 일정 밀도와 회복 간격. 어느 층위까지 확보되는지가 시뮬레이터의 상한을 만든다.

상업 리그에서는 선수 위치 추적이 초당 10회 이상 들어온다. 이 데이터가 있으면 전개 속도, 압박 성공, 라인 간 거리 같은 거친 개념을 수치로 내릴 수 있다. 반면 하부 리그나 아마추어 씬에서는 이벤트 로그가 전부일 때가 있다. 이때는 사건 사이의 보이지 않는 시간과 움직임을 가정으로 채워야 한다. 통계적 추정과 도메인 지식이 맞물리는 지점이다. 예컨대 평균적인 측면 전개에서 풀백과 윙어의 거리 분포가 어느 정도인지, 후방에서 전방으로의 롱볼 시도가 몇 분에 한 번 일어나는지, 공을 빼앗긴 뒤 첫 3초 내 재탈환 확률이 어느 범위에 드는지. 수치가 없어도 합리적인 범위와 불확실성 표현만으로 모델은 작동한다.

상태와 사건, 시간의 해상도

시뮬레이션의 최소 단위는 상태와 사건의 교차점에 있다. 상태는 필드를 어떻게 나누고 무엇을 기억할지의 선택이다. 폭 105미터의 필드를 6 x 4 구역으로 갈지 12 x 8로 갈지, 혹은 지속값으로 좌표를 쓸지. 선수의 체력이나 집중력 같은 잠재 변수를 상태에 포함할지, 아니면 사건 발생 확률의 잠재 파라미터로 둘지. 사건은 소유권 전환, 패스, 드리블 돌파, 슈팅, 파울, 세트피스 같은 전술적으로 의미 있는 변화다. 시간 해상도는 사건 중심이면 불연속이 된다. 즉 사건이 일어나지 않는 동안은 상태가 천천히, 혹은 정의된 규칙에 따라 연속 업데이트된다.

저해상도 모델의 장점은 계산 속도다. 구역 단위를 8 x 6으로 제한하고 상태를 소유권, 볼의 위치, 양 팀 라인 간 거리 정도로 줄이면 한 경기 몬테카를로 1만 회를 수 초 내에 끝낼 수 있다. 반면 슈팅 각도, 몸의 방향, 상대 압박자 수 같은 요소를 상태에 더하면 득점 기대값 추정은 더 정확해지는 대신, 파라미터가 기하급수적으로 늘고 학습도 어렵다. 실무에서는 일반적으로 기본 엔진은 얕게, 마무리 단계인 슈팅과 세트피스는 더 정교하게 두는 비대칭 구성을 사용한다. 리소스가 넉넉하지 않을 때 합리적인 절충이다.

전이 확률을 어디서 만들어낼 것인가

과거에는 규칙 기반이 흔했다. 패스 성공률을 거리와 각도의 함수로 정하고, 수비 압박이 한 단위 증가할 때 확률이 몇 퍼센트포인트씩 떨어지도록 선형 규칙을 만든다. 이 방식은 투명하고 제어가 쉽다. 다만 스케일링과 상호작용이 복잡해지면 규칙이 금세 꼬인다. 지금은 데이터 주도형이 주류다. 로그에서 패스 시도 시점의 맥락을 특징으로 삼아 확률을 바로 회귀나 분류로 학습한다. 점유 전환, 돌파 성공, 파울 유발, 슈팅 선택도 같은 식이다.

여기에는 두 가지 노선이 있다. 하나는 거시적 모델이다. 점유 유지 vs 전환의 체인을 마코프 프로세스로 두고, 각 전이에 영향을 주는 맥락 특징을 추정한다. 다른 하나는 미시적 모델, 즉 에이전트가 행동을 선택하는 정책을 학습시키는 방법이다. 강화학습을 쓰면 상태에 따른 행동 분포를 실증적으로 얻을 수 있다. 전자는 해석이 쉽고 빠르다. 후자는 복잡한 전술 상호작용을 드러낸다. 다만 데이터가 충분하지 않으면 후자는 환각처럼 과장된 패턴을 만든다. 2만 경기 미만에서는 거시적 체인이 더 단단했다.

image

득점과 실점의 미세 구조

한 번의 슈팅으로 모든 것이 끝난다. 그래서 xG, 즉 예상 득점값이 중추를 이룬다. 슈팅 위치와 각도, 사용 발, 체공 시간, 압박자 수 같은 변수를 넣어 로지스틱 회귀나 그래디언트 부스팅으로 득점 확률을 얻는다. 여기서 중요한 점 하나, xG는 한 번의 슈팅 확률일 뿐 경기 맥락을 온전히 반영하지 않는다. 같은 0.15의 슈팅도 0 대 0에서의 가치와 2 대 0에서의 가치가 다르다. 점수 상태와 남은 시간은 슈팅 선택 자체에 영향을 준다. 따라서 시뮬레이터에서는 xG를 단독 지표로 쓰기보다, 슈팅 발생 확률과 선택 정책의 일부로 다루는 편이 낫다.

세트피스는 또 다른 세계다. 코너킥에서의 득점률은 통상 2.5% 전후, 프리킥 직시도는 위치에 따라 3%에서 8%까지 변한다. 팀별 전술 차이가 커서, 세트피스만 별도 모듈로 두는 구성이 실감과 예측력을 함께 높인다. 예를 들어 니어 포스트 러닝을 즐겨 쓰는 팀의 경우, 혼전 후 세컨드볼 슈팅 빈도를 일반 팀의 1.3배로 가중하면 시즌 누적 득점이 실제와 근사해졌다. 반대로 코너 수비에서 지역 방어를 쓰는 팀은 유효 슈팅 허용 분포가 헤딩 중심으로 몰리는 경향이 있는데, 여기에 대한 보정을 하지 않으면 특정 팀의 실점 과대평가가 반복된다.

선수 모델, 집단 모델, 그리고 상호작용

개별 선수의 특성이 어떻게 팀의 전이 확률을 바꿀까. 단순화의 유혹은 크다. 패스 능력치를 평균으로 합치고, 드리블 능력은 전방 3분의 1에서만 적용하는 식이다. 하지만 볼을 받는 선수와 주는 선수의 조합, 도우미의 오프더볼 움직임이 전이를 가속한다. 한 편의석에서는 센터백의 전진 패스가 늘어나면 중원의 부담이 줄고 공격수의 터치 수가 줄어든다. 이 연쇄는 능력치의 선형 합으로는 나타나지 않는다.

그래서 계층 베이즈를 쓴다. 사건 확률을 팀 레벨, 포지션 레벨, 선수 레벨로 분해한다. 팀 레벨은 전술적 맥락, 포지션 레벨은 역할 기반 기본값, 선수 레벨은 개인 편차다. 샘플이 적은 선수는 팀과 포지션 평균으로 수축되어 과적합을 줄인다. 예를 들어 신인 윙어의 드리블 성공률을 추정할 때, 같은 팀의 윙어 평균과 리그 전체 윙어 분포가 기준점이 된다. 데이터가 쌓이면 개인 파라미터가 드러난다. 이런 방식은 시즌 초반의 불확실성을 정직하게 표현해 준다. 가상축구 이용자 입장에서도 이 불확실성이 시뮬레이션 결과의 폭으로 반영되므로, 단일 포인트 예측 대신 결과 분포를 보는 훈련이 된다.

시드, 난수, 그리고 분산을 낮추는 기술

시뮬레이션은 운에 기대는 기술이 아니다. 난수는 통제된다. 재현 가능한 시드를 쓰고, 동일한 매치업에 동일 시드를 적용하면 결과가 같아야 한다. 엔진을 비교할 때는 공정성의 기본이다. 그다음은 분산을 낮추는 일이다. 단순 몬테카를로는 수십만 회가 필요할 때가 많다. 제어변수법을 도입하면 샘플 수를 줄일 수 있다. 예를 들어 홈 어드밴티지, 기온, 심판 성향 같은 외생 변수를 기준으로 묶어 같은 블록 내에서만 비교하면 표준오차가 준다. 중간 사건의 확률을 약간 변경했을 때 점수 분포가 얼마나 민감하게 변하는지 보는 민감도 분석에서도, 라틴 하이퍼큐브 샘플링이 순수 난수보다 훨씬 효율적이었다. 1만 회와 5만 회 사이에서 로그손실 수렴이 얼마나 빨리 오는지는 엔진의 이벤트 설계에 달렸다. 불필요한 무작위성을 줄이고 실제 불확실성만 남기는 것이 핵심이다.

검증, 더티 데이터, 그리고 가려진 편향

시뮬레이터는 스스로를 속이는 재주가 있다. 훈련 데이터에 맞춘 튜닝이 완벽해질수록 실전 성능은 떨어질 수 있다. 경기 로그의 타임스탬프는 몇 초씩 어긋나기도 하고, 득점 이전의 의도적 파울이 사건으로 기록되지 않기도 한다. 이 노이즈를 과도하게 설명하려 들면 모델은 현실을 놓친다.

검증은 세 가지를 본다. 첫째, 칼리브레이션. 예측 확률 0.6을 준 사건이 장기적으로 60% 일어나는가. 신뢰구간의 폭과 관측 빈도가 일치하는가. 둘째, 분류력. 브라이어 점수와 로그손실은 미세한 차이를 보여준다. 시뮬레이터에서 로그손실 0.68과 0.66의 차이는 겉보기보다 크다. 셋째, 구조적 패턴. 시간대별 득점 분포가 현실처럼 후반으로 갈수록 높아지는가, 카드 누적과 퇴장의 빈도는 시즌 평균에 맞는가, 특정 전술 조합에서 xG 대비 득점 오버 또는 언더가 일관되게 생기지 않는가.

가상축구

교차검증은 시간 의존성을 고려해야 한다. 시즌을 섞어서 훈련과 검증을 나누면 누수가 생긴다. 과거 몇 시즌으로 학습하고 이후 시즌으로 평가하는 롤링 윈도우가 맞다. 데이터 스누핑, 즉 파라미터를 바꿔가며 검증 세트 성능이 가장 좋은 조합을 고정하는 우를 경계해야 한다. 이럴 때는 아예 최종 검증 세트를 따로 빼 두고, 튜닝이 끝난 뒤 한 번만 열어보는 절차가 필요하다.

경기 맥락과 심판, 날씨 같은 작은 변수들

정밀한 엔진은 작은 변수에 반응한다. 심판의 파울 판정 경향은 카드와 세트피스, 나아가 득점에 영향을 준다. 몇몇 리그에서는 심판별 파울 수가 경기당 6회 차이 나기도 한다. 강한 바람은 롱볼의 효용을 낮추고, 빗물은 태클 성공률과 부상 확률을 소폭 끌어올린다. 빽투빽 원정은 체력 손실뿐 아니라 전술의 보수화로 이어진다. 점유 전환에서의 위험 감수도가 낮아지면 볼 소유는 늘지만 파이널 서드 진입은 줄어든다. 이 변화는 공통 파라미터를 한두 칸 조정하는 방식으로 반영할 수 있다. 중요한 점은 상호작용이다. 예를 들어 빗속에서 하이프레스를 유지하는 팀은 전방에서의 파울이 늘고, 이게 곧바로 세트피스 실점으로 이어질 수 있다. 단일 변수의 평균 효과보다 조합의 복합 효과를 추정하는 습관이 필요하다.

밸런싱과 재미, 공정성 사이의 줄타기

가상축구가 전적으로 예측의 도구일 때는 정확도가 곧 미덕이지만, 게임으로서의 가상축구는 재미가 걸려 있다. 완벽하게 현실적인 분포는 팬들에게 지루할 수 있다. 이때는 보이는 난수의 밀도를 조정한다. 드라마틱한 역전이 시즌에 한 번은 나오도록 꼬리를 살짝 두껍게 만들거나, 라이벌전의 텐션을 높이는 식이다. 물론 과하면 인공적인 느낌이 난다. 우리 팀에서 도입했던 방법은 출력은 자연스럽되 원인이 설명 가능한 정도의 조정을 하는 것이었다. 예를 들어 상대 전력을 크게 앞서는 팀이 일방적으로 이기는 시뮬레이션의 비중을 3% 줄이고, 중반 이후 교체 카드를 상황 지능적으로 쓰는 팀의 후반 득점 확률을 미세하게 올렸다. 이용자 피드백은 좋아졌고, 장기 통계에서는 여전히 현실 리그와 큰 차이가 없었다.

공정성은 또 다른 층이다. 선수 능력치의 출발점을 어떤 데이터로 두느냐가 민감하다. 측정 편향이 인종, 국적, 리그 수준과 얽히면 결과는 쉽게 왜곡된다. 추적 데이터가 부족한 리그의 선수들이 과소평가되는 현상도 흔하다. 해결책은 불확실성을 모델 안으로 가져오는 일, 그리고 설명 가능성을 높이는 일이다. 베이즈적 수축은 데이터가 빈약한 집단을 과하게 낮추지 않는다. 이벤트 생성의 주요 결정 경로를 로그로 남겨 내부 감사가 가능하게 하면, 업데이트와 피드백 사이의 건전한 순환이 만들어진다.

로스터 변화, 전술 업데이트, 시즌의 결

가상축구의 어려움은 변화율에 있다. 이적 시장 한 번, 감독 교체 한 번으로 팀의 분포가 달라진다. 외부에서 보이는 것은 출전시간과 기본 포지션의 이동뿐일 때가 많다. 이를 엔진에 반영하려면 가정이 필요하다. 새 감독이 선호하는 포메이션, 지난 팀에서의 전술 경향, 핵심 선수의 역할 변화 가능성. 우리는 이런 상황에서 세 가지 거친 시나리오를 만든다. 전술 유지, 점진적 전환, 급진적 전환. 각 시나리오를 2천 회씩 돌려 분포를 비교하면, 위험한 베팅이나 팬터지 팀 선택에서 피해야 할 구간이 떠오른다. 평균만 보면 놓치게 되는 지점이다. 시즌 막판 강등권 경쟁처럼 심리적 요소가 과대반영되는 구간에서도, 모델은 차분하게 분포의 꼬리를 보여준다. 불확실성을 인정하는 태도가 여기서도 유효하다.

예측을 넘어, 질문을 위한 엔진

좋은 시뮬레이터는 답보다 질문을 낳는다. 수비 라인을 5미터 올리면 상대의 롱패스 성공률이 얼마나 오르고, 그게 우리 팀의 전방 압박 이득을 상쇄하는가. 세트피스 전담 키커를 바꾸면 시즌 기대 득점이 몇 골 달라지는가. 주중 경기 뒤 원정 이동이 하루 늦춰지면 주말 경기의 득점 분포 꼬리가 얼마나 얇아지는가. 이런 가정 실험은 감독과 분석가에게는 계획의 도구가 되고, 가상축구 이용자에게는 이해의 도구가 된다. 시뮬레이션의 가치는 이런 대화에 있다.

모델 선택의 갈림길에서

복수의 엔진을 병행 운용해 본 사람이라면 알 것이다. 어느 하나가 항상 이기지 않는다. 빠르고 투명한 마코프 체인은 전체 리그 시즌을 통으로 백테스트할 때 강력하다. 반면 강화학습 기반의 에이전트 모델은 전술의 맥락 변화, 예를 들어 스코어라인과 남은 시간에 따른 압박 강도 조절을 자연스럽게 반영한다. 계산 자원이 넉넉하지 않거나 데이터가 적을 때는 체인이 우세하고, 프레임 단위의 위치 데이터를 장기간 축적했다면 에이전트가 제 힘을 낸다. 하이브리드도 가능하다. 소유권 전환과 빌드업은 체인으로, 파이널 서드에서의 선택은 정책 네트워크로. 이 구성이 현실성과 속도의 균형을 잡는 경우가 많았다.

사례, 숫자, 그리고 작동 확인

실무에서 한 번은 이렇게 됐다. 코너킥 방어에서 맨마킹 비율을 20% 높이면 시즌 실점이 몇 골 줄어드는지 알고 싶었다. 과거 4시즌의 코너 수비 로그와 수비 위치 히트맵, 헤더 경합 성공률 데이터를 모아 파라미터를 업데이트했다. 가정은 두 가지였다. 첫째, 맨마킹 전환으로 니어 포스트 러너의 자유도가 떨어진다. 둘째, 지역 수비의 세컨드볼 회수율이 약간 줄어든다. 시뮬레이션 상으로는 리그 평균 팀의 코너 실점이 시즌 6.4골에서 5.7골로 내려갔다. 표준오차는 0.6골. 실제로 다음 시즌에 그 조정을 시행한 팀에서 코너 실점이 1골가량 줄었다. 물론 단정할 수는 없지만, 설계와 추정의 방향이 틀리지 않았다는 확인이었다.

숫자 하나 더. 홈 어드밴티지는 경기당 득점에 평균 0.18골, 파울 유도에 1.2회의 우위를 준다는 추정이 있다. 리그마다 다르지만, 이 정도의 모수는 시뮬레이터의 균형을 잡아 준다. 심판 효과가 큰 리그에서는 이 값이 커진다. 반대로 무관중 시즌에는 0.18이 0.05까지 줄어든 일이 실제로 있었다. 이런 외생 변화는 가상축구 엔진에 일시적 오프셋으로 주입할 수 있다. 그 결과 분포가 어떻게 재편되는지 보는 것만으로도 팬 입장에서는 배울 점이 많다.

학습과 운영, 두 개의 엔진

시뮬레이터는 개발과 운영이 분리될수록 단단해진다. 학습용 엔진은 가능한 많은 변수를 흡수하고, 실험적으로 위험한 아이디어도 받아본다. 운영 엔진은 안정성과 재현성이 최우선이다. 로그 포맷을 고정하고, 파라미터 변경은 버전으로 관리한다. 시드를 일관되게 유지하며, 성능은 마이크로초 단위로 모니터링한다. 배치로 돌리는 몬테카를로는 저비용 서버에 분산하고, 결과 저장은 요약 통계 중심으로 한다. 과거 우리는 경기당 원시 이벤트 2천 건을 저장하던 방식을 버리고, 구간별 득점 확률 벡터와 핵심 사건 타임라인만 남겼다. 저장 용량은 80% 줄고, 사후 분석 속도는 두 배 빨라졌다. 현장에서 가장 값비싼 자원은 계산 능력이 아니라 팀의 시간이다.

가상축구 이용자를 위한 현실 감각

결과 분포는 넓다. 55 대 45의 승률 차이가 있다고 해서 한 경기의 당연함으로 번역되지는 않는다. 시뮬레이터가 주는 상자그림을 보자. 중앙값과 사분위 범위, 극단의 꼬리. 특정 선수 한 명의 컨디션 변수가 꼬리를 넓히는지, 전술 조정이 중앙을 움직이는지. 가상축구에서 팀을 짤 때 이런 감각이 몸에 배면 손실을 줄인다. 사진 한 장으로 경기를 모두 설명할 수 없듯 확률 하나로 시즌을 요약할 수 없다. 분포를 이해하면 감정의 과잉에서 벗어난다.

연구의 최전선, 그리고 조심해야 할 과장

다중 모달 데이터를 합치는 연구가 가속하고 있다. 영상에서 직접 상황을 읽어 사건 확률을 추정하는 비전 모델, 선수의 미세 움직임을 피처로 뽑아 드리블 성공 확률을 따로 모델링하는 시도. 또 하나는 미분 가능한 시뮬레이터다. 전이 규칙을 연속 함수로 두고, 결과 지표에 대한 그래디언트를 계산해 전술 파라미터를 역으로 최적화한다. 계산량이 만만치 않다. 데이터가 많은 상위 리그가 아니면 실전에 쓰기 어렵다. 그리고 과장에 주의해야 한다. 하이라이트 영상만으로 선수 전술지능을 정량화했다는 말은 대개 허풍이다. 장면 선택의 편향이 너무 크다. 가상축구에 그 결과를 그대로 넣으면 화려하지만 공허한 엔진이 나온다.

설계 전에 던지는 네 가지 질문

    무엇을 예측하고 싶은가, 분포 전체인가 포인트인가 어떤 데이터가 실제로 사용 가능한가, 업데이트 주기는 어떤가 해석 가능성이 얼마나 중요한가, 블랙박스를 감수할 수 있는가 계산 제약은 어디까지인가, 지연 시간과 비용의 한계는 무엇인가

이 네 가지에 대한 답이 모델의 형태, 파이프라인, 운영 방식까지 거의 결정한다. 예컨대 실시간 정보 제공이 목적이라면 200밀리초 안에 업데이트 가능한 체인이 필요하고, 시즌 단위 리스크 관리는 밤새 돌리는 묵직한 에이전트 기반도 허용된다.

실무에서 바로 쓸 수 있는 작은 팁 다섯

    경기 단위가 아니라 세그먼트 단위로 로그를 보정하라. 하프타임과 교체 타이밍에서 오차가 몰린다. 세트피스는 별도 모듈로 빼고, 팀별 프로파일을 6주 간격으로 업데이트하라. 민감도 분석을 자동화해, 파라미터가 10% 변할 때 출력 지표가 얼마나 움직이는지 주기적으로 레포트하라. 동일 매치업을 3개의 다른 시드 묶음으로 나눠 돌려 분산을 추정하라. 표준오차를 수치로 갖고 있어야 설득이 된다. 품질지표를 셋만 고르고 고수하라. 칼리브레이션, 로그손실, 구조적 패턴 검사. 많아지면 흐려진다.

끝에 남는 것

가상축구는 단지 경기를 흉내 내지 않는다. 불확실성을 언어로 바꾸고, 전략을 실험으로 만든다. 정확한 수치와 말끔한 그림이 전부는 아니다. 현장의 제약, 데이터의 구멍, 팬의 기대가 함께 들어와야 비로소 살아있는 엔진이 된다. 뚜렷한 규칙 몇 개와 잘 다듬은 확률, 그리고 오류를 숨기지 않는 로그, 이 정도면 충분하다. 남은 일은 반복과 대화다. 모델은 사람을 돕는 도구, 가상축구는 그 도구가 살아 움직이는 무대다. 경기의 매력을 해치지 않으면서 이해를 더하는 일, 그게 시뮬레이션 알고리즘이 품어야 할 균형이다.