Python 分析两队拦截抢断数据案例
下面给你一个完整的案例,从数据准备 → 处理 → 可视化 → 分析结论,看完就能套用到你自己的数据上。

准备数据
假设你有一份比赛技术统计 CSV(match_stats.csv),格式如下:
team,interceptions,tackles,possession,passes 曼城,8,15,65,720 利物浦,12,22,35,410
也可以用字典直接构造:
import pandas as pd
data = {
"team": ["曼城", "利物浦"],
"interceptions": [8, 12], # 拦截
"tackles": [15, 22], # 抢断
"possession": [65, 35], # 控球率
"passes": [720, 410] # 传球数
}
df = pd.DataFrame(data)
print(df)
基础对比
直接对比数值
print(df[["team", "interceptions", "tackles"]])
计算"防守总贡献"
df["defense_total"] = df["interceptions"] + df["tackles"] print(df[["team", "interceptions", "tackles", "defense_total"]])
找出谁更强
# 拦截最多的队
best_inter = df.loc[df["interceptions"].idxmax()]
print(f"拦截最多: {best_inter['team']} ({best_inter['interceptions']}次)")
# 抢断最多的队
best_tackle = df.loc[df["tackles"].idxmax()]
print(f"抢断最多: {best_tackle['team']} ({best_tackle['tackles']}次)")
深入分析:结合控球率看防守含义
关键思路:抢断/拦截多 ≠ 防守就一定强,还要看控球率。
- 控球率低的队,防守次数通常高(被动挨打)
- 所以要用 "每 90 分钟对手控球时的防守频率" 来标准化
# 假设对手控球率 = 100 - 本方控球率 df["opp_possession"] = 100 - df["possession"] # 防守强度:每分钟对手控球时的防守次数(简化算法) df["defense_intensity"] = (df["interceptions"] + df["tackles"]) / df["opp_possession"] print(df[["team", "possession", "opp_possession", "defense_intensity"]])
可视化对比
柱状图对比
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"] # 中文显示
plt.rcParams["axes.unicode_minus"] = False
fig, ax = plt.subplots(figsize=(8, 5))
x = range(len(df))
width = 0.35
ax.bar([i - width/2 for i in x], df["interceptions"], width, label="拦截", color="#4C72B0")
ax.bar([i + width/2 for i in x], df["tackles"], width, label="抢断", color="#DD8452")
ax.set_xticks(x)
ax.set_xticklabels(df["team"])
ax.set_ylabel("次数")
ax.set_title("两队拦截 vs 抢断对比")
ax.legend()
plt.tight_layout()
plt.show()
雷达图(多维度对比)
import numpy as np
categories = ["拦截", "抢断", "传球", "控球率"]
N = len(categories)
angles = np.linspace(0, 2 * np.pi, N, endpoint=False).tolist()
angles += angles[:1] # 闭合
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
for _, row in df.iterrows():
values = [row["interceptions"], row["tackles"], row["passes"]/10, row["possession"]]
values += values[:1]
ax.plot(angles, values, label=row["team"])
ax.fill(angles, values, alpha=0.15)
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories)
ax.set_title("球队综合能力雷达图")
ax.legend(loc="upper right")
plt.show()
多场数据(进阶)
如果你是本赛季多场数据,可以这样做:
# 假设 df 是每场比赛一行,含 team、interceptions、tackles
season = pd.read_csv("season_stats.csv")
# 按球队汇总平均
summary = season.groupby("team")[["interceptions", "tackles"]].agg(["mean", "sum"])
print(summary)
# 排序,找出本赛季防守最强的队
summary["avg_defense"] = summary[("interceptions", "mean")] + summary[("tackles", "mean")]
summary = summary.sort_values("avg_defense", ascending=False)
print(summary.head(10))
常见分析结论模板
| 观察 | |
|---|---|
| A 队抢断+拦截多,但控球率低 | 防守被动,被压着打 |
| A 队抢断+拦截多,控球率也高 | 高强度逼抢 + 主动出击,攻防兼备 |
| 两队数据接近,但传球差很多 | 一队是"技术流",一队是"绞肉机" |
| 抢断 > 拦截 | 更多正面对抗;拦截 > 抢断 |
如果你想拿真实数据
几个免费数据源:
- FBref — 网页表格,
pandas.read_html(url)可直接抓 - Understat — Python 库
understat可直接拉 - StatsBomb Open Data — GitHub 开源,json 格式
- football-data.org — 有免费 API 额度
示例(FBref 抓取):
url = "https://fbref.com/en/comps/9/defense/Premier-League-Stats" tables = pd.read_html(url) df = tables[0] print(df.head())
如果你能告诉我:
- 数据是什么格式(CSV / Excel / API / 网页)?
- 是单场还是整赛季?
- 想要什么输出(表格 / 图表 / 分析报告)?
我可以给你写一个直接能跑的完整脚本。