Продвинутая спортивная визуализация с Python, Matplotlib и Seaborn
https://t.me/ai_machinelearning_big_data«Величайшая ценность картины - это когда она заставляет нас заметить то, чего мы никогда не ожидали увидеть».
Вы видели все это в новостях: средства массовой информации в восторге от эпохи появления спортивной аналитики, коммерческие рекламные объявления с изображением инструментов больших данных, таких как карманный калькулятор, умелое использование многомерных камер для сбора информации о каждом поте спортивных игроков *** введите имена героев вашего детства: Л. Месси, Леброн Джеймс, Том Брэди и т. д. *** и увеличьте их производительность в 10 раз.
Хотя очевидно, что мы еще не достигли этого, спортивная аналитика прошла долгий путь, помогая командам в отношении принятия решений, которые традиционно делались из-за «интуитивного» чувства или приверженности прошлым традициям относительно того, какие игроки должны составлять, торговать, развивать, тренировать и какую систему играть.
В этом посте я не буду разрабатывать алгоритм прогнозирования насколько вероятно (маловероятно), что Тоттенхэм попадет в топ-4 премьер-лиги или как создать идеальную команду Jets. Вместо этого я представлю некоторые методы визуализации, которые помогут нам подготовить привлекательные и проницательные графики, которые понравятся вашим любителям спорта.
Заметка:
- Хотя мой пример остается исключительно в футболе и чемпионате мира по футболу, методы применимы к любым видам спорта и турнирам.
- Вы можете найти весь исходный код для этого урока Вот,

1. Получение данных:
Плохие новости: обычно это самая сложная часть
Хотя у вас могут возникнуть проблемы со сбором сводных статистических данных о спортивных событиях (голы в футбольном матче, броски в баскетбольном матче и т. Д.), Как правило, намного сложнее найти подробный набор данных для каждого конкретного футбольного матча. игра или теннисный матч. Отслеживание игроков на поле, особенно в высокоскоростных, интенсивных видах спорта, таких как футбол или баскетбол, является сложной задачей, хотя и очень прибыльной. Такие компании, как SportVu или Opta Sports, монетизируют, продавая эту востребованную информацию командам, спортивным консультантам или исследовательским центрам.
«Для каждого матча у нас есть три парня, использующих […] видео в прямом эфире на графике основного тона: один парень смотрит домашнюю команду, другой выполняет выездную команду, а третий - по сути, проверяет данные»
- Саймон Бануб, директор по маркетингу Opta
Вот идет наш невоспетый герой
Недавно Statsbomb объявила о публичном выпуске наборов данных с точностью до каждой игры для каждой отдельной игры в трех последних футбольных лигах: Национальной женской футбольной лиге (США), Женской суперлиге Англии (Англия) и Чемпионат мира по футболу . Вы можете получить доступ к их наборам данных бесплатно Вот,
Все наборы данных представлены в формате json, поэтому вам нужно будет проанализировать необработанный набор данных в реляционном формате, который можно легко найти и манипулировать.
json_normalize ()это очень удобный инструмент, так как он может автоматически «нормализовать» структуру json в плоскую реляционную структуру.
В этом уроке мы сосредоточимся исключительно на Чемпионате мира по футболу. Я рекомендую вам прочитать документацию набора данных, прежде чем углубляться в анализ. В конце концов, понимание ваших данных имеет первостепенное значение.
2. Рисуем футбольное поле:
Во-первых, давайте использовать Matplotlib, чтобы нарисовать простое футбольное поле.
Это кажется много, но давайте распаковатьdraw_pitch ()функция построчно. Функция принимает аргумент ax, который является выходомadd_subplot ()функция в Matplotlib. Затем он добавляет несколько объектов с заранее заданным размером, чтобы воссоздать изображение футбольного поля, включая центральный круг, штрафные площадки, 6-ярдовые боксы и дуги на поле. Как только мы определили эту функцию, мы вызываем ее вместе со стандартной функцией Matplotlib figure следующим образом:

3. Выровняйте визуализацию с помощью Pass Pass и Heat Map:

Есть много претендентов, но немногие победили бы тот момент, когда тогдашний действующий чемпион Германии выбился из чемпионата мира после поражения от Южной Кореи. Были боли, были слезы и, конечно, была критика. Последствия отрезвляющего поражения ознаменовались уходом 10-го немца Месута Озила, который почти всю вину нес за команду, как за свои выступления, так и за встречу с президентом Турции Эрдоганом прямо перед чемпионатом мира. Просто послушайте, что президент Баварии Мюнхен Ули Хенесс сказал об Озиле:
«Он играл в s *** годами […], а теперь он и его выступление s *** скрываются за пределами этой картины. »
Но был ли он так плох?
Давайте посмотрим на его выступление во время широко критикуемого матча против Южной Кореи. Я хочу построить тепловую карту и карту пропусков, чтобы запечатлеть его выступления в течение 90 минут и оценить влияние (положительное или отрицательное), которое он оказал на наступательную сторону немца.
Давайте начнем с карты пропусков
Мы загружаем файл json и делаем некоторую базовую очистку данных в Panda, чтобы получить набор данных, который содержит только Passing Events от Mesut Özil.

Этот набор данных чрезвычайно важен, т. Е. Можно узнать, что Озил в матче совершил 95 пасов с 7 резкими ударами, что было довольно впечатляюще для атакующего полузащитника, или он больше всего передал мяч Тони Кроосу ( 19 раз) и Марко Реус (18 раз) во время игры. Для целей карты пропусков мы заботимся только о начальной и конечной локациях пропуска
Код ниже позволяет нам накладывать проходы в виде стрелок на поле.

Отслеживание активной зоны с тепловой картой
Футбольные тепловые карты используются аналитиками в клубах и СМИ для иллюстрации области, в которой находился игрок. Они фактически представляют собой сглаженный точечный график расположения игроков и могут быть хорошим индикатором эффективности игрока в разных частях поля. Хотя могут быть некоторые споры о том, насколько они полезны (они не говорят вам, являются ли действия / движения хорошей или плохой вещью!), Они часто могут быть очень эстетически привлекательными и привлекательными, отсюда и их популярность.
Теперь, если мы вернемся к Месуту Озилу, одна из главных его критических замечаний - это низкий уровень охвата поля, поскольку мы редко видим, как он запускает снасти или борется за обладание, таким образом, как говорится, «низкий уровень производительности».
Но так ли это на самом деле?
Давайте построим тепловую карту с использованием Seaborn на вершине Matplotlib, чтобы визуализировать участие Месута Озила в течение 90-минутного матча Германия-Корея. Синтаксис кода невероятно прост. Мы используем kdeplot, который нарисует плотность ядра в точках рассеяния местоположений Озила.

Вау!!! Это выглядит очень ... анти-климатическим. В конце концов, что график пытается вам сказать? Я вижу некоторые координаты, и ясно, что эти контурные графики действительно показывают, что Озил более активен в области с более темным цветом.
Можем ли мы сделать лучше, чем это?
Да, ответ заключается в том, что мы можем объединить (1) высоту тона, (2) карту проходов и (3) тепловую карту, чтобы получить более полное представление о производительности Озила во время игры.

Теперь мы можем увидеть более полную картину производительности Mesut Özil во время игры. Пара наблюдений сразу
- Он охватил почти исключительно половину противника, поэтому критика его отсутствия оборонительного мышления не является полностью необоснованной. Но вопрос в том, должен ли он выиграть 1–1 и вернуть мяч как САМ?
- Он сделал намного больше прямых и прямых передач во второй половине, противопоставляя большее количество более консервативных, обращенных назад проходов, сделанных в первой половине. Причин может быть две: (1) общее чувство срочности в команде Германии во второй половине (2) введение Марио Гомеса в качестве центрального форварда действительно создало выход для ключевых передач Озила, как мы видим в целом из 6 проходит прямо в штрафную, в три раза больше, чем он сделал в первом тайме.
Что мне показалось интересным, так это карта теплового пасса Тимо Вернера, который начинал как одинокий нападающий сборной Германии, а затем в паре с Марио Гомесом большую часть второй половины.

Он неожиданно провел много времени на двух сторонах, в то время как вы ожидаете, что Центральный Форвард займет место в 18-ярдовом боксе намного больше. Это отчасти объясняет неэффективность немецкой линии наступления во время игры, так как их передовые линии (Вернер, Реус, Горецка, а затем Мюллер, Гомес) собираются на флангах, но не занимают места в штрафной, тем самым обеспечивая очень маленький выход. для плеймейкеров, таких как Özil и Kroos, чтобы направить мяч в 18-ярдовую коробку.
4. Проверка ваших навыков: пример французских дальних усилий
Мой друг был очень убежден, что ключом к успешному чемпионату мира по футболу во Франции были их неустанные попытки сломить оборонительные рубежи с помощью дальних усилий. Подумайте об этом потрясающем голе, который Бенджамин Павард забил против Аргентины в четвертьфинале

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

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

Теперь это выглядит намного лучше. Мы сразу видим, что Франция пыталась сделать столько же выстрелов в штрафные, сколько и за пределами штрафной. Хотя в определенной степени это подтверждает аргумент о том, что Франция предприняла гораздо больше усилий на дальних дистанциях, чем обычно, поскольку мы ожидаем гораздо меньшую плотность выстрелов за пределами поля. В любом случае, это выглядит интересно, как они кажутся одинаково клиническими с короткими и дальними усилиями.
Вмой блокнот JupyterВы также можете найти другие методы, такие как наложение графика плотности и включение изображения в визуализацию. С помощью еще пары строк кода вы можете легко создать такую визуализацию:

Вы можете найти весь исходный код для этого урока Вот
Данные, использованные для этого проекта, были опубликованы Statsbomb и доступны для общественности