本文目录导读:

分析球员之间的默契程度,在开源项目中通常可以拆解为数据层、指标层、模型层和可视化层四个部分,下面从这几个维度展开说明。
核心思路
默契本质上是两名或多名球员在时空上的协同行为模式,可以从三个角度量化:
| 维度 | 含义 | 示例 |
|---|---|---|
| 空间协同 | 跑位是否互补/重叠 | 传球线路、覆盖区域 |
| 时间同步 | 动作是否连贯及时 | 传跑时机、二过一 |
| 效果增益 | 配合是否产生超额价值 | 预期进球增量、推进效率 |
数据来源(开源)
- 事件数据:StatsBomb Open Data、Wyscout 公开样本
- 追踪数据:Metrica Sports、SkillCorner 公开样本
- 视频数据:SoccerNet、dfdc(用于计算机视觉提取)
常用量化指标
传球网络类
# 传球网络中的边权 = 传球次数 / 成功率 / 推进距离
passing_network[player_i][player_j] = {
"count": n,
"success_rate": s,
"avg_progression": d,
"xt_added": xT # 预期威胁增量
}
- 传球频率矩阵:谁经常传给谁
- 互传对称性:A→B 与 B→A 的比例
- 聚类系数:小团体识别(如巴萨的 tiki-taka 三角)
空间协同类
- 平均位置距离:两名球员平均站位距离
- 空间重叠度:用核密度估计(KDE)计算热区重叠
- 覆盖互补性:
1 - IoU(热区A, 热区B)
时间同步类(需追踪数据)
- 同步跑动检测:速度/加速度序列的互相关
- 传跑时差:接球者启动时间 vs 传球时间
- DTW 距离:动态时间规整衡量轨迹相似度
效果增益类
- xT / xG 增量:该组合参与进攻的期望值
- 推进效率:每次配合向前推进的米数
- 超额表现:实际进球 - 预期进球(配合后的)
建模方法
方法 1:图神经网络
# 把球员当作节点,传球/跑动关系当作边
import torch_geometric as tg
class ChemistryGNN(tg.nn.GCNConv):
# 输入:节点特征(位置、技术统计) + 边特征(传球频率、成功率)
# 输出:每对球员的默契分数
方法 2:协同过滤
把球员当作 item,把“成功配合”当作交互,用矩阵分解学习隐向量:
默契(A,B) ≈ <embedding_A, embedding_B>
方法 3:序列模型
用 Transformer 建模比赛事件序列,注意力权重可解释为默契度:
# attention[player_i][player_j] 高 → 两人频繁互动
方法 4:统计检验
- 置换检验:随机打乱队友,看实际配合是否显著高于随机
- 贝叶斯层次模型:分离球员个人能力与组合效应
开源项目参考
| 项目 | 用途 |
|---|---|
| mplsoccer | 传球网络、热图可视化 |
| socceraction | 将事件数据转为 SPADL,计算 xT |
| statsbombpy | 拉取 StatsBomb 开放数据 |
| footballscout / kloppy | 追踪数据加载与对齐 |
| PyG / DGL | 图神经网络建模球员关系 |
| networkx | 传球网络分析(中心性、社区发现) |
典型分析流程
数据获取 → statsbombpy 拉取比赛事件
2. 数据清洗 → socceraction 转 SPADL
3. 构建网络 → networkx 建传球图
4. 特征工程 → 传球频率、xT、空间重叠
5. 建模 → GNN / 矩阵分解 / 序列模型
6. 可视化 → mplsoccer 画网络图 + 热区叠加
7. 验证 → 与教练评分/比赛结果对比
难点与注意事项
- 样本量不足:一对球员同场时间有限 → 需跨赛季/跨赛事聚合
- 混淆因素:默契 vs 个人能力强 → 需控制变量
- 位置依赖:前锋-中场 vs 中卫-中卫,默契定义不同
- 追踪数据稀缺:开源追踪数据远少于事件数据
- 可解释性:教练需要知道为什么默契高,而不只是分数
一个最小示例
import networkx as nx
from statsbombpy import sb
# 1. 拉取比赛事件
events = sb.events(match_id=3788741)
# 2. 构建传球网络
G = nx.DiGraph()
passes = events[events['type'] == 'Pass']
for _, p in passes.iterrows():
if p['pass_outcome'] is None: # 成功传球
G.add_edge(p['player'], p['pass_recipient'])
# 3. 计算默契指标
for u, v in G.edges():
count_uv = G[u][v]['weight']
count_vu = G[v][u]['weight'] if G.has_edge(v, u) else 0
symmetry = min(count_uv, count_vu) / max(count_uv, count_vu)
print(f"{u} ↔ {v}: 传球{count_uv}, 对称性{symmetry:.2f}")
开源项目分析默契的核心公式可以概括为:
默契 = f(交互频率, 交互质量, 空间互补性, 时间同步性, 效果增益) - 个人能力基线
实际落地时,事件数据 + 传球网络 + xT 是最易实现的组合;若追求深度,则需引入追踪数据 + GNN/Transformer。