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

wen python案例 2

本文目录导读:

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

  1. 核心量化指标定义
  2. Python 实现案例(足球数据)
  3. 篮球场景的快速适配
  4. 实际应用注意事项
  5. 总结输出

量化进攻三区(通常指足球或篮球中距离球门或篮筐最近的区域,如足球的“进攻三区”指前场35米区域,或篮球的“进攻三区”指三分线内区域)的效率值,核心是衡量球队或个人在该区域创造机会和转化为得分的能力

以下是一个基于Python的量化案例框架,适用于足球和篮球,我会以足球进攻三区为例(因为概念更典型),并提供可复用的代码逻辑。


核心量化指标定义

进攻三区效率值可以分解为以下几个维度:

  1. 进入三区次数 – 球队成功将球推进到前场35米区域的频率。
  2. 关键传球 / 射门转化 – 在三区内传出形成射门的传球次数。
  3. 射门效率 – 三区内的射门次数、射正率、进球率。
  4. 预期进球 (xG) – 基于射门位置和角度的进球概率模型(可选,高级指标)。

综合效率公式示例: [ \text{Efficiency} = \frac{\text{进球数} + 0.5 \times \text{射正数} + 0.3 \times \text{关键传球}}{\text{进入三区次数}} ] 权重可根据实际业务调整


Python 实现案例(足球数据)

假设你有一份CSV数据(attack_data.csv),包含以下字段:

  • match_id, team, player, event_type (pass, shot, goal, dribble), event_result (success, fail, goal), zone (attacking_third, middle_third, defensive_third), x, y (坐标), timestamp

数据加载与清洗

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 创建示例数据(实际应用中替换为真实数据)
data = pd.DataFrame({
    'team': ['TeamA', 'TeamA', 'TeamB', 'TeamA', 'TeamB'],
    'player': ['P1', 'P2', 'P3', 'P1', 'P4'],
    'event_type': ['pass', 'shot', 'shot', 'goal', 'pass'],
    'event_result': ['success', 'on_target', 'goal', 'goal', 'success'],
    'zone': ['attacking_third', 'attacking_third', 'attacking_third', 'attacking_third', 'attacking_third'],
    'x': [95, 98, 100, 101, 92],  # 假设球场宽度105m
    'y': [45, 50, 30, 55, 60]
})
# 定义进攻三区(假设x坐标 > 70 为进攻三区)
def classify_zone(x):
    if x > 70:
        return 'attacking_third'
    elif 35 <= x <= 70:
        return 'middle_third'
    else:
        return 'defensive_third'
data['zone'] = data['x'].apply(classify_zone)
# 过滤出进攻三区事件
att_third = data[data['zone'] == 'attacking_third'].copy()

计算关键指标

# 统计每个队伍/球员在进攻三区的表现
def calculate_attacking_efficiency(df, group_by='team'):
    # 基本计数
    total_entries = df['event_type'].count()  # 进攻三区事件总数(作为进入次数近似)
    passes = df[df['event_type'] == 'pass'].shape[0]
    key_passes = df[(df['event_type'] == 'pass') & (df['event_result'] == 'key_pass')].shape[0]  # 假设有key_pass标签
    shots = df[df['event_type'] == 'shot'].shape[0]
    shots_on_target = df[(df['event_type'] == 'shot') & (df['event_result'].isin(['on_target', 'goal']))].shape[0]
    goals = df[df['event_result'] == 'goal'].shape[0]
    # 效率公式
    efficiency = (goals * 1.0 + shots_on_target * 0.5 + key_passes * 0.3) / max(total_entries, 1)
    # 聚合统计
    result = df.groupby(group_by).agg(
        total_entries=('event_type', 'count'),
        shots=('event_type', lambda x: (x == 'shot').sum()),
        shots_on_target=('event_result', lambda x: x.isin(['on_target', 'goal']).sum()),
        goals=('event_result', lambda x: (x == 'goal').sum())
    )
    # 计算效率
    result['efficiency'] = (result['goals'] * 1.0 + result['shots_on_target'] * 0.5) / result['total_entries'].replace(0, np.nan)
    return result
team_eff = calculate_attacking_efficiency(att_third)
print("队伍进攻三区效率:")
print(team_eff)

可视化:热力图展示进攻三区热点

# 假设你有所有触球点的坐标
plt.figure(figsize=(10, 8))
# 创建2D直方图(代表进攻三区射门/传球密度)
plt.hist2d(att_third['x'], att_third['y'], bins=(20, 15), cmap='Reds', alpha=0.7)
plt.colorbar(label='事件密度')
# 添加球场示意图(半场)
plt.axhline(y=0, color='grey', linestyle='--')
plt.axhline(y=68, color='grey', linestyle='--')  # 假设球场宽度68m
plt.xlim(70, 105)
plt.ylim(0, 68)'进攻三区活动热力图')
plt.xlabel('x 坐标 (m)')
plt.ylabel('y 坐标 (m)')
plt.show()

进阶:预期进球模型(xG)简化版

# 简单的xG模型:基于距离和角度(实际需用机器学习)
def simulate_xg(x, y, goal_center=(105, 34.5)):
    distance = np.sqrt((x - goal_center[0])**2 + (y - goal_center[1])**2)
    # 越近xG越高,且角度越好(y靠近球门中心)越高
    base = 1 / (1 + np.exp(0.1 * distance - 5))  # Sigmoid函数
    angle_factor = 1 - abs(y - 34.5) / 34.5
    return base * angle_factor
att_third['xG'] = att_third.apply(lambda row: simulate_xg(row['x'], row['y']) if row['event_type'] == 'shot' else 0, axis=1)
avg_xG_per_shot = att_third[att_third['event_type'] == 'shot']['xG'].mean()
print(f"进攻三区平均每脚射门预期进球:{avg_xG_per_shot:.3f}")

篮球场景的快速适配

如果用于篮球,可以将“进攻三区”改为“油漆区”或“三分线内一步”,指标调整为:

  • 油漆区触球次数
  • 油漆区出手/命中率
  • 制造犯规次数
  • 进攻篮板率

示例代码片段:

# 假设有坐标数据,定义油漆区为 (x, y) 满足 15<=x<=45 且 15<=y<=45 (单位英尺,半场)
basket_data['is_paint'] = (15 <= basket_data['x']) & (basket_data['x'] <= 45) & (15 <= basket_data['y']) & (basket_data['y'] <= 45)
paint_activities = basket_data[basket_data['is_paint']]
# 效率计算:得分 / 油漆区触球次数
paint_efficiency = paint_activities.groupby('player')['points'].sum() / paint_activities.groupby('player').size()

实际应用注意事项

  1. 数据粒度 – 最好使用逐帧事件数据(如 Opta、StatsBomb 格式),包含 x/y 坐标和子事件标签。
  2. 权重调整 – 行业里有标准 xG 模型,但你可以根据业务定制效率公式的权重。
  3. 量化为百分制 – 如果需要更直观,可将效率归一化到 0-100。
    from sklearn.preprocessing import MinMaxScaler
    scaler = MinMaxScaler(feature_range=(0, 100))
    team_eff['efficiency_scaled'] = scaler.fit_transform(team_eff[['efficiency']])
  4. 时间序列 – 可以统计每场比赛或每阶段的效率变化,用于分析趋势。

总结输出

通过上述 Python 案例,你可以:

  • 量化球队/球员在进攻三区的产出效率(得分、关键传球、射门转化)。
  • 用热力图定位核心进攻区域
  • 结合预期进球模型做更精准的评估。

如果你需要我帮你针对特定格式的数据(如 CSV 或 JSON 格式的事件流)编写完整脚本,请提供示例数据结构和字段说明。

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