本文目录导读:

基础模型:进球效率法(最简单)
这个方法只关注防守反击的最终结果,是“结果导向”的量化。
公式:
[ 防守反击效率值 = \frac{防守反击进球数}{防守反击总次数} \times 100\% ]
Python 案例:
# 假设一场比赛的数据
data = {
"反击次数": 12,
"反击射正次数": 5,
"反击进球数": 2
}
# 计算反击终结率(射正率)
finishing_rate = data["反击进球数"] / data["反击次数"] * 100
print(f"防守反击效率值:{finishing_rate:.2f}%")
局限性: 没有考虑防守阶段和推进过程的难度,只看进球。
进阶模型:加权评分法(最常用)
该模型将反击拆分为三个核心阶段,并为每个阶段打分,最后汇总为一个综合“效率值”(0-100分)。
核心指标分解:
- 防守成功率(40%):防守成功次数 / 防守尝试次数(抢断、拦截、解围的总和)。
- 推进效率(30%):成功推进到前场或禁区的次数 / 反击发起总次数。
- 终结效率(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}")
# 如果效率值为正,说明你的反击在超额完成;如果为负,说明浪费了机会。
实战建议:如何选择模型?
- 有比赛录像数据源(无坐标数据):使用模型二(加权评分法),直观且容易跟教练沟通。
- 有追平跟踪数据(如 StatsBomb、Opta 的 xT/xG 数据):使用模型三(期望进球值模型),可以精确评估“机会创造质量”。
- 只想要一个 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)更具说服力。
- 如果用于战术实验,可以考虑在模型三中加入“反击路线”数据(边路/中路)。