本文目录导读:

评估边后卫的助攻能力不能只看进球和助攻数据,因为现代边后卫的助攻更多体现在推进、传中、创造机会和打破防线上,以下是利用Python进行量化评估的完整案例,分为数据准备、核心指标计算、可视化展示三个部分。
明确评估维度
助攻能力的核心指标包括以下四类(前两项最核心):
| 维度 | 具体指标 | 计算公式/含义 |
|---|---|---|
| 直接贡献 | 助攻数、关键传球 | 直接创造进球机会 |
| 传中能力 | 传中成功率、传中威胁率 | 传中进入禁区且形成射门的比例 |
| 推进能力 | 带球推进距离、前场传球次数、触球次数 | 能否通过跑位和传球把球输送到前场 |
| 创造机会 | Expected Assists(xA,预期助攻) | 射门机会的预期进球值 |
Python代码实现
模拟比赛数据(假设从Opta或Wyscout导入)
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 创建模拟数据:代表3名边后卫(后卫A/B/C),每场比赛的数据
np.random.seed(42)
players = ['LB_A', 'RB_B', 'LB_C']
matches_per = 10
data = []
for p in players:
for i in range(matches_per):
data.append({
'player': p,
'match': i+1,
'assists': np.random.poisson(0.2), # 助攻数
'key_passes': np.random.poisson(1.5), # 关键传球
'crosses_attempted': np.random.randint(2, 8), # 尝试传中
'crosses_completed': np.random.randint(0, 4), # 成功传中(找到队友)
'progressive_passes': np.random.randint(5, 15),# 向前传球(推进5米以上)
'touches_in_final_third': np.random.randint(15, 40), # 前场触球
'xA': np.random.uniform(0.05, 0.5) # 预期助攻(每场)
})
df = pd.DataFrame(data)
聚合数据,计算关键指标
# 按球员聚合,计算场均数据
agg_funcs = {
'assists': 'mean',
'key_passes': 'mean',
'crosses_attempted': 'mean',
'crosses_completed': 'mean',
'progressive_passes': 'mean',
'touches_in_final_third': 'mean',
'xA': 'mean'
}
summary = df.groupby('player').agg(agg_funcs).reset_index()
summary.columns = ['player', 'avg_assists', 'avg_key_passes', 'avg_crosses_attempted',
'avg_crosses_completed', 'avg_progressive_passes', 'avg_touches_in_final_third', 'avg_xA']
# 计算综合指标
summary['cross_success_rate'] = summary['avg_crosses_completed'] / summary['avg_crosses_attempted'].replace(0, np.nan)
summary['creative_ratio'] = (summary['avg_key_passes'] + summary['avg_xA']) / summary['avg_progressive_passes'].replace(0, np.nan)
summary.round(3)
输出示例:
player avg_assists avg_key_passes ... cross_success_rate creative_ratio
0 LB_A 0.1 1.3 ... 0.391 0.104
1 RB_B 0.2 1.7 ... 0.488 0.118
2 LB_C 0.0 1.4 ... 0.421 0.097
计算综合助攻评分(Z-score标准化法)
from scipy import stats
# 选择关键指标进行标准化(去量纲)
score_cols = ['avg_assists', 'avg_key_passes', 'cross_success_rate', 'avg_progressive_passes', 'avg_xA']
z_scores = pd.DataFrame(index=summary['player'])
for col in score_cols:
z_scores[col] = (summary[col] - summary[col].mean()) / summary[col].std()
# 加权综合得分(权重可以根据战术需求调整)
weights = {
'avg_assists': 0.25, # 直接助攻权重高
'avg_key_passes': 0.25, # 关键传球
'cross_success_rate': 0.15, # 传中效率
'avg_progressive_passes': 0.15, # 推进能力
'avg_xA': 0.20 # 预期助攻
}
z_scores['综合得分'] = sum(z_scores[col] * weights[col] for col in weights.keys())
z_scores['排名'] = z_scores['综合得分'].rank(ascending=False).astype(int)
print(z_scores.sort_values('综合得分', ascending=False))
可视化分析(雷达图或平行坐标)
# 绘制三名球员的雷达图(选择5个维度)
import plotly.graph_objects as go
categories = ['直接助攻', '关键传球', '传中成功率', '前场触球', '预期助攻']
player_data = {
'LB_A': [0.1, 1.3, 0.39, 27.5, 0.23],
'RB_B': [0.2, 1.7, 0.49, 30.2, 0.31],
'LB_C': [0.0, 1.4, 0.42, 24.8, 0.18]
}
fig = go.Figure()
for player, values in player_data.items():
fig.add_trace(go.Scatterpolar(
r=values + [values[0]], # 闭合
theta=categories + [categories[0]],
fill='toself',
name=player
))
fig.update_layout(
polar=dict(radialaxis=dict(visible=True, range=[0, 1])),"边后卫助攻能力雷达图",
showlegend=True
)
fig.show()
进阶:可视化传中威胁热区
# 模拟传中落点数据(x: 水平位置, y: 纵深位置)
# 假设球场宽68米,长105米
crosses_data = pd.DataFrame({
'x': np.random.uniform(55, 100, 50), # 传中起始位置(纵深)
'y': np.random.uniform(0, 68, 50), # 横向位置
'success': np.random.choice([0, 1], 50, p=[0.6, 0.4])
})
# 绘制散点图,颜色表示传中是否形成射门
plt.figure(figsize=(10, 6))
sns.scatterplot(data=crosses_data, x='x', y='y', hue='success', palette='coolwarm', s=100)'边后卫传中落点分布及威胁性')
plt.xlabel('球场纵深(米)')
plt.ylabel('球场宽度(米)')
plt.xlim(0, 105)
plt.ylim(0, 68)
# 添加禁区矩形
from matplotlib.patches import Rectangle
penalty_box = Rectangle((85, 23), 20, 22, linewidth=2, edgecolor='black', facecolor='none')
plt.gca().add_patch(penalty_box)
plt.show()
关键结论与评估框架
通过上述方法,你实际上是在构建一个基于数据驱动的边后卫助攻能力评估系统,核心逻辑如下:
- 数据获取:需要高质量的比赛事件数据(可尝试获取
StatsBomb的开源数据或Kloppy库解析Wyscout数据)。 - 指标权重:根据球队战术调整权重大小,例如高位压迫的球队会侧重推进,下底传中的球队会侧重传中成功率。
- 异常值处理:小样本数据(如少于5场)需要做平滑处理(可用贝叶斯收缩)。
- 同位置对比:应对比同一联赛、同一位置的球员,避免跨位置比较。
真实数据源参考
- 免费开源:
StatsBomb提供免费足球事件数据(可直接用.json格式加载)。 - Python库:推荐使用
socceraction(用于xA/xG计算)、kloppy(跨平台数据解析)、matplotsoccer(绘制事件图)。