本文目录导读:

- 第一步:定义“边路突破”的量化指标
- 第二步:Python 实战案例(以模拟数据为例)
- 第三步:数据可视化(一眼看出强弱)
- 第四步:进阶统计检验(判断差异是否显著)
- 第五步:针对真实数据的适配建议
- 总结:怎么“看”结果?
在Python中分析两支球队的边路突破能力,核心思路是将“边路突破”这一模糊概念量化为具体的、可统计的数据指标,然后通过数据可视化和统计检验进行对比。
下面给你一套完整的实战分析框架,包含数据模拟、指标计算、可视化和结论输出,你可以直接复制代码运行,然后替换成自己的数据。
第一步:定义“边路突破”的量化指标
在开始写代码前,先确定统计哪些字段,通常包含以下维度(以足球为例):
- 突破次数:在边路(左/右)1v1 或带球过人的成功次数。
- 成功率和被抢断率:效率的体现。
- 制造威胁:突破后形成的传中、射门、定位球或关键传球。
- 推进距离:从后场推进到前场禁区附近的距离。
第二步:Python 实战案例(以模拟数据为例)
导入库并生成模拟数据
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文显示(防止乱码)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 或者 'Microsoft YaHei'
plt.rcParams['axes.unicode_minus'] = False
# 假设有A队和B队,每队有5名边路球员(左右边锋+边后卫)
# 每行代表一名球员在一场比赛中的数据
data = {
'球队': ['A队']*5 + ['B队']*5,
'球员': ['A左边锋', 'A左边卫', 'A右边锋', 'A右边卫', 'A轮换',
'B左边锋', 'B左边卫', 'B右边锋', 'B右边卫', 'B轮换'],
'边路': ['左', '左', '右', '右', '左', '左', '左', '右', '右', '右'],
'成功突破': [4, 2, 5, 1, 3, 6, 1, 4, 2, 2],
'尝试突破': [7, 5, 8, 3, 5, 9, 3, 7, 4, 5],
'传中次数': [2, 3, 4, 1, 2, 5, 1, 6, 2, 1],
'创造射门机会': [1, 0, 2, 0, 1, 3, 0, 2, 0, 1]
}
df = pd.DataFrame(data)
# 计算效率和贡献
df['成功率'] = df['成功突破'] / df['尝试突破']
df['制造威胁'] = df['传中次数'] + df['创造射门机会']
print(df[['球队', '球员', '边路', '成功突破', '尝试突破', '成功率', '制造威胁']])
核心对比分析(分组聚合)
# 按球队和边路分组,汇总数据
grouped = df.groupby(['球队', '边路']).agg({
'成功突破': 'sum',
'尝试突破': 'sum',
'传中次数': 'sum',
'创造射门机会': 'sum',
'球员': 'count'
}).rename(columns={'球员': '出场人次'})
# 计算整体的成功率
grouped['成功率'] = grouped['成功突破'] / grouped['尝试突破']
grouped['场均制造威胁'] = (grouped['传中次数'] + grouped['创造射门机会']) / grouped['出场人次']
print("\n--- 左右边路对比汇总 ---")
print(grouped)
第三步:数据可视化(一眼看出强弱)
左右边路雷达图对比
# 准备画雷达图的数据
# 指标:总突破次数、成功率、传中制造威胁
metrics = ['成功突破总数', '成功率', '场均制造威胁']
A_left = [7, grouped.loc[('A队','左'),'成功率'], 1.33] # 具体数值从grouped里取
B_left = [8, grouped.loc[('B队','左'),'成功率'], 2.00]
# 这里为了演示,手动提取数值
A_values = [
grouped.loc[('A队','左'), '成功突破'],
grouped.loc[('A队','左'), '成功率'],
grouped.loc[('A队','左'), '场均制造威胁']
]
B_values = [
grouped.loc[('B队','左'), '成功突破'],
grouped.loc[('B队','左'), '成功率'],
grouped.loc[('B队','左'), '场均制造威胁']
]
# 绘制雷达图
angles = np.linspace(0, 2 * np.pi, len(metrics), endpoint=False).tolist()
A_values += A_values[:1]
B_values += B_values[:1]
angles += angles[:1]
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
ax.fill(angles, A_values, color='red', alpha=0.25, label='A队左路')
ax.fill(angles, B_values, color='blue', alpha=0.25, label='B队左路')
ax.set_xticks(angles[:-1])
ax.set_xticklabels(metrics)
ax.legend(loc='upper right')'左路突破能力对比')
plt.show()
散点图(突破次数 vs 成功率)
plt.figure(figsize=(10, 6))
sns.scatterplot(data=df, x='尝试突破', y='成功率', hue='球队', style='边路', s=150)'突破次数与成功率关系(气泡大小代表创造威胁)', fontsize=14)
plt.xlabel('尝试突破次数')
plt.ylabel('成功率')
# 添加球员标签
for i in range(len(df)):
plt.text(df['尝试突破'][i]+0.1, df['成功率'][i], df['球员'][i], fontsize=8)
plt.grid(alpha=0.3)
plt.show()
第四步:进阶统计检验(判断差异是否显著)
光看柱状图可能不够客观,可以用 scipy 的 T检验或曼-惠特尼U检验,判断“A队的边路突破成功率”是否显著高于“B队”。
from scipy import stats
# 提取A队和B队的所有边路球员数据
A_success = df[df['球队'] == 'A队']['成功率']
B_success = df[df['球队'] == 'B队']['成功率']
# 独立样本T检验(先检查方差齐性)
t_stat, p_value = stats.ttest_ind(A_success, B_success, equal_var=False) # Welch's t-test
print(f"T统计量: {t_stat:.3f}, P值: {p_value:.4f}")
if p_value < 0.05:
print("两队边路突破效率存在显著差异(P<0.05)")
else:
print("两队边路突破效率差异不显著(P>=0.05)")
第五步:针对真实数据的适配建议
如果你在自己的数据工程中需要处理真实比赛数据,可以参考以下代码片段处理:
# 假设你只有一个包含大量事件的CSV文件(每一行是一次触球或对抗)
# event_data.csv 包含 ['Team', 'Player', 'Zone', 'Outcome']
event_df = pd.read_csv('your_data.csv')
# 筛选边路区域(假设Zone列包含 'Left Wing' 或 'Right Wing')
left_wing = event_df[event_df['Zone'].str.contains('Left')]
right_wing = event_df[event_df['Zone'].str.contains('Right')]
# 结合事件类型('Take On' 表示过人)计算成功次数
def count_success(group):
return group[(group['Outcome'] == 'Success')].shape[0]
# 按球队统计
summary = event_df.groupby(['Team', 'Zone']).apply(
lambda x: pd.Series({
'突破尝试': x[x['Event'] == 'Take On'].shape[0],
'成功突破': x[(x['Event'] == 'Take On') & (x['Outcome'] == 'Success')].shape[0],
'完成传中': x[x['Event'] == 'Cross'].shape[0]
})
).reset_index()
怎么“看”结果?
- 看总量:谁尝试多、谁成功多(统计
sum)。 - 看效率:谁的成功率高(计算比例)。
- 看威胁:谁的突破能转化成射门/传球(加权得分)。
- 看均衡性:左右两边是否明显“瘸腿”(对比左右路数据)。
- 看显著性:用P值判断强弱是偶然还是实力差距。
如果你能提供具体的字段名(比如你的CSV里叫 cross 还是 key_pass),我可以帮你直接写一份适配你数据结构的完整分析脚本。