综合实用脚本,射门质量与xG差异原因?

wen 实用脚本 4

射门质量与xG差异原因分析

下面给你一份可直接套用的分析框架 + Python脚本,用于诊断"球员/球队实际进球 vs xG 差异"到底来自哪里。

综合实用脚本,射门质量与xG差异原因?


先理清逻辑:xG差异的四个来源

实际进球 − xG 的差异,本质上来自四类因素:

来源 含义 可量化指标
① 射门数量 创造机会多少 射门数、射门/90
② 射门位置质量 射门点距球门远近、角度 平均射门距离、平均xG/射门
③ 射门选择 是否在该射时射、该传时传 射门转化率、射门占触球比
④ 终结能力 同样xG下的超额进球 进球−xG、超额进球/90

关键:xG本身已包含位置质量,进球−xG"只反映终结+运气,不反映射门选择好坏,要拆解差异,必须把①②③④分开看。


Python 分析脚本

假设你有一份射门级数据(每行一次射门),字段示例: player, team, xG, goal, distance, angle, body_part, shot_type, min

import pandas as pd
import numpy as np
# ---------- 1. 读取数据 ----------
df = pd.read_csv("shots.csv")
# 必需列:player, team, xG, goal, distance, angle
# ---------- 2. 球员级聚合 ----------
def player_profile(g):
    n = len(g)
    goals = g["goal"].sum()
    xg = g["xG"].sum()
    return pd.Series({
        "射门数": n,
        "进球": goals,
        "xG": round(xg, 2),
        "进球-xG": round(goals - xg, 2),
        "每射xG": round(xg / n, 3),          # 射门位置质量
        "平均距离": round(g["distance"].mean(), 1),
        "平均角度": round(g["angle"].mean(), 1),
        "转化率": round(goals / n, 3),        # 终结效率
        "超额进球/射门": round((goals - xg) / n, 3),
    })
prof = df.groupby(["player", "team"]).apply(player_profile).reset_index()
# ---------- 3. 差异归因:分解为"数量/质量/终结" ----------
# 用联赛均值做基准
lg_xg_per_shot = df["xG"].mean()
lg_conv = df["goal"].mean()
def decompose(r):
    n = r["射门数"]
    xg = r["xG"]
    goals = r["进球"]
    # 数量效应:射门数偏离带来的xG差(相对基准每射xG)
    qty = (n - df.groupby("player").size().mean()) * lg_xg_per_shot
    # 质量效应:射门位置质量偏离
    qual = n * (r["每射xG"] - lg_xg_per_shot)
    # 终结效应:超额进球
    finish = goals - xg
    return pd.Series({"数量效应": round(qty,2),
                      "质量效应": round(qual,2),
                      "终结效应": round(finish,2)})
prof = pd.concat([prof, prof.apply(decompose, axis=1)], axis=1)
# ---------- 4. 排序找出"被高估/低估"的球员 ----------
prof["实际-预期"] = prof["进球-xG"]
print(prof.sort_values("实际-预期", ascending=False).head(10))   # 超常终结
print(prof.sort_values("实际-预期").head(10))                    # 低于预期
# ---------- 5. 射门选择诊断(该射未射/滥射) ----------
# 若你有"是否射门"的事件数据,可计算:
#   射门占禁区内触球比 = 射门数 / 禁区内触球数
#   高比值 → 滥射;低比值 → 过度传球

四象限诊断法(实用决策表)

把球员放进 "每射xG(质量) × 进球−xG(终结)" 二维图:

象限 每射xG 进球−xG 解读 建议
右上 高 正 好位置+好终结 核心,围绕建队
左上 低 正 远射神准/运气好 警惕回归,别高估
右下 高 负 好机会浪费 可能运气差,会回升
左下 低 负 滥射+低效 减少低质量射门

差异归因的实用结论模板

对某球员"进球比xG多 5 球",按脚本输出判断:

  1. 数量效应大 → 他射门多(球队喂球多/位置靠前),不是终结特别好;
  2. 质量效应大 → 他总在好位置射门(跑位/战术创造),可持续;
  3. 终结效应大且每射xG正常 → 纯终结能力或运气,看样本量:<50射慎信,>100射可信度高;
  4. 转化率异常高但xG低 → 远射/世界波,大概率回归。

注意事项(避免踩坑)

  • 样本量:单赛季 <30 射的"进球−xG"噪声极大,至少 2–3 赛季或用贝叶斯收缩。
  • xG模型差异:不同数据商(StatsBomb/Opta/FBref)xG不同,别混用。
  • 点球:通常单独剔除,否则扭曲终结指标。
  • 防守压力/门将质量:基础xG未完全包含,进阶可用 post-shot xG(PSxG)区分"射门质量"与"门将扑救"。

需要我把脚本改成适配你现有数据字段的版本(FBref/Understat 导出格式),或加上可视化(四象限散点图)吗?告诉我数据来源即可。

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