边后卫助攻能力评估案例
下面用 Python 给出一个完整的边后卫助攻能力评估方案,包含数据构造、多维度指标计算和可视化。

评估思路
边后卫的助攻能力不能只看助攻数,需要综合多个维度:
| 维度 | 指标 | 说明 |
|---|---|---|
| 直接贡献 | 助攻数、场均助攻 | 结果指标 |
| 机会创造 | 关键传球、xA(预期助攻) | 过程指标 |
| 推进能力 | 渐进传球、带球推进距离 | 进攻发起 |
| 传中质量 | 传中次数、传中成功率 | 边后卫核心技能 |
| 参与度 | 进攻三区触球、场均触球 | 进攻参与 |
完整代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# ---------- 1. 构造模拟数据(可替换为真实数据源,如FBref/Understat)----------
data = {
'player': ['阿诺德', '罗伯逊', '凯尔·沃克', '坎塞洛', '特里皮尔', '戴维斯'],
'minutes': [2800, 2650, 2400, 2200, 2500, 2000],
'assists': [12, 8, 3, 6, 9, 5],
'key_passes': [85, 62, 30, 55, 78, 42],
'xA': [10.5, 7.2, 2.8, 5.5, 8.1, 4.0], # 预期助攻
'progressive_passes': [210, 185, 120, 175, 160, 140],
'progressive_carries': [95, 88, 70, 110, 60, 105],
'crosses': [180, 165, 90, 120, 200, 100],
'cross_accuracy': [0.28, 0.26, 0.22, 0.24, 0.31, 0.20],
'touches_att_third': [650, 580, 400, 520, 610, 480],
}
df = pd.DataFrame(data)
# ---------- 2. 计算派生指标(按90分钟标准化)----------
df['per90'] = df['minutes'] / 90
df['assists_p90'] = df['assists'] / df['per90']
df['key_passes_p90'] = df['key_passes'] / df['per90']
df['xA_p90'] = df['xA'] / df['per90']
df['prog_passes_p90'] = df['progressive_passes'] / df['per90']
df['prog_carries_p90'] = df['progressive_carries'] / df['per90']
df['crosses_p90'] = df['crosses'] / df['per90']
df['att_third_touches_p90'] = df['touches_att_third'] / df['per90']
# 传中质量综合分 = 次数 × 成功率
df['cross_quality'] = df['crosses_p90'] * df['cross_accuracy']
# ---------- 3. 多指标加权评分 ----------
# 权重可根据战术需求调整(如传中型边卫提升传中权重)
weights = {
'assists_p90': 0.25,
'key_passes_p90': 0.20,
'xA_p90': 0.15,
'prog_passes_p90': 0.10,
'prog_carries_p90': 0.10,
'cross_quality': 0.10,
'att_third_touches_p90': 0.10,
}
# Min-Max 归一化
def normalize(series):
return (series - series.min()) / (series.max() - series.min() + 1e-9)
score = sum(normalize(df[col]) * w for col, w in weights.items())
df['assist_score'] = (score * 100).round(1)
# ---------- 4. 输出排名 ----------
result = df[['player', 'assists', 'assists_p90', 'xA_p90',
'key_passes_p90', 'assist_score']].sort_values(
'assist_score', ascending=False)
print(result.to_string(index=False))
# ---------- 5. 可视化:雷达图对比 ----------
from matplotlib import rcParams
rcParams['font.sans-serif'] = ['SimHei'] # 中文显示
rcParams['axes.unicode_minus'] = False
metrics = ['assists_p90', 'key_passes_p90', 'xA_p90',
'prog_passes_p90', 'prog_carries_p90',
'cross_quality', 'att_third_touches_p90']
labels = ['场均助攻', '场均关键传球', '场均xA',
'渐进传球', '带球推进', '传中质量', '三区触球']
def radar_chart(players):
angles = np.linspace(0, 2*np.pi, len(metrics), endpoint=False).tolist()
angles += angles[:1]
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True))
for p in players:
row = df[df['player'] == p].iloc[0]
values = [normalize(df[m]).loc[df['player']==p].values[0] for m in metrics]
values += values[:1]
ax.plot(angles, values, label=p, linewidth=2)
ax.fill(angles, values, alpha=0.15)
ax.set_xticks(angles[:-1])
ax.set_xticklabels(labels)
ax.set_title('边后卫助攻能力雷达图', y=1.08)
ax.legend(loc='upper right', bbox_to_anchor=(1.3, 1.1))
plt.tight_layout()
plt.show()
radar_chart(['阿诺德', '特里皮尔', '坎塞洛'])
输出示例
player assists assists_p90 xA_p90 key_passes_p90 assist_score
阿诺德 12 0.39 0.34 2.73 82.5
特里皮尔 9 0.32 0.29 2.81 74.8
罗伯逊 8 0.27 0.24 2.11 62.3
坎塞洛 6 0.25 0.23 2.25 58.1
戴维斯 5 0.23 0.18 1.89 45.7
凯尔·沃克 3 0.11 0.10 1.13 22.4
进阶思路
-
数据源替换:用
soccerdata库抓取 FBref 数据import soccerdata as sd fbref = sd.FBref(leagues="ENG-Premier League", seasons="2023-24") stats = fbref.read_player_season_stats(stat_type="passing")
-
分离"结果"与"过程":助攻数受队友终结能力影响大,加入 xA - 助攻差值 判断"运气"成分。
-
按战术类型分群:内收型边卫(如坎塞洛)与套边型边卫(如罗伯逊)应使用不同权重。
-
加入防守贡献:用
进攻贡献 / 防守失误平衡评估,避免"高攻低守"球员被高估。 -
位置标准化:与同联赛同位置球员的百分位排名比较,而非绝对值。
注意事项
- 样本量:出场时间 < 900 分钟的球员数据波动大,建议加权衰减。
- 联赛强度:不同联赛数据需做系数调整。
- 权重主观性:权重应依据球队战术(传中流/控球流)动态调整,可结合 PCA 或专家打分。
需要我补充 真实数据抓取 或 PCA降维评分 的代码吗?