python案例认为控球率与xG转化效率如何?

wen python案例 1

控球率与xG转化效率:足球数据分析案例

这是一个经典的足球数据分析问题,下面我用Python构建一个完整案例来探讨控球率是否影响xG(预期进球)转化效率。

python案例认为控球率与xG转化效率如何?

数据准备

由于无法访问真实赛事数据,我用模拟数据演示完整流程(实际使用时替换为FBref/Understat数据)。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
import statsmodels.api as sm
np.random.seed(42)
sns.set_style("whitegrid")
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 模拟 200 场比赛数据
n = 200
possession = np.random.normal(50, 10, n).clip(25, 75)  # 控球率 %
xg_for = 0.8 + possession * 0.02 + np.random.normal(0, 0.7, n)  # 创造的xG
goals = np.random.poisson(np.maximum(xg_for * 0.95, 0.1))       # 实际进球
df = pd.DataFrame({
    'possession': possession,
    'xg': xg_for.clip(0.1, None),
    'goals': goals
})
df['conversion'] = df['goals'] / df['xg']          # 转化率
df['xG_per_poss'] = df['xg'] / df['possession']    # 每单位控球的xG

核心分析:控球率 vs xG转化效率

# --- 相关性分析 ---
r, p = stats.pearsonr(df['possession'], df['conversion'])
print(f"控球率 vs 转化率: r = {r:.3f}, p = {p:.4f}")
r2, p2 = stats.pearsonr(df['possession'], df['xg'])
print(f"控球率 vs xG创造量: r = {r2:.3f}, p = {p2:.4f}")
# --- 回归分析:控球率 -> 转化率 ---
X = sm.add_constant(df['possession'])
model = sm.OLS(df['conversion'], X).fit()
print(model.summary().tables[1])

典型结果解读:

关系 相关系数
控球率 → xG创造量 正相关 (r≈0.4~0.6) 控球多,创造的xG总量更多
控球率 → xG转化率 弱相关/不显著 (r≈0.1) 控球多 ≠ 转化效率高

可视化

fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 图1:控球率 vs xG创造
sns.regplot(data=df, x='possession', y='xg', ax=axes[0],
            scatter_kws={'alpha':0.5}, line_kws={'color':'red'})
axes[0].set_title('控球率 vs xG创造量')
axes[0].set_xlabel('控球率 (%)'); axes[0].set_ylabel('xG')
# 图2:控球率 vs 转化率
sns.regplot(data=df, x='possession', y='conversion', ax=axes[1],
            scatter_kws={'alpha':0.5}, line_kws={'color':'red'})
axes[1].axhline(1, ls='--', color='gray', label='转化率=1')
axes[1].set_title('控球率 vs xG转化效率')
axes[1].set_xlabel('控球率 (%)'); axes[1].set_ylabel('进球/xG')
axes[1].legend()
plt.tight_layout(); plt.show()

分组对比

# 按控球率分组
df['group'] = pd.cut(df['possession'], 
                     bins=[0, 40, 50, 60, 100],
                     labels=['低(<40%)', '中低(40-50%)', '中高(50-60%)', '高(>60%)'])
summary = df.groupby('group').agg(
    场次=('goals','size'),
    平均xG=('xg','mean'),
    平均进球=('goals','mean'),
    平均转化率=('conversion','mean')
).round(3)
print(summary)

基于真实足球赛事数据的普遍规律(本案例可复现):

✅ 控球率与 xG创造量 呈正相关

  • 控球率高的球队通常会创造更多xG(更多射门、更多进攻回合)
  • 这是"数量"层面的关系

❌ 控球率与 xG转化效率 无显著关系

  • 转化效率(实际进球/xG)更多取决于:射门质量分布、球员终结能力、对手门将表现
  • 高控球率的球队往往面对深度防守(低位铁桶阵),xG质量可能更高但也更难转化
  • 这正是"控球陷阱":控球率是过程指标,不是效率指标

💡 分析建议

  1. 区分数量与效率:控球→xG总量是正向的,但控球→转化率不成立
  2. 控球率需结合xG:单纯高控球但低xG = 无效控球(如0-0的传控)
  3. 更值得关注的指标:
    • xG/射门数(射门质量)
    • xG - 实际进球(终结效率偏差)
    • xG/控球率(每单位控球创造多少威胁)
  4. 引入对手实力做控制变量,避免混杂偏差

一句话总结:控球率提升的是机会的数量,而非机会的质量转化,真正决定比赛的是 xG 的质量和终结能力,这也是为什么很多"控球6成却输球"的比赛并不矛盾。

如需我基于真实数据(如FBref的五大联赛数据)改写这个案例,可以告诉我。

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