python案例统计扑救次数门将谁更忙?

wen python案例 6

Python案例:统计扑救次数,看看哪位门将更忙?

下面我用一个完整的案例,从数据构造到可视化,帮你分析"哪位门将最忙"。

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
最忙门将:皮克福德(埃弗顿)
最闲门将:埃德森(曼城)

结论与思考

  1. "忙"≠"强":皮克福德最忙,恰恰因为埃弗顿防守弱;埃德森最闲,因为曼城控球压制对手。
  2. 合理使用指标
    • 只看"总扑救" → 会被出场次数影响
    • 只看"扑救成功率" → 弱队门将反而可能更亮眼
    • 综合"每90分钟扑救 + 面对射正" → 更公平
  3. 扩展方向:可加入 xGA(预期失球)、扑救区域、高难度扑救等高级数据。

一句话总结:数据本身中立,关键是用哪个指标去定义"忙"。 用 Python 把多维度指标算出来,就能避免"数据骗人"。

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