本文目录导读:

先定义“界外球进攻威胁次数”
建议从三个层级定义,按你手头数据条件选:
基础版(仅需事件数据)
界外球进攻威胁次数 = 掷界外球后 N 秒内(如10秒)本方在进攻三区完成射门或形成射门的机会次数。
- 统计对象:本方掷界外球
- 时间窗口:掷出后 10 秒内
- 威胁事件:射门、射门前最后一传、进入禁区传球
进阶版(需坐标数据)
掷界外球后 N 秒内,球进入对方禁区或形成 xG ≥ 0.05 的射门机会,计 1 次威胁。
高精度版(需跟踪数据)
用控球序列(possession sequence)判定:界外球开始的进攻序列是否以射门/xG 阈值结束,且序列中向前推进距离超过阈值。
工具选择
| 工具 | 适用场景 | 说明 |
|---|---|---|
| StatsBomb Open Data + Python | 免费、可复现 | 有坐标和事件序列,可写脚本统计 |
| Wyscout / InStat | 商业数据 | 有界外球事件和后续序列 |
| Opta / Stats Perform | 职业级 | 有 possession chain 和 xG |
| Hudl Sportscode | 视频手动标记 | 无数据接口时手动打点统计 |
| Python + socceraction / mplsoccer | 自建分析 | 开源库处理事件数据 |
用 StatsBomb 开放数据 + Python 的实现思路
步骤 1:加载事件数据
from statsbombpy import sb events = sb.events(match_id=XXXX)
步骤 2:筛选界外球事件
throw_ins = events[events['type'] == 'Throw-in']
注意区分本方/对方:用 team 和 possession_team 判断。
步骤 3:定义时间窗口内的后续事件
对每个本方界外球事件,取其后 10 秒内(timestamp 差值)的所有事件:
import pandas as pd events['timestamp'] = pd.to_timedelta(events['timestamp'])
步骤 4:判定威胁
在窗口内检查是否出现:
type == 'Shot'→ 威胁 +1- 或
type == 'Pass'且pass_end_location在对方禁区内 → 威胁 +1 - 或累计 xG(若数据含 shot_statsbomb_xg)
步骤 5:统计与可视化
threat_count = 0
for idx, row in throw_ins.iterrows():
window = events[(events['timestamp'] > row['timestamp']) &
(events['timestamp'] <= row['timestamp'] + pd.Timedelta(seconds=10)) &
(events['possession'] == row['possession'])]
if (window['type'] == 'Shot').any():
threat_count += 1
再用 mplsoccer 画界外球位置热图 + 威胁次数对比。
统计口径注意事项
- 区分本方/对方界外球:只统计本方进攻界外球。
- 时间窗口要固定:10 秒是常见选择,可做敏感性分析(5/10/15 秒)。
- 序列归属:用
possession字段确保窗口内事件仍属同一次进攻,避免对方抢断后反击被误计。 - 死球重置:若窗口内出现对方界外球/犯规中断,应终止该序列。
- 主客场/比分情境:可分场景统计,避免混淆。
如果只有视频没有数据
用 Hudl Sportscode 或 Kinovea 手动标记:
- 建一个“界外球”按钮,记录时间戳和掷球位置。
- 建“威胁”按钮(射门/禁区传球)。
- 导出 CSV 后用 Excel/Python 按时间窗口匹配统计。
输出建议
统计结果建议按以下维度呈现:
- 全场界外球总数 vs 威胁次数(转化率)
- 按场地区域(前场/中场/后场界外球)分组
- 按比赛时段(15 分钟区间)
- 与联赛/对手均值对比
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。