python案例复盘称这次伤病潮是否拖累球队?

wen python案例 2

本文目录导读:

python案例复盘称这次伤病潮是否拖累球队?

  1. 第一步:数据准备(模拟数据)
  2. 第二步:核心指标对比(伤病 vs 健康)
  3. 第三步:可视化呈现(趋势分析)
  4. 第四步:高级分析 —— 对抗“对手质量”的干扰
  5. 第五步:归因分析 —— 谁缺阵影响最大?(假设有伤病名单)
  6. 第六步:结论输出(最终复盘)
  7. 关键解读要点(写报告时用)
  8. 这个案例能帮你得到什么?

这是一个非常经典的体育数据分析场景,要回答“伤病潮是否拖累球队”,不能只看“伤病期间输了几场”,而是要通过战绩对比、攻防效率、阵容深度以及对手强度四个维度来复盘。

下面我为你提供一个完整的Python 案例复盘框架,包含可运行的示例代码,你可以直接用这个模板去分析你关注的那支球队。

第一步:数据准备(模拟数据)

假设我们有一支球队过去30场比赛的数据,包含:比赛日期、是否主力受伤(伤病潮标记)、得分、失分、对手胜率。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 构造模拟数据 (示例)
np.random.seed(42)
dates = pd.date_range('2024-10-01', periods=40, freq='D')
data = {
    '日期': dates,
    '得分': np.random.randint(100, 125, 40).astype(float),
    '失分': np.random.randint(98, 122, 40).astype(float),
    '对手胜率': np.random.uniform(0.4, 0.7, 40),
    '伤病潮': [0]*10 + [1]*15 + [0]*15  # 中间15场为伤病期
}
df = pd.DataFrame(data)
# 计算净胜分
df['净胜分'] = df['得分'] - df['失分']
# 添加结果列
df['胜负'] = df['净胜分'].apply(lambda x: '胜' if x > 0 else '负')
print(df.head())

第二步:核心指标对比(伤病 vs 健康)

对比伤病期间和非伤病期间的:胜率、场均得失分、攻防效率

# 分组对比
comparison = df.groupby('伤病潮').agg(
    胜率=('胜负', lambda x: (x == '胜').mean() * 100),
    场均得分=('得分', 'mean'),
    场均失分=('失分', 'mean'),
    场均净胜分=('净胜分', 'mean'),
    对手平均胜率=('对手胜率', 'mean')
).round(2)
comparison.index = ['健康期', '伤病潮']
print(comparison)

思考点: 如果伤病潮期间胜率低于健康期5个百分点以上,说明有直接影响;如果胜率持平,可能说明阵容深度好。


第三步:可视化呈现(趋势分析)

画出净胜分的滚动平均值(比如5场平均),直观看出伤病潮对长期状态的影响。

# 计算5场滚动平均净胜分
df['滚动净胜分'] = df['净胜分'].rolling(window=5).mean()
plt.figure(figsize=(12, 6))
plt.plot(df['日期'], df['滚动净胜分'], marker='o', linestyle='-', label='5场滚动净胜分')
plt.axvline(x=df['日期'][10], color='red', linestyle='--', label='伤病潮开始')
plt.axvline(x=df['日期'][24], color='green', linestyle='--', label='伤病潮结束')
# 用背景色标出伤病期
for i, row in df.iterrows():
    if row['伤病潮'] == 1:
        plt.axvspan(row['日期'], row['日期'] + pd.Timedelta(days=1), color='red', alpha=0.1)
'球队净胜分趋势(伤病潮影响分析)')
plt.xlabel('日期')
plt.ylabel('净胜分(5场平均)')
plt.legend()
plt.grid(alpha=0.3)
plt.show()

第四步:高级分析 —— 对抗“对手质量”的干扰

光看胜负不够公平,因为赛程强度不同,我们用一个简单的“加权表现”模型

  • 计算每场比赛的“超预期表现”:净胜分 - (对手胜率 - 0.5)*10(假设胜率50%为分水岭)。
# 简化模型:如果对手胜率高于平均,输少算赢;低于平均,赢多算赢
df['调整后净胜分'] = df['净胜分'] - (df['对手胜率'] - 0.5) * 10
# 对比调整后的平均值
adj_comparison = df.groupby('伤病潮')['调整后净胜分'].mean().round(2)
adj_comparison.index = ['健康期', '伤病潮']
print("\n调整对手强度后的场均净胜分对比:")
print(adj_comparison)

第五步:归因分析 —— 谁缺阵影响最大?(假设有伤病名单)

如果知道具体伤停球员,可以用“缺失球员的出场时间”与球队表现做相关性分析。

# 模拟:伤病潮期间的“核心球员缺阵时间”
df['伤病阵容价值'] = 0
df.loc[(df['伤病潮'] == 1) & (df.index < 20), '伤病阵容价值'] = 2  # 核心缺阵
df.loc[(df['伤病潮'] == 1) & (df.index >= 20), '伤病阵容价值'] = 1  # 轮换缺阵
# 计算相关性
corr = df[['伤病阵容价值', '净胜分']].corr().iloc[0, 1]
print(f"\n伤病阵容价值与净胜分的相关系数:{corr:.2f}")

第六步:结论输出(最终复盘)

基于以上数据,用 Python 生成一份简明的复盘报告。

# 生成结论的逻辑判断
healthy_winrate = comparison.loc['健康期', '胜率']
injured_winrate = comparison.loc['伤病潮', '胜率']
diff = healthy_winrate - injured_winrate
if diff > 10:
    verdict = f"【伤病潮严重拖累球队!胜率下降 {diff:.1f} 个百分点。"
elif diff > 0:
    verdict = f"【伤病潮有一定影响,胜率下降 {diff:.1f} 个百分点,但阵容深度尚可。"
else:
    verdict = "【伤病潮未明显拖累球队,甚至激发了角色球员潜力(胜率未降反升)。"
print("="*60)
print(verdict)
print(f"健康期胜率: {healthy_winrate}% vs 伤病潮胜率: {injured_winrate}%")
print("="*60)

关键解读要点(写报告时用)

  1. 防守端影响通常大于进攻端:主力缺阵往往导致防守体系崩溃,注意看“失分”增幅是否大于“得分”降幅。
  2. 对手级别控制:如果伤病潮恰好碰上了魔鬼赛程,胜率下降不能全归咎于伤病。
  3. 后期恢复曲线:看伤病结束后,球队是否立即反弹,还是需要适配期,这考验教练组的调整能力。

这个案例能帮你得到什么?

  • 量化结果:明确告诉你胜率下降的具体百分点。
  • 数据支撑:通过净胜分、调整后净胜分来排除赛程干扰。
  • 视觉冲击:用图表直接展示伤病潮的持续影响。

如果你想分析具体的某支球队(比如NBA、英超等),只需要将模拟数据替换为真实的数据(可以从网站爬取或手动录入),运行同样的代码即可得到精确的复盘结论,需要我帮你适配真实数据的格式吗?

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