Анализ эффективности в спорте на примере Криштиано Роналду

Анализ выступлений спортсменов – это всегда интересно, а Криштиану Роналду – один из самых известных футболистов в мире. И я подумал, а почему бы не проанализировать его игры за последние годы, используя всю мощь Python?

Как собирались данные?

Данные о выступлениях были выгружены с сайтов со спортивной статистикой. Прежде всего, скажу, что я немного расширил понятие «последние годы». Когда я начал собирать данные, то увидел, что Криштиану, которому на момент исследования было 37 лет, сейчас играет не так часто, и анализировать такую статистику не очень интересно. Поэтому я решил проанализировать последние 12 лет карьеры этого игрока, начиная с 2010 года.

За 12 лет Роналду успел поиграть за множество клубов: Реал Мадрид, Ювентус, Манчестер Юнайтед. Он сыграл в 3 национальных чемпионатах и много выступал за сборную своей страны. За двенадцать лет этот великий футболист провел 730 матчей. И этих данных более чем достаточно, чтобы проанализировать его лучшие и худшие периоды.

Анализ игр Криштиано Роналду с помощью Python

Код, который представлен ниже написан на языке программирования Python. Плюс я также буду использовать его библиотеки для анализа данных и построения визуализаций: pandas, numpy, plotly.

Давайте начнем наш анализ игр Роналдо с загрузки необходимых библиотек

import pandas as pd
import numpy as np
import plotly.express as px
import plotly.graph_objects as go
#Загрузим БД с официальной спортивной статистикой
data = pd.read_csv('https://drive.google.com/file/d/1XfJfWy-cZdRZzaGLbtIkASCOsmc9ULHl/view?usp=drive_link', sep=';')

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

print(data.isnull().sum())

Количество NaN и пропущенных значений в датафрейме

Рис. 1: Количество NaN и пропущенных значений в датафрейме

Ну что-ж отлично. Тогда поехали! Давайте посмотрим сколько Роналдо забил за это время голов.

data['goals'].sum()

662

Читайте также:  Графический анализ владения автомобилями в регионах России

662 гола в 729 матчах. Феноменально! А сколько же он сделал голевых пасов?

data['passes'].sum()

163

Неплохо, но очевидно что Роналдо больше любит тащить мяч сам, чем раздавать пасы.

Давайте теперь посмотрим насколько грубо играет Криштиано.

data['yelcards'].sum()

96

Многовато желтых карточек. А сколько же в среднем за игру?

data['yelcards'].mean()

0.13168724279835392

То есть он получает желтую в каждой 9 игре. В принципе терпимо. А что с красными карточками?

data['redcards'].sum()

6

Отличный результат! Давайте посмотрим сколько в среднем минут он остается в игре?

data['min_total'].mean()

85.59807956104252

Почти все время 90 мин за 730 игр! Потрясающе! Сколько же выносливости у этого футболиста!

Ну хорошо, давайте теперь посмотрим на перфоманс характеристики и построим несколько графиков.

matches = data.index
figure = px.line(data, x='games', y='goals',
                 title='Голы забитые Роналдо с 2010 по 2022 годы')
figure.show()

Голы, забитые Роналдо с 2010 по 2022 гг

Рис. 2: Голы, забитые Роналдо с 2010 по 2022 гг

Знаю, этот график немного шумноват. Но вы только посмотрите сколько пиков! Роналдо забивает по 2-3 мяча в большинстве игр! Это очень круто!

median_column = data['goals']
type(median_column)
median_column.plot(kind='hist', title='Частота дублей, хет-триков у Роналдо')

Частота забитых мячей по матчам (1 гол, дубли, хет-трики итд) у Роналдо

Рис. 3: Частота забитых мячей по матчам (1 гол, дубли, хет-трики итд) у Роналдо

И все же построив немного другой график мы видим, что более 300 матчей Роналдо не забивал.

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

pens = px.bar(data, x="penalties", y="goals", color="penalties", title='Соотношение голов с игры и с пенальти')
pens.show()

Соотношение голов с игры и с пенальти

Рис. 4: Соотношение голов с игры и с пенальти

На графике выше мы наглядно видим что 450 голов или 2/3 от общего числа были забиты не с пенальти. Тем не менее 1/3 – это весьма внушительная сумма. Очевидно что Рональдо был штатным пенальтистом в своих клубах, либо часто получал право бить с 11-метровой отметки.

Читайте также:  Профессиональный анализ данных бизнеса с помощью Python и Pandas

Давайте теперь посмотрим на прогресс этого игрока как нападающего во времени.

fig = px.scatter(data, x="date", y="goals", color="goals", title='Количество забитых голов за игру')
fig.show()

Криштиано Роналду. Количество забитых голов за игру

Рис. 5: Криштиано Роналду. Количество забитых голов за игру

На графике выше мы видим, что Роналдо больше всего забивал в периоды 2010-2011, 2014-2019 годы. Причем самый лучший период у него был в 2015 году. Это был пик его карьеры.

Давайте теперь посмотрим за какую команду Роналдо чаще всего забивал.

fig = px.scatter(data, x="team", y="goals", color="goals", title='Максимальное кол-во голов за матч за команды')
fig.show()

Максимальное кол-во голов за матч за команды

Рис. 6: Максимальное кол-во голов за матч за команды

Судя по графику выше, однозначный лидер – Реал Мадрид. Это была его лучшая команда. Давайте перепроверим эту информацию столбчатой диаграммой.

clubs = px.bar(data, x="team", y="goals", color="goals", title='За какие команды Роналдо чаще всего забивал')
clubs.show()

За какие команды Роналдо чаще всего забивал

Рис. 7: За какие команды Роналдо чаще всего забивал

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

А вот ниже уже более интересный график. В нем мы можем посмотреть сколько Роналдо сыграл за свои команды без забитых мячей.

fig = px.histogram(data, x="min_total", y="team", color="goals", hover_data=data.columns, title='К. Роналдо: Сыгранное время vs Забитые голы')
fig.show()

График времени на поле и количества забитых голов

Рис. 8: График времени на поле и количества забитых голов

Какие выводы мы можем сделать из графика выше? Ну, очевидно, Роналдо еще рано списывать со счетов!

Синяя полоска означает время на поле без забитых голов. И мы явно видим что в последнем клубе Манчестер Юнайтед она минимальна. Т. е. Криштиану сейчас распоряжается временем более эффективно!

clubs = px.histogram(data, x="games", y="tournament", color="goals", title='В каких чемпионатах Роналдо чаще всего забивал')
clubs.show()

В каких чемпионатах Роналдо чаще всего забивал

Рис. 9: В каких чемпионатах Роналдо чаще всего забивал

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

Читайте также:  Прогнозирование спроса с помощью машинного обучения

В заключение приведем еще один график – время, которое Криштиану проводит на поле.

fig = px.scatter(data, x="date", y="min_total", color="min_total", title='Время на поле')
fig.show()

Количество отыгранных минут на поле по матчам

Рис. 10: Количество отыгранных минут на поле по матчам

Как мы видим этот график достаточно ровный, что означает что несмотря на почтенный с точки зрения спорта возраст со здоровьем и выносливостью у Роналдо пока что все в порядке.