本文目录导读:

- 第一步:数据准备(模拟数据)
- 第二步:核心指标对比(伤病 vs 健康)
- 第三步:可视化呈现(趋势分析)
- 第四步:高级分析 —— 对抗“对手质量”的干扰
- 第五步:归因分析 —— 谁缺阵影响最大?(假设有伤病名单)
- 第六步:结论输出(最终复盘)
- 关键解读要点(写报告时用)
- 这个案例能帮你得到什么?
这是一个非常经典的体育数据分析场景,要回答“伤病潮是否拖累球队”,不能只看“伤病期间输了几场”,而是要通过战绩对比、攻防效率、阵容深度以及对手强度四个维度来复盘。
下面我为你提供一个完整的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)
关键解读要点(写报告时用)
- 防守端影响通常大于进攻端:主力缺阵往往导致防守体系崩溃,注意看“失分”增幅是否大于“得分”降幅。
- 对手级别控制:如果伤病潮恰好碰上了魔鬼赛程,胜率下降不能全归咎于伤病。
- 后期恢复曲线:看伤病结束后,球队是否立即反弹,还是需要适配期,这考验教练组的调整能力。
这个案例能帮你得到什么?
- 量化结果:明确告诉你胜率下降的具体百分点。
- 数据支撑:通过净胜分、调整后净胜分来排除赛程干扰。
- 视觉冲击:用图表直接展示伤病潮的持续影响。
如果你想分析具体的某支球队(比如NBA、英超等),只需要将模拟数据替换为真实的数据(可以从网站爬取或手动录入),运行同样的代码即可得到精确的复盘结论,需要我帮你适配真实数据的格式吗?
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播