本文目录导读:

在足球数据分析中(特别是使用 StatsBomb 或 Opta 这类数据源时),进攻三区传球成功率(Final Third Passing Accuracy) 是一个基础且实用的指标。
这里提供两个层面的“实用脚本”:
- SQL 查询脚本(适用于从数据库中直接提取数据)。
- Python 脚本(适用于使用
pandas处理导出的 CSV 或通过 API 获取的数据)。
核心定义(先明确口径)
- 进攻三区(Final Third):靠近对方球门的最后 1/3 场地。
- 传球成功:传球成功找到了本方队友(且队友成功控球)。
- 成功率:成功的传球次数 / 该区域总传球尝试次数。
SQL 查询脚本(适用于 Opta/StatsBomb 数据库)
假设你的数据库中有一张名为 passes 的表,包含以下字段:
player_idplayer_namex(起始点 X 坐标,0-100,100 为对方底线)y(起始点 Y 坐标,0-100)outcome(‘Complete’ 或 ‘Incomplete’)match_id
逻辑:提取所有起始点 x > 66.7(即进攻三区)的传球,计算成功率。
SELECT
player_name,
COUNT(*) AS total_passes,
SUM(CASE WHEN outcome = 'Complete' THEN 1 ELSE 0 END) AS successful_passes,
ROUND(
SUM(CASE WHEN outcome = 'Complete' THEN 1 ELSE 0 END) * 100.0 / COUNT(*),
1
) AS final_third_accuracy_pct
FROM passes
WHERE
-- 假设坐标是 0-100,进攻三区是接近对方球门的 33.3 码
x > 66.7
-- 如果需要筛选特定赛季或球队,在这里添加过滤条件
-- AND match_id IN (SELECT id FROM matches WHERE season = '2023-24')
GROUP BY player_name
HAVING COUNT(*) >= 10 -- 排除传球次数太少的样本
ORDER BY final_third_accuracy_pct DESC;
Python 实用脚本(Pandas 数据处理)
这是最常用的情况,假设你从数据源导出了一个包含所有传球事件的 CSV 文件,字段名稍有不同,但核心逻辑一致。
场景:你想分析某支球队在上一场比赛中,首发中场球员的进攻三区传球成功率。
import pandas as pd
# 假设 CSV 文件列名如下(根据你的数据源调整)
# 'x': 传球起始点X, 'final' : 是否为进攻三区传球(如果数据源直接提供)
# 我们需要自己计算
# 1. 读取数据
df = pd.read_csv('passes.csv')
# 2. 筛选传球事件(可能包含其他事件,如射门、抢断)
passes_df = df[df['type'] == 'Pass'].copy()
# 3. 判断是否在进攻三区(假设坐标是0-100)
# 注意:进攻方向(我方进攻=朝左还是朝右)需要统一,这里假设标准x坐标,x越大越接近对方球门。
passes_df['is_final_third'] = passes_df['x'] > 66.7
# 4. 筛选进攻三区的传球
final_third_passes = passes_df[passes_df['is_final_third']]
# 5. 假设 'outcome' 列包含 'Complete' 或 'Incomplete'
# 创建布尔值:是否成功
final_third_passes['is_success'] = final_third_passes['outcome'] == 'Complete'
# 6. 根据球员分组计算指标
result = final_third_passes.groupby('player_name').agg(
total_passes=('outcome', 'count'), # 总传球次数
successful_passes=('is_success', 'sum') # 成功次数(布尔求和)
).reset_index()
# 7. 计算成功率
result['accuracy_pct'] = (result['successful_passes'] / result['total_passes'] * 100).round(1)
# 8. 过滤出场传球次数较少的球员(例如至少5次)
result = result[result['total_passes'] >= 5]
# 9. 排序输出
result = result.sort_values('accuracy_pct', ascending=False)
print(result)
进阶版:技术统计(更贴近实用分析)
import pandas as pd
# 如果你的数据源直接提供了 'pass_outcome' 或 'pass_accuracy'
def calculate_final_third_accuracy(df):
"""
一行函数:计算进攻三区传球成功率
df 必须包含列:'x', 'outcome', 'player_id'
"""
final_third = df[df['x'] > 66.7]
group = final_third.groupby('player_id').agg(
attempts=('outcome', 'count'),
completions=('outcome', lambda x: (x == 'Complete').sum())
)
group['success_rate'] = group['completions'] / group['attempts'] * 100
return group.sort_values('success_rate', ascending=False)
关键注意事项
- 坐标问题:不同公司的数据格式不同。
- Opta: 坐标是 0-100,进攻方向取决于半场(如果需要全赛季,必须判断
team_side)。 - StatsBomb: 坐标是 0-120(X轴),进攻三区是指
x >= 80(因为120的一半是60,最后1/3是从80到120)。 - 如果是平铺数据(所有球队都在同一方向),需要先标准化坐标(把对方球门作为 X 轴正方向)。
- Opta: 坐标是 0-100,进攻方向取决于半场(如果需要全赛季,必须判断
- 传球方向:通常排除回传和横传的区分,如果是严格的“前场组织”评估,有时只计算 向前传球(Progressive Pass),如果要求这个,脚本需增加条件:
if x_end > x_start。 - 权重:如果评估传球手,建议加入传球距离加权(如 Expected Threat 或 xT),但标准成功率通常是纯次数比。
总结输出示例
如果你的脚本运行正确,输出将会是一个表格:
| Player Name | Total Attempts | Completed | Final Third Accuracy (%) |
|---|---|---|---|
| 球员A | 15 | 12 | 0 |
| 球员B | 10 | 7 | 0 |
| 球员C | 8 | 4 | 0 |
建议:如果你提供具体的数据源(如 Wyscout 的列名),我可以帮你把字段名改成完全匹配的版本。