python案例如何评估边后卫的助攻能力?

wen python案例 2

本文目录导读:

python案例如何评估边后卫的助攻能力?

  1. 明确评估维度
  2. Python代码实现
  3. 关键结论与评估框架
  4. 真实数据源参考

评估边后卫的助攻能力不能只看进球和助攻数据,因为现代边后卫的助攻更多体现在推进、传中、创造机会和打破防线上,以下是利用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()

关键结论与评估框架

通过上述方法,你实际上是在构建一个基于数据驱动的边后卫助攻能力评估系统,核心逻辑如下:

  1. 数据获取:需要高质量的比赛事件数据(可尝试获取StatsBomb的开源数据或Kloppy库解析Wyscout数据)。
  2. 指标权重:根据球队战术调整权重大小,例如高位压迫的球队会侧重推进,下底传中的球队会侧重传中成功率。
  3. 异常值处理:小样本数据(如少于5场)需要做平滑处理(可用贝叶斯收缩)。
  4. 同位置对比:应对比同一联赛、同一位置的球员,避免跨位置比较。

真实数据源参考

  • 免费开源StatsBomb 提供免费足球事件数据(可直接用.json格式加载)。
  • Python库:推荐使用 socceraction(用于xA/xG计算)、kloppy(跨平台数据解析)、matplotsoccer(绘制事件图)。

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