Розробка AI-системи для спортивної індустрії
Спорт — один із перших секторів, які прийняли аналітику даних на найвищому рівні. Moneyball 2003 змінив бейсбол. Сьогодні AI-системи стандартні в НХЛ, NBA, АПЛ та застосовуються від прогнозу травм до тактичної аналітики.
Тактична аналітика матчів
Tracking Data Analysis:
Системи позиціонування відстежують кожного гравця та м'яч 25–50 разів на секунду (Hawk-Eye, Second Spectrum, StatsBomb):
import numpy as np
import pandas as pd
from scipy.spatial import Voronoi
class FootballTacticsAnalyzer:
"""Тактическая аналитика футбольных матчей по tracking data"""
def calculate_pressure_map(self, frame_data, possessing_team):
"""
Карта прессинга: где испытывает давление владеющая команда.
frame_data: позиции всех игроков в один момент времени
"""
attacking = frame_data[frame_data['team'] == possessing_team][['x', 'y']].values
defending = frame_data[frame_data['team'] != possessing_team][['x', 'y']].values
pressure = np.zeros_like(attacking[:, 0])
for i, att_pos in enumerate(attacking):
distances = np.linalg.norm(defending - att_pos, axis=1)
# Давление по Fernandez & Born (2020)
pressure[i] = sum(np.exp(-((d - 3.0) / 4.0)**2) for d in distances if d < 10)
return pressure
def detect_pressing_trigger(self, sequence, min_ppda=8):
"""
PPDA (Passes Allowed Per Defensive Action) — метрика прессинга.
Низкий PPDA = агрессивный прессинг.
"""
defensive_actions = len(sequence[sequence['event_type'].isin(['tackle', 'interception'])])
allowed_passes = len(sequence[sequence['event_type'] == 'pass'])
ppda = allowed_passes / max(defensive_actions, 1)
return {
'ppda': ppda,
'is_high_press': ppda < min_ppda,
'def_actions': defensive_actions,
'allowed_passes': allowed_passes
}
def xG_model(self, shot_data):
"""Expected Goals: вероятность гола из данной позиции"""
# Признаки: расстояние, угол, часть тела, ситуация, предшествующий пас
features = {
'distance': shot_data['distance_to_goal'],
'angle': shot_data['shot_angle_deg'],
'is_header': int(shot_data['body_part'] == 'head'),
'is_penalty': int(shot_data['situation'] == 'penalty'),
'preceded_by_cross': int(shot_data.get('preceding_pass_type') == 'cross'),
'speed': shot_data.get('player_speed', 0),
'defenders_in_cone': shot_data.get('defenders_blocking', 0)
}
return self.xg_model.predict_proba([list(features.values())])[0][1]
Expected Threat (xT):
Цінність кожної позиції на полі з м'ячем - ймовірність гола в наступних N ходах. Побудова Markov Chain матриць переходу із tracking data → карта загрози поля.
Фізіологія та запобігання травмам
Injury Prediction:
Моніторинг фізичного навантаження спортсменів: - GPS-вставки у форму: відстань, швидкість, прискорення, HRV - Acute:Chronic Workload Ratio (ACWR): при ACWR >1.5 ризик травм зростає на 50% - ML-модель (LightGBM): ознаки навантаження останніх 28 днів → P(
Біомеханічний аналіз:
- Маркерна система (Vicon) → 3D-кінематика рухів - Asymmetry detection: різниця між правою та лівою ногою при приземленні → ризик розриву хрестоподібної зв'язки - ML-класифікатор техніки виконання: правильна vs. ризикована
Скаутинг та трансферна аналітика
Player Similarity Search:
"Знайти гравця, схожого на Модріча, вартістю до €20M":
from sklearn.preprocessing import StandardScaler
from sklearn.metrics.pairwise import cosine_similarity
import pandas as pd
class PlayerScoutingSystem:
def __init__(self, player_stats_df):
self.stats = player_stats_df
self.scaler = StandardScaler()
feature_cols = ['pass_completion', 'progressive_passes', 'xA',
'pressures_success_rate', 'ball_recoveries', 'dribbles']
X = self.stats[feature_cols].fillna(0)
self.X_scaled = self.scaler.fit_transform(X)
def find_similar_players(self, target_player, top_k=10, max_value_eur=20e6):
"""Поиск похожих игроков с ценовым ограничением"""
target_idx = self.stats[self.stats['name'] == target_player].index[0]
target_vec = self.X_scaled[target_idx].reshape(1, -1)
similarities = cosine_similarity(target_vec, self.X_scaled)[0]
self.stats['similarity'] = similarities
candidates = (self.stats[
(self.stats['name'] != target_player) &
(self.stats['market_value_eur'] <= max_value_eur)
].sort_values('similarity', ascending=False).head(top_k))
return candidates[['name', 'club', 'age', 'market_value_eur', 'similarity']]
Fan Engagement
Персоналізація контенту:
Recommendation system для медіа-платформ клубів: - Матчі, highlights, behind-the-scenes - рекомендації на основі переглядової історії - Push-сповіщення: персональний момент з матчу (гол улюбленого гравця)
Динамічне ціноутворення квитків:
Аналогічно авіаквиткам: ціна залежить від попиту часу, що залишився, матчу: - Очікувана відвідуваність по ML-прогнозу - Surge pricing при високому попиті, знижки при низькому
Термін розробки: 5-8 місяців для спортивної AI-платформи з тактичною аналітикою, injury prediction та скаутинговою системою.







