https://plus3s.site - футбольная аналитика, как игра...
Для того, чтобы с помощью цифр получить информацию о происходящих на футбольном поле событиях, предлагаю оценить как влияет тот или иной показатель на результат матча, а потом выяснить по каким из показателей команда недорабатывает и как это исправить.
В виде тепловой карты представлено влияние основных признаков на забитые мячи команды. Забитые мячи олицетворяют результаты любого футбольного коллектива, хотя можно экспериментировать и с другими целевыми переменными. Признаки представлены только основные. Конечно, существуют и другие, и их очень-очень много.
Тепловую карту мы можем составить при помощи питона, код представлен ниже. Для этого нам потребуются данные - датафрейм (df) и понимание того, какую целевую переменную мы будем исследовать (в данном случае - забитые мячи Gls). Как итог - представленная выше тепловая карта или, проще говоря, степень влияния всех основных признаков на целевую переменную.
# библиотеки, которые понадобятся
import pandas as pd
import matplotlib as mpl
from matplotlib import pyplot as plt
import seaborn as sb
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_squared_error
# читаем файл с данными
df = pd.read_csv('*.csv')
# строим из данных тепловую карту
f, ax = plt.subplots(figsize=(18, 18), dpi=200)
plt.figure(figsize=(10, 68))
df.corr()[['Gls']].sort_values(by='Gls', ascending=False)
heatmap = sb.heatmap(df.corr()[['Gls']].sort_values(by='Gls', ascending=False), vmin=-1, vmax=1, annot=True,
cmap='rocket', linecolor='white', linewidths=0.7)
ax.invert_yaxis()
# сохраняем файл в текущей папке
heatmap.figure.savefig('correlation_Gls.png', dpi=200)
Посмотрим описательную статистику. Для этого берем данные за несколько сезонов лиги. То, что представлено ниже, сделано на основе тех признаков, которые кажутся нам, и компьютеру конечно тоже, наиболее важными. В качестве примере - статистика по ударам в створ ворот (SoT).
Команда, для того, чтобы забивать от 1.7 до 2.43 мячей за матч, должна бить в створ ворот соперника в среднем 5.84 раза. А если, например, средний показатель за матч 5.2 удара в створ, но при этом команда забивает 2.0 мяча, то это значит, что по ударам в створ идет недоработка, а хорошего результата по забитым мячам команда добилась благодаря каким-то другим показателям. Следовательно, если подтянуть точность, то результат у команды будет лучше. Уловили смысл?..
Дарю небольшой, но полезный код для получения описательной статистики )
# разбиваем на равные интервалы
df_2['Gls'] = pd.qcut(df_2['Gls'], q=10)
# описательная статистика
df_m = df_2.groupby('Gls')['SoT'].describe()
Теперь добавим еще визуализации и посмотрим что из себя представляют данные, с которыми мы работаем.
Цветные четырехугольники являются диапазоном наибольшего скопления наблюдений. Вертикальная линия в середине каждого наблюдения – наиболее справедливое, медианное значение. Ну и усики, указывающие на встречающиеся отклонения.
output, var2 = 'SoT', 'Gls'
fig, ax = plt.subplots(figsize=(14, 9))
sb.boxplot(x=var2, y=output, data=df_2)
plt.grid(linestyle="--")
ax.set(xlabel='голы (в среднем за матч)', ylabel='SoT')
ax.figure.savefig('SoT.png', dpi=300)
Таким образом, мы провели исследование только по одной целевой переменной – забитым мячам. В качество основного признака рассмотрели удары в створ ворот. Однако, команда может много забивать и быть по забитым мячам лидером, но при этом много пропускать и реально располагаться ближе к середине турнирной таблицы. Необходимо исследовать сразу несколько признаков в совокупности! Тогда у нас будет более четкое представление о том, за счет улучшения каких качеств игры команда может улучшить и свои результаты.
Представим, что аналогичным образом мы провели исследования и по таким показателям, как среднее число пасов, после которых последовали голы (Ast), владение мячом (Poss), удары соперника в створ ворот (SoTA) и сэйвы вратаря нашей команды (Save).
Все показатели в итоге должны иметь среднее за матч значение. Далее берем текущие в сезоне показатели анализируемой команды и сравниваем их со средними по лиге за несколько лет. Такую лепестковую диаграмму несложно построить в экселе.
Соответствие признаков забитым голам можно определить с помощью того же питона и регрессии.
# создаем холст для диаграммы
fig, ax = plt.subplots(figsize=(8, 6), dpi=150)
plt.xlabel(value_1, fontsize=12)
plt.ylabel(value_5, fontsize=12)
ax.set(xlabel='голы (в среднем за матч)', ylabel='SoT')
plt.grid(linestyle="--")
# значения признака
Xg = np.array(df['SoT'])
# значение целевой переменной
yg = np.array(df['Gls'])
X_g = Xg.reshape(-1, 1)
# рисуем точки на холсте
plt.scatter(X_g, yg)
# предсказание для введенного значения (красная точка)
X_Gpred = np.array([4])
# точки по которым чертится черная линия
X_Gpred_2 = np.array([2.5, 2.8, 3.1, 3.5, 3.7, 4.0, 4.2, 4.5, 4.7, 4.9, 5.1, 5.4, 5.6, 5.8, 6.0, 6.2, 6.4, 6.7, 6.9])
# создаем выборку данных для обучения модели
X_train, X_test, y_train, y_test = train_test_split(X_g, yg, test_size=0.5, random_state=1)
pr = LinearRegression()
quadratic = PolynomialFeatures(degree=1)
# обучаем модель
pr.fit(quadratic.fit_transform(X_train), y_train)
# определяем соответствие признака целевой переменной
y_pr = pr.predict(quadratic.fit_transform(X_Gpred.reshape(-1, 1)))
y_pr_2 = pr.predict(quadratic.fit_transform(X_Gpred_2.reshape(-1, 1)))
plt.scatter(X_Gpred, y_pr, c='red')
plt.plot(X_Gpred_2, y_pr_2, c='black')
# сохраняем диаграмму в текущей папке
ax.figure.savefig('figure.png', dpi=150)
# оценка качества модели
print(f"SoT score - {pr.score(quadratic.fit_transform(X_train), y_train)}")
Также представленный код позволяет посмотреть, где находится значение указанного признака (в данном случае - 4 удара в створ ворот SoT) в общем количестве наблюдений.
ИТОГ
Мы рассмотрели очевидные признаки… Да, если команда мало забивает или много пропускает это видно и без дополнительного анализа, но искусство футбольной аналитики состоит также и в том, чтобы подобрать признаки каждой команде индивидуально! В итоге на основе анализа мы получим сведения о том, какие показатели команде необходимо улучшить…
Присоединяйтесь к plus3s.site!
Побед вам и преодоления трудностей! )
Комментарии (12)
Daddy_Cool
26.06.2023 17:57По-моему, из этой описательной статистики получается, что причины достижений и неудач футбольного клуба в том, что команда играет или хорошо или плохо. /irony
В этом проблема описательной статистики. То что выдается за анализ - является просто описанием получившейся картины. И в статье рассказывается не о причинах, а о том как описать числами игру команды помимо результирующего счета (это слишком грубо). Наверняка если футболисты бегают много, бьют часто, бьют точно, мало получают карточек - то такая команда играет хорошо (на уровне своего класса).Plus3s Автор
26.06.2023 17:57Дело в том, что, если команда не супер-гранд, проводящий свой лучший сезон, в котором и улучшать-то ничего не нужно, то она не будет часто и точно бить, много бегать и т.д. одновременно... По каким-то показателям будет проседать. А вот по каким, без статистики точно сказать будет сложно.
Ergistael
26.06.2023 17:57Допустим, команда мало бегает и проигрывает. Тренер увидел статистику и сделал упор на бег ) не в ущерб остальному). Вопрос: это улучшит результативность или испортит статистику так, что этот показатель перестанет коррелировать с результатами?..
Plus3s Автор
26.06.2023 17:57Если команде не хватает физики, но она работает, чтобы ее улучшить, то результат должен быть положительный. Установленная годами многими командами корреляция в данном случае не должна будет никуда деться )
Polaris99
26.06.2023 17:57Даже без разбора самой методологии (хотя тут тоже полно вопросов, потому что по сути происходит попытка предсказать результат на основе предыдущего результата), для футбола все эти технологии абсолютно бессмысленны по большому количеству причин, среди которых сильная зависимость результата команды от состояния игроков (причем тут еще их амплуа нужно разбирать и учитывать по отдельности), наличие кучи внеигровых факторов (плотность графика, заинтересованность в результате в данном конкретном матче, физические кондиции всей команды в данный момент времени, материальные моменты - бонусы, подкуп и т.д.) и сам стохастический характер футбола, когда можно абсолютно доминировать на поле все 90 минут, нанести пару десятков ударов в створ ворот соперника и получить какой-то корявый гол в свои в одиночной контратаке. Такие статистические методики применимы в совсем других видах спорта, где процесс куда более детерминированный и определяется в основном классом собранных в команде игроков - баскетбол, волейбол, бейсбол, например.
Plus3s Автор
26.06.2023 17:57Спасибо за комментарий. Лично я это все хорошо понимаю. Результат, как вы сами и сказали, складывается из множества причин. Посмотреть на некоторые из них данный анализ все же позволяет. А вот предложить что-то еще... Буду рад, если кто-то сможет это сделать )
dyadyaSerezha
Вопрос только один - с помощью этого можно стабильно выигрывать в тотализаторе?)
Plus3s Автор
Ну если разбираться в футболе очень хорошо, то шансы на некоторый успех есть) А так я считаю, что быть в плюсе можно только, если, выиграв, вовремя слезть с тотализатора.
anonymous
НЛО прилетело и опубликовало эту надпись здесь
tommyangelo27
Если вы хорошо разбираетесь в футболе, то на большой дистанции сможете быть в не очень большом проигрыше.
dyadyaSerezha
Я вообще не разбираюсь в футболе, поэтому есть шанс быть в большом выигрыше)