本文目录导读:

在足球数据分析中,“二过一配合”通常需要事件数据(如传球、跑动、接球)来识别,如果你用的是 Python 做案例,一般会按下面这个思路来算成功率,下面我给你一个可直接套用的框架和示例。
先定义什么叫“二过一成功”
足球数据里没有天然的“二过一”标签,所以要自己定义,常见定义有两种:
定义 A(严格)
- A 传球给 B
- B 不停球直接回做给前插的 A
- A 接到球 → 成功
- 中间被断、传丢、A 没接到 → 失败
定义 B(宽松)
- 两人之间连续两次传球,且第二次传球后球权仍在原队
- 不要求必须“一脚出球”
下面用定义 A 来写代码。
Python 案例框架
假设你有一份事件数据 events_df,字段类似:
| 字段 | 含义 |
|---|---|
| match_id | 比赛ID |
| team | 球队 |
| player | 球员 |
| event_type | 事件类型(pass/reception/interception...) |
| receiver | 接球人 |
| minute | 分钟 |
| second | 秒 |
| success | 是否成功 |
识别二过一组合
import pandas as pd
# 只保留传球事件
passes = events_df[events_df['event_type'] == 'pass'].copy()
passes = passes.sort_values(['match_id', 'minute', 'second'])
one_twos = []
for match_id, group in passes.groupby('match_id'):
group = group.reset_index(drop=True)
for i in range(len(group) - 1):
p1 = group.loc[i] # A -> B
p2 = group.loc[i + 1] # B -> A
# 条件1:同一队
if p1['team'] != p2['team']:
continue
# 条件2:第一次传球接球人 = 第二次传球人
if p1['receiver'] != p2['player']:
continue
# 条件3:第二次传球接球人 = 第一次传球人(回做给A)
if p2['receiver'] != p1['player']:
continue
# 条件4:时间间隔很短(比如2秒内),体现“二过一”快速配合
time1 = p1['minute'] * 60 + p1['second']
time2 = p2['minute'] * 60 + p2['second']
if time2 - time1 > 3:
continue
one_twos.append({
'match_id': match_id,
'team': p1['team'],
'player_a': p1['player'],
'player_b': p1['receiver'],
'success': p2['success'] # 第二次传球是否成功
})
one_twos_df = pd.DataFrame(one_twos)
计算成功率
if len(one_twos_df) > 0:
success_rate = one_twos_df['success'].mean()
print(f"二过一总次数: {len(one_twos_df)}")
print(f"二过一成功率: {success_rate:.2%}")
else:
print("未识别到二过一配合")
按球队统计
team_stats = one_twos_df.groupby('team').agg(
尝试次数=('success', 'count'),
成功次数=('success', 'sum'),
成功率=('success', 'mean')
).sort_values('成功率', ascending=False)
print(team_stats)
按球员组合统计
pair_stats = one_twos_df.groupby(['player_a', 'player_b']).agg(
尝试次数=('success', 'count'),
成功率=('success', 'mean')
).query('尝试次数 >= 3').sort_values('成功率', ascending=False)
print(pair_stats.head(10))
真实数据中二过一成功率大概是多少?
如果你用的是 StatsBomb / Opta / Wyscout 这类事件数据,按严格定义(一脚回做 + 3秒内 + 成功接到),通常结果是:
| 范围 | 成功率 |
|---|---|
| 全联赛平均 | 55% ~ 70% |
| 顶级球队 | 65% ~ 75% |
| 普通球队 | 50% ~ 62% |
| 前场危险区域 | 略低,45% ~ 60%(防守密集) |
| 后场/中场 | 略高,65% ~ 78% |
注意:这个数字高度依赖你的“成功”定义,如果只算“第二次传球没被断”,成功率会偏高;如果要求“接球后还能继续推进或形成射门”,会降到 30% ~ 45%。
影响成功率的关键因素
用 Python 可以做逻辑回归或分组统计:
# 示例:按区域统计
one_twos_df['zone'] = pd.cut(
one_twos_df['x'],
bins=[0, 40, 80, 120],
labels=['后场', '中场', '前场']
)
print(one_twos_df.groupby('zone')['success'].mean())
- 中场成功率最高
- 前场成功率最低,但一旦成功威胁最大
- 一脚出球比停球后再传成功率高
- 两人默契度(历史配合次数)与成功率正相关
总结一句话
用 Python 算二过一成功率,核心是先定义清楚什么是二过一,再按“A→B→A”且时间间隔短来筛选事件,最后用
success.mean()计算,真实比赛中,严格定义下成功率通常在 55%~70%,前场会明显更低。
如果你把具体的数据字段(StatsBomb 的 pass、ball_receipt 结构)发我,我可以帮你写成能直接跑的完整脚本。