python案例统计伤病停赛影响数据对比?

wen python案例 2

Python案例:统计伤病停赛对球队影响的对比分析

下面我用一个完整的案例,演示如何用 Python 分析伤病/停赛球员对球队战绩的影响。

python案例统计伤病停赛影响数据对比?

场景设定

假设我们要分析某足球队:有主力伤病/停赛时 vs 阵容齐整时,球队表现的差异。

构造示例数据

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
# 模拟 30 场比赛数据
np.random.seed(42)
data = {
    '比赛日期': pd.date_range('2024-01-01', periods=30, freq='W'),
    '对手实力': np.random.choice(['强', '中', '弱'], 30),
    '主力缺阵人数': np.random.choice([0, 0, 0, 1, 1, 2, 3], 30),  # 伤病+停赛
}
df = pd.DataFrame(data)
# 根据缺阵人数生成比赛结果(缺阵越多,表现越差)
def simulate_result(row):
    base_goals = {'强': 1.0, '中': 1.5, '弱': 2.0}[row['对手实力']]
    # 每缺1人,进攻-0.35球,防守+0.4失球
    goals_for = max(0, np.random.poisson(base_goals - 0.35 * row['主力缺阵人数']))
    goals_against = np.random.poisson(1.2 + 0.4 * row['主力缺阵人数'])
    return pd.Series({'进球': goals_for, '失球': goals_against})
df[['进球', '失球']] = df.apply(simulate_result, axis=1)
df['积分'] = df.apply(lambda r: 3 if r['进球'] > r['失球'] else (1 if r['进球'] == r['失球'] else 0), axis=1)
df['净胜球'] = df['进球'] - df['失球']
print(df.head(10))

核心对比分析

# 1. 按缺阵情况分组
df['阵容状态'] = df['主力缺阵人数'].apply(
    lambda x: '阵容齐整' if x == 0 else ('轻度缺阵(1人)' if x == 1 else '严重缺阵(2+人)')
)
# 2. 分组统计
summary = df.groupby('阵容状态').agg(
    场次=('积分', 'count'),
    胜场=('积分', lambda x: (x == 3).sum()),
    平场=('积分', lambda x: (x == 1).sum()),
    负场=('积分', lambda x: (x == 0).sum()),
    总积分=('积分', 'sum'),
    场均积分=('积分', 'mean'),
    场均进球=('进球', 'mean'),
    场均失球=('失球', 'mean'),
    场均净胜=('净胜球', 'mean')
).round(2)
# 计算胜率
summary['胜率(%)'] = (summary['胜场'] / summary['场次'] * 100).round(1)
print("\n===== 伤病停赛影响对比表 =====")
print(summary)

输出示例:

===== 伤病停赛影响对比表 =====
              场次  胜场  平场  负场  总积分  场均积分  场均进球  场均失球  场均净胜  胜率(%)
阵容状态
严重缺阵(2+人)   6   0    2    4    2     0.33    0.83    2.17   -1.33    0.0
轻度缺阵(1人)   10   2    3    5   14     1.40    1.10    1.90   -0.80   20.0
阵容齐整        14  10    4    0   34     2.43    2.00    1.00    1.00   71.4

可视化对比

fig, axes = plt.subplots(1, 3, figsize=(15, 5))
# 图1:场均积分对比
summary['场均积分'].plot(kind='bar', ax=axes[0], color=['#e74c3c', '#f39c12', '#27ae60'])
axes[0].set_title('场均积分对比')
axes[0].set_ylabel('积分')
axes[0].tick_params(axis='x', rotation=0)
# 图2:场均进/失球对比
summary[['场均进球', '场均失球']].plot(kind='bar', ax=axes[1], color=['#3498db', '#e74c3c'])
axes[1].set_title('场均进失球对比')
axes[1].tick_params(axis='x', rotation=0)
# 图3:胜率对比
summary['胜率(%)'].plot(kind='bar', ax=axes[2], color=['#e74c3c', '#f39c12', '#27ae60'])
axes[2].set_title('胜率对比(%)')
axes[2].tick_params(axis='x', rotation=0)
plt.tight_layout()
plt.show()

关键结论输出

full = summary.loc['阵容齐整']
injured = summary.loc['严重缺阵(2+人)']
print("\n===== 影响量化 =====")
print(f"场均积分下降:{full['场均积分'] - injured['场均积分']:.2f} 分 "
      f"(下降 {(1 - injured['场均积分']/full['场均积分'])*100:.0f}%)")
print(f"场均进球减少:{full['场均进球'] - injured['场均进球']:.2f} 球")
print(f"场均失球增加:{injured['场均失球'] - full['场均失球']:.2f} 球")
print(f"胜率下降:{full['胜率(%)'] - injured['胜率(%)']:.1f} 个百分点")

输出示例:

===== 影响量化 =====
场均积分下降:2.10 分 (下降 86%)
场均进球减少:1.17 球
场均失球增加:1.17 球
胜率下降:71.4 个百分点

进阶:显著性检验

from scipy import stats
full_pts = df[df['主力缺阵人数'] == 0]['积分']
injured_pts = df[df['主力缺阵人数'] >= 2]['积分']
t_stat, p_value = stats.ttest_ind(full_pts, injured_pts, equal_var=False)
print(f"\nT检验: t={t_stat:.2f}, p={p_value:.4f}")
if p_value < 0.05:
    print("→ 伤病停赛对球队积分有显著影响(p<0.05)")
else:
    print("→ 影响不显著")

案例要点总结

步骤 关键操作
数据构建 记录每场缺阵人数、对手实力、比分结果
特征工程 划分阵容状态(齐整/轻度/严重)
分组统计 场均积分、进失球、胜率
可视化 对比柱状图直观呈现差异
量化影响 计算积分/胜率下降幅度
显著性检验 用 T 检验判断差异是否偶然

可扩展方向

  • 按球员拆分:单独评估每位主力缺阵的影响(回归/贡献度)
  • 控制变量:加入对手实力、主客场做分层对比
  • 时间序列:观察伤病潮前后的战绩变化
  • 预测模型:用机器学习预测缺阵人数对胜率的概率影响

如果你有真实的比赛数据(如 CSV/Excel),可以直接替换 df,其余分析代码基本通用,需要我帮你写读取真实数据或按具体球员分析的版本吗?

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