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