Добро пожаловать во вторую часть этой серии из четырех частей, в которой я пытаюсь проанализировать крайне разочаровывающую кампанию Кубка мира T20 в Индии. В предыдущей статье (которую вы можете прочитать здесь) я рассказал о своих мотивах завершения этого проекта. Вкратце, я хочу исследовать, как команда, которая так долго доминировала на двусторонних T20, каким-то образом ухитрилась нащупать сумку, когда это действительно имело значение.

Чтобы завершить свой анализ, я использую метод кластеризации, чтобы понять типы матчей T20, которые проводятся, а затем я буду использовать эти кластеры, чтобы понять тактику Индии до и во время чемпионата мира.

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

Источник данных

Я получил данные о матче по мячу для матчей T20 из этого банка данных по крикету. Ниже приведено изображение этих данных. Столбец match_id однозначно идентифицирует каждый матч по крикету. Остальные столбцы содержат метаданные о матче (сезон, стартовые данные и место проведения, команды) и данные о каждом мяче.

Подготовка данных

Блокнот для этого раздела можно найти здесь.

Диапазон дат

Первым шагом было выбрать диапазон дат, который я хотел использовать. Я решил включить только матчи, которые произошли после окончания чемпионата мира T20 2016 года, вплоть до финала чемпионата мира T20 2022 года включительно.

Завершенные матчи

Затем я выбрал матчи, которые были завершены и которые не были заброшены (например, дождем).

Команды

Я хотел сосредоточиться на 12 лучших командах согласно последнему рейтингу ICC. Следующие команды соответствуют этим критериям на момент написания:

За указанный период времени эти 12 команд сыграли 555 матчей.

Создание данных уровня соответствия

Создание соответствующих функций

Необходимо разработать две функции: общее количество пробегов и калитки. Общее количество прогонов указывает количество прогонов, засчитанных за доставку, а калитки указывает, является ли доставка калиткой. Общее количество запусков — это сумма runs_off_bat и дополнительных расходов. Функция калитка получается следующим образом:

# Create wicket column indicating if a wicket occured on that delivery
# Where wicket_type is null, set wicket column to 0
df.loc[df['wicket_type'].isnull(),'wicket'] = 0
# Imputate remaining fields with 1 to indicate that a wicket did occur
df['wicket'].fillna(1,inplace=True)

Агрегация

Затем я агрегирую match_id, batting_team, чтобы получить следующие функции для всех иннингов:

  1. Количество мячей в иннингах
  2. Количество пробежек в иннингах
  3. Количество калиток в иннингах
  4. Дата начала

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

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

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

На рисунке выше показана итоговая таблица, которая будет использоваться для моделирования. Это содержит:

  1. match_id: уникальный ключ соответствия
  2. batting_team: команда, которая бьет первой
  3. мяч: количество подач в первом иннинге
  4. total_runs: общее количество пробежек в первом иннинге
  5. калитка: общее количество калиток в первом иннинге
  6. start_date: дата матча
  7. total_runs_powerplay: количество ранов в первой игре в большинстве иннингов
  8. wickets_powerplay: количество калиток в первой игре в большинстве иннингов
  9. Особенности 2–8 повторяются для второй возможности.

Теперь, когда данные агрегированы до уровня совпадения, я могу продолжить их подготовку, сосредоточив внимание на том, чтобы данные подходили для обучения модели кластеризации.

Предварительная обработка данных для кластеризации

Блокнот для этого раздела можно найти здесь.

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

  1. Данные симметричны относительно среднего (нормально распределены)
  2. Дисперсия и среднее значение всех признаков одинаковы.

Из следующих рисунков ясно видно, что некоторые функции имеют несимметричное распределение.

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

  1. Преобразование журнала
  2. Преобразование Бокс-Кокса
  3. Кубическое преобразование

Я преобразовываю объекты с помощью описанных выше преобразований, и по результатам визуального анализа установлено, что Преобразование Бокса-Кокса дало наилучшие результаты.

Следующим шагом является масштабирование признаков таким образом, чтобы дисперсия и средние значения каждого признака были похожи друг на друга. Для этого я использую пакет StandardScaler.

Окончательная таблица, которая будет использоваться для моделирования, содержит следующие функции, которые были преобразованы и масштабированы:

  1. Калитки (Иннингс 1)
  2. Калитки (Иннингс 2)
  3. Калитки в большинстве (Иннингс 1)
  4. Калитки в большинстве (Иннингс 2)
  5. Всего ранов (иннингов 1)
  6. Всего ранов (иннингов 2)
  7. Всего пробежек в большинстве (иннингс 1)
  8. Всего пробежек в большинстве (иннингс 2)
  9. Победы ватиновой команды

Кластеризация

Чтобы завершить моделирование кластера, мы будем использовать алгоритм кластеризации K-средних. Этот метод эффективен для данных с низкой размерностью и позволяет мне гибко указывать количество кластеров, которые я хотел бы вернуть.

Найдите идеальное количество кластеров

Первый шаг — использовать метод локтя, чтобы найти идеальный диапазон кластеров для использования. Для этого я подгоняю модель k-средних к данным с увеличивающимся числом кластеров, от одного до десяти. Затем я строю график инерции каждой модели k-средних и анализирую график, чтобы найти идеальное количество кластеров. Дополнительную информацию об использовании метода локтя можно найти здесь.

Из приведенного выше графика видно, что идеальное количество кластеров равно четырем.

Затем я обучаю алгоритм K-средних на подготовленном наборе данных, указав, что совпадения должны быть сегментированы на четыре кластера. На этом моделирование завершено, и теперь я буду анализировать кластеры.

Краткое содержание

В этой статье я описал свой процесс получения и подготовки данных, которые я буду использовать для создания моей модели кластеризации. Я фильтрую данные, чтобы сосредоточиться только на матчах, которые происходят после мая 2016 года, и на командах, которые входят в топ-12 рейтинга ICC T20. Затем я манипулирую данными, чтобы получить агрегированные данные уровня матча и агрегированные данные уровня игры в большинстве. Следующим шагом была предварительная обработка данных, чтобы признаки были симметричными с одинаковыми средними значениями и дисперсией. Я использую метод локтя для определения идеального количества кластеров — этот анализ определил, что четыре кластера — это наилучшее количество сегментов.

В следующей статье я проанализирую сегменты, которые возвращает моделирование.