python案例复盘称主力伤退影响有多大?

wen python案例 1

本文目录导读:

python案例复盘称主力伤退影响有多大?

  1. 分析思路
  2. 可运行代码模板
  3. 如何解读结果
  4. 如果你有真实数据

这个问题涉及用Python做案例复盘,分析“主力伤退”的影响,由于你没有提供具体数据,我先给你一个完整的分析框架和可运行代码模板,你可以把真实数据替换进去,下面以体育赛事(如篮球/足球)为例,因为“主力伤退”最常见于这个场景。


分析思路

要量化“主力伤退影响有多大”,核心是对比:

  1. 有主力 vs 无主力 时球队表现差异(得分、失分、胜率等)
  2. 伤退前后 的时间序列变化(中断分析)
  3. 控制其他变量(对手强弱、主客场)后的净效应

常用方法:

  • 描述性统计对比(均值、胜率)
  • 双重差分(DID)思想:伤退组 vs 对照组
  • 中断时间序列(ITS)
  • 可视化:伤退前后趋势图

可运行代码模板

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
# ========== 1. 构造示例数据(替换为你的真实数据) ==========
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=40, freq='3D')
df = pd.DataFrame({
    'date': dates,
    'opponent_strength': np.random.uniform(0.3, 1.0, 40),  # 对手强度
    'home': np.random.randint(0, 2, 40),                   # 主客场
})
# 假设第20场开始主力伤退
df['star_out'] = (np.arange(40) >= 20).astype(int)
# 模拟球队得分:主力在时基础分更高
base = 100 + 8 * df['home'] - 10 * df['opponent_strength']
df['points'] = base + np.where(df['star_out']==1, -6, 0) + np.random.normal(0, 5, 40)
df['points_allowed'] = 100 + 10 * df['opponent_strength'] + np.random.normal(0, 5, 40)
df['win'] = (df['points'] > df['points_allowed']).astype(int)
df['margin'] = df['points'] - df['points_allowed']
print(df.head())
# ========== 2. 描述性对比 ==========
summary = df.groupby('star_out').agg(
    场次=('win','size'),
    场均得分=('points','mean'),
    场均失分=('points_allowed','mean'),
    场均净胜分=('margin','mean'),
    胜率=('win','mean')
).round(2)
print("\n===== 主力在场 vs 伤退 对比 =====")
print(summary)
# ========== 3. 简单回归:控制对手强度和主客场 ==========
import statsmodels.api as sm
X = sm.add_constant(df[['star_out','opponent_strength','home']])
model = sm.OLS(df['margin'], X).fit()
print("\n===== 回归结果(净胜分 ~ 伤退 + 控制变量) =====")
print(model.summary())
# 伤退的净效应
coef = model.params['star_out']
pval = model.pvalues['star_out']
print(f"\n主力伤退对净胜分的净影响: {coef:.2f} 分 (p={pval:.4f})")
# ========== 4. 可视化:伤退前后趋势 ==========
fig, axes = plt.subplots(2, 1, figsize=(10, 8), sharex=True)
axes[0].plot(df['date'], df['margin'], 'o-', label='净胜分')
axes[0].axvline(df.loc[df['star_out']==1,'date'].iloc[0], color='red', ls='--', label='主力伤退')
axes[0].set_ylabel('净胜分'); axes[0].legend(); axes[0].set_title('伤退前后净胜分走势')
# 滚动胜率
df['roll_win'] = df['win'].rolling(5, min_periods=1).mean()
axes[1].plot(df['date'], df['roll_win'], 'o-', color='green')
axes[1].axvline(df.loc[df['star_out']==1,'date'].iloc[0], color='red', ls='--')
axes[1].set_ylabel('5场滚动胜率'); axes[1].set_title('伤退前后胜率走势')
plt.tight_layout()
plt.savefig('star_out_impact.png', dpi=120)
plt.show()
# ========== 5. 中断时间序列(ITS)简化版 ==========
df['time'] = np.arange(len(df))
df['post'] = df['star_out']
df['time_after'] = df['time'] * df['post']
X_its = sm.add_constant(df[['time','post','time_after','opponent_strength','home']])
its = sm.OLS(df['margin'], X_its).fit()
print("\n===== 中断时间序列(ITS) =====")
print(f"伤退瞬时效应: {its.params['post']:.2f} 分 (p={its.pvalues['post']:.4f})")
print(f"伤退后趋势变化: {its.params['time_after']:.2f} 分/场 (p={its.pvalues['time_after']:.4f})")

如何解读结果

指标 含义
描述性对比 伤退后场均净胜分下降多少、胜率跌多少
回归系数 star_out 控制对手强度、主客场后的净效应,比简单对比更可信
ITS 的 post 伤退当场的瞬时冲击
ITS 的 time_after 伤退后球队是否逐渐适应(系数接近0说明适应了)

关键提醒:

  • 样本量小(如只有几场伤退)时,p值不稳定,要谨慎下结论
  • 要控制对手强度,否则“伤退后连遇强队”会高估影响
  • 若能找到同期的对照组(如其他球队同期表现),可用DID进一步剔除赛季整体趋势

如果你有真实数据

把你的数据整理成类似结构(每场一行,含日期、得分、失分、胜负、主力是否出战、对手强度等),直接替换上面 df 的构造部分即可。

如果你能告诉我:

  1. 具体是什么运动/场景(篮球、足球、电竞?)
  2. 数据字段有哪些
  3. 样本量大概多少

我可以帮你把代码改成贴合你数据的版本,并给出针对性的复盘结论写法。

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

友情链接攻略窝 · 礼包窝 · 配置窝 · 换算窝 · 算法窝 · 查文窝 · 手册窝 · 问答窝 · 全文搜 · 手册库
相关站点礼包窝 · 查文窝