Bóng đá là môn thể thao “không thể đoán trước” kết quả nếu như trận đấu chưa đi đến phút cuối cùng. Điều này có thể đúng ở một phương diện nào đó…

Thế nhưng, Frank Andrade (chuyên gia về Data Science) đã làm cho khẳng định đó khác đi trong phương diện của mình. Bằng một mô hình Python đơn giản, Frank đã thực hiện dự đoán nhà vô địch của các giải đấu bóng đá 2020-2021, như Premier League, La Liga, Serie A và Bundesliga. Điều đáng ngạc nhiên là, tất cả đều đúng!

Và nhà chuyên gia về dữ liệu này đã áp dụng mô hình tương tự với FIFA World Cup 2022  năm nay. Hãy cùng xem cách anh ấy thực hiện ngay dưới đây!

Dựa vào đâu để dự đoán kết quả các trận đấu?

Frank Andrade đã dựa vào Phân phối Poisson để dự đoán. Cụ thể:

Nếu coi bàn thắng là một sự kiện có thể xảy ra trong 90 phút của một trận đấu bóng đá, chúng ta có thể tính xác suất số bàn thắng có thể ghi được trong một trận đấu của Đội A và Đội B. Ngoài ra, còn cần đáp ứng các giả định của phân phối Poisson.

  1. Có thể đếm được số trận (và một trận có thể có 1, 2, 3 bàn thắng trở lên)
  2. Sự xuất hiện của các sự kiện là độc lập (sự xuất hiện của một mục tiêu sẽ không ảnh hưởng đến xác suất của mục tiêu khác)
  3. Tốc độ các sự kiện xảy ra là không đổi (xác suất của một mục tiêu xảy ra trong một khoảng thời gian nhất định phải hoàn toàn giống nhau cho mọi khoảng thời gian khác có cùng độ dài)
  4. Hai sự kiện không thể xảy ra chính xác cùng một lúc (hai mục tiêu không thể xảy ra cùng một lúc)

Trong 4 giả định trên, 1 và 4 luôn được đáp ứng, nhưng 2 và 3 chỉ đúng một phần. Vậy nên, ta hãy giả sử rằng, 2 và 3 luôn đúng.

Biểu đồ số bàn thắng trong 5 năm của 4 giải đấu hàng đầu: La Liga, Premier League, Bundesliga, Serie A

Dự đoán kết quả FIFA World Cup 2022 bằng mô hình Python đơn giản

Nếu bạn nhìn vào đường cong của 1 trong các biểu đồ trên, bạn sẽ thấy nó giống Phân phối Poisson. Vậy nên, chúng ta tương tự cũng có thể khẳng định nó áp dụng được cho giải đấu FIFA World Cup 2022 năm nay.

Đây là công thức của phân phối Poisson:

Dự đoán kết quả FIFA World Cup 2022 bằng mô hình Python đơn giản

Để đưa ra dự đoán, Frank đã đặt:

lambda: Là trung bình số bàn thắng trong 90 phút (Đội A và B)

x: Số bàn thắng trong một trận đấu mà Đội A và B có thể ghi được.

Để tính toán lambda, chúng ta cần số bàn thắng trung bình mà mỗi đội tuyển quốc gia ghi được/thủng lưới. Bây giờ chúng ta sẽ xem xét

Số bàn thắng ghi được/thủng lưới của các đội tuyển

Sau khi thu thập dữ liệu từ tất cả các trận đấu tại World Cup diễn ra từ năm 1930 đến năm 2018 , Frank đã tính toán số bàn thắng trung bình mà mỗi đội tuyển quốc gia ghi được và để thủng lưới.

Dự đoán kết quả FIFA World Cup 2022 bằng mô hình Python đơn giản

Bây giờ, các yếu tố đã được thiết lập hoàn tất, dự đoán các vòng sẽ như sau.

Dự đoán vòng bảng FIFA World Cup 2022.

Đây là đoạn mã Frank đã viết để dự đoán số điểm mỗi đội tuyển dành được ở vòng bảng FIFA World Cup 2022.

def Predict_points ( sân nhà, sân khách ):
nếu đội nhà df_team_ strength.index đội khách df_team_ strength.index:
lamb_home = df_team_ strength.at[home, ‘GoalsScored’ ] * df_team_ strength.at[away, ‘GoalsConceded’ ]
lamb_away = df_team_ strength.at[ sân khách, ‘GoalsScored’ ] * df_team_ strength.at[home, ‘GoalsConceded’ ]
prob_home, prob_away, prob_draw = 0 , 0 , 0
cho x trong phạm vi ( 0 , 11): #số bàn thắng đội nhà
cho y trong phạm vi ( 0 , 11 ): #số bàn thắng đội khách
p = poisson.pmf(x, lamb_home) * poisson.pmf(y, lamb_away)
if x == y:
prob_draw += p
elif x > y:
prob_home += p other :
prob_away
+= p

point_home = 3 * prob_home + prob_draw
point_away = 3 * prob_away + prob_draw
return (
points_home , point_away) other :
return (0 , 0 )

Giải thích: predict_points tính toán số điểm mà đội nhà và đội khách sẽ nhận được. Để làm được vậy, Frank đã tính toán lambda cho mỗi đội bằng công thức average_goals_scored * average_goals_conceded. 

Sau đó, mô phỏng tất cả các tỷ số có thể có của một trận đấu từ 0–0 đến 10–10 (điểm số cuối cùng đó chỉ là giới hạn trong phạm vi ghi bàn). Khi có lambda và x, Frank sử dụng công thức phân phối Poisson để tính toán p. Thêm nữa, prob_home, prob_draw và prob_away tích lũy giá trị của p. Nếu giả sử, trận đấu kết thúc với tỷ số 1–0 (đội nhà thắng), 1–1 (hòa) hoặc 0–1 (đội khách thắng) tương ứng. Cuối cùng, điểm được tính theo công thức dưới đây.

point_home = 3 * prob_home + prob_draw
point_away = 3 * prob_away + prob_draw

Nếu sử dụng predict_points để dự đoán trận Anh vs Mỹ, chúng ta sẽ nhận được điều này.

>>> Predict_points('Anh', 'Hoa Kỳ') 
(2.2356147635326007, 0.5922397535606193)

Điều này có nghĩa là Anh sẽ nhận được 2,23 điểm, trong khi Hoa Kỳ sẽ nhận được 0,59.

Nếu chúng ta áp dụng predict_points cho tất cả các trận đấu ở vòng bảng, chúng ta sẽ có được vị trí thứ nhất và thứ hai của mỗi bảng, do đó các trận đấu tiếp theo sẽ vào loại trực tiếp.

Dự đoán kết quả FIFA World Cup 2022 bằng mô hình Python đơn giản

Dự đoán loại trực tiếp FIFA World Cup 2022.

Đối với loại trực tiếp, Frank không dự đoán số điểm. Thay vào đó, anh dự đoán người chiến thắng trong mỗi bảng đấu. Đây là lý do tại sao Frank tạo một get_winner dựa trên predict_points trước đó. Đây là mã:

def get_winner ( df_fixture_updated ):
đối với chỉ mục, hàng trong df_fixture_updated.iterrows():
home, away = row[ ‘home’ ], row[ ‘away’ ]
point_home, point_away = predict_points(home, away)
if point_home > point_away:
người chiến thắng = sân nhà
khác :
người chiến thắng = sân khách
df_fixture_updated.loc[index, ‘người chiến thắng’ ] = người chiến thắng
trở lại df_fixture_updated

Nói một cách đơn giản, nếu points_home lớn hơn thì points_away đội nhà thắng. Nếu ngược lại, thì đội khách thắng.

Nhờ get_winner, Frank có thể nhận được kết quả của các dấu ngoặc trước đó.

Dự đoán kết quả FIFA World Cup 2022 bằng mô hình Python đơn giản

Dự đoán tứ kết, bán kết và chung kết

Bằng cách sử dụng lại get_winner, Frank đã cho ra kết quả của đội vô địch FIFA World Cup 2022.

Dự đoán kết quả FIFA World Cup 2022 bằng mô hình Python đơn giản

Chính là… Brasil!!!

Xem thêm

Nâng cao kỹ năng học Python với Python Tricks

Làm thế nào để bắt đầu học Python từ nền tảng Excel?

Khóa học: Xử lý và Trực quan hóa dữ liệu với Python