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 / 网页)?
- 是单场还是整赛季?
- 想要什么输出(表格 / 图表 / 分析报告)?
我可以给你写一个直接能跑的完整脚本。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播