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

wen python案例 4

本文目录导读:

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

  1. 第一步:定义核心概念(模型假设)
  2. 第二步:Python代码实战(案例)
  3. 第三步:代码解释与业务逻辑
  4. 第四步:进阶优化(可选)

量化“进攻三区效率值”是足球数据分析中非常核心的指标,通常指球队或个人在对方禁区前沿30米区域(进攻三区)内完成进攻的产出投入之比。

最直接、可落地的量化模型是期望威胁(Expected Threat, xT)模型和进球期望(xG)模型,但如果你需要基于案例实战实现,可以从简化版的“加权评分模型”入手。

以下是一个量化进攻三区效率值的完整Python实战案例,包含数据模拟、核心算法和可视化。


第一步:定义核心概念(模型假设)

我们定义“进攻三区效率值” ( E ) 为: [ E = \frac{(w_1 \cdot \text{射门得分产出}) + (w_2 \cdot \text{关键传球产出}) + (w_3 \cdot \text{成功突破产出})}{\text{进攻回合的总控球时间或传控次数}} ]

权重设定(可根据联赛风格调整):

  • 射正/进球:得分产出,权重最高(如 ( w_1 = 3 ))
  • 关键传球(形成射门的传球):威胁产出(( w_2 = 2 ))
  • 成功进入禁区的盘带或传中:推进产出(( w_3 = 1 ))

分母:该队在该场比赛中进入进攻三区的有效触球次数(或控球回合数)。


第二步:Python代码实战(案例)

我们将模拟一支球队(如利物浦)在最近5场比赛中的进攻数据,计算其效率值。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 1. 模拟数据:进攻三区内的关键行为统计
data = {
    '比赛': ['vs 曼联', 'vs 曼城', 'vs 阿森纳', 'vs 切尔西', 'vs 热刺'],
    '进攻三区触球次数': [150, 165, 140, 158, 180],  # 分母
    '射门次数': [18, 22, 15, 20, 25],
    '射正次数': [6, 9, 4, 7, 11],
    '进球数': [2, 3, 1, 2, 4],
    '关键传球次数': [12, 15, 10, 14, 18],
    '成功突破进入禁区次数': [8, 10, 6, 9, 12]
}
df = pd.DataFrame(data)
# 2. 定义权重(依据对进球贡献度)
weights = {
    'w_goal': 3.5,      # 进球权重
    'w_shot_on_target': 1.0,  # 射正权重(本身是威胁)
    'w_key_pass': 1.5,   # 关键传球权重
    'w_penetration': 0.8 # 突破进入禁区权重
}
# 3. 计算产出分(得分)
def calculate_output(row, w):
    output_score = (row['进球数'] * w['w_goal'] 
                    + row['射正次数'] * w['w_shot_on_target'] 
                    + row['关键传球次数'] * w['w_key_pass'] 
                    + row['成功突破进入禁区次数'] * w['w_penetration'])
    # 补充:射门但未射正的轻微惩罚或低贡献
    return output_score
df['产出总分'] = df.apply(lambda row: calculate_output(row, weights), axis=1)
# 4. 计算进攻三区效率值(每触球单位的产出)
df['进攻三区效率值'] = df['产出总分'] / df['进攻三区触球次数']
# 5. 输出结果
print("=== 球队进攻三区效率分析 ===")
print(df[['比赛', '进攻三区触球次数', '产出总分', '进攻三区效率值']].to_string(index=False))
# 6. 可视化对比
fig, ax = plt.subplots(1, 2, figsize=(12,5))
# 左图:产出分与触球次数
ax[0].bar(df['比赛'], df['产出总分'], color='skyblue', label='产出总分')
ax[0].set_title('进攻产出总分')
ax[0].set_ylabel('得分')
ax[0].tick_params(axis='x', rotation=45)
# 右图:效率值对比
ax[1].bar(df['比赛'], df['进攻三区效率值'], color='lightcoral')
ax[1].set_title('进攻三区效率值(产出/触球次数)')
ax[1].set_ylabel('效率值')
ax[1].tick_params(axis='x', rotation=45)
plt.tight_layout()
plt.show()
# 7. 实时评价
max_efficiency_game = df.loc[df['进攻三区效率值'].idxmax()]
print(f"\n效率最高场比赛: {max_efficiency_game['比赛']},效率值: {max_efficiency_game['进攻三区效率值']:.4f}")
print("解读:每在进攻三区触球100次,可产出的得分指数为", round(max_efficiency_game['进攻三区效率值']*100,2))

第三步:代码解释与业务逻辑

  1. 什么是“产出”

    • 进球是最高产出(权重3.5),因为它直接决定比赛结果。
    • 射正代表有威胁的射门,但未进球,权重1.0。
    • 关键传球(导致射门的传球)权重1.5,因为它是破门的前置环节。
    • 突破进入禁区代表撕开防线,权重0.8。
  2. 为什么用“触球次数”做分母

    • 不同比赛风格不同(比如巴萨控球多,利物浦反击快),单纯比较绝对产出不公平。
    • 使用 “进入进攻三区的有效触球次数” 作为分母,衡量的是转化率,即每次进入危险区域能制造多少威胁。
  3. 进阶:归一化(Z-score)

    后续可以对不同球队的效率值进行标准化(减均值除标准差),以进行横向对比。


第四步:进阶优化(可选)

如果想要更科学的模型,可以将上面的线性加权替换为 机器学习模型

  • 目标变量:是否进球(0/1)
  • 特征:传中次数、直塞次数、射门位置角度、防守压力距离等
  • 输出:每个区域内动作的 威胁概率,累加成总威胁值(即xT模型)。

如果想了解具体怎么实现,可以继续追问,上面的案例已经可以让你快速跑通统计逻辑,并在比赛中量化出高效的进攻模式(比如是射门转化高还是突破转化高)。

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