※ 철저하게 이과틱한 글임을 밝힙니다. 자료의 수집, 통계적 분석, 프로그래밍의 삼위일체가 되겠습니다. 결론만 보고 싶으시면 그냥 쭉 스크롤 내리시면 됩니다.
까놓고 이야기하면 사실 별것도 아닙니다. 프로그래밍 시간에 졸지만 않았으면 얼마든지 할 수 있는 일이죠. 아이디어를 내는 게 조금 귀찮아서 그렇지. 내일 이른 시간에 모임이 있기는 합니다만 있다가 크로아티아전 하는 건 꼭 보고 자야 할 것 같아서(...) 할 일도 없겠다 마침 떠오른 의문을 풀고자 고민을 좀 해 봤습니다. 불현듯 좋은 아이디어가 떠올랐죠. 요걸 시뮬레이션을 하면 답이 나오겠군.
프로그래밍을 함에 있어서 기본적으로 필요한 것은 인풋 파일입니다. 아무나 떠먹여주지 않죠. 그리고 결과가 어떤 식으로 나올 것인지를 예측하고 있어야 합니다. 하다못해 최소한 이것이 내가 원하는 결과라고 딱 떠오르는 건 있어야 프로그래밍이 용이하죠. 말하자면 일필휘지와 같은 방식인데, 소스 코드는 좀 많이 더럽더라도(애초에 저는 컴공과 출신도 아닙니다) 버그를 최대한 줄이는 데 이만한 방법이 없더군요. 미리 구상은 다 끝났고, 데이터를 모으는 단계로 들어갔습니다.
근데 어느 데이터를? 당연히 각 팀의 전적이죠. 각 팀이 한 경기당 평균 몇 점을 따냈으며 평균 몇 점을 실점했는지, 상대방이 누구냐에 대한 구분 없이 일단 국대 경기라면 데이터를 모으는 것으로 결정을 했죠. 여기에 UEFA 측의 점수 계산하는 방식을 약간 변형해서 받아들였습니다. 13년도 이전의 자료는 버리고, 14년도 경기의 가중치는 0.5, 15년도 경기의 가중치는 0.75, 올해 경기의 가중치는 1로 하여 어느 정도의 득/실이 예상되는지를 우선 뽑아낸 거죠. 자료는 싸커웨이(
http://us.soccerway.com/teams/)에서 싹 뽑아갈 수 있었습니다. 여기에 14년도에 월드컵이 있었고 거기서 연장전이 벌어진 일이 있었으니까 해당 경기의 가중치는 0.75를 추가로 곱합니다. 90분 뛴 게 아니라 120분을 뛴 것이니까 경기당으로 맞추려면 별 수 있나요. 가중치를 줄이는 수밖에요. 유로를 시뮬레이션하기 위함인 만큼 유로 본선의 데이터는 제외했습니다.
어찌저찌해서 데이터를 싹 모았으니, 중간적으로 그 데이터를 한번 쓱 훑어봤습니다. 의외로 평균 예상 득점 수 1위는 독일도 프랑스도 아닌 크로아티아더군요(2.422골, 2위 폴란드 2.365, 3위 프랑스 2.250, 4위 독일 2.217, 5위 벨기에 2.199). 유로 이전까지 가장 실점이 낮을 것으로 기대된 팀은 의외로 우크라이나(0.613골)였습니다. 뭐, 독일과의 재미졌던 공방전 생각해 보면 아주 틀린 것 같지 않긴 한데 왠지 좀 찜찜-하군요. 뭐 어쩌겠습니까. 데이터가 그렇게 나왔다는데.
굳이 실점률을 계산한 이유는, 득점력만 가지고는 좀더 원하는 결과에 가까울 시뮬레이션 결과를 낼 수 없기 때문입니다. 생각해 보세요. 2014년 브라질 월드컵 당시의 정성룡이 골문을 지키고 있는 것과 마누엘 노이어가 골문을 지키고 있는 것은 벌써부터 무게감이 다르지 않습니까?
그럼 계산된 것을 어떻게 넣느냐... 예컨대 우리가 경기당 평균 2골을 넣고, 상대방이 경기당 평균 1골 정도를 실점한다면, 둘이 붙었을 때 대충 그 결과는 1골과 2골 사이가 되지 막 대여섯 골까지 나오는 일은 (없으리란 법은 없지만) 드물겠죠. 그 점을 노렸습니다. 그래서 구질구질하게 쇼할 거 없이 그냥 깔끔하게 산술평균을 때려버렸죠. (시뮬레이션할 팀의 기대 득점 + 시뮬레이션할 상대팀의 기대 실점) / 2를 해서, 이 값을 λ로 삼아 프와송 분포에 집어넣었습니다. 통계학 하신 분들이라면 대충 아시겠습니다만.
그리고 한 가지 더. 결과가 늘 똑같게 나올 수는 없지 않습니까. 그래서 0~1 사이의 무작위의 수를 난수표에서 뽑고, 그 값이 k골이 터지기까지의 누적 프와송 분포보다 크면 k값을 늘리고, 작으면 스톱하는 식으로 해서 몇 골이 들어갔는가를 시뮬레이션할 수 있었습니다. 이걸로 어느 정도 근거를 가진 무작위의 시뮬레이션을 벌이는 게 가능했죠.
이 과정을 A조에서 F조에 이르는 전 경기에 대해 수행하고, 각 조의 승점을 계산하고 순서대로 버블소팅으로 추린 후(물론 골득실 등도 같이 다 추립니다), 3위가 되는 팀의 승점을 또다시 따로 모아 버블소팅으로 추려서 턱걸이로 본선에 진출하는 승점을 얻어냅니다. 이 전체 과정을 1천 번 반복한 후, 통계를 냄으로써 과연 몇 점 정도면 가능했을지 평균을 내 보는 것이죠.
결과는 이렇습니다.
1천 번의 시뮬레이션 결과
4점의 승점으로 턱걸이한 경우 196회
3점의 승점으로 턱걸이한 경우 743회
2점의 승점으로 턱걸이한 경우 60회
1점의 승점으로 턱걸이한 경우 1회 (불가능은 아닙니다. 1무 2패인 팀이 3위인 경우가 셋 이상 있으면 가능하죠)
평균 승점 3.134점
표준편차 0.491
그러니까 대충 요약하면, 3점의 승점으로는 약간 불안하기는 하지만 80% 이상의 확률로 토너먼트 진출이 가능하다는 겁니다. 그러면 나머지 20%를 막기 위해서는 결과적으로 승점에 이은 골득실에서 손해를 덜 봐야 한다는 이야기가 되는 거죠.
이번 유로에서 (특히 그 B조 5차전에서의 슬로바키아처럼... -_-;) 수비축구가 난무한 속사정은 이런 데 있다고 봐야겠습니다. 같은 승점 3점이라도 1승 2패보다는 3무가 훨씬 더 유리한 게 사실이죠. 평균적으로 한 경기에서 1-0으로 승부가 갈린다 치면 1승 2패면 골득실이 음의 값을 가지고 3무면 무조건 골득실이 0인데요. 무조건 3무를 따는 게 1승 2패보다 유리하다는 다소 황당한 결론이 나오는 거죠. 그리고 이번 유로에서 실제로 1승 2패를 기록한 터키와 알바니아는 3무를 기록한 포르투갈에 밀려서 짐을 싸야 했지 않습니까. 실제와 비슷한 결과가 나왔다고 자부합니다.
다음 유로도 24강인 걸로 아는데, UEFA 측에서 1승 2패가 3무보다 우선한다는 룰이라도 박아놓지 않는 한 수비축구가 이번 유로에서처럼, 아니 어쩌면 그보다 더 심하게 난무할 것 같다는 걱정이 벌써부터 생기기 시작하는군요. 3위 순위 결정이 승점 > 골득실 > 다득점 순인 것으로 아는데, 골득실 앞에 다승이라도 하나 박아놓아야 수면제 경기가 좀 덜할 것 같다는 생각이 듭니다. 어차피 2승이면 다섯 조 이상에서 2승 1패가 세 팀이 나오지 않는 한, 다시 말해서 거의 무조건 16강 진출이니까 다승을 골득실 앞에 박아넣으면 간단하게 3무 16강 진출을 저격할 수 있습니다. 과연 앞으로 바뀌는 게 있을지, 아니면 4년 후에도 꼼짝없이 수면고문을 당해야 하는 건지(...)는 시간이 답을 해 주겠죠.
마지막으로 그 1점으로 16강 간(...) 시뮬레이션 결과입니다. 977번째 데이터더군요. 재미로 보는 거니까 그러려니 하고 봐 주셨으면 합니다. 쌔빠지게 한 천만 번쯤 돌리다 보면 지금 유로 상황과 딱 맞는 게 하나쯤은 나오겠지만 시간은 한정되어 있어서...
FRA 2 - 0 ROM
ALB 0 - 1 SUI
FRA 2 - 0 ALB
ROM 0 - 2 SUI
SUI 3 - 4 FRA
ROM 0 - 0 ALB
W D L P G L
FRA 3 0 0 9 8 3
SUI 2 0 1 6 6 4
ALB 0 1 2 1 0 3
ROM 0 1 2 1 0 4
ENG 5 - 0 RUS
WAL 1 - 1 SVK
ENG 3 - 0 WAL
RUS 3 - 0 SVK
SVK 1 - 3 ENG
RUS 2 - 0 WAL
W D L P G L
ENG 3 0 0 9 11 1
RUS 2 0 1 6 5 5
SVK 0 1 2 1 2 7
WAL 0 1 2 1 1 6
GER 2 - 2 UKR
POL 5 - 2 NIR
GER 2 - 4 POL
UKR 2 - 2 NIR
NIR 2 - 2 GER
UKR 3 - 1 POL
W D L P G L
POL 2 0 1 6 10 7
UKR 1 2 0 5 7 5
GER 0 2 1 2 6 8
NIR 0 2 1 2 6 9
ESP 0 - 4 CZE
TUR 0 - 3 CRO
ESP 1 - 1 TUR
CZE 3 - 2 CRO
CRO 4 - 1 ESP
CZE 2 - 4 TUR
W D L P G L
CRO 2 0 1 6 9 4
CZE 2 0 1 6 9 6
TUR 1 1 1 4 5 6
ESP 0 1 2 1 2 9
BEL 2 - 1 ITA
IRL 1 - 1 SWE
BEL 2 - 1 IRL
ITA 1 - 0 SWE
SWE 0 - 3 BEL
ITA 2 - 0 IRL
W D L P G L
BEL 3 0 0 9 7 2
ITA 2 0 1 6 4 2
IRL 0 1 2 1 2 5
SWE 0 1 2 1 1 5
POR 2 - 1 ICL
AUT 3 - 2 HUN
POR 0 - 3 AUT
ICL 0 - 2 HUN
HUN 0 - 1 POR
ICL 2 - 0 AUT
W D L P G L
AUT 2 0 1 6 6 4
POR 2 0 1 6 3 4
HUN 1 0 2 3 4 4
ICL 1 0 2 3 3 4
3위팀 알바니아(1), 슬로바키아(1), 독일(2), 터키(4), 아일랜드(1), 헝가리(3)
알바니아, 아일랜드 -3, 슬로바키아 -5
아일랜드 2득 5실, 알바니아 0득 3실
아일랜드 진출 (알바니아는 여기서도...)
...이거 보니까 토너먼트 결과도 프로그래밍으로 예측해볼 걸 그랬네요. 16강 끝나고 한 번 돌려봐야 하나...