本文目录导读:

在足球数据分析中,比较两队边路突破能力,通常需要通过进攻宽度、下底传中、1对1过人、边路推进速度等维度来量化。
由于你没有提供具体的Python代码或数据结构,我假设你的数据是球队级的(如场均数据)或球员级的(如事件流数据),我为你提供两种主流场景下的Python分析思路和代码范式。
基于球队赛季平均数据的对比(简单可视化)
如果你的数据是类似 Team, 边路进攻占比, 成功传中次数, 过人成功率, 下底传中次数 的DataFrame,直接对比图表即可。
Python代码示例(使用Pandas + Matplotlib):
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 示例数据(假设你从CSV或数据库读入)
data = {
'Team': ['Team A', 'Team B'],
'边路进攻占比(%)': [45, 52], # 边路发起进攻的比例
'场均下底传中': [18, 25], # 下底传中次数
'场均成功传中': [4.5, 7.2], # 成功找到队友的传中
'边路1对1过人成功率(%)': [50, 62], # 边路突破效率
'场均夺回球权后推进距离(m)': [150, 220] # 推进距离
}
df = pd.DataFrame(data)
df.set_index('Team', inplace=True)
# 创建雷达图来直观对比(雷达图最适合多维能力对比)
def radar_plot(df):
labels = df.columns.tolist()
angles = np.linspace(0, 2 * np.pi, len(labels), endpoint=False).tolist()
angles += angles[:1] # 闭合图形
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True))
for team in df.index:
values = df.loc[team].values.tolist()
# 归一化(这里简单处理,按最大值归一)
values = (values - values.min()) / (values.max() - values.min())
values += values[:1]
ax.plot(angles, values, linewidth=1, linestyle='solid', label=team)
ax.fill(angles, values, alpha=0.25)
ax.set_xticks(angles[:-1])
ax.set_xticklabels(labels)
ax.legend(loc='upper right', bbox_to_anchor=(1.1, 1.1))
plt.title('两队边路突破能力对比雷达图')
plt.show()
radar_plot(df)
# 另外可以输出一个具体的得分公式(加权)
# 边路威胁指数 = 0.3*占比 + 0.3*传中成功率 + 0.4*过人成功率
df['边路威胁指数'] = (df['边路进攻占比(%)']*0.3 +
(df['场均成功传中']/df['场均下底传中'])*100*0.3 + # 传中成功率
df['边路1对1过人成功率(%)']*0.4)
print(df[['边路威胁指数']].sort_values('边路威胁指数', ascending=False))
适用场景: 快速给教练组看结论,知道哪只球队整体边路“更猛”。
基于事件流数据(逐球分析)的实战对比
如果你有逐事件的XML/JSON数据(如StatsBomb或Wyscout数据),你可以精确分析“边路突破”的具体过程。
定义“边路突破”:
- 位置在X < 25或X > 75(球场宽度坐标)。
- 动作是
Carry(推进)或Dribble(过人)。 - 成功后方向是向对方底线或禁区(Y轴变大)。
- 突破成功标志:过人后控制住球权,或制造了犯规/角球/传中。
Python代码示例(模拟事件流):
import pandas as pd
# 假设你有两队的边路事件数据,包含字段:team, event_type, x, y, end_x, end_y, outcome
# 这里模拟一些数据
sample_data = [
{'team': 'TeamA', 'event': 'dribble', 'x': 10, 'y': 30, 'success': True},
{'team': 'TeamA', 'event': 'pass', 'x': 8, 'y': 45, 'success': True},
{'team': 'TeamB', 'event': 'carry', 'x': 20, 'y': 60, 'success': False},
# ... 省略更多
]
df_events = pd.DataFrame(sample_data)
def analyze_wide_breakthrough(df, team_name):
# 筛选该队边路事件(x<25或x>75,且y值在中前场或对方半场)
wide_events = df[(df['team'] == team_name) &
((df['x'] < 25) | (df['x'] > 75))]
# 1. 边路进攻次数(尝试突破)
attempts = len(wide_events)
# 2. 成功突破次数(outcome为success)
successful = len(wide_events[wide_events['success'] == True])
# 3. 突破成功率
success_rate = successful / attempts if attempts else 0
# 4. 平均推进距离(假设有end_y - y)
# 这里简化示例,假设有推进距离列
if 'progress_distance' in wide_events.columns:
avg_distance = wide_events['progress_distance'].mean()
else:
avg_distance = "数据缺失,需额外计算"
return {
'边路尝试次数': attempts,
'成功突破次数': successful,
'成功率(%)': round(success_rate*100, 2),
'平均每次推进距离(m)': avg_distance
}
# 获取两队对比结果
result_a = analyze_wide_breakthrough(df_events, 'TeamA')
result_b = analyze_wide_breakthrough(df_events, 'TeamB')
comparison = pd.DataFrame([result_a, result_b], index=['TeamA', 'TeamB'])
print(comparison)
# 可视化:绘制边路区域热力图(展示在哪条边路更活跃)
# 需要安装 matplotlib 和 numpy
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
for ax, team in zip(axes, ['TeamA', 'TeamB']):
team_data = df_events[(df_events['team'] == team) &
((df_events['x'] < 25) | (df_events['x'] > 75))]
if team_data.empty:
continue
# 简化:只用x和y坐标画散点热力
heatmap, xedges, yedges = np.histogram2d(team_data['x'], team_data['y'], bins=20, range=[[0, 100], [0, 100]])
ax.imshow(heatmap.T, origin='lower', cmap='Reds', extent=[0, 100, 0, 100])
ax.set_title(f'{team} 边路活动热力图(越红越活跃)')
ax.set_xlabel('横向 (X坐标)')
ax.set_ylabel('纵向 (Y坐标)')
# 标出两条边路区域
ax.axvspan(0, 25, alpha=0.2, color='blue')
ax.axvspan(75, 100, alpha=0.2, color='blue')
plt.tight_layout()
plt.show()
关键指标速查表(对比时看哪些数字)
| 维度 | 核心指标 | 说明 |
|---|---|---|
| 宽度利用能力 | 场均边路传球次数 | 球队是否愿意把球倒到边上 |
| 突破能力 | 边路1对1次数 & 成功率 | 能否硬解防守 |
| 传中威胁 | 运动战传中次数 & 禁区内触球 | 下底后的威胁程度 |
| 攻防转换 | 边路夺回球权后推进速度 | 攻转守的犀利程度 |
| 区域侧重 | 左路 vs 右路 活动占比 | 对手的劣势边路在哪 |
进阶:如果数据包含球员位置(有“边锋”位置标记)
你可以用 groupby('position') 筛选出 LW(左翼)和 RW(右翼)的球员,再对比他们的一对一人均次数:
# 假设有球员位置列
player_df = pd.DataFrame({
'position': ['LW', 'RW', 'LW', 'RW'],
'dribbles': [3, 5, 2, 4],
'dribbles_success': [1, 3, 0, 2]
})
# 计算边锋场均突破
player_df['成功过人率'] = player_df['dribbles_success'] / player_df['dribbles']
print(player_df.groupby('position').mean())
我该用哪种?
- 如果你只有官网的赛后统计表格(比如控球率、传球次数),用场景一(雷达图)。
- 如果你有一整年的事件流数据(比如从
sportsdataverse或StatsBomb下载的),用场景二(精确计算)。
你需要我针对某个特定的数据格式(如CSV表头是怎么样)或某个特定指标(如下底传中成功率)再拆解一下吗?你可以把字段名发给我,我帮你改一下代码。