Машинное обучение (ML) стало жизненно важным в современном футболе. Методы машинного обучения могут дать ценную информацию о производительности команды, индивидуальных стилях игры и системах управления. Кластеризация является одним из таких методов. Футбольные эксперты часто ранжируют игроков на основе их легендарных позиций. Примером может служить частое сравнение в английских СМИ высокоэффективных молодых полузащитников со Стивеном Джеррардом или Полом Скоулзом. Но можем ли мы определить эти роли, выходящие за рамки простого умозаключения?

Кластеризация использует подход, ориентированный на данные, который может иметь следующие преимущества для команд:

1. Кластеризация может использоваться для группировки игроков, демонстрирующих схожее поведение на поле. Эти данные имеют решающее значение для изучения того, как игрок впишется в определенный стиль игры или систему управления. Группируя игроков по их стилям, тренеры и аналитики могут получить представление о динамике команды, определить сильные и слабые стороны и принять решения на основе данных для повышения производительности.

2. Модели кластеризации могут добавлять количественную основу к отчетам о разведке, позволяя командам принимать более обоснованные решения.

3. Используя наш внутренний Moneyball, кластеризация может быть использована для того, чтобы не обращать внимания на СМИ конкретных игроков и рыночную шумиху, чтобы позволить командам экономить деньги на трансферном рынке. Например, зачем тратить пятьдесят миллионов на нападающего, если у нападающего, который стоит вдвое меньше, такой же стиль игры и производительность?

Как работает кластеризация?

Кластеризация — это неконтролируемый алгоритм машинного обучения. В этой статье основное внимание будет уделено алгоритму «K-средних», который работает путем разбиения набора данных на K кластеров на основе их сходства с точки зрения расстояния до центра тяжести кластера. Он включает в себя итеративное обновление центроидов и переназначение точек данных ближайшему центроиду до тех пор, пока не будет достигнута конвергенция.

Код этого проекта можно найти здесь https://github.com/ryanoc21/Football-clustering.

Данные

Данные были взяты с fbref.com, основного веб-сайта футбольных данных. Метод pandas read_html использовался для очистки данных для каждой команды. Это не самый лучший способ получения данных, но Fbref может быть требователен к слишком большому количеству HTTP-запросов и, как известно, блокирует IP-адреса. Метод панд более надежен. Все данные были записаны в CSV-файлы, поэтому процесс очистки веб-страниц нужно было выполнить только один раз.

Игроки были проанализированы по пяти различным показателям: создание, передача, бросок, защита и «стандарт», который на жаргоне Fbref используется для определения голов и передач, сыгранных минут и т. д.

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

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

Стандартная статистика

Стандартная статистика будет проанализирована на уровне производительности. Каждые 90 минут уровни Expected и Progression могут быть сброшены.

Статистика стрельбы

Данные съемки будут проанализированы на «Стандартном уровне». Поэтому верхнюю колонку «Ожидается» можно не учитывать.

Проходная статистика

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

Создание ворот и бросков

Это будет проанализировано на уровнях SCA (создание броска) и GCA (создание цели). Уровни SCA Type и GCA Type можно не указывать.

Защитная статистика

Этот анализ будет рассматривать только Отборы и Блоки, другие уровни можно опустить.

Вот код для этой фильтрации:

# Pass the required upper columns to an index 
standard_data = standard_data[["Unnamed: 0_level_0","Unnamed: 2_level_0","Unnamed: 3_level_0","Playing Time","Performance"]]
shooting_data = shooting_data[['Unnamed: 0_level_0','Standard']] 
passing_data = passing_data[['Unnamed: 0_level_0','Total']]
creation_data = creation_data[['Unnamed: 0_level_0','SCA','GCA']]
defense_data = defense_data[['Unnamed: 0_level_0','Tackles','Blocks']]

Уровни «Без имени» в приведенном выше коде относятся к статистике, у которой нет верхнего уровня столбца. Обычно это имя игрока, страна, возраст и т. д.

Как только это будет сделано, мы можем отказаться от верхнего уровня и объединить отдельные кадры данных.

from functools import reduce

# Drop the upper-level 
standard_data.columns = standard_data.columns.droplevel()
shooting_data.columns = shooting_data.columns.droplevel()
passing_data.columns = passing_data.columns.droplevel() 
creation_data.columns = creation_data.columns.droplevel()
defense_data.columns = defense_data.columns.droplevel()

from functools import reduce 
all_data = pd.merge(standard_data,shooting_data,on='Player',how='outer')
new_df_list = [passing_data,creation_data,defense_data]
data_merge = reduce(lambda left, right:     # Merge DataFrames in list
                     pd.merge(left , right,
                              on = ["Player"],
                              how = "outer"),
                     new_df_list)

all_data = pd.merge(all_data,data_merge,on="Player",how="outer")

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

# Get all the columns bar the Player, Position and Age columns
X = all_data.iloc[:,3:]

Масштабирование функций

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

from sklearn.preprocessing import StandardScaler 

# Create a ScandardScaler object 
sc = StandardScaler() 

# Get the required columns 
scaler_columns = X.columns[1:] 

# Scale required columns 
X[scaler_columns] = sc.fit_transform(X[scaler_columns])

Применение алгоритма

Установка оптимального значения K

K - количество кластеров, необходимых в алгоритме. Существует множество вариантов расчета значения k. Как правило, лучшим вариантом является использование эмпирического метода, такого как метод силуэта. Однако в этом случае мы можем применить знания предметной области и предположить, что в этих данных существуют три различных кластера.

  • Защитники
  • Полузащитники
  • Злоумышленники

Будет какое-то совпадение. Например, могут быть центральные опорные полузащитники, такие как Джошуа Киммих, чей стиль игры может больше напоминать защитника. Также могут быть центральные атакующие полузащитники или вингеры, такие как Кевин Де Брюйне, чей стиль игры может быть сгруппирован с нападающими.

from sklearn.cluster import KMeans

# Implementing the K Means Clustering Algorithm and specifying the number of clusters needed.
kmeans = KMeans(n_clusters = 3, init = 'k-means++', random_state = 1)
clusters = kmeans.fit_predict(X)

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

all_data['Cluster'] = clusters

И это все. Все, что осталось сделать, это проанализировать возвращенные кластеры.

Информация о кластерах

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

По этим показателям можно выделить три различных кластера.

Кластер 0 — высокоэффективные атакующие игроки

Кластер 1 — игроки со средними/плохими показателями как в защите, так и в атаке.

Кластер 2 — высокоэффективные защитники

Кластер 0

  • Первый кластер состоит из высокоэффективных игроков, ориентированных на атаку. Большинство игроков – нападающие (115). Многие игроки играют как в форварде, так и в полузащите (FW, MF = 70, MF, FW = 59), а остальные являются чистыми полузащитниками (45). В этом кластере всего десять защитников.
  • Кластер 0 имеет самую высокую медиану забитых голов (медиана = 7) и небольшой межквартильный диапазон количества голов (IQR = 5). Это предполагает относительную последовательность в подсчете очков по всему кластеру. Также стоит отметить, что в этот кластер входит максимальное количество голов в выборке (Max = 35).
  • То же самое относится и к передачам: в этот кластер входят игроки с самыми высокими показателями по этому показателю среди трех групп. Опять же, медиана передач относительно низкая (медиана = 4). Однако межквартильный размах также относительно низок (IQR=4), что свидетельствует о согласованности по всей выборке. Опять же, максимальное количество передач в этом кластере является самым высоким из трех (Max=18).
  • Снимки, созданные для этого кластера, очень высоки (медиана = 73,5) с чрезвычайно высоким максимумом (макс. = 188).
  • В обороне этот кластер работает плохо. Среднее количество выигранных отборов относительно низкое по сравнению с кластером, в котором доминирует защита (Med = 14), что позволяет предположить, что сильными сторонами кластера 0 являются забитые голы и создание голов.

Кластер 1

  • Во второй кластер входят средне/плохо работающие игроки как в полузащите, так и в обороне. На сегодняшний день это самый большой кластер с 1922 записями. Опять же, большинство игроков - защитники (605), чистые полузащитники составляют 473 рекорда, а нападающие - 316. Остальные рекорды состоят из комбинаций игроков, например. игроки, которые играют как полузащитники, так и защитники.
  • Медиана забитых голов для этого кластера равна 0. Максимальное количество забитых голов также низкое (Max=8).
  • Среднее количество передач = 0, максимум 6.
  • Низкая креативность этой группы проявляется в низком среднем значении созданных снимков (медиана = 13).
  • В защите эта группа работает хуже, чем чисто атакующие игроки в кластере 0, с медианой 6 выигранных бросков по сравнению с 13 в кластере 0.

Кластер 2

  • Третий кластер состоит в основном из защитников (390) и полузащитников, ориентированных на оборону (239).
  • Средние цели для этой группы малы (медиана = 1). Медиана передач также мала (медиана = 1).
  • Этот кластер обладает приличным уровнем креативности: в среднем 37 бросков. Это ожидаемо, так как большинство защитников и опорных полузащитников в современной игре активно участвуют в построении игры.
  • С точки зрения защиты, этот кластер, безусловно, является самым эффективным, с медианой 24 выигранных отборов и очень высоким максимальным количеством выигранных отборов (макс. = 71).

Преимущества этой модели для команд/аналитиков/скаутов

1. Эта модель основана на пяти самых результативных лигах мирового футбола. На макроуровне это дает хорошее представление о том, как игроки в этих лигах выступают по сравнению с другими. Например, у большинства игроков «Манчестер Сити», самого результативного клуба Англии, есть игроки, ориентированные на атаку (например, Бернарду Силва), в кластере 0, а игроки, ориентированные на защиту (например, Родри), в кластере 2. Таким образом, управленческие команды могут использовать эти модели для оценки того, как игроки выступают по сравнению с другими высокоэффективными игроками на их конкретной позиции. Это можно использовать в сочетании с просмотром игровых и тренировочных материалов, чтобы добавить количественную основу для управленческих решений. Эти решения жизненно важны для всех аспектов игры, например, тактические замены в ответ на пропущенный гол, решение, кем заменить травмированных игроков и т. д.

2. Наряду с командными решениями эту модель можно использовать для принятия обоснованных решений о трансферах. Команды могут сравнить, как цели переноса вписываются в каждый кластер. Вокруг некоторых игроков часто поднимается шумиха в СМИ, что может увеличить их трансферную стоимость. С помощью этой модели менее результативные или более сознательные в финансовом отношении команды могут покупать игроков, которые могут быть дешевле, но при этом могут соответствовать требованиям к производительности самых результативных игроков на их позиции. Это жизненно важно для клубов с меньшим бюджетом.