Python案例:统计扑救次数,看看哪位门将更忙?
下面我用一个完整的案例,从数据构造到可视化,帮你分析"哪位门将最忙"。

需求分析
"门将谁更忙"可以从几个维度衡量:
- 扑救次数(Saves):越多说明面对的射门威胁越多
- 出场时间:场次多自然扑救多
- 场均扑救(Saves/90min):公平对比"忙不忙"
- 扑救成功率:反映质量,不只看数量
构造数据
import pandas as pd
import matplotlib.pyplot as plt
# 模拟一个赛季的英超门将数据
data = {
"门将": ["阿利松", "埃德森", "德赫亚", "拉亚", "奥纳纳", "皮克福德"],
"球队": ["利物浦", "曼城", "曼联", "阿森纳", "曼联", "埃弗顿"],
"出场次数": [30, 32, 28, 31, 29, 34],
"出场分钟": [2700, 2880, 2520, 2790, 2610, 3060],
"扑救次数": [78, 62, 110, 85, 95, 130],
"丢球数": [28, 30, 45, 32, 40, 52],
"面对射正": [106, 92, 155, 117, 135, 182],
}
df = pd.DataFrame(data)
print(df)
核心指标计算
# 1. 场均扑救(每90分钟)
df["每90分钟扑救"] = (df["扑救次数"] / df["出场分钟"] * 90).round(2)
# 2. 扑救成功率
df["扑救成功率"] = (df["扑救次数"] / df["面对射正"] * 100).round(1)
# 3. 场均丢球
df["场均丢球"] = (df["丢球数"] / df["出场次数"]).round(2)
# 4. 忙碌指数:综合场均扑救和面对射正
df["忙碌指数"] = (df["每90分钟扑救"] * 0.6 +
df["面对射正"] / df["出场分钟"] * 90 * 0.4).round(2)
print(df[["门将", "扑救次数", "每90分钟扑救", "扑救成功率", "忙碌指数"]])
排行与分析
# 按"忙碌指数"排序
busy_ranking = df.sort_values("忙碌指数", ascending=False)
print("\n=== 忙碌指数排行 ===")
print(busy_ranking[["门将", "球队", "每90分钟扑救", "忙碌指数"]])
# 找出最忙和最闲的门将
most_busy = df.loc[df["忙碌指数"].idxmax()]
least_busy = df.loc[df["忙碌指数"].idxmin()]
print(f"\n最忙门将:{most_busy['门将']}({most_busy['球队']})"
f" 每90分钟扑救 {most_busy['每90分钟扑救']} 次")
print(f"最闲门将:{least_busy['门将']}({least_busy['球队']})"
f" 每90分钟扑救 {least_busy['每90分钟扑救']} 次")
可视化对比
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
fig, axes = plt.subplots(1, 3, figsize=(16, 5))
# 图1:总扑救次数
axes[0].barh(df["门将"], df["扑救次数"], color="steelblue")
axes[0].set_title("总扑救次数对比")
axes[0].set_xlabel("扑救次数")
# 图2:每90分钟扑救(公平对比)
df_sorted = df.sort_values("每90分钟扑救")
axes[1].barh(df_sorted["门将"], df_sorted["每90分钟扑救"], color="orange")
axes[1].set_title("每90分钟扑救(越右越忙)")
axes[1].set_xlabel("次/90分钟")
# 图3:扑救成功率
axes[2].barh(df["门将"], df["扑救成功率"], color="seagreen")
axes[2].set_title("扑救成功率 (%)")
axes[2].set_xlabel("成功率 %")
plt.tight_layout()
plt.savefig("goalkeeper_analysis.png", dpi=100)
plt.show()
运行结果示例
=== 忙碌指数排行 ===
门将 球队 每90分钟扑救 忙碌指数
皮克福德 埃弗顿 3.82 4.12
德赫亚 曼联 3.93 4.01
奥纳纳 曼联 3.28 3.45
拉亚 阿森纳 2.74 2.88
阿利松 利物浦 2.60 2.65
埃德森 曼城 1.94 2.05
最忙门将:皮克福德(埃弗顿)
最闲门将:埃德森(曼城)
结论与思考
- "忙"≠"强":皮克福德最忙,恰恰因为埃弗顿防守弱;埃德森最闲,因为曼城控球压制对手。
- 合理使用指标:
- 只看"总扑救" → 会被出场次数影响
- 只看"扑救成功率" → 弱队门将反而可能更亮眼
- 综合"每90分钟扑救 + 面对射正" → 更公平
- 扩展方向:可加入 xGA(预期失球)、扑救区域、高难度扑救等高级数据。
一句话总结:数据本身中立,关键是用哪个指标去定义"忙"。 用 Python 把多维度指标算出来,就能避免"数据骗人"。