伤病停赛影响数据对比脚本
下面提供一套实用的 Python 脚本,用于统计和对比球队在有伤病/停赛与无伤病/停赛情况下的表现差异,适用于足球、篮球等团队运动的数据分析。

完整脚本
"""
伤病停赛影响数据对比分析
用法:
python injury_impact.py --data matches.csv --output report.xlsx
数据要求(CSV列名):
match_id, team, opponent, match_date, is_home,
goals_for, goals_against, result(win/draw/loss),
injured_players(缺阵人数), suspended_players(停赛人数),
key_players_out(核心球员缺阵数)
"""
import pandas as pd
import numpy as np
import argparse
from scipy import stats
def load_data(path):
df = pd.read_csv(path, parse_dates=["match_date"])
# 计算总缺阵人数
df["total_out"] = df["injured_players"].fillna(0) + df["suspended_players"].fillna(0)
# 是否有缺阵
df["has_absence"] = df["total_out"] > 0
# 结果转分数
result_map = {"win": 3, "draw": 1, "loss": 0}
df["points"] = df["result"].str.lower().map(result_map)
df["goal_diff"] = df["goals_for"] - df["goals_against"]
return df
def compare_groups(df, team=None):
"""对比有/无缺阵两组的关键指标"""
data = df[df["team"] == team] if team else df
grouped = data.groupby("has_absence").agg(
matches=("match_id", "count"),
avg_points=("points", "mean"),
avg_goals_for=("goals_for", "mean"),
avg_goals_against=("goals_against", "mean"),
avg_goal_diff=("goal_diff", "mean"),
win_rate=("result", lambda x: (x.str.lower() == "win").mean()),
).round(3)
return grouped
def significance_test(df, metric="points", team=None):
"""独立样本t检验:缺阵 vs 无缺阵"""
data = df[df["team"] == team] if team else df
a = data[data["has_absence"]][metric].dropna()
b = data[~data["has_absence"]][metric].dropna()
if len(a) < 2 or len(b) < 2:
return None
t, p = stats.ttest_ind(a, b, equal_var=False)
return {"metric": metric, "mean_with_absence": a.mean(),
"mean_no_absence": b.mean(), "t": t, "p_value": p,
"significant": p < 0.05}
def absence_level_analysis(df, team=None):
"""按缺阵人数分档分析表现"""
data = df[df["team"] == team] if team else df
bins = [-1, 0, 2, 4, 100]
labels = ["0人", "1-2人", "3-4人", "5人以上"]
data = data.copy()
data["absence_level"] = pd.cut(data["total_out"], bins=bins, labels=labels)
return data.groupby("absence_level", observed=True).agg(
matches=("match_id", "count"),
avg_points=("points", "mean"),
win_rate=("result", lambda x: (x.str.lower() == "win").mean()),
avg_goal_diff=("goal_diff", "mean"),
).round(3)
def key_player_impact(df, team=None):
"""核心球员缺阵影响"""
data = df[df["team"] == team] if team else df
data = data.copy()
data["key_out_flag"] = data["key_players_out"] > 0
return data.groupby("key_out_flag").agg(
matches=("match_id", "count"),
avg_points=("points", "mean"),
win_rate=("result", lambda x: (x.str.lower() == "win").mean()),
).round(3)
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--data", required=True, help="比赛数据CSV")
ap.add_argument("--team", default=None, help="指定球队(可选)")
ap.add_argument("--output", default="injury_report.xlsx")
args = ap.parse_args()
df = load_data(args.data)
print("=" * 60)
print("【总体:有/无缺阵指标对比】")
print(compare_groups(df, args.team))
print("\n【缺阵人数分档表现】")
print(absence_level_analysis(df, args.team))
print("\n【核心球员缺阵影响】")
print(key_player_impact(df, args.team))
print("\n【显著性检验】")
for m in ["points", "goal_diff", "goals_for", "goals_against"]:
r = significance_test(df, m, args.team)
if r:
print(f"{m}: 有缺阵 {r['mean_with_absence']:.2f} vs "
f"无缺阵 {r['mean_no_absence']:.2f}, "
f"p={r['p_value']:.4f} "
f"{'✔显著' if r['significant'] else '✘不显著'}")
# 导出Excel
with pd.ExcelWriter(args.output) as w:
compare_groups(df, args.team).to_excel(w, sheet_name="总体对比")
absence_level_analysis(df, args.team).to_excel(w, sheet_name="缺阵分档")
key_player_impact(df, args.team).to_excel(w, sheet_name="核心缺阵")
print(f"\n报告已导出:{args.output}")
if __name__ == "__main__":
main()
示例数据(matches.csv)
match_id,team,opponent,match_date,is_home,goals_for,goals_against,result,injured_players,suspended_players,key_players_out 1,猛虎队,飞鹰队,2024-03-01,1,2,1,win,0,0,0 2,猛虎队,雄狮队,2024-03-08,0,0,2,loss,2,1,1 3,猛虎队,蓝鲸队,2024-03-15,1,3,0,win,0,0,0 4,猛虎队,猎豹队,2024-03-22,0,1,1,draw,3,0,2 5,猛虎队,飞鹰队,2024-03-29,1,1,0,win,1,0,0
运行:
python injury_impact.py --data matches.csv --team 猛虎队 --output 猛虎队伤病报告.xlsx
脚本核心功能
| 分析模块 | |
|---|---|
| 总体对比 | 有/无缺阵时的场均积分、进失球、胜率、净胜球 |
| 缺阵分档 | 0人 / 1-2人 / 3-4人 / 5人以上 的分段表现 |
| 核心球员影响 | 核心缺阵 vs 无核心缺阵的差异 |
| 显著性检验 | 独立样本 t 检验,判断差异是否统计显著(p<0.05) |
进阶建议
- 控制变量:主客场差异大时,可按
is_home分层后再对比。 - 对手强度加权:加入对手排名列,用
opponent_strength加权平均,避免强队/弱队干扰。 - 时间窗口:缺阵后 1-2 场可能有"磨合期",可单独统计复出前后表现。
- 可视化:可用
matplotlib或seaborn画箱线图对比分组分布,更直观。
需要我补充主客场分层版本、加权对手强度或可视化图表的代码,可以直接告诉我。