Начинаем работу с трекинговыми данными
Данные обо всем, что происходит на поле (перемещения игроков, мяча и разнообразные действия - удары, передачи, фолы и прочее) логируется и собирается. И все это можно потом разобрать, проанализировать. Потом построить модели, сделать выводу, рекомендации и т.д. и т.п.
Здесь напишу о том, как эти данные начать обрабатывать и выводить графически.
Немного о целях этого блога. Буду описывать, фиксировать свое обучение работе с футбольными данными. Как нетружно предположить, мне интересна футбольная аналитика. Но только та ее часть, которая касается аналитики данных. Просмотры матчей километрами - это не про меня, нет на это времени. А вот покопаться в циферках, построить какие-то модельки - это самое то. Цель - уметь быстро и легко строить всякие графики-визуализации, использовать ML и вот это вот все. А там посмотрим.
Сейчас только начал этим заниматься. Весь этот путь опишу здесь. Может, потом еще где-нибудь.
Кто я такой. Меня зовут Александр. Работаю аналитиком продукта в крупном интернет-магазине. В работе использую Python, SQL и прочие штуки, немного знаю и умею ML. Теперь решил попробовать все это в футбольной аналитике. Потому что интересно.
Начинаю работать с трекинговыми данными и событиями футбольного матча. В целом, все то же, что и ранее, только применение другое.
Надеюсь, не очень мучительно все это будет читать. Критика, в том числе касательно оптимальности решений, приветствуется.
Немного о том, что будет ниже
Что такое трекинговые данные. Это координаты положений каждого игрока матча а также мяча каждые 0.04 сек, т.е. 25 кадров в сек. Формат данных может быть разным, например, здесь после очистки выглядят так: столбцы тайм, номер строки, время матча, и по каждому игроку два столбца x, y. Здесь 0 в левом нижнем углу и диапазон значений координат [0, 1]. Подробно про трекинговые данные можно почитать в отличном блоге: https://bit.ly/3meXwyz.
Также есть таблица с событиями. Здесь данные о ключевых событиях матча: передачи, удары, отборы, и многие другие. Можно одновременно и с теми, и с другими данными, получая и положение игроков и их действия.
Сами данные взяты отсюда: https://bit.ly/3e764n2. С документацией можно ознакомиться там же. Полный ноутбук можно найти по ссылке: https://bit.ly/3yIvIIf. Для того, чтобы открыть, понадобится установить Google Colaboratory, ну или скачать и открыть у себя.
Чтобы все это получилось, нужны совсем небольшие познания в python
Туториал по работе с ними есть здесь:
часть 1 - https://bit.ly/3Eg0WY1
часть 2 - https://bit.ly/3e9vOz8
часть 3 - https://bit.ly/33IUah7
часть 4 - https://bit.ly/3yPgoJS
Посмотрел первую часть, использовал функции из него, немного модифицировал их. И выполнил домашнее задание после первого урока. Данные, с которыми я работаю, могут отличаться от тех, которые можно скачать сейчас. Но, логика работы не будет отличаться.
Все будет происходить в Jupiter Notebook. Можно использовать любой другой интерпретатор Python: PyCharm, Google Colab и многое другое. Работаем с библиотеками pandas, numpy для обработки данных, matplotlib для визуализации результатов.
Матч, данные которого мы анализируем, неизвестен. И команды просто хозяева и гости.
Итак, что нужно сделать перед тем, как анализировать данные.
Сначала импортируем данные, и смотрим, что у нас есть. У нас для гостей и хозяев отдельные таблицы. Данные лежат в формате csv. Импортируем их с помощью функции read_csv из pandas и смотрим первые несколько строк. Видим, что в первых строках странные значения, а также некорректные названия столбцов. Их нужно обработать и привести в нормальное состояние.

Используем простые функции python, и получаем вот такой результат:

Идем дальше. В этих таблицах, как я писал выше, данные в координатах [0, 1] с нулем в левом нижнем углу поля. Удобнее работать, если они будут в метрах, и 0 будет располагаться в центре поля.

Будем использовать размеры поля 105*68, такой же размер использует StatsBomb. Для преобразования используем простую функцию to_metric_coordinates.

В работе будут использоваться еще несколько функций, их целиком приводить не стану - в них много строк:
для отрисовки поля - plot_pitch, получается прямо как настоящее.
для отрисовки событий - plot_events, с его помощью можно показывать на поле отметки нужных событий и их последовательность.
для отображения отображения расположения игроков в любой момент времени - plot_frame, на поле точками двух цветов показываем игроков.



Теперь к собственно заданиям
1 задание. Показать все передачи и удар, которые привели ко второму и третьему голу
Сначала преобразуем координаты в метры и в датафрейме выбираем строки с голами. Второй и третий голы - строки 823 и 1118.

Теперь нужно выбрать строки с передачами перед голом. Взял строк с запасом, чтобы увидеть, когда были передачи. Это можно сделать иначе - более автоматизированно. Но сейчас это ни к чему. Видим, что нам нужны строки 818-823.

И с помощью функции plot_events выводим необходимые данные. Аналогично нужно сделать с третьим голом.

2 задание. Показать все удары 9 номера хозяев. Разделить символы для успешных ударов и неуспешных
Из таблицы с событиями events выбираем строки с ударами 9 номера хозяев. Всего их 4 - 2 мимо, 2 в створ, и из них 1 год. Все удары были во втором тайме.

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

3 задание. Позиции всех игроков, когда номер 9 забил гол
В таблице events выбираем строку с голом. В чем есть нюанс - данные о расположении игроков находятся в таблице с трекинговыми данными. Для того, чтобы связать эти наши две таблиы, у нас есть поле End Frame. Если использовать вольную интерпретацию, то это номер кадра. У нас ведь 25 кадров в секунду. И поля Start Frame, End Frame - кадры начала и окончания действия. Здесь голевой удар, поэтому нужно именно поле End Frame. В таблице трекинговых данных есть поле Frame. И по ним как раз мы сможем соотнести все позиции игроков в нужный момент времени.
И вот берем необходимое число и используем его в параметре функции и plot_frame.


Еще раз повторю, что процесс можно автоматизировать, но пока нет причины городить дополнительные функции, так как пока это разовые задачи. Если все это придется делать часто, тогда совсем другое дело.
4 задание. Посчитать пробег всех игроков матча
Так как у нас есть координаты положения каждого игрока в каждую 1/25 секунды, можно посчитать, на какое расстояние еремещался игрок за это время. Самое простое - использовать теорему Пифагора - ведь у нас перемещения происходят по катетам и нужно расчитать гипотенузу этого треугольника. Не буду приводить формулу - все же, наверное, ходили в школу.
Что нужно сдалать для этого. Добавить два столбца и в них записать значения координат из следующей строки. После этого посчитаем расстояние по x и y между текущей точкой и следующей. Эти расстояния и будут катетами. И расстояние, которое проешл игрок высчитаем по знакомой формуле. Получилась вот такая функция:

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

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