本文目录导读:

在开源项目(尤其是足球数据分析类的开源项目)中,分析守门员的出击范围通常涉及数据采集、事件定义、空间建模和可视化几个环节,下面梳理一套完整的分析思路。
核心概念定义
出击范围通常指守门员离开球门线、主动介入比赛的区域,常见分类:
| 类型 | 英文 | 典型区域 |
|---|---|---|
| 禁区内出击 | Inside-box claim | 己方18码区 |
| 禁区外出击 | Outside-box sweep | 禁区外(清道夫门将) |
| 高空球出击 | Cross claim / Punch | 定位球、传中 |
| 一对一出击 | 1v1 engagement | 面对单刀 |
数据来源(开源)
-
事件数据
- StatsBomb Open Data(含门将动作坐标)
- Wyscout 公开数据集
- Football-Data.org(基础层)
-
追踪数据
- Metrica Sports Sample Data(含XY坐标)
- SkillCorner 公开样例
- 自建:YOLO + 单应性变换(Homography)从视频提取
-
辅助数据
- 球场坐标系标准化(如 StatsBomb 120×80)
- 门将站位基线(球门中心为原点)
分析流程
数据预处理
# 示例:StatsBomb 坐标转标准球场
# 原始: x∈[0,120], y∈[0,80],球门在 x=0 或 x=120
# 转换到以球门为原点、朝场内为正方向
def normalize_goal_position(x, y, attacking_left=True):
if attacking_left:
return (120 - x, 40 - y) # 距离/横向偏移
else:
return (x, y - 40)
筛选门将出击事件
关键事件类型(StatsBomb 中):
Goal Keeper→Smother、Punch、Claim、Keeper SweeperPass/Interception中门将参与
空间建模
方法 A:出击距离分布
distances = [np.linalg.norm([x, y]) for x, y in gk_actions] # 画出击距离直方图 / KDE
方法 B:出击热图
import mplsoccer pitch = mplsoccer.Pitch(pitch_type='statsbomb') fig, ax = pitch.draw() pitch.kdeplot(gk_x, gk_y, ax=ax, fill=True, levels=10)
方法 C:出击范围多边形(凸包/核密度阈值)
from scipy.spatial import ConvexHull hull = ConvexHull(np.column_stack([gk_x, gk_y])) # 绘制最小凸多边形作为“活动范围”
方法 D:扫荡面积指标
- 平均出击距离 (Avg Sweeping Distance)
- 出击半径 P90(90% 动作在此半径内)
- 禁区外动作占比
对比与情境化
- 按比分状态:领先/落后时出击倾向
- 按对手风格:面对长传球队 vs 短传球队
- 按门将风格:诺伊尔型(清道夫)vs 传统型
- xG 加权:出击是否阻止了高威胁机会
推荐开源工具栈
| 用途 | 工具 |
|---|---|
| 数据加载 | statsbombpy, socceraction |
| 可视化 | mplsoccer, matplotlib |
| 空间分析 | shapely, scipy.spatial |
| 追踪解析 | kloppy, soccerdata |
| 建模 | scikit-learn, pycaret |
| Web 展示 | streamlit, dash |
可参考的开源项目
- socceraction — 事件数据转 SPADL,可做门将动作分类
- mplsoccer — 官方示例里有 GK heatmap
- footballdata / understat 爬虫项目 — 采集 xG 与门将数据
- Metrica Sports Sample — 追踪数据做门将跑动范围
- Friends of Tracking (YouTube + GitHub) — Laurie Shaw 的门将分析教程
进阶方向
- 决策模型:出击 vs 留守的期望失球对比(用 xG/xT)
- 时序建模:LSTM/Transformer 预测门将出击概率
- 追踪数据 + 事件数据融合:更精确的“实际覆盖区域”
- 对手射门前的门将站位热度:预判式分析