本文目录导读:

分析球员之间的默契程度,可以从数据、战术、行为三个层面入手,下面是一套可落地的实用脚本思路,按数据源和计算方法展开。
核心思路
默契 = 可预测性 + 效率 + 双向性
即:A传球时B总能出现在预期位置,且这种配合比和其他队友更高效、更频繁、更双向。
数据源准备
| 数据类型 | 来源示例 | 用途 |
|---|---|---|
| 传球事件 | StatsBomb、Opta、Wyscout | 传接频率、成功率 |
| 位置数据 | 追踪系统(SportVU等) | 空间距离、跑位同步 |
| 事件流 | 比赛日志 | 传→跑→射链条 |
| 阵容数据 | 首发/换人 | 共现场次 |
核心指标与计算脚本
传球网络指标(基础层)
import pandas as pd
import numpy as np
# 假设 df 含: passer, receiver, match_id, success, x, y, minute
def pair_metrics(df):
# 只保留同队传球,需先合并队伍信息
df['pair'] = df.apply(lambda r: tuple(sorted([r['passer'], r['receiver']])), axis=1)
g = df.groupby('pair').agg(
passes=('success', 'size'),
success_rate=('success', 'mean'),
matches=('match_id', 'nunique')
)
g['passes_per_match'] = g['passes'] / g['matches']
return g.sort_values('passes_per_match', ascending=False)
关键指标:
- 每场传球次数
- 传球成功率
- 共赛场次(排除偶然性)
空间默契度(追踪数据)
def spatial_sync(tracking_df, player_a, player_b, window=5):
"""
tracking_df: frame, player_id, x, y
计算两人在时间窗口内的位置同步性
"""
a = tracking_df[tracking_df.player_id == player_a].set_index('frame')
b = tracking_df[tracking_df.player_id == player_b].set_index('frame')
merged = a.join(b, lsuffix='_a', rsuffix='_b', how='inner')
# 1) 平均距离
merged['dist'] = np.sqrt((merged.x_a - merged.x_b)**2 +
(merged.y_a - merged.y_b)**2)
# 2) 位移向量相关性(跑位同步)
merged['dx_a'] = merged.x_a.diff()
merged['dy_a'] = merged.y_a.diff()
merged['dx_b'] = merged.x_b.diff()
merged['dy_b'] = merged.y_b.diff()
corr_x = merged['dx_a'].rolling(window).corr(merged['dx_b'])
corr_y = merged['dy_a'].rolling(window).corr(merged['dy_b'])
return {
'avg_distance': merged.dist.mean(),
'movement_corr': (corr_x.mean() + corr_y.mean()) / 2,
'proximity_time_ratio': (merged.dist < 15).mean() # 15米内时间占比
}
解读:
movement_corr> 0.5:跑位高度同步(如边后卫+边锋)proximity_time_ratio高 + 传球多 = 强默契
预期配合效率(进阶)
用 xT(Expected Threat) 或 VAEP 衡量每次配合的价值增量:
def combo_value(df, model):
"""
对每次 A→B 传球,计算价值变化
"""
df['value_gain'] = df.apply(
lambda r: model.predict(r['end_x'], r['end_y']) -
model.predict(r['start_x'], r['start_y']), axis=1)
return df.groupby('pair')['value_gain'].agg(['sum', 'mean', 'count'])
默契组合 = 高频 + 高价值增益 + 稳定
三角/小组默契(网络分析)
import networkx as nx
def build_pass_network(df, min_passes=5):
G = nx.DiGraph()
edges = df.groupby(['passer','receiver']).size().reset_index(name='w')
edges = edges[edges.w >= min_passes]
for _, r in edges.iterrows():
G.add_edge(r.passer, r.receiver, weight=r.w)
return G
def clique_score(G):
"""用三角计数和聚类系数衡量小组默契"""
undirected = G.to_undirected()
return {
'clustering': nx.clustering(undirected, weight='weight'),
'triangles': nx.triangles(undirected)
}
三人组默契尤其重要——足球中经典的三角配合(如巴萨tiki-taka)。
综合默契评分模型
def chemistry_score(pair_stats, spatial_stats, value_stats, weights=None):
w = weights or {'freq': 0.3, 'success': 0.2, 'space': 0.25, 'value': 0.25}
# 归一化到 0-1
score = (
w['freq'] * norm(pair_stats['passes_per_match']) +
w['success'] * pair_stats['success_rate'] +
w['space'] * spatial_stats['movement_corr'] +
w['value'] * norm(value_stats['mean'])
)
return score
实用脚本工作流
拉取数据(API / CSV)
↓
2. 清洗:统一球员ID、队伍、坐标方向
↓
3. 计算 pair-level 指标
↓
4. 加入空间同步(如有追踪数据)
↓
5. 加入价值模型(xT/VAEP)
↓
6. 归一化 + 加权 → chemistry_score
↓
7. 可视化:热力图 / 网络图 / 时间演化曲线
可视化建议
- 传球网络图:节点大小=触球,边粗=传球频率,颜色=默契分
- 默契热力图:N×N 矩阵,行列都是球员
- 时间演化:随赛季推进,两人默契分变化(识别磨合期)
- 空间协同图:两人平均位置连线 + 覆盖区域
注意事项
- 样本量:共赛 < 5 场的组合结果不可靠
- 位置偏差:后卫-门将传球多但价值低,需分位置组比较
- 对手强度:强强对话中的默契更有说服力
- 战术角色:同一球员在不同体系下默契对象不同
- 双向性:A→B 多但 B→A 少,可能是单向依赖而非默契
如果你告诉我你手头的数据格式(如 StatsBomb event JSON、Opta CSV、自采追踪数据),我可以给出针对性的完整可运行脚本。