python案例如何评估教练换人得分能力?

wen python案例 2

本文目录导读:

python案例如何评估教练换人得分能力?

  1. 方案一:基于“直接参与”的简单统计(入门级)
  2. 方案二:引入“预期进球(xG)”和“时间切片”(进阶版)
  3. 方案三:引入“机器学习模型”和“反事实推理”(高级版)
  4. 总结与实用建议

在足球数据分析中,评估教练的“换人得分能力”是一个比较精细的课题,最简单的定义是:通过换人,教练是否改变了球队的进攻效率或直接带来了进球/助攻。

这里给出一个从简单到复杂的Python案例实现思路,假设你已经拥有包含球员进出场时间进球时间的比赛数据。


基于“直接参与”的简单统计(入门级)

核心逻辑:统计替补球员在上场后,球队的总进球数以及替补球员的直接参与数(进球+助攻)。

示例数据:假设我们有一场模拟比赛(用字典模拟):

# 模拟一场比赛的事件流
events = [
    {"minute": 10, "type": "goal", "team": "A", "player": "首发前锋"},
    {"minute": 25, "type": "sub_in", "team": "A", "player": "替补奇兵", "out": "中场核心"},
    {"minute": 30, "type": "goal", "team": "A", "player": "替补奇兵"},  # 替补进球了
    {"minute": 45, "type": "sub_in", "team": "A", "player": "新任边锋", "out": "边后卫"},
    {"minute": 55, "type": "goal", "team": "A", "player": "首发前锋"},  # 这个进球与换人无关(或者说是新边锋拉开空间?这里先不算)
    {"minute": 70, "type": "sub_in", "team": "A", "player": "秘密武器", "out": "另一中场"},
    {"minute": 85, "type": "goal", "team": "A", "player": "秘密武器"}  # 又是替补进球
]
# 计算教练换人的“得分贡献”
goals_after_sub = 0
sub_goal_assist = 0
# 记录最后一名替补上场的时间
last_sub_time = 0
for event in events:
    if event["type"] == "sub_in":
        last_sub_time = event["minute"]
    if event["type"] == "goal" and event["minute"] > last_sub_time:
        goals_after_sub += 1
        if event["player"] in ["替补奇兵", "新任边锋", "秘密武器"]:
            sub_goal_assist += 1
print(f"换人后球队总进球数: {goals_after_sub}")
print(f"替补直接参与进球数: {sub_goal_assist}")
print(f"换人有效率: {sub_goal_assist / goals_after_sub:.2f}" if goals_after_sub > 0 else "无进球")

引入“预期进球(xG)”和“时间切片”(进阶版)

单纯算进球太依赖于运气,更科学的评估是看换人前后,球队进攻质量的提升

核心逻辑:将比赛按时间切片,计算每个时间段的 射门次数射正率xG(预期进球值),然后对比“换人前30分钟”和“换人后30分钟”的进攻数据。

步骤:

  1. 数据准备:拥有每场比赛的射门事件(包含时间、xG值)和换人事件
  2. 逻辑:找到每次换人时间点,计算该换人事件前后(比如前后10分钟)球队的xG差值。
  3. 归因:把xG的正向变化归功于教练的这次换人(值越大,说明换人越有效)。
import pandas as pd
# 构造数据:一场比赛的射门数据
shot_data = {
    'minute': [12, 25, 40, 55, 70, 82, 88],
    'xG': [0.1, 0.3, 0.05, 0.6, 0.2, 0.8, 0.4],
    'team': ['A'] * 7
}
shots = pd.DataFrame(shot_data)
# 构造换人数据(假设第60分钟换人)
sub_minute = 60
# 计算换人前后的 xG 对比
before_sub = shots[shots['minute'] < sub_minute]['xG'].sum()
after_sub = shots[shots['minute'] > sub_minute]['xG'].sum()
# 归一化:按每分钟平均xG计算(因为换人后的时间更长)
minutes_before = sub_minute  # 假设从0分钟开始
minutes_after = 90 - sub_minute
xg_per_min_before = before_sub / minutes_before
xg_per_min_after = after_sub / minutes_after
print(f"换人前平均每分钟xG: {xg_per_min_before:.3f}")
print(f"换人后平均每分钟xG: {xg_per_min_after:.3f}")
impact_score = xg_per_min_after - xg_per_min_before
print(f"教练换人带来的进攻效率提升: {impact_score:.3f} xG/分钟")

引入“机器学习模型”和“反事实推理”(高级版)

这是目前足球分析公司(如Opta、StatsBomb)使用的黄金标准方法论。

核心逻辑:试着回答“如果不换这个人,比赛会怎样?” 方法:构建一个进球预测模型(基于场上控球率、跑动距离、球员体力值等),然后计算在同一场比赛中,实际上的进球数与模型预测的进球数(如果没人被换下)之间的差值,这个差值就是教练“换人”的因果效应。

简化伪代码示例:

# 假设我们有一个训练好的模型: predict_goals(team_stats) -> 返回进球概率
# 在比赛第60分钟,教练换人了。
# 1. 计算实际上场球员的最终比分
actual_score = 2
# 2. 提取换人后的真实比赛数据切片 (如第60-90分钟)
real_stats_after_sub = {"possession": 65, "shots": 8, "pass_accuracy": 88}
# 3. 提取换人前的数据,用来预测如果不换人(用同样的首发继续踢)会怎样?
# 关键:用“未换人”的替补球员的历史表现数据来填充模型
# 这里用之前的平均表现代替
counterfactual_stats = {"possession": 55, "shots": 5, "pass_accuracy": 82}
# 4. 预测两个值
predicted_actual = predict_goals(real_stats_after_sub)  # 0.8 个期望进球
predicted_no_change = predict_goals(counterfactual_stats)  # 0.3 个期望进球
# 5. 差值就是教练换人的“得分贡献”
coach_impact = predicted_actual - predicted_no_change
print(f"教练的换人贡献了约 {coach_impact:.1f} 个期望进球")

总结与实用建议

方案 适用人群 优缺点
方案一(计数统计) 业余爱好者、简单复盘 优点:容易实现,直观懂。缺点:受运气影响大,无法排除球员个人能力因素。
方案二(时间切片) 进阶分析师 优点:剔除了比赛时间长度的影响,比单纯看进球更专业。缺点:忽略了对手防守变化和红黄牌影响。
方案三(机器学习) 专业数据团队 优点:真正的“因果推断”,能定量评估。缺点:需要大量数据(球员跑动、体能),建模难度高,容易过拟合。

实战建议:对于普通Python数据分析师,推荐方案二,因为它只需要 pandas 和基础的shooting数据就能完成,而且逻辑自洽。

如果你有现成的CSV或Excel数据(包含射门时间、xG值、换人时间),可以把代码改成读取文件即可使用,需要我帮你写一个读取真实数据文件的版本吗?

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