python案例如何量化防守反击的效率值?

wen python案例 4

本文目录导读:

python案例如何量化防守反击的效率值?

  1. 基础模型:进球效率法(最简单)
  2. 进阶模型:加权评分法(最常用)
  3. 高级模型:期望进球值模型
  4. 实战建议:如何选择模型?
  5. 一个合二为一的完整脚本示例(带异常处理)

基础模型:进球效率法(最简单)

这个方法只关注防守反击的最终结果,是“结果导向”的量化。

公式:

[ 防守反击效率值 = \frac{防守反击进球数}{防守反击总次数} \times 100\% ]

Python 案例:

# 假设一场比赛的数据
data = {
    "反击次数": 12,
    "反击射正次数": 5,
    "反击进球数": 2
}
# 计算反击终结率(射正率)
finishing_rate = data["反击进球数"] / data["反击次数"] * 100
print(f"防守反击效率值:{finishing_rate:.2f}%")

局限性: 没有考虑防守阶段和推进过程的难度,只看进球。


进阶模型:加权评分法(最常用)

该模型将反击拆分为三个核心阶段,并为每个阶段打分,最后汇总为一个综合“效率值”(0-100分)。

核心指标分解:

  1. 防守成功率(40%):防守成功次数 / 防守尝试次数(抢断、拦截、解围的总和)。
  2. 推进效率(30%):成功推进到前场或禁区的次数 / 反击发起总次数。
  3. 终结效率(30%):射正次数 / 射门次数(或进球数 / 反击总数)。

权重可以根据教练战术风格调整。 快速反击打法可能更看重推进效率。

Python 案例:

import numpy as np
# 模拟一场比赛的统计数据
match_stats = {
    'defensive_attempts': 40,      # 防守尝试次数(抢断+拦截+解围)
    'defensive_success': 28,       # 防守成功次数
    'counter_start': 15,           # 成功断球后发起的反击总次数
    'counter_advance': 8,          # 推进到进攻三区或完成传中的次数
    'counter_shots': 6,            # 反击中的射门次数
    'counter_on_target': 4         # 射正次数
}
# 1. 计算防守成功率
def defensive_success_rate(stats):
    return stats['defensive_success'] / stats['defensive_attempts']
# 2. 计算推进成功率
def advance_rate(stats):
    return stats['counter_advance'] / stats['counter_start']
# 3. 计算射门转化率(射正率)
def shooting_accuracy(stats):
    return stats['counter_on_target'] / stats['counter_shots'] if stats['counter_shots'] > 0 else 0
# 4. 综合评分(满分100分)
def calculate_efficiency_score(stats):
    # 权重分配(可根据战术调整)
    w_defend = 0.4   # 防守
    w_advance = 0.3  # 推进
    w_shoot = 0.3    # 射门
    # 归一化到0-1范围,乘以权重
    defend_score = defensive_success_rate(stats) * w_defend * 100
    advance_score = advance_rate(stats) * w_advance * 100
    shoot_score = shooting_accuracy(stats) * w_shoot * 100
    total_score = defend_score + advance_score + shoot_score
    return round(total_score, 2)
# 输出结果
print("防守成功率:{:.1f}%".format(defensive_success_rate(match_stats)*100))
print("反击推进成功率:{:.1f}%".format(advance_rate(match_stats)*100))
print("反击射正率:{:.1f}%".format(shooting_accuracy(match_stats)*100))
print("综合防守反击效率值:{}分".format(calculate_efficiency_score(match_stats)))

高级模型:期望进球值模型

这是一个更科学的指标,通过考虑“反击发起位置”和“进攻速度”来计算每次反击的威胁程度(xG - Expected Goals)。

核心思路: 每次防守反击都有一个“期望进球值”(xG),效率值 = 实际进球数 - 期望进球数(或 xG 总和)。

Python 案例(数据模拟):

假设从本方半场(后场)发起反击,推进速度越快、射门距离越近,xG 值越高。

import pandas as pd
# 模拟5次防守反击事件
data = {
    'counter_id': [1, 2, 3, 4, 5],
    'start_position': ['deep', 'mid', 'deep', 'mid', 'deep'],  # 发起位置
    'ball_carries': [3, 2, 5, 1, 4],           # 向前传球/带球次数
    'pass_speed_s': [8, 10, 12, 6, 9],         # 反击完成时间(秒)
    'shot_result': [0, 1, 0, 0, 1],            # 是否进球(1=是)
    'shot_distance_m': [15, 12, 20, 18, 10]    # 射门距离(米)
}
df = pd.DataFrame(data)
# 简单 xG 模型(基于射门距离和推进时间)
def calculate_xg(row):
    # 距离越近,xG越高;时间越短(速度快),xG加成
    base_xg = 0.2 if row['shot_distance_m'] < 15 else 0.1
    speed_bonus = 0.05 if row['pass_speed_s'] < 9 else 0
    return min(base_xg + speed_bonus, 0.9)  # 最大xG为0.9
df['xg'] = df.apply(calculate_xg, axis=1)
# 计算效率值:实际进球 vs 期望进球
actual_goals = df['shot_result'].sum()
expected_goals = df['xg'].sum()
efficiency = actual_goals - expected_goals
print("每次反击的期望进球值 (xG):")
print(df[['counter_id', 'xg', 'shot_result']])
print(f"\n实际进球数:{actual_goals}")
print(f"累计期望进球数 (xG):{expected_goals:.2f}")
print(f"防守反击效率值(进球-期望):{efficiency:+.2f}")
# 如果效率值为正,说明你的反击在超额完成;如果为负,说明浪费了机会。

实战建议:如何选择模型?

  1. 有比赛录像数据源(无坐标数据):使用模型二(加权评分法),直观且容易跟教练沟通。
  2. 有追平跟踪数据(如 StatsBomb、Opta 的 xT/xG 数据):使用模型三(期望进球值模型),可以精确评估“机会创造质量”。
  3. 只想要一个 KPI 报表:使用模型一(基础模型),只统计“反击进球 / 反击次数”,方便进行赛季对比。

一个合二为一的完整脚本示例(带异常处理)

如果你想要一个可以直接运行的代码,这是一个融合了防守、推进、射门三个维度以及时间成本的综合评分函数:

def counter_attack_efficiency(attempts, successes, counters, final_third_entries, shots, on_target, goals, avg_time_sec=0):
    """
    计算防守反击综合效率值 (0-100)
    参数:
    attempts: 防守尝试次数
    successes: 防守成功次数
    counters: 反击发起次数
    final_third_entries: 进入进攻三区次数
    shots: 射门次数
    on_target: 射正次数
    goals: 进球数
    avg_time_sec: 平均反击耗时(秒),用于速度惩罚/奖励
    返回:
    效率值(float), 详情(dict)
    """
    # 防除零
    def safe_div(a, b):
        return a / b if b != 0 else 0
    defend_rate = safe_div(successes, attempts)
    advance_rate = safe_div(final_third_entries, counters)
    shoot_rate = safe_div(on_target, shots)
    goal_conversion = safe_div(goals, shots)
    # 综合评分(权重可调整)
    score = (
        defend_rate * 30 + 
        advance_rate * 25 + 
        shoot_rate * 25 + 
        goal_conversion * 20
    )
    # 速度惩罚:如果平均时间太长,扣分(假设>12秒扣5分)
    speed_penalty = 5 if avg_time_sec > 12 else 0
    final_score = max(0, 100 - speed_penalty + score * 1)  # 简单归一化
    details = {
        "防守成功率": f"{defend_rate:.1%}",
        "推进成功率": f"{advance_rate:.1%}",
        "射正率": f"{shoot_rate:.1%}",
        "进球转化率": f"{goal_conversion:.1%}",
        "速度惩罚": f"-{speed_penalty}分"
    }
    return round(final_score, 1), details
# 示例
if __name__ == "__main__":
    score, details = counter_attack_efficiency(
        attempts=45, 
        successes=32, 
        counters=18, 
        final_third_entries=9, 
        shots=7, 
        on_target=4, 
        goals=2, 
        avg_time_sec=10.5
    )
    print("防守反击效率评分:", score)
    print("明细:", details)

  • 如果仅用于赛后复盘,用模型二最实用。
  • 如果用于球员表现评估,用模型一或模型三(xG)更具说服力。
  • 如果用于战术实验,可以考虑在模型三中加入“反击路线”数据(边路/中路)。

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