python案例如何量化进攻三区效率值?

wen python案例 2

本文目录导读:

python案例如何量化进攻三区效率值?

  1. 第一阶段:定义核心指标(效率的维度)
  2. 第二阶段:构造模拟数据(可替换为你的实际数据集)
  3. 第三阶段:核心量化计算(Python逻辑)
  4. 第四阶段:构建综合“进攻三区效率指数”(Final Score)
  5. 第五阶段:进阶优化(如使用 StatsBomb 数据)
  6. 总结:如何解读你的 Python 输出?

量化“进攻三区效率值”是足球数据分析中的热门课题。进攻三区(Final Third)通常指距离对方球门约30米(或最后35码)的区域。

量化该区域的效率,核心逻辑是 “单位球权/单位时间/单位射门机会”能产生多少“进攻收益”

这里给你提供一个基于 Python + Pandas + 事件流数据(如StatsBomb或Wyscout格式) 的完整量化案例框架。


第一阶段:定义核心指标(效率的维度)

我们不能只看“进球数”,因为样本太小,通常我们将效率拆解为三个维度,最后合成综合评分:

  1. 纵深推进效率(推进能力):球在该区域的停留时间比进入次数、以及进入后向前传球(Progressive Pass)的成功率
  2. 射门创造效率(威胁制造):每次进入三区,能产生多少射门(Shots)或绝对机会(Big Chances)。
  3. 终结转化效率(得分能力):射门转化率、进球期望值(xG)的实际达成率。

第二阶段:构造模拟数据(可替换为你的实际数据集)

假设你有每条事件数据(传球、接球、射门),包含 x, y 坐标。

import pandas as pd
import numpy as np
from collections import defaultdict
# 模拟数据格式:事件、球队、球员、位置、时间、结果
np.random.seed(42)
n_samples = 5000
data = {
    'event_type': np.random.choice(['pass', 'reception', 'shot', 'dribble'], n_samples, p=[0.6, 0.2, 0.1, 0.1]),
    'team': np.random.choice(['Team_A', 'Team_B'], n_samples),
    'player': np.random.choice(['Player_X', 'Player_Y', 'Player_Z'], n_samples),
    'x': np.random.uniform(0, 100, n_samples), # 假设0是己方底线,100是对方底线
    'y': np.random.uniform(0, 100, n_samples), # 宽度
    'outcome': np.random.choice(['success', 'fail'], n_samples, p=[0.75, 0.25]),
    'is_goal': np.random.choice([0, 1], n_samples, p=[0.98, 0.02])
}
df = pd.DataFrame(data)
# 定义进攻三区:对方半场 70-100(即罚球区到角球附近),或者更严格地看,使用 (x > 70)
df['in_final_third'] = df['x'] >= 70
print(df.head())

第三阶段:核心量化计算(Python逻辑)

我们用 矩阵计算分组聚合 来实现核心量化。

进攻三区“球权停留”与“推进效率”

计算每支球队在进攻三区的触球密度传球成功率

# 筛选进攻三区的事件
final_third_df = df[df['in_final_third'] == True]
# 指标1:进攻三区控球率(按事件占比估算)
# 某队在三区的事件数 / 所有队伍在三区的事件数
total_final_third_events = len(final_third_df)
team_possession_ratio = final_third_df.groupby('team').size() / total_final_third_events
# 指标2:推进效率(三区传球成功率)
pass_success = final_third_df[final_third_df['event_type'] == 'pass'].groupby('team')['outcome'].apply(lambda x: (x == 'success').sum() / len(x))
print("进攻三区球权占比:")
print(team_possession_ratio)
print("\n进攻三区传球成功率(推进效率):")
print(pass_success)

射门威胁效率(每次进入三区的得分机会)

我们需要“进入次数”,这里简化处理:每次在三区内的射门,都视为一次有效进攻尝试,但我们引入更高级的指标 Threat(威胁值),利用 x 坐标加权。

# 威胁值权重函数:离球门越近,权值越高(指数型增长)
def threat_weight(x):
    if x < 70:
        return 0
    elif x < 80:
        return 0.5
    elif x < 90:
        return 1.0
    else: # 禁区内
        return 2.0
df['threat_score'] = df['x'].apply(threat_weight)
# 计算每队的总威胁值和威胁效率(威胁值 / 触球次数)
threat_by_team = df.groupby('team')['threat_score'].sum()
touch_by_team = df.groupby('team').size()
threat_efficiency = threat_by_team / touch_by_team
print("\n单位触球威胁值(效率):")
print(threat_efficiency)

进攻转化率(终结效率)

计算每队“进攻三区事件”到“实际进球”的效率,为了减少随机性,引入 xG(预期进球)概念,这里用 threat_score 作为 xG 的近似值。

# 真实进球数
goals_by_team = df[df['is_goal'] == 1].groupby('team').size()
# 预期进球(用威胁分总和近似,实际应使用模型计算)
xG_by_team = threat_by_team / 100 # 归一化
# 转化效率 = 实际进球 / 预期进球
conversion_efficiency = (goals_by_team / xG_by_team).fillna(0)
print("\n射门转化效率(实际进球 vs 预期进球):")
print(conversion_efficiency)

第四阶段:构建综合“进攻三区效率指数”(Final Score)

为了避免单一指标偏差,我们使用 Z-score 标准化 将上述三个维度加权合成一个总分。

from scipy import stats
# 构建指标表
efficiency_df = pd.DataFrame({
    '控球占比': team_possession_ratio,
    '传球成功率': pass_success.fillna(0),
    '威胁效率': threat_efficiency,
    '转化效率': conversion_efficiency.fillna(0)
}).fillna(0)
# Z-score 标准化(得分为正数代表高于联盟平均)
z_scores = efficiency_df.apply(stats.zscore, axis=0)
# 权重分配(可根据需求调整)
weights = {
    '控球占比': 0.2,
    '传球成功率': 0.3,
    '威胁效率': 0.3,
    '转化效率': 0.2 # 转化效率波动大,权重稍低
}
efficiency_df['综合效率指数'] = sum(z_scores[col] * weight for col, weight in weights.items())
print("\n量化后的进攻三区效率综合排名:")
print(efficiency_df.sort_values('综合效率指数', ascending=False))

第五阶段:进阶优化(如使用 StatsBomb 数据)

如果你的数据字段更全(如 locationfreeze_frameunder_pressure),你可以将“效率值”升级为:

  1. 基于威胁场(Threat Field)计算:使用积分图计算每次传球提升的威胁值(VAEP模型)。
  2. 逐步逻辑回归:利用机器学习评估每个动作对结果的边际贡献。

VAEP模型核心代码片段:

# 计算某个行为的“价值增值”
def calculate_vaep(row, next_event_gain_goal, prev_event_gain_goal):
    # 当前事件发生的概率
    p_goal_before = prev_event_gain_goal
    p_goal_after = next_event_gain_goal
    # 得分收益:如果进球则收益 1
    vaep_score = p_goal_after - p_goal_before
    if row['event_type'] == 'shot' and row['outcome'] == 'success':
        vaep_score += 1 # 进球奖励
    return vaep_score

如何解读你的 Python 输出?

  • 综合效率指数 > 0:该队在进攻三区的整体效率高于联赛平均水平。
  • 传球成功率低但威胁值高:说明该队打法直接,长传冲吊进禁区,虽然成功率低但每次成功都极具威胁(类似早期利物浦)。
  • 转化效率高:说明该队把握机会能力强,但这指标回归均值较快,需配合预期进球数据长期观察。

建议:实际应用中,请务必使用每分钟(标准化到90分钟)的数据,并且要过滤掉“垃圾时间”(如大比分领先后),以保证指标的有效性。

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