Data dan Prediksi Piala Dunia Qatar 2022
Beberapa waktu silam, saya sempat menuliskan artikel terkait data dan fakta pada Piala Dunia. Sekarang saatnya membahas data dan prediksi piala dunia Qatar 2022.
Saat di Bali kemarin, (hampir) semua orang yang bertemu dengan saya selalu menanyakan tentang prediksi di piala dunia ini. Secara konsisten saya selalu bilang bahwa:
Data penyisihan atau kualifikasi antar konfederasi kemarin tidak bisa dijadikan dasar prediksi. Kenapa? Karena fase penyisihan dengan fase beneran piala dunia berbeda.
Atmosfir pertandingan dan tim yang berlaga pun berbeda. Sudah beberapa kali kita dikejutkan dengan hasil pertandingan yang diraih oleh timnas-timnas seperti Saudi, Korea, Iran, Maroko, dan Tunisia. Dari beberapa pertandingan yang saya tonton juga ternyata ball possesion gak menentukan siapa pemenang pertandingan yah.
Ketika saya melihat situs resmi FIFA dan mencari underlying data pada situsnya, saya temukan bahwa tidak semua data pertandingan dipublikasikan di sana. Dari proses penelitian lebih lanjut, situs FIFA menggunakan sistem API based utk menyimpan datanya. Setelah saya coba scrape datanya, saya temukan 110 variabel statistika per pertandingan. Berikut adalah list-nya:
[1] "distance_high_speed_running"
[2] "distance_high_speed_sprinting"
[3] "total_distance"
[4] "distance_walking"
[5] "distance_jogging"
[6] "distance_low_speed_sprinting"
[7] "receptions_between_midfield_and_defensive_line"
[8] "take_ons_completed"
[9] "phase_aggregate_recovery"
[10] "offers_to_receive_total"
[11] "offers_to_receive_in_front"
[12] "distributions_under_pressure"
[13] "linebreaks_completed_under_pressure"
[14] "offers_to_receive_outside"
[15] "offers_to_receive_inside"
[16] "phase_aggregate_set_pieces"
[17] "phase_aggregate_high_press"
[18] "phase_aggregate_high_block"
[19] "phase_aggregate_mid_press"
[20] "phase_aggregate_mid_block"
[21] "phase_aggregate_long_ball"
[22] "linebreaks_completed_midfield_and_defensive_line"
[23] "linebreaks_attempted_midfield_and_defensive_line"
[24] "linebreaks_attempted_attacking_and_midfield_line"
[25] "final_third_entries_reception_right_channel"
[26] "final_third_entries_reception_central_channel"
[27] "linebreaks_attempted_under_pressure"
[28] "phase_aggregate_progression"
[29] "phase_aggregate_final_third"
[30] "final_third_entries_reception_inside_left_channel"
[31] "final_third_entries_reception_left_channel"
[32] "linebreaks_attempted_defensive_line_completed"
[33] "linebreaks_attempted_attacking_line_completed"
[34] "linebreaks_attempted_completed"
[35] "linebreaks_attempted_defensive_line"
[36] "linebreaks_attempted_midfield_line"
[37] "linebreaks_attempted_attacking_line"
[38] "linebreaks_attempted"
[39] "direct_defensive_pressures_applied"
[40] "defensive_pressures_applied"
[41] "phase_aggregate_build_up_opposed"
[42] "final_third_entries_reception_inside_right_channel"
[43] "linebreaks_attempted_midfield_line_completed"
[44] "forced_turnovers"
[45] "possession"
[46] "received_offers_to_receive"
[47] "receptions_under_direct_pressure"
[48] "receptions_under_indirect_pressure"
[49] "receptions_under_no_pressure"
[50] "phase_aggregate_defensive_transition"
[51] "phase_aggregate_attacking_transition"
[52] "phase_aggregate_counterattack"
[53] "phase_aggregate_counter_press"
[54] "completed_switches_of_play"
[55] "attempted_switches_of_play"
[56] "goalkeeper_defensive_actions_outside_penalty_area"
[57] "offers_to_receive_in_behind"
[58] "phase_aggregate_low_press"
[59] "linebreaks_completed_all_lines"
[60] "linebreaks_completed_attacking_and_midfield_line"
[61] "linebreaks_attempted_all_lines"
[62] "receptions_in_behind"
[63] "receptions_under_pressure"
[64] "distributions_completed_under_pressure"
[65] "offers_to_receive_in_between"
[66] "phase_aggregate_low_block"
[67] "attempted_ball_progressions"
[68] "completed_ball_progressions"
[69] "goalkeeper_goal_preventions"
[70] "goalkeeper_defensive_actions_inside_penalty_area"
[71] "phase_aggregate_build_up_unopposed"
[72] "crosses"
[73] "crosses_completed"
[74] "assists"
[75] "attempt_at_goal"
[76] "attempt_at_goal_on_target"
[77] "attempt_at_goal_blocked"
[78] "offsides"
[79] "passes"
[80] "fouls_for"
[81] "attempt_at_goal_off_target"
[82] "attempt_at_goal_outside_the_penalty_area_on_target"
[83] "attempt_at_goal_from_free_kicks"
[84] "goals_outside_the_penalty_area"
[85] "headed_attempt_at_goal"
[86] "fouls_against"
[87] "red_cards"
[88] "goals_conceded_from_attempt_at_goal_against"
[89] "yellow_cards"
[90] "own_goals"
[91] "time_played"
[92] "substitutions_in"
[93] "goals_from_direct_free_kicks"
[94] "attempt_at_goal_inside_the_penalty_area"
[95] "attempt_at_goal_inside_the_penalty_area_on_target"
[96] "goals_inside_the_penalty_area"
[97] "attempt_at_goal_outside_the_penalty_area"
[98] "goal_kicks"
[99] "corners"
[100] "free_kicks"
[101] "indirect_free_kicks"
[102] "direct_free_kicks"
[103] "throw_ins"
[104] "penalties"
[105] "penalties_scored"
[106] "attempt_at_goal_against"
[107] "substitutions_out"
[108] "goals_conceded"
[109] "passes_completed"
[110] "goals"
Sekarang dari semua data pertandingan yang sudah saya ambil sejak pertandingan pertama hingga pertandingan semalam, saya akan coba membuat model prediksi yang sederhana aja. Menggunakan semua variabel di atas utk menentukan berapa persen kemungkinan suatu timnas menang dalam pertandingan.
Berhubung ini cuma iseng, saya hanya akan gunakan model machine learning yang runtimenya tercepat. Saya gak akan gunakan deep learning dulu yah, nanti nunggu lowong ngrjainnya. Berikut adalah hasil akurasi dari beberapa model tersebut:
model akurasi_model
1 GLMNet 91.30
2 Random forest 82.60
3 GBM 78.26
4 Parallel Random Forest 78.26
5 Multivariate Adaptive Regression Spline 69.56
6 Naive Bayes 47.82
7 SVM Radial 34.78
Lalu gimana prediksi pemenang piala dunianya? Eits, jangan terburu-buru. Lebih baik kita coba prediksi pertandingan nanti malam dulu. Cara saya memprediksi adalah dengan menggunakan rata-rata statistik 2 pertandingan terakhir dari grup yang akan berlaga nanti malam dan memasukkannya ke dalam model yang punya akurasi terbaik. Berikut adalah hasilnya:
negara win_prob lose_prob
1 belgia 1.1 98.9
2 canada 0.0 100.0
3 kroasia 87.8 12.2
4 maroko 60.7 39.3
Nanti semua hasil pertandingan terbaru setiap harinya kita gunakan kembali untuk update model ML yang saya buat di atas dan saya update kembali di postingan ini.
Utk analisa pertandingan dan analisa modelnya saya bahas terpisah nanti di blog ini yah. Jadi kalau ada yang bertanya:
Apa yang membuat suatu tim menang?
Nanti dulu yah jawabnya…. Hehe
Update 3 Desember 2022
Berikut adalah update modelnya dengan data terbaru:
model akurasi_test
1 GLMNet 100.00000
2 GBM 78.57143
3 Multivariate Adaptive Regression Spline 78.57143
4 Parallel Random Forest 71.42857
5 Random forest 67.85714
6 Naive Bayes 64.28571
7 SVM Radial 60.71429
Berdasarkan kejutan-kejutan yang terjadi selama fase grup kemarin, saya coba ubah the way we predicting the match dengan cara menggunakan data 2 pertandingan terbaik untuk masing-masing tim yang akan berlaga.
negara win_prob not_win_prob
1 argentina 78.4 21.6
2 australia 14.4 85.6
3 netherland 81.4 18.6
4 usa 39.4 60.6
Update 4 Desember 2022
Prediksi nanti malam:
negara win_prob not_win_prob
1 england 99.9 0.1
2 france 98.0 2.0
3 poland 62.7 37.3
4 senegal 92.7 7.3
Update 5 Desember 2022
Update akurasi model dari data baru:
model akurasi_test akurasi_train
1 GLMNet 100.00000 98.64865
2 Random forest 90.00000 100.00000
3 Multivariate Adaptive Regression Spline 86.66667 100.00000
4 Parallel Random Forest 86.66667 100.00000
5 GBM 83.33333 98.64865
6 Naive Bayes 76.66667 78.37838
7 SVM Radial 60.00000 59.45946
Prediksi nanti malam:
negara win_prob not_win_prob
1 brazil 81.4 18.6
2 japan 84.5 15.5
3 korea 55.8 44.2
4 kroasia 76.5 23.5
Update 6 Desember 2022
Prediksi nanti malam:
negara win_prob not_win_prob
1 maroko 78.2 21.8
2 portugal 61.4 38.6
3 spain 88.5 11.5
4 swiss 43.9 56.1
Update 13 Desember 2022
Berhubung kemarin saya agak sibuk dengan urusan ujian perkuliahan, saya baru sempat meng-_update_ data pertandingan dan model. Berdasarkan model update GLM Net
dengan akurasi sebesar $88 \%$, saya dapatkan:
negara win_prob not_win_prob
1 france 88.7 11.3
2 maroko 68.4 31.6
3 argentina 55.0 45.0
4 kroasia 27.7 72.3
Catatan: prediksi di atas berdasarkan top 5 pertandingan terbaik dari masing-masing tim.
Update 14 Desember 2022
Berikut adalah video cara saya mengambil data statistik pertandingan dari situs resmi FIFA: