射门质量与xG差异原因分析
下面给你一份可直接套用的分析框架 + Python脚本,用于诊断"球员/球队实际进球 vs 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 球",按脚本输出判断:
- 数量效应大 → 他射门多(球队喂球多/位置靠前),不是终结特别好;
- 质量效应大 → 他总在好位置射门(跑位/战术创造),可持续;
- 终结效应大且每射xG正常 → 纯终结能力或运气,看样本量:<50射慎信,>100射可信度高;
- 转化率异常高但xG低 → 远射/世界波,大概率回归。
注意事项(避免踩坑)
- 样本量:单赛季 <30 射的"进球−xG"噪声极大,至少 2–3 赛季或用贝叶斯收缩。
- xG模型差异:不同数据商(StatsBomb/Opta/FBref)xG不同,别混用。
- 点球:通常单独剔除,否则扭曲终结指标。
- 防守压力/门将质量:基础xG未完全包含,进阶可用 post-shot xG(PSxG)区分"射门质量"与"门将扑救"。
需要我把脚本改成适配你现有数据字段的版本(FBref/Understat 导出格式),或加上可视化(四象限散点图)吗?告诉我数据来源即可。