Плюс обработка данных и некоторые визуализации данных.

Недавно я попробовал свои силы в другом проекте спортивной аналитики; вместо того, чтобы использовать бесплатные данные об уровне спортивных событий, я наткнулся на некоторые поддельные данные футбольной лиги (Суперлига Великобритании). Он содержал различную информацию: результаты матчей за весь сезон, будущие матчи, шансы на матч и многое другое. Моя цель состояла в том, чтобы изучить все данные, чтобы ответить на некоторые вопросы о предыдущем сезоне и сделать прогнозы на предстоящий сезон.

Контекст

Только что завершился первый сезон Суперлиги Великобритании, приближается второй сезон. Наша цель — проанализировать результаты первого сезона, а затем сделать прогноз на второй сезон.

Каждая команда сохраняет один и тот же состав на второй сезон. Это также лига в американском стиле для простоты, без понижения или повышения из более низкого дивизиона.

Наши цели:

  1. Узнайте, какая команда выиграет лигу в сезоне 1
  2. Найдите, когда в сезоне эта команда завоевала чемпионский титул
  3. Найдите самое большое расстройство в сезоне 1
  4. Прогнозировать исходы матчей 2 сезона и по очереди лиги
  5. Создайте визуализацию, показывающую вероятность финишной позиции каждой команды во втором сезоне.

Объяснительный анализ данных (EDA)

Как и при любом хорошем анализе данных, важно понимать данные, которые у нас есть, по их форме, формату, содержанию, основным статистическим свойствам и т. д.

Для этого я буду использовать некоторые стандартные функции Pandas EDA для наиболее важного набора данных, называемого «результаты», например:

Функция .describe() показывает, что в сезоне 1 было сыграно 1512 матчей, команда хозяев/гостей забивала в среднем 1,7/1,3 гола за игру соответственно и совершала в среднем 14,97/11,75 бросков за игру соответственно. Мы ожидаем, что команда хозяев будет иметь преимущество и в целом будет лучше, чем команда гостей, поэтому данные подтверждают, что это хороший знак.

Функция .info показывает нам столбцы наших данных, тип данных каждого столбца и количество ненулевых значений в каждом. Каждый столбец имеет 1512 ненулевых значений, поэтому мы знаем, что наши данные чисты.

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1512 entries, 0 to 1511
Data columns (total 9 columns):
 #   Column      Non-Null Count  Dtype
---  ------      --------------  -----
 0   SeasonID    1512 non-null   int64
 1   Gameweek    1512 non-null   int64
 2   MatchID     1512 non-null   int64
 3   HomeTeamID  1512 non-null   int64
 4   HomeScore   1512 non-null   int64
 5   HomeShots   1512 non-null   int64
 6   AwayTeamID  1512 non-null   int64
 7   AwayScore   1512 non-null   int64
 8   AwayShots   1512 non-null   int64
dtypes: int64(9)
memory usage: 106.4 KB

Функция .corr(), вызываемая для указанных столбцов, показывает нам, есть ли между ними корреляция. Здесь мы выбрали единственные столбцы, в которых мы могли бы найти какие-либо интересные сведения, основанные на корреляции (например, MatchID и Gameweek не сказали бы нам многого и добавили бы шум в нашу матрицу корреляции).

Здесь нет ничего такого, чего бы мы не ожидали, броски относительно положительно коррелируют с соответствующим счетом дома и на выезде.

Далее давайте быстро взглянем на первые несколько строк наших данных, так что мы знакомы с форматом:

Наконец, давайте проверим команды, с которыми мы имеем дело в этой лиге:

results.head()

Кто выиграл лигу в первом сезоне?

Есть несколько способов сделать это, но я решил создать таблицу, которая будет понятна всем любителям футбола. турнирная таблица. Все наши команды будут перечислены в порядке, основанном на количестве очков, которые они набрали в конце сезона.

Чтобы сделать это, я должен использовать данные результатов сезона 1 (содержащие все голы, забитые домашней и гостевой командой в каждом матче) и данные идентификатора команды (чтобы выяснить, какая команда играла в каждом матче). я мог бы работать только с идентификаторами команд, однако это менее интуитивно понятно и им легче манипулировать, чем случайными идентификаторами.

Процесс, которому я следовал, заключался в объединении названий команд с данными результатов с использованием идентификаторов команд, а затем в распределении очков каждой команде в каждом матче на основе условия того, кто забил больше всего голов (или если было забито одинаковое количество голов).

Чтобы получить общее количество очков для каждой команды, я сгруппировал и суммировал приведенный выше фрейм данных по HomeTeamName и AwayTeamName и переименовал столбцы для фреймов данных дома и на выезде.

Объединение этих двух фреймов данных на Team дает нам общую информацию для каждой команды за сезон. Все, что нам нужно сделать, это суммировать Home_Points и Away_Points и добавить столбцы для сыгранных матчей, голов за и против и разницы мячей. Сортировка фрейма данных по Points дает нам нашу рейтинговую таблицу:

Вывод: кто выиграл лигу в первом сезоне?

Мы видим, что «Манчестер» выиграл лигу с преимуществом в 13 очков по итогам сезона из 54 матчей (эти игроки должны быть в отличной форме!), и только 25 очков отделяют первую четверку.

Я разделю эту статью на последующие части, так как она будет долго читаться целиком. Эта часть в основном заключалась в том, чтобы проникнуть внутрь данных и установить контекст для остальной части анализа. Надеюсь, вам понравилась первая часть, скоро выйдет вторая часть!