本文目录导读:

关于进攻三区(Final Third)的传球成功率,这是一个非常具体且专业的足球数据分析指标。
在实用脚本或数据看板(如使用 Python/Pandas 或 R 语言)中,计算这个指标通常需要事件数据(Event Data),而不是简单的比分数据。
下面我为你提供一套实用的分析逻辑和一段可直接运行的 Python 脚本,你可以根据自己手头的数据字段进行适配。
指标定义(标准口径)
在足球数据分析中,进攻三区传球成功率的定义通常为:
[ 成功率 = \frac{进攻三区成功传球次数}{进攻三区总传球次数} \times 100\% ]
- 进攻三区:指距离对方球门线最近的那 1/3 场地(通常由
x坐标表示,如果球场宽度为 100,则进攻三区通常是x > 66或x > 32(取决于你的数据方向)。 - 传球动作:包含短传、长传、直塞、传中等触点(Open Play 或 Set Piece),通常不包含定位球中的角球和任意球直接打门前的传球(可根据需求调整)。
- 成功定义:传球后,接球队员成功控制住球(即该传球事件的后继事件是接球方球员的动作)。
实用 Python 脚本(伪代码/真实逻辑)
以下脚本假设你有一个 events 的 DataFrame,包含列:
match_id, team_id, x, y, end_x, end_y, type, subtype, outcome, period。
import pandas as pd
import numpy as np
def calculate_final_third_pass_success(events_df):
"""
计算每支球队的进攻三区传球成功率
参数:
events_df (pd.DataFrame): 包含传球事件的数据框
必须包含列:team_id, x, end_x, outcome, type
返回:
pd.DataFrame: 包含每支球队的总传球数、成功数和成功率的表格
"""
# 1. 数据清洗:只筛选出传球事件
# 假设 'type' 列中 'Pass' 代表传球(具体名称根据你的数据修改)
passes = events_df[events_df['type'] == 'Pass'].copy()
# 2. 定义进攻三区:这里假设球场 x 坐标范围是 0-100
# 如果对方球门在右侧(x=100),进攻三区为 x > 66.7
# 如果对方球门在左侧(x=0),进攻三区为 x < 33.3
# 这里以 “进攻方向向右” 为例(即进攻三区在右侧),如果方向相反请调整阈值
# 注意:x 是传球发起点的坐标,我们需要判断传球是否在进攻三区发起
# 或者更严格:传球发起点和接球点都在进攻三区?这里通常按“发起点”计算,因为球员在该区域触球并传球。
final_third_mask = passes['x'] > 66.7 # 按 2/3 场计算
# 3. 布尔索引筛选进攻三区传球
ft_passes = passes[final_third_mask]
# 4. 判断成功:'outcome' 列中 1 表示成功,0 表示失败
# 或者 'is_successful' 为 True/False
ft_passes['is_successful'] = ft_passes['outcome'] == 1 # 根据实际字段调整
# 5. 按球队分组计算
result = ft_passes.groupby('team_id').agg(
total_passes=('x', 'count'), # 总传球数
successful_passes=('is_successful', 'sum') # 成功次数
).reset_index()
# 6. 计算成功率
result['success_rate'] = (result['successful_passes'] / result['total_passes']) * 100
# 处理除零情况(有时球队可能没有进攻三区传球)
result['success_rate'] = result['success_rate'].fillna(0)
return result
# --- 使用示例 ---
# 假设你有一个名为 data 的 DataFrame
# result_df = calculate_final_third_pass_success(data)
# print(result_df)
实战中容易踩的坑(重要提醒)
-
坐标方向问题:大多数现代数据服务商(如 StatsBomb、Wyscout、Opta)默认进攻方向是从左到右(x坐标
0-100),对方球门在x=100,如果你的数据是反的(x越小越是对方半场),你需要mask = passes['x'] < 33.3。建议:优先用end_x和x比较来判断进攻方向。 -
反击/直塞球处理:如果传球发起于中场(x=40),但皮球穿越到了进攻三区(end_x=75),这算不算进攻三区传球?
- 严格算法:只统计发起点在进攻三区(x>66)的传球。
- 宽容算法:统计终点在进攻三区的传球,这两种统计口径差异很大,建议使用宽容算法(看传球终点),因为这更能反映球队把球推进到威胁区域的能力。
-
定位球(死球)处理:角球和边线球通常不算入常规传球成功率,因为它们是静止状态,代码中建议增加过滤:
passes = passes[passes['subtype'].isin(['Open Play'])] # 仅限动态进攻
-
质量分层:如果需要更精细的分析,可以加一个
weight列,直塞球成功(Key Pass)给 1.5 权重,回传安全球给 0.5 权重——但这属于进阶模型,基础脚本用 0/1 即可。
如果只是想要“实用看板”计算的公式逻辑
如果你是在 Excel 或 Tableau 中操作,逻辑同上:
=COUNTIFS(条件区域, ">66.7", 传球状态列, "成功") / COUNTIF(条件区域, ">66.7")
核心在于明确你的数据集中坐标的定义和传球的判定标准,如果你能告诉我你的数据源是 StatsBomb / Wyscout,或是某款国内数据API,我可以帮你把字段名调整得完全对齐。