پیشبینی جامجهانی فوتبال 2022 با استفاده از پایتون
بسیاری از مردم فوتبال را «بازی غیرقابل پیشبینی» مینامند، زیرا معتقدند یک مسابقه فوتبال به عوامل مختلفی برای تغییر دادن امتیاز نهایی بستگی دارد!
اگرچه پیشبینی امتیاز نهایی سخت است، اما در مورد پیشبینی برنده یک مسابقه اینطور نیست. در طول 5 سال گذشته، بایرن مونیخ تمام بوندسلیگاها را برده است، در حالی که منچسترسیتی 4 لیگ برتر را برده است! در واقع، در اواسط فصل 20-21، مدلی برای پیشبینی برنده لیگ برتر، لالیگا، سری آ و بوندسلیگا ایجاد شد و پیشبینی برنده همه آنها با موفقیت بود. البته این پیشبینی چندان هم سخت نبود، زیرا در آن مقطع 19 مسابقه برگزار شده بود. اکنون قرار است همین مدل برای پیشبینی جامجهانی 2022 اجرا شود که نحوه پیشبینی جامجهانی با استفاده از پایتون است.
چگونه مسابقات را پیشبینی کنیم؟
روشهای مختلفی برای پیشبینی مسابقه وجود دارد که در اینجا با توزیع پواسون شروع میکنیم. توزیع پواسون یک توزیع احتمال گسسته است که تعداد رویدادهای رخداده در یک بازه زمانی ثابت یا منطقه فرصت را توصیف میکند. اگر گل را به عنوان رویدادی در نظر بگیریم که ممکن است در 90 دقیقه یک مسابقه فوتبال اتفاق بیفتد، میتوانیم احتمال تعداد گلهایی را که در یک مسابقه توسط تیم A و B به ثمر میرسد، محاسبه نماییم. برای این کار باید مفروضات توزیع پواسون را برآورد کنیم:
۱- تعداد رویدادها (گلها) را میتوان شمارش کرد.
۲- وقوع رویدادها (گلها) مستقل است.
۳- سرعت رخ دادن رویدادها (گلها) ثابت است.
۴- دو رویداد (گل) نمیتوانند دقیقاً در یک لحظه در زمان رخ دهند.
بدون شک فرضیات 1 و 4 برآورده میشوند، اما 2 و 3 تا حدی درست هستند. با این حال، اجازه دهید فرض کنیم که مفروضات 2 و 3 همیشه درست هستند. اکنون میتوان گفت که میتوان از توزیع پواسون برای محاسبه احتمال تعداد گلهایی که در یک مسابقه به ثمر میرسد، استفاده کرد. در اینجا فرمول توزیع پواسون آمده است.
برای انجام پیشبینیها:
لامبدا: میانگین گل در 90 دقیقه (تیم A و تیم B)
x: تعداد گلهایی که در یک مسابقه میتواند توسط تیم A و تیم B به ثمر برسد.
حال برای محاسبه لامبدا به میانگین گلهای زده/خورده هر تیم ملی نیاز داریم. این ما را به نقطه بعدی هدایت میکند.
گلهای زده/خورده توسط هر تیم ملی
پس از جمعآوری اطلاعات از تمام بازیهای جامجهانی از سال 1930 تا 2018، میانگین گلهای زده و خورده هر تیم ملی محاسبه شد. با گلهای زده/خورده هر تیم ملی، تابعی ایجاد شد که تعداد امتیازهای هر تیم در مرحله گروهی را پیشبینی میکرد.
پیشبینی مرحله گروهی
در زیر کدی که برای پیشبینی تعداد امتیازات هر تیم ملی در مرحله گروهی استفاده شده، آمده است. ترسناک به نظر میرسد، اما بسیاری از موارد در نظر گرفته شده، تا این مرحله به کد تبدیل شده است.
def predict_points(home, away): if home in df_team_strength.index and away in df_team_strength.index: lamb_home = df_team_strength.at[home,'GoalsScored'] * df_team_strength.at[away,'GoalsConceded'] lamb_away = df_team_strength.at[away,'GoalsScored'] * df_team_strength.at[home,'GoalsConceded'] prob_home, prob_away, prob_draw = 0, 0, 0 for x in range(0,11): #number of goals home team for y in range(0, 11): #number of goals away team p = poisson.pmf(x, lamb_home) * poisson.pmf(y, lamb_away) if x == y: prob_draw += p elif x > y: prob_home += p else: prob_away += p points_home = 3 * prob_home + prob_draw points_away = 3 * prob_away + prob_draw return (points_home, points_away) else: return (0, 0)
به زبان انگلیسی ساده، predict_points محاسبه میکند که تیمهای میزبان و میهمان چند امتیاز کسب خواهند کرد. برای انجام این کار، لامبدا برای هر تیم با استفاده از فرمول average_goals_scored * average_goals_conceded محاسبه شد.
سپس تمام امتیازهای ممکن یک مسابقه از 0–0 تا 10–10 شبیهسازی شد. هنگامی که لامبدا و x وجود داشته باشد، از فرمول توزیع پواسون برای محاسبه p استفاده میشود.
prob_home ، prob_draw و prob_away مقدار p را جمع میکنند. اگر مثلاً مسابقه به ترتیب با 1–0 (برندههای خانگی)، 1–1 (تساوی) یا 0–1 (بردهای خارج از خانه) به پایان برسد، در نهایت، امتیازها با فرمول زیر محاسبه میشوند:
points_home = 3 * prob_home + prob_draw
points_away = 3 * prob_away + prob_draw
اگر از predict_points برای پیشبینی بازی انگلستان و ایالات متحده استفاده کنیم، این را دریافت خواهیم کرد:
>>> predict_points('England', 'United States') (2.2356147635326007, 0.5922397535606193)
این به این معنی است که انگلیس 2.23 امتیاز و ایالات متحده 0.59 امتیاز میگیرند.
اگر این تابع predict_points را برای همه مسابقات مرحله گروهی اعمال کنیم، جایگاه اول و دوم هر گروه را به دست میآوریم، بنابراین مسابقات بعدی در ناکاوت میشوند.
پیشبینی ناکاوتها
برای ناکاوتها، نیازی به پیشبینی امتیاز نیست، بلکه برنده هر براکت است. به همین دلیل است که یک تابع get_winner جدید بر اساس تابع predict_points قبلی ایجاد شد.
def get_winner(df_fixture_updated): for index, row in df_fixture_updated.iterrows(): home, away = row['home'], row['away'] points_home, points_away = predict_points(home, away) if points_home > points_away: winner = home else: winner = away df_fixture_updated.loc[index, 'winner'] = winner return df_fixture_updated
به بیان ساده، اگر امتیاز points_homeخارج باشد، برنده، تیم میزبان است، در غیر این صورت، برنده، تیم میهمان است. در واقع، به لطف تابع get_winner میشود نتایج براکتهای قبلی را دریافت کرد.
پیشبینی مرحله یکچهارم نهایی، نیمهنهایی و فینال
اگر دوباره از get_winner استفاده کنیم، میتوانیم برنده جامجهانی را پیشبینی کنیم. با اجرای یک بار دیگر تابع، متوجه میشویم که برنده برزیل است!
بدین ترتیب، ما جامجهانی 2022 را با استفاده از پایتون و توزیع پواسون پیشبینی کردیم.
جدیدترین اخبار هوش مصنوعی ایران و جهان را با هوشیو دنبال کنید