本文目录导读:

分析球员之间的默契程度,不能只看单场比赛的得分或助攻,而需要从传球网络、跑位联动、攻防转换等多个维度进行量化。
下面是一个系统性的Python分析案例框架,从数据准备、特征工程、算法模型到可视化,逐步给出可执行的代码思路。
数据准备
假设我们有一份包含时间戳、球员ID、动作类型(传球、接球、射门、抢断等)和坐标的逐秒事件流数据,数据结构通常如下:
import pandas as pd
# 示例数据结构
data = {
'timestamp': [10.0, 10.5, 11.0, 11.2, 12.0, 12.5],
'player_id': [1, 1, 2, 3, 2, 1], # 1号传球给2号,2号传球给3号...
'action': ['pass', 'receive', 'pass', 'receive', 'shoot', 'run'],
'x': [20.0, 22.0, 25.0, 30.0, 35.0, 40.0],
'y': [10.0, 12.0, 15.0, 18.0, 20.0, 25.0]
}
df = pd.DataFrame(data)
核心分析维度与代码实现
传球网络分析(量化连线的紧密程度)
这是最直接的默契指标,统计每对球员之间的成功传球次数,并构建传球矩阵。
import numpy as np
# 假设df中有'pass'和'receive'成对出现
# 通过时间戳对齐找出传球者和接球者
def build_pass_matrix(df):
passes = df[df['action'] == 'pass']
receives = df[df['action'] == 'receive']
players = sorted(set(df['player_id'].unique()))
matrix = pd.DataFrame(0, index=players, columns=players)
# 简化逻辑:根据时间戳最近匹配
for _, pass_row in passes.iterrows():
# 寻找紧随其后的接球事件
next_receive = receives[receives['timestamp'] > pass_row['timestamp']].iloc[0]
passer = pass_row['player_id']
receiver = next_receive['player_id']
if passer != receiver:
matrix.loc[passer, receiver] += 1
return matrix
pass_matrix = build_pass_matrix(df)
空间联动指数(分析跑位同步性)
默契不仅仅在于传球,更在于无球跑动的契合,利用皮尔逊相关系数分析两名球员移动轨迹的同步性。
from scipy.stats import pearsonr
# 提取两名球员的轨迹
def calculate_movement_sync(player_a, player_b):
# 按时间戳插值对齐轨迹
traces = df[df['player_id'].isin([player_a, player_b])]
pivot = traces.pivot_table(index='timestamp', columns='player_id', values=['x', 'y'], aggfunc='first')
pivot = pivot.fillna(method='ffill')
# 计算X和Y方向的相关性
corr_x, _ = pearsonr(pivot[('x', player_a)], pivot[('x', player_b)])
corr_y, _ = pearsonr(pivot[('y', player_a)], pivot[('y', player_b)])
# 综合得分(取平均值并归一化到0-1)
sync_score = (corr_x + corr_y) / 2
return max(0, sync_score)
特定战术配合(如“二过一”/“挡拆”)
通过模式识别检测连续触球序列(A→B→A),这是极强默契的表现。
def detect_wall_pass(events, players):
"""检测A传给B,B立刻回传A的模式"""
patterns = []
for i in range(len(events) - 2):
e1, e2, e3 = events[i], events[i+1], events[i+2]
if (e1['action'] == 'pass' and e3['action'] == 'pass' and
e1['player_id'] == e3['player_id'] and
e2['player_id'] != e1['player_id']):
# 时间窗口小于阈值(如3秒内)
if e3['timestamp'] - e1['timestamp'] < 3.0:
patterns.append((e1['player_id'], e2['player_id']))
return patterns
# 统计该组合出现的频率
pattern_count = Counter(patterns)
构建综合默契评分模型
将多个维度的数据标准化后加权求和,生成0-100的综合评分。
from sklearn.preprocessing import MinMaxScaler
def comprehensive_sync_score(pass_freq, movement_sync, pattern_freq, weights):
"""
weights: 一个字典,如 {'pass':0.4, 'movement':0.3, 'pattern':0.3}
"""
# 标准化到0-1
scaler = MinMaxScaler()
pass_norm = scaler.fit_transform(np.array(pass_freq).reshape(-1, 1))
move_norm = scaler.fit_transform(np.array(movement_sync).reshape(-1, 1))
pattern_norm = scaler.fit_transform(np.array(pattern_freq).reshape(-1, 1))
total = (pass_norm * weights['pass'] +
move_norm * weights['movement'] +
pattern_norm * weights['pattern'])
return total * 100 # 映射到0-100
可视化展示
使用squarify或networkx绘制动态传球网络图,节点大小代表触球次数,边的粗细代表传球频率。
import networkx as nx
import matplotlib.pyplot as plt
def visualize_pass_network(matrix):
G = nx.from_pandas_adjacency(matrix)
# 计算边权重
edge_weights = [matrix.loc[u, v] for u, v in G.edges()]
plt.figure(figsize=(10, 8))
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True,
node_size=1200, node_color='lightblue',
width=[w/2 for w in edge_weights], # 线粗代表传球多
edge_color='gray')
plt.title('球员传球默契网络图')
plt.show()
进阶优化:图神经网络(GNN)
如果数据量很大,可以借鉴Graph Neural Network(GNN),将球员看作节点,传球网看作边,用PyTorch Geometric建模型,通过节点嵌入学习,自动发现“高默契组合”(即嵌入向量余弦相似度高的球员对)。
# 伪代码(需要pyg库) # model = GCN(输入特征=球员的位置/技术统计, 邻接矩阵=传球矩阵) # 输出每个球员的Embedding向量 # 默契度 = Cosine_Similarity(embedding[a], embedding[b])
总结与注意事项
- 数据质量是核心,如果没有精确的空间坐标,只能依赖传球序列数据。
- 对手强度会影响传球成功率,建议在分析时加入对手防守强度作为控制变量(如使用“预期助攻 xA”等高级指标)。
- 样本量要求:如果只统计一场比赛,偶然性较大,建议收集多场、多对手的数据进行平均。
通过以上步骤,你可以从结果(传球数)、过程(跑位同步性)、战术(特定配合频次)三个层面,相对科学地量化“默契”这个抽象概念。