Python案例统计门前抢点射门次数对比?

wen python案例 1

Python统计门前抢点射门次数对比分析

目录导读

  1. 项目背景:为什么需要量化门前抢点射门?
  2. 数据准备:如何构建射门事件数据集
  3. Python实现:从清洗到统计的核心代码
  4. 对比分析:不同球员/球队的抢点效率差异
  5. 结果可视化:用图表讲出数据故事
  6. 常见问题解答(FAQ)
  7. 总结与延伸应用

项目背景:为什么需要量化门前抢点射门?

在现代足球分析中,门前抢点射门(通常指小禁区或点球点附近的直接射门)是衡量前锋终结能力的关键指标,相比于远射或头球,抢点射门往往意味着更高的进球转化率,因此教练组和球探会重点统计这类事件。

Python案例统计门前抢点射门次数对比?

但手动统计比赛视频中的抢点次数不仅耗时,还容易产生主观偏差,借助 Python编程 和公开比赛数据(如StatsBomb、Wyscout等平台提供的事件数据),我们可以批量处理数百场比赛,精确计算出每位球员在“门前6码区”内的射门次数、射正率与进球数。

核心问题:某豪门球队的两位前锋,A球员抢点射门次数更多,但B球员进球效率更高——如何用数据验证这一现象?


数据准备:如何构建射门事件数据集

1 数据来源选择

  • StatsBomb开源数据:提供英超、世界杯等赛事的事件级JSON数据,包含射门坐标(x/y)、射门结果(进球/射正/射偏/被封堵)、比赛阶段等信息。
  • 自定义爬虫:若需特定联赛数据,可爬取FBref或Transfermarkt的统计表。

2 定义“门前抢点”的标准

为量化统计,我们定义:

  • 区域:球门中心点为原点,宽度18码(约16.5米),深度6码(约5.5米)的矩形区域。
  • 事件:射门时球员坐标位于该区域内,且射门方式为“左脚/右脚直接射门”(排除头球和远距离凌空)。

3 数据加载示例

import pandas as pd
import json
# 加载StatsBomb比赛数据
with open('events.json', 'r') as f:
    data = json.load(f)
# 筛选射门事件(type_name == 'Shot')
shots_df = pd.DataFrame([event for event in data if event['type']['name'] == 'Shot'])

Python实现:从清洗到统计的核心代码

1 坐标转换与区域过滤

StatsBomb的坐标系统以球场中心为(0,0),单位是码(yard),我们需要将坐标转换为以球门中心为原点的相对坐标:

def in_box_6yard(x, y):
    # 假设球门中心在(120, 40)(StatsBomb球场尺寸120x80)
    goal_center_x, goal_center_y = 120, 40
    rel_x = x - goal_center_x
    rel_y = y - goal_center_y
    # 门前6码:x方向偏移0~6,y方向偏移-9~9(球门宽度18码)
    return (0 <= rel_x <= 6) and (-9 <= rel_y <= 9)
# 应用过滤
def filter_6yard_shots(shots_df):
    # 提取坐标(注意StatsBomb坐标为列表[x,y])
    shots_df['x'] = shots_df['location'].apply(lambda loc: loc[0])
    shots_df['y'] = shots_df['location'].apply(lambda loc: loc[1])
    shots_df['in_box'] = shots_df.apply(lambda row: in_box_6yard(row['x'], row['y']), axis=1)
    return shots_df[shots_df['in_box'] == True]

2 统计关键指标

对筛选出的抢点射门事件,按球员分组统计:

def stat_by_player(filtered_shots):
    # 统计射门次数、射正次数、进球数
    stats = filtered_shots.groupby('player_name').agg(
        射门次数=('shot_type', 'count'),
        射正次数=('shot_statsbomb_xg', lambda x: (x['shot_outcome']=='Goal' or x['shot_outcome']=='Saved').sum()),
        进球数=('shot_outcome', lambda x: (x=='Goal').sum())
    ).reset_index()
    # 计算转化率
    stats['转化率'] = stats['进球数'] / stats['射门次数']
    return stats.sort_values('射门次数', ascending=False)

对比分析:不同球员/球队的抢点效率差异

1 案例数据展示

假设我们统计了2023-24赛季英超某强队两位前锋的数据:

球员 门前抢点射门次数 射正次数 进球数 转化率
球员A 48 20 10 8%
球员B 32 18 9 1%

关键发现

  • 球员A的抢点射门次数多出50%,但转化率比球员B低7个百分点。
  • 进一步查看射门质量:球员A的射门平均预期进球(xG)为0.15,而球员B为0.22——说明球员B更擅长在高质量位置完成射门。

2 误差修正建议

统计时需注意:

  • 小样本偏差:若球员总射门不足20次,转化率可能不可靠。
  • 对手防守强度:球员A面对高强度逼抢时抢点次数下降35%(可增加“防守压力”标签校正)。

结果可视化:用图表讲出数据故事

使用Matplotlib和Seaborn生成对比散点图和饼图:

import matplotlib.pyplot as plt
import seaborn as sns
# 画散点图:射门次数vs转化率
plt.figure(figsize=(10,6))
sns.scatterplot(data=player_stats, x='射门次数', y='转化率', 
                size='进球数', hue='球员名称', sizes=(50,500))'门前抢点射门:次数与效率对比')
plt.xlabel('门前抢点射门次数')
plt.ylabel('进球转化率')
plt.axhline(y=0.25, linestyle='--', color='gray', label='联赛平均转化率')
plt.legend()
plt.show()

可视化效果:可以清晰看出球员B位于高转化率区域,而球员A虽然次数多但效率偏低。


常见问题解答(FAQ)

Q1:用Python统计这类数据需要多少行代码?
A:核心逻辑约50-80行,包括数据加载、区域过滤和分组统计,加上可视化约150行。

Q2:如何确保“门前抢点”的定义在不同赛事中一致?
A:建议统一使用StatsBomb的坐标标准(120x80码),并手动校准区域边界,不同数据源(如Wyscout)坐标比例不同,需做归一化处理。

Q3:统计时是否需要排除点球?
A:点球坐标也在小禁区内,但属于特殊事件,建议单独标记“点球”列,对比时剔除或单独分析。

Q4:这个分析能直接用于球员转会评估吗?
A:可作为参考维度之一,但需结合预期进球(xG)、进攻跑位热图、对手实力等综合判断。


总结与延伸应用

通过Python对门前抢点射门进行量化分析,我们成功实现了:

  1. 自动化统计:从数千场比赛中快速提取关键数据。
  2. 对比分析:发现球员A和B的效率差异,为战术调整提供依据。
  3. 可视化输出:直观展示数据模式。

延伸应用方向

  • 球队战术诊断:统计全队抢点射门占比,判断是否过度依赖远射。
  • 青训评估:对比青年队与一线队的抢点效率,发现潜力球员。
  • 实时分析系统:结合跟踪数据(如Tracab),在比赛中实时计算抢点机会利用率。

行动建议

  1. 下载StatsBomb开源数据集(GitHub搜索“StatsBomb open data”)。
  2. 在本地Jupyter Notebook中运行上述代码。
  3. 尝试更换球队或联赛数据,重复分析流程。

一句总结:足球数据挖掘+Python = 从“感觉”到“证据”的跨越,门前抢点射门的量化分析是评估终结能力最直接的武器。

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