本文目录导读:

量化进攻三区(通常指足球或篮球中距离球门或篮筐最近的区域,如足球的“进攻三区”指前场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 格式的事件流)编写完整脚本,请提供示例数据结构和字段说明。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播