python案例怎么看两队后防默契度差异?

wen python案例 3

本文目录导读:

python案例怎么看两队后防默契度差异?

  1. 方法一:基于“防守联动”的传球网络分析(最推荐)
  2. 方法二:基于“防守行为同步性”的时序分析(高阶)
  3. 方法三:基于“失球归因”的机器学习模型(业务导向)
  4. 总结:如何选择分析维度?

在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队更紧凑,默契更高。

如何选择分析维度?

数据你拥有什么? 推荐方法 核心结论
传球数据 方法一(网络分析) 密度高、熵低、中卫配合多 → 默契好
防守事件时间戳 方法二(时间同步性) 事件间隔方差小、突发性小 → 默契好(防守节奏稳定)
全队位置/跑动/补位数据 方法三(机器学习) 站位间距小、同步率高 → 默契好
只有比赛结果 无数据,不能直接看 需补充数据,否则只能定性分析

操作建议

  1. 先利用传球网络初步判断(数据最容易获取)。
  2. 若有事件流数据,再叠加时间同步性分析。
  3. 若想严谨出报告,用机器学习法列出特征贡献度,量化差异。

如果手头已有实际数据(例如从StatsBomb或Wyscout导出的JSON),你可以发个数据示例给我,我来帮你写出针对性的分析代码。

抱歉,评论功能暂时关闭!