Анализ выступлений спортсменов – это всегда интересно, а Криштиану Роналду – один из самых известных футболистов в мире. И я подумал, а почему бы не проанализировать его игры за последние годы, используя всю мощь 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())
Рис. 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()
Рис. 2: Голы, забитые Роналдо с 2010 по 2022 гг
Знаю, этот график немного шумноват. Но вы только посмотрите сколько пиков! Роналдо забивает по 2-3 мяча в большинстве игр! Это очень круто!
median_column = data['goals']
type(median_column)
median_column.plot(kind='hist', title='Частота дублей, хет-триков у Роналдо')
Рис. 3: Частота забитых мячей по матчам (1 гол, дубли, хет-трики итд) у Роналдо
И все же построив немного другой график мы видим, что более 300 матчей Роналдо не забивал.
Да, кстати, не забываем о том, что Криштиану часто дают бить пенальти. И это одна из причин почему у него такая красивая статистика по голам. Давайте посмотрим сколько голов было забито именно с пенальти, а не с игры.
pens = px.bar(data, x="penalties", y="goals", color="penalties", title='Соотношение голов с игры и с пенальти')
pens.show()
Рис. 4: Соотношение голов с игры и с пенальти
На графике выше мы наглядно видим что 450 голов или 2/3 от общего числа были забиты не с пенальти. Тем не менее 1/3 – это весьма внушительная сумма. Очевидно что Рональдо был штатным пенальтистом в своих клубах, либо часто получал право бить с 11-метровой отметки.
Давайте теперь посмотрим на прогресс этого игрока как нападающего во времени.
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: Количество отыгранных минут на поле по матчам
Как мы видим этот график достаточно ровный, что означает что несмотря на почтенный с точки зрения спорта возраст со здоровьем и выносливостью у Роналдо пока что все в порядке.