本文目录导读:

在足球数据分析的开源项目中,“进攻三区传球成功率”通常需要自己基于事件数据(event data)计算,因为不同项目/数据源对这个指标的定义并不统一,下面按常见开源生态说明怎么算、去哪儿找。
指标定义(先统一口径)
进攻三区(Final Third):一般指球场纵向靠近对方球门的 1/3 区域。
- 以 105m × 68m 标准球场为例,进攻三区约为
x > 70m(即从对方底线往中场方向 35m 内)。 - 在 StatsBomb 坐标系(120 × 80)中,通常是
x > 80。 - Opta / F24 等坐标需按比例换算。
传球成功率:
传球成功率 = 成功传球次数 / 总传球次数 × 100%
进攻三区传球成功率:
= 在进攻三区内完成的成功传球 / 在进攻三区内的总传球尝试
需要注意两种常见口径:
- 传球起点在进攻三区(更常见,衡量在该区域的控球质量)
- 传球终点在进攻三区(衡量打入该区域的效率,接近“推进传球”)
多数开源分析用的是口径 1。
推荐的开源项目与数据源
| 项目 | 数据 | 是否可直接算 |
|---|---|---|
| StatsBomb Open Data | 事件级,含坐标、传球结果 | ✅ 最推荐 |
| FBref(基于 StatsBomb/Opta) | 聚合统计 | ⚠️ 无直接“进攻三区传球成功率”,需自算 |
| Understat | xG 等,无传球坐标 | |
| soccerdata(Python 库) | 抓 FBref/Understat 等 | ⚠️ 需底层数据 |
| mplsoccer | 绘图 + StatsBomb 加载 | ✅ 配合计算 |
| kloppy | 多源事件数据统一接口 | |
| OpenFootball | 基础数据 | ❌ 无事件坐标 |
用 StatsBomb Open Data 计算的示例
from statsbombpy import sb
import pandas as pd
# 1. 取一场比赛的事件数据
events = sb.events(match_id=3788741) # 示例 match_id
# 2. 筛选传球事件
passes = events[events['type'] == 'Pass'].copy()
# 3. 提取传球起点坐标
passes['x'] = passes['location'].apply(lambda l: l[0] if isinstance(l, list) else None)
# 4. 定义进攻三区(StatsBomb 坐标 x > 80)
final_third = passes[passes['x'] > 80]
# 5. 判断成功传球(StatsBomb 中用 pass_outcome 是否为空)
final_third['success'] = final_third['pass_outcome'].isna()
# 6. 计算成功率
success_rate = final_third['success'].mean()
print(f"进攻三区传球成功率: {success_rate:.2%}")
print(f"样本量: {len(final_third)} 次传球")
关键字段说明(StatsBomb):
location:[x, y],x 范围 0–120pass_outcome:为空 = 成功;有值(如Incomplete)= 失败pass_end_location:传球终点,可用于“终点在进攻三区”的口径
如果你想要现成结果
目前没有主流开源项目直接发布“进攻三区传球成功率”这张表,原因:
- 各数据商区域划分不同(Opta 用 0–100,StatsBomb 用 0–120)
- “成功”定义不同(是否算被断、出界、被犯规中断)
- 分母是否包含传中、角球、定位球差异大
所以实践路径通常是:
- 用
statsbombpy/kloppy/soccerdata拉事件数据 - 按上面代码自定义区域和成功口径
- 按球员/球队聚合
常见参数建议
| 参数 | 推荐值 |
|---|---|
| 坐标系 | StatsBomb 120×80 |
| 进攻三区阈值 | x > 80 |
| 是否含定位球 | 通常剔除角球、任意球、界外球 |
| 最小样本 | ≥ 30 次传球才报告成功率 |
| 成功定义 | pass_outcome 为空 |
如果你告诉我:
- 你想分析某支球队/某球员/某联赛
- 手头用的是 StatsBomb / Opta / FBref 哪种数据
我可以给你一段可直接跑的计算脚本。