python案例认为补时长短会影响进球概率吗?

wen python案例 3

本文目录导读:

python案例认为补时长短会影响进球概率吗?

  1. 分析思路
  2. Python 实现
  3. 结论解读
  4. 真实数据获取

这是一个很有意思的足球数据分析问题,我来用Python做一个完整的案例分析,探讨补时长短是否会影响进球概率。

分析思路

核心问题:补时时间越长,进球概率是否越高?

需要区分两种情况:

  1. 补时阶段本身的进球(补时越长,补时内进球机会越多)
  2. 补时长短作为比赛特征的代理变量(补时长的比赛往往更激烈/换人更多/伤停更多)

Python 实现

import numpy as np
import pandas as pd
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns
np.random.seed(42)
# ============ 1. 构造模拟数据 ============
# 现实中你需要从 football-data.co.uk / Opta / FBref 等获取真实数据
# 这里模拟 1000 场比赛,包含补时分钟数与补时阶段进球数
n_matches = 1000
# 补时长短本身受多种因素影响(换人、伤病、VAR、比分差距等)
# 模拟:补时基础 3 分钟 + 随机波动
added_time = np.random.gamma(shape=6, scale=0.6, size=n_matches)  # 均值约 3.6 分钟
added_time = np.clip(added_time, 1, 12)
# 关键建模:补时阶段进球数 ~ 泊松分布
# 假设基础进球率 ~0.15 球/分钟(补时阶段通常进攻更激进)
# 但补时长短与比赛激烈程度相关,激烈比赛进球率也更高
intensity = np.random.beta(2, 5, size=n_matches)  # 比赛激烈程度
# 进球率(每补时分钟的期望进球数)
base_rate = 0.10
rate_per_min = base_rate + 0.08 * intensity
# 补时阶段进球数(泊松)
goals_in_added_time = np.random.poisson(rate_per_min * added_time)
df = pd.DataFrame({
    'added_time': added_time,
    'intensity': intensity,
    'goals_added_time': goals_in_added_time,
})
print(df.describe())
print(f"\n补时阶段的平均进球数: {df.goals_added_time.mean():.3f}")
print(f"补时阶段有进球的比赛比例: {(df.goals_added_time > 0).mean():.1%}")
# ============ 2. 分组对比 ============
df['added_bin'] = pd.cut(df.added_time, 
                          bins=[0, 3, 4, 5, 6, 20],
                          labels=['≤3', '3-4', '4-5', '5-6', '>6'])
summary = df.groupby('added_bin', observed=True).agg(
    n=('goals_added_time', 'size'),
    mean_goals=('goals_added_time', 'mean'),
    p_any_goal=('goals_added_time', lambda x: (x > 0).mean()),
).round(3)
print("\n按补时时长分组:")
print(summary)
# ============ 3. 统计检验 ============
# (a) 相关性:补时长短 vs 补时进球数
r, p = stats.pearsonr(df.added_time, df.goals_added_time)
print(f"\nPearson 相关 (补时长度 vs 补时进球): r={r:.3f}, p={p:.4f}")
# (b) 卡方检验:补时长短是否影响"是否进球"
contingency = pd.crosstab(df.added_bin, df.goals_added_time > 0)
chi2, p_chi, dof, _ = stats.chi2_contingency(contingency)
print(f"卡方检验: chi2={chi2:.2f}, p={p_chi:.4f}")
# (c) 泊松回归(更合适的模型)
import statsmodels.api as sm
X = sm.add_constant(df[['added_time']])
model = sm.GLM(df.goals_added_time, X, family=sm.families.Poisson()).fit()
print("\n泊松回归结果:")
print(model.summary().tables[1])
print(f"补时每分钟的进球系数: {model.params['added_time']:.3f}")
print(f"IRR (每多1分钟补时,进球率倍数): {np.exp(model.params['added_time']):.3f}")
# ============ 4. 可视化 ============
fig, axes = plt.subplots(1, 3, figsize=(15, 4))
# 散点 + 趋势
axes[0].scatter(df.added_time + np.random.normal(0,0.1,len(df)), 
                df.goals_added_time + np.random.normal(0,0.05,len(df)), 
                alpha=0.2, s=10)
axes[0].set_xlabel('补时分钟'); axes[0].set_ylabel('补时阶段进球数')
axes[0].set_title(f'补时长度 vs 补时进球 (r={r:.2f})')
# 分组的进球率
summary['p_any_goal'].plot(kind='bar', ax=axes[1], color='steelblue')
axes[1].set_xlabel('补时区间'); axes[1].set_ylabel('至少1球概率')
axes[1].set_title('各补时区间进球概率'); axes[1].tick_params(axis='x', rotation=0)
# 泊松回归预测
xs = np.linspace(1, 10, 100)
pred = model.predict(sm.add_constant(pd.DataFrame({'added_time': xs})))
axes[2].plot(xs, pred, 'r-', label='泊松回归拟合')
axes[2].bar(summary.index, summary.mean_goals, alpha=0.5, label='实际均值')
axes[2].set_xlabel('补时分钟'); axes[2].set_ylabel('期望进球数')
axes[2].set_title('泊松回归: 补时长度对进球的影响'); axes[2].legend()
plt.tight_layout()
plt.savefig('added_time_analysis.png', dpi=100)
plt.show()

结论解读

补时长短是否影响进球概率":答案是——

✅ 影响补时阶段"内的"进球

补时越长,"补时内进球机会"越多,这几乎必然成立(暴露时间变长),泊松回归的 IRR 系数通常是显著大于1的。

⚠️ 但有重要的混淆因素需要控制

  1. 逆向因果:补时长往往是因为比赛激烈、有更多VAR/换人/伤病/冲突才延长的,而非补时长导致进球。
  2. 代理变量问题:补时长短本身反映了比赛特征(强度、落后方施压、换人拖延),这些才是影响进球的真正因素。
  3. 比赛阶段效应:补时阶段球员体能下降、落后方全线压上,本身进球率就高("补时绝杀"效应),这与补时长短区分开才有意义。

📊 严谨的分析建议

  • 用泊松/负二项回归而非线性回归(进球数是计数数据)
  • 控制混淆变量:比分差距、射门数、球队实力、主客场
  • 区分"补时内进球"与"整场进球"—补时长短对全场进球的影响会弱得多
  • 因果推断时考虑工具变量或断点回归(如补时规则变化)

真实数据获取

# 真实数据来源推荐:
# - football-data.co.uk(免费CSV)
# - FBref (StatsBomb/OPTA数据)
# - Understat (xG数据)
# - API-Football
# 示例:从 football-data 读取
# url = "https://www.football-data.co.uk/mmz4281/2324/E0.csv"
# df = pd.read_csv(url)
# 但需解析 FTHG/FTAG 以及分钟级进球时间(需其他数据源)

从统计上,补时长短与"补时阶段进球数"呈正相关(因为暴露时间长),但这更多是时间暴露效应而非因果效应;要回答"补时长短是否提高了单分钟进球率"需要控制比赛特征,真实案例分析强烈建议用真实赛事数据而非模拟数据验证。

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