本文目录导读:

在Python中分析两队后防默契度差异,可以通过数据驱动的方式量化防守协同性,因为“默契”是抽象的,我们需要将其转化为可衡量的防守数据指标。
以下提供三种由浅入深的分析思路,并附上核心Python代码案例,你可以根据手头拥有的数据(如传球、抢断、失球)选择适合的方法。
基于“防守联动”的传球网络分析(最推荐)
核心逻辑:后防默契体现在后场传导球是否流畅、特定区域防守职责是否清晰,通过构建后场球员(门将+后卫+后腰)的传球网络,计算网络的连接密度和中心度,对比两队差异。
适用数据:两队后卫线之间的成功传球数据(包含传球者、接球者)。
import pandas as pd
import networkx as nx
import numpy as np
# 假设 data 是包含 [队伍, 传球者, 接球者, 时间, 区域] 的DataFrame
# 示例数据:队伍A和队伍B的后场传球数据
data = pd.DataFrame({
'team': ['A']*20 + ['B']*20,
'passer': ['CB1','CB2','CB3','DM']*5 + ['CB1','CB2','CB3','DM']*5,
'receiver': ['CB2','CB3','DM','CB1']*5 + ['CB3','DM','CB1','CB2']*5,
'zone': ['def_own']*40 # 防守区域
})
def defensive_cohesion_score(team_df):
"""计算后防联动得分"""
# 过滤只保留后卫和门将之间的传球
defenders = ['CB1', 'CB2', 'CB3', 'DM'] # 根据实际替换
edges = team_df[team_df['passer'].isin(defenders) & team_df['receiver'].isin(defenders)]
# 构建加权图
G = nx.DiGraph()
for _, row in edges.iterrows():
if G.has_edge(row['passer'], row['receiver']):
G[row['passer']][row['receiver']]['weight'] += 1
else:
G.add_edge(row['passer'], row['receiver'], weight=1)
# 核心指标1:网络密度(边数/可能最大边数) --- 密度越高,后防间配合越频繁
density = nx.density(G)
# 核心指标2:传递熵(传球流向的单一性) --- 若集中在某一人,则默契差(单点依赖)
# 计算每个节点的权重占比
out_weights = dict(G.out_degree(weight='weight'))
total = sum(out_weights.values())
entropy = -sum((v/total) * np.log(v/total) for v in out_weights.values() if v > 0)
# 核心指标3:防守对位配合占比(比如中后卫互相传球占比)
cb_pairs = [('CB1','CB2'), ('CB2','CB3'), ('CB1','CB3')]
cb_pass_count = sum(G.get_edge_data(*pair, default={'weight':0})['weight'] for pair in cb_pairs)
cb_ratio = cb_pass_count / len(edges) if len(edges) > 0 else 0
return {
'density': density,
'entropy': entropy, # 熵越低,说明传球越集中在少数人的单点,默契差
'cb_ratio': cb_ratio, # 中卫之间直接配合占比,占比高说明后卫线内部联动好
'avg_node_degree': sum(dict(G.degree()).values()) / len(G.nodes) if len(G) > 0 else 0
}
# 分别计算两队
score_A = defensive_cohesion_score(data[data['team']=='A'])
score_B = defensive_cohesion_score(data[data['team']=='B'])
print("A队:", score_A)
print("B队:", score_B)
# 差异对比(t检验或直接对比)
from scipy import stats
# 如果有多场比赛数据,可以收集两队的density列表进行独立样本T检验
# stats.ttest_ind(scores_A_list, scores_B_list)
结论解读:
- 密度高说明后防球员互相传球多,整体配合积极。
- 熵低说明球权过于集中于某个后卫(比如全部出给CB1),这通常意味着“默契不足”,因为队友间信任度不够,只能依赖一人安全出球。
- 中卫配合占比高说明后卫线内部沟通好,协防能力强。
基于“防守行为同步性”的时序分析(高阶)
核心逻辑:默契体现在防守时同步移动、同时施压,通过分析比赛事件流(如抢断、拦截、解围),计算两队防守动作发生时间的间隔熵或互相关系数。
适用数据:每场比赛的防守事件(如抢断成功)时间戳和位置。
import numpy as np
import pandas as pd
from scipy.signal import correlate
# 假设 event_data 包含 [team, action, time(分钟), x, y]
# 例:A队后防抢断时间点和 B队后防抢断时间点
# 我们模拟两队防守动作的时间序列(0-90分钟,每分钟是否发生关键防守)
def synchrony_score(team_events):
"""计算防守动作时间序列的规律性(用来判断默契)"""
# 将时间离散化为每分钟的计数
time_bins = np.arange(0, 91, 1)
counts, _ = np.histogram(team_events['time'], bins=time_bins)
# 引入傅里叶变换看周期性(默契高的防守通常有爆发性集中,比如反击后的集体回防)
fft_vals = np.abs(np.fft.fft(counts))
# 忽略直流分量,取主要频率
main_freq = np.argmax(fft_vals[1:]) + 1
# 核心指标:事件间隔方差(越小说明行动越规律,默契好)
diffs = np.diff(sorted(team_events['time']))
if len(diffs) < 3:
return {'interval_variance': np.nan, 'burstiness': 0}
interval_var = np.var(diffs)
# 突发性:方差/均值,越小越均匀(即同步性高)
burst = interval_var / np.mean(diffs) if np.mean(diffs) > 0 else 0
return {'interval_variance': interval_var, 'burstiness': burst}
# 模拟数据
times_A = np.sort(np.random.normal(45, 10, 20)) # 集中防守
times_B = np.sort(np.random.uniform(0, 90, 30)) # 分散防守
df_A = pd.DataFrame({'time': times_A})
df_B = pd.DataFrame({'time': times_B})
score_A = synchrony_score(df_A)
score_B = synchrony_score(df_B)
print("A队防守突发性(小=更默契):", score_A['burstiness'])
print("B队防守突发性(小=更默契):", score_B['burstiness'])
结论解读:
- 突发性小(方差小)说明防守动作在时间上分布均匀,没有出现严重脱节(比如前半场防守好,后半场崩盘),但真正的默契更多体现在失球后的快速回防,这需要看特定时段的活跃度差异。
进阶:可以计算两支球队后防线平均位置随比赛时间的波动(通过追踪跑动数据),若一方后防线站位标准差明显小于另一队,则说明该队整体移动更整齐,默契度高。
基于“失球归因”的机器学习模型(业务导向)
核心逻辑:通过历史比赛数据训练一个模型,预测“失球概率”,将后防球员的协同特征(如平均站位差、相互补位次数)作为特征,观察哪个特征对“失球”贡献最大,从而反推默契度差异。
适用数据:大量比赛事件 + 失球标签。
import pandas as pd
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import train_test_split
from sklearn.inspection import permutation_importance
# 假设数据集包含所有比赛前半段(0-45分钟)的防守特征
# 例:特征包括 ['平均距离后卫之间', '后防移动同步率', '补位次数', '犯规次数', '控球率']
# 标签:是否失球(0/1)
# 模拟数据
np.random.seed(42)
X = pd.DataFrame({
'avg_def_spacing': np.random.normal(20, 5, 100), # 平均站位距离(越小越紧凑)
'sync_movement': np.random.beta(2, 2, 100), # 同步移动指数(0-1)
'cover_success': np.random.poisson(3, 100), # 成功补位次数
'opp_pressure': np.random.normal(30, 10, 100) # 对方施压强度
})
y = (X['sync_movement'] < 0.4).astype(int) # 模拟:同步率低容易失球
# 训练模型
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
clf = GradientBoostingClassifier()
clf.fit(X_train, y_train)
# 计算特征重要性(哪个特征对失球影响最大)
result = permutation_importance(clf, X_test, y_test, n_repeats=10, random_state=42)
importance_df = pd.DataFrame({
'feature': X.columns,
'importance': result.importances_mean
}).sort_values('importance', ascending=False)
print("影响失球的关键协同特征:")
print(importance_df)
# 之后,对比两队在这几个关键特征上的均值差异,即可得出后防默契度差异
# A队 avg_def_spacing 为 15米,B队为25米,则A队更紧凑,默契更高。
如何选择分析维度?
| 数据你拥有什么? | 推荐方法 | 核心结论 |
|---|---|---|
| 传球数据 | 方法一(网络分析) | 密度高、熵低、中卫配合多 → 默契好 |
| 防守事件时间戳 | 方法二(时间同步性) | 事件间隔方差小、突发性小 → 默契好(防守节奏稳定) |
| 全队位置/跑动/补位数据 | 方法三(机器学习) | 站位间距小、同步率高 → 默契好 |
| 只有比赛结果 | 无数据,不能直接看 | 需补充数据,否则只能定性分析 |
操作建议:
- 先利用传球网络初步判断(数据最容易获取)。
- 若有事件流数据,再叠加时间同步性分析。
- 若想严谨出报告,用机器学习法列出特征贡献度,量化差异。
如果手头已有实际数据(例如从StatsBomb或Wyscout导出的JSON),你可以发个数据示例给我,我来帮你写出针对性的分析代码。