本文目录导读:

量化进攻三区(通常指足球或篮球中距离球门或篮筐最近的区域,如足球的“进攻三区”指前场35米区域,或篮球的“进攻三区”指三分线内区域)的效率值,核心是衡量球队或个人在该区域创造机会和转化为得分的能力。
以下是一个基于Python的量化案例框架,适用于足球和篮球,我会以足球进攻三区为例(因为概念更典型),并提供可复用的代码逻辑。
核心量化指标定义
进攻三区效率值可以分解为以下几个维度:
- 进入三区次数 – 球队成功将球推进到前场35米区域的频率。
- 关键传球 / 射门转化 – 在三区内传出形成射门的传球次数。
- 射门效率 – 三区内的射门次数、射正率、进球率。
- 预期进球 (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()
实际应用注意事项
- 数据粒度 – 最好使用逐帧事件数据(如 Opta、StatsBomb 格式),包含 x/y 坐标和子事件标签。
- 权重调整 – 行业里有标准 xG 模型,但你可以根据业务定制效率公式的权重。
- 量化为百分制 – 如果需要更直观,可将效率归一化到 0-100。
from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler(feature_range=(0, 100)) team_eff['efficiency_scaled'] = scaler.fit_transform(team_eff[['efficiency']])
- 时间序列 – 可以统计每场比赛或每阶段的效率变化,用于分析趋势。
总结输出
通过上述 Python 案例,你可以:
- 量化球队/球员在进攻三区的产出效率(得分、关键传球、射门转化)。
- 用热力图定位核心进攻区域。
- 结合预期进球模型做更精准的评估。
如果你需要我帮你针对特定格式的数据(如 CSV 或 JSON 格式的事件流)编写完整脚本,请提供示例数据结构和字段说明。