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,其余分析代码基本通用,需要我帮你写读取真实数据或按具体球员分析的版本吗?