Многие называют футбол «непредсказуемой игрой». Почему? Так как существует множество факторов, которые могут повлиять на счет.
Это так… Но только в некоторой степени. Так считает разработчик и дата-сайентист Фрэнк Эндрейд. Он предлагает просчитать, кто все же победит на Чемпионате мира по футболу 2022 года. Передаем ему слово.
Трудно предсказать окончательный счет или победителя матча, но можно узнать, кто победит в соревновании. Последние пять лет Bayern Munich выигрывал все Бундеслиги, а Manchester City выиграл четыре Премьер-лиги. Не думаю, что это случайность.
В середине сезона 20-21 я создал модель для предсказания победителя Премьер-лиги, Ла Лиги, Серии А и Бундеслиги. С ее помощью я верно назвал всех победителей.
Этот прогноз было не так уж трудно сделать, поскольку на тот момент уже состоялось 19 матчей. Сейчас я запускаю ту же модель, чтобы предсказать Чемпионат мира по футболу 2022 года.
Вот результат моего предсказания, выполненный с помощью Python. Чтобы узнать больше о коде, просмотрите этот часовой видеоурок:
Есть разные способы делать прогнозы. Я мог бы работать с машинным обучением и различными переменными, но несколько прочитанных статей убедили меня попробовать распределение Пуассона.
Сейчас объясню почему. Давайте начнем с определения распределения Пуассона.
Распределение Пуассона — это дискретное распределение вероятностей, описывающее количество событий, происходящих в течение фиксированного интервала времени или области возможностей.
Если мы рассматриваем гол как событие, которое может произойти в течение 90 минут футбольного матча, мы можем вычислить, сколько голов предположительно забьет команда А и Б.
Нам нужно, чтобы выполнялись следующие условия:
Без сомнения, предположения 1 и 4 выполняются, но 2 и 3 частично верны. Однако предположим, что предположения 2 и 3 всегда верны.
Когда я прогнозировал победителей высших европейских лиг, я построил гистограмму количества голов в каждом матче за последние пять лет для четырех лучших лиг:
Если вы посмотрите на соответствующую кривую любой лиги, она выглядит как распределение Пуассона.
Теперь можно сказать, что можно использовать распределение Пуассона для расчета вероятности количества голов, которые могут быть забиты в матче.
Вот формула распределения Пуассона.
Чтобы сделать предсказание, я рассмотрел:
lambda: медиана голов за 90 минут (Команда A и B)
x: количество голов в матче, которые могут забить команды A и B
Чтобы вычислить lambda, нам нужны средние результаты, забитые/пропущенные каждой командой. Потому переходим к следующему пункту.
Собрав данные со всех матчей чемпионата мира с 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
вычисляет, сколько очков получат местные и команды-гости. Для этого я вычислил lambda для каждой команды по формуле средние_забитые_голы * средние_пропущенные_голы
.
Затем я смоделировал все возможные счета матча от 0-0 до 10-10. У меня есть lambda и 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)
Если мы применим эту функцию predict_points
ко всем матчам на групповом этапе, мы получим первую и вторую позицию каждой группы, следовательно, следующие матчи в нокаутах.
Для нокаутов мне нужно предсказывать не очки, а победителя каждого bracket
. Вот почему я создал новую функцию 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
больше, чем points_away
, победитель — команда хозяев, если нет — победитель команда гостей.
Благодаря функции get_winner
я могу получить результаты предыдущих brackets
:
Если я снова использую get_winner
, я смогу предсказать победителя чемпионата мира. Я запускаю функцию еще раз и узнаю, что победителем будет… Бразилия!
Вот как я предсказал результаты Чемпионата мира по футболу 2022 с помощью Python и распределения Пуассона. Чтобы увидеть полный код, посмотрите мой GitHub, а все статьи об этом проекте можно найти в моем блоге на Medium.
Автор: Фрэнк Эндрейд
Примечание редакции: в пятницу, 9 декабря, в матче ¼ финала сошлись сборные Хорватии и Бразилии. В основное время и экстратаймах соперники не определили сильнейшего (1:1), все решилось в серии пенальти, неожиданно завершившейся в пользу хорватов — 4:2.
Текст адаптировала Евгения Козловская
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…