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

wen python案例 2

要回答“伤病潮是否拖累球队”这个问题,最严谨的方法是进行数据驱动的对比分析,我们可以通过一个经典的Python案例复盘来拆解这个问题。

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

核心逻辑是:对比球队在“核心球员受伤前”与“核心球员受伤后”的比赛表现(胜率、场均得分、防守效率等),并做统计学检验。

以下是一个基于Python的“伤病潮影响复盘”案例框架,你可以根据你的具体数据替换文件路径和字段名。


案例复盘:伤病潮是否拖累球队?

数据准备

假设你拥有2019-2020赛季NBA金州勇士队(或其他任何球队)的比赛数据,包括:

  • game_date:比赛日期
  • is_win:是否获胜
  • total_points:球队总得分
  • opponent_points:对手得分
  • injured_players_list:该场比赛因伤缺阵的主要球员名单(或一个标识 is_key_player_out

Python代码实现

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
# ----- 1. 加载数据 -----
df = pd.read_csv('team_game_logs.csv')
df['game_date'] = pd.to_datetime(df['game_date'])
df = df.sort_values('game_date').reset_index(drop=True)
# ----- 2. 定义“伤病潮”时间段 -----
# 假设伤病潮从某场比赛开始(核心球员A、B同时受伤)
injured_window_start = '2020-01-15'  # 伤病潮开始日期
injured_window_end = '2020-03-10'    # 伤病潮结束日期(主力回归)
# 划分时间段
df_before = df[df['game_date'] < injured_window_start].copy()
df_during = df[(df['game_date'] >= injured_window_start) & 
               (df['game_date'] <= injured_window_end)].copy()
df_after = df[df['game_date'] > injured_window_end].copy()
# ----- 3. 计算关键指标 -----
def calc_metrics(group, label):
    wins = group['is_win'].sum()
    games = len(group)
    win_rate = wins / games if games > 0 else 0
    avg_scored = group['total_points'].mean()
    avg_opponent = group['opponent_points'].mean()
    avg_margin = avg_scored - avg_opponent
    return {
        'period': label,
        'games': games,
        'wins': wins,
        'win_rate': round(win_rate * 100, 2),
        'avg_points_for': round(avg_scored, 2),
        'avg_points_against': round(avg_opponent, 2),
        'avg_margin': round(avg_margin, 2)
    }
results = [
    calc_metrics(df_before, '伤病潮前'),
    calc_metrics(df_during, '伤病潮中'),
    calc_metrics(df_after, '伤病潮后')
]
summary_df = pd.DataFrame(results)
print("=== 球队表现对比 ===")
print(summary_df.to_string(index=False))
# ----- 4. 可视化:得分变化趋势 -----
plt.figure(figsize=(12, 5))
sns.lineplot(data=df, x='game_date', y='total_points', 
             marker='o', color='blue', label='球队得分')
plt.axvline(pd.to_datetime(injured_window_start), 
            color='red', linestyle='--', label='伤病潮开始')
plt.axvline(pd.to_datetime(injured_window_end), 
            color='green', linestyle='--', label='伤病潮结束')'球队得分随时间变化 (伤病潮前后对比)')
plt.xlabel('比赛日期')
plt.ylabel('单场得分')
plt.legend()
plt.grid(alpha=0.3)
plt.show()
# ----- 5. 统计检验:伤病潮中与伤病潮前的胜率是否有显著差异? -----
# 使用T检验(或Z检验)比较两组的胜率
before_wins = df_before['is_win'].values
during_wins = df_during['is_win'].values
# 注意:胜率是比例数据,这里使用卡方检验或Mann-Whitney U更合适
# 使用曼-惠特尼U检验(不假设正态分布)
stat, p_value = stats.mannwhitneyu(before_wins, during_wins, alternative='two-sided')
print(f"\n=== 统计检验 ===")
print(f"Mann-Whitney U检验统计量: {stat}")
print(f"P值: {p_value:.4f}")
if p_value < 0.05:
    print("伤病潮期间与之前的胜率存在显著差异 (p < 0.05)")
    print("伤病潮显著拖累了球队表现。")
else:
    print("伤病潮期间与之前的胜率不存在显著差异 (p ≥ 0.05)")
    print("伤病潮未对球队胜率造成统计上显著的影响(或样本量不足)。")
# ----- 6. 深入分析:哪些指标恶化最严重? -----
print("\n=== 影响幅度分析 ===")
margin_change = summary_df.iloc[1]['avg_margin'] - summary_df.iloc[0]['avg_margin']
score_change = summary_df.iloc[1]['avg_points_for'] - summary_df.iloc[0]['avg_points_for']
print(f"场均净胜分变化: {summary_df.iloc[0]['avg_margin']} -> {summary_df.iloc[1]['avg_margin']} (变化{margin_change:+.2f})")
print(f"场均得分变化: {summary_df.iloc[0]['avg_points_for']} -> {summary_df.iloc[1]['avg_points_for']} (变化{score_change:+.2f})")

输出结果解读

假设输出:

=== 球队表现对比 ===
   period   games  wins  win_rate  avg_points_for  avg_points_against  avg_margin
伤病潮前     30     20     66.67           112.4               108.2         4.20
伤病潮中     20      8     40.00           105.3               114.7        -9.40
伤病潮后     15     10     66.67           110.5               107.8         2.70
=== 统计检验 ===
Mann-Whitney U检验统计量: 180.0
P值: 0.0021
伤病潮期间与之前的胜率存在显著差异 (p < 0.05)
伤病潮显著拖累了球队表现。
=== 影响幅度分析 ===
场均净胜分变化: 4.20 -> -9.40 (变化-13.60)
场均得分变化: 112.4 -> 105.3 (变化-7.10)

伤病潮导致球队胜率从66.67%暴跌至40%,场均得分下降7.1分,净胜分暴跌13.6分,且统计检验显著。伤病潮确实拖累了球队。

进阶分析方向(可选)

  • 核心球员缺席的边际效应:使用回归模型,如 伤病数量 + 球员平均效率值 -> 球队胜负
  • 对手强度校准:引入对手强队标识(top_10_team),控制对手实力。
  • 伤病累积效应:检测连续多场人员不整时,疲劳是否导致表现曲线加速下滑。

通过这个Python案例复盘,我们可以从数据事实出发,客观地回答“伤病潮是否拖累球队”:

  • 如果胜率、净胜分、统计检验均显著变差 → 是的,拖累了
  • 如果表现没有显著变化,或其他因素(如对手变强)也同时发生变化 → 需要进一步控制变量分析

如果你有具体的球队数据(如某赛季的伤病报告和比赛日志),可以按上述步骤运行,就能得到基于你数据的结论。

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