9 мин.

Начинаем работу с трекинговыми данными

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

Здесь напишу о том, как эти данные начать обрабатывать и выводить графически.

Немного о целях этого блога. Буду описывать, фиксировать свое обучение работе с футбольными данными. Как нетружно предположить, мне интересна футбольная аналитика. Но только та ее часть, которая касается аналитики данных. Просмотры матчей километрами - это не про меня, нет на это времени. А вот покопаться в циферках, построить какие-то модельки - это самое то. Цель - уметь быстро и легко строить всякие графики-визуализации, использовать 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 и получим необходимое. И мяч тоже здесь.

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