11 minute read

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:

Alt text