根据实用脚本,进攻三区传球成功率?

wen 实用脚本 3

本文目录导读:

根据实用脚本,进攻三区传球成功率?

  1. 核心定义(先明确口径)
  2. SQL 查询脚本(适用于 Opta/StatsBomb 数据库)
  3. Python 实用脚本(Pandas 数据处理)
  4. 进阶版:技术统计(更贴近实用分析)
  5. 关键注意事项
  6. 总结输出示例

在足球数据分析中(特别是使用 StatsBombOpta 这类数据源时),进攻三区传球成功率(Final Third Passing Accuracy) 是一个基础且实用的指标。

这里提供两个层面的“实用脚本”:

  1. SQL 查询脚本(适用于从数据库中直接提取数据)。
  2. Python 脚本(适用于使用 pandas 处理导出的 CSV 或通过 API 获取的数据)。

核心定义(先明确口径)

  • 进攻三区(Final Third):靠近对方球门的最后 1/3 场地。
  • 传球成功:传球成功找到了本方队友(且队友成功控球)。
  • 成功率:成功的传球次数 / 该区域总传球尝试次数。

SQL 查询脚本(适用于 Opta/StatsBomb 数据库)

假设你的数据库中有一张名为 passes 的表,包含以下字段:

  • player_id
  • player_name
  • x(起始点 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)

关键注意事项

  1. 坐标问题:不同公司的数据格式不同。
    • Opta: 坐标是 0-100,进攻方向取决于半场(如果需要全赛季,必须判断 team_side)。
    • StatsBomb: 坐标是 0-120(X轴),进攻三区是指 x >= 80(因为120的一半是60,最后1/3是从80到120)。
    • 如果是平铺数据(所有球队都在同一方向),需要先标准化坐标(把对方球门作为 X 轴正方向)。
  2. 传球方向:通常排除回传和横传的区分,如果是严格的“前场组织”评估,有时只计算 向前传球(Progressive Pass),如果要求这个,脚本需增加条件:if x_end > x_start
  3. 权重:如果评估传球手,建议加入传球距离加权(如 Expected Threat 或 xT),但标准成功率通常是纯次数比。

总结输出示例

如果你的脚本运行正确,输出将会是一个表格:

Player Name Total Attempts Completed Final Third Accuracy (%)
球员A 15 12 0
球员B 10 7 0
球员C 8 4 0

建议:如果你提供具体的数据源(如 Wyscout 的列名),我可以帮你把字段名改成完全匹配的版本。

抱歉,评论功能暂时关闭!