Python案例统计禁区内射门次数对比?

wen python案例 2

本文目录导读:

Python案例统计禁区内射门次数对比?

  1. 目录导读
  2. 为什么要分析禁区内射门次数对比?
  3. 数据准备:获取与清洗足球赛事数据
  4. Python代码实现:禁区射门坐标判定与统计
  5. 数据可视化:用图表呈现禁区内外射门对比
  6. 常见问题与解决方案(Q&A)
  7. 结论与延伸应用

Python案例实战:如何统计足球比赛中禁区内射门次数与禁区外射门对比分析

目录导读

  1. 为什么要分析禁区内射门数据?
  2. 数据准备:获取与清洗足球赛事数据
  3. Python代码实现:禁区射门坐标判定与统计
  4. 数据可视化:用图表呈现禁区内外射门对比
  5. 常见问题与解决方案(Q&A)
  6. 结论与延伸应用

为什么要分析禁区内射门次数对比?

在现代足球数据分析中,“禁区内射门次数”被视为衡量进攻效率的核心指标之一,根据Opta等专业体育数据机构的统计,禁区内射门的进球转化率通常比禁区外高出3-5倍(禁区外远射命中率约3%-5%,禁区内则可达15%-20%),通过Python自动化统计球队或球员在禁区内外的射门分布,可以帮助教练团队制定更具针对性的战术——若某支球队射门数量虽多但多来自禁区外,说明其渗透进禁区的能力不足。

案例背景:假设我们需要分析2023-2024赛季英超联赛中,曼城与阿森纳在最近一场焦点战中的射门数据,原始数据通常来自赛事API(如Sportradar或Footballdata.org)导出的JSON/CSV文件,其中包含每脚射门的精确坐标(x,y)及射门结果。


数据准备:获取与清洗足球赛事数据

数据字段结构示例

一般赛事API返回的射门事件记录格式如下: | 字段名 | 类型 | 示例值 | |--------|------|--------| | match_id | int | 123456 | | player | str | “Haaland” | | x_coord | float | 75.2 | | y_coord | float | 45.8 | | shot_result | str | “goal” / “saved” / “missed” | | minute | int | 62 |

  • X坐标:通常以球场中圈为原点,纵向0~100(0为底线,100为对方底线)。
  • Y坐标:横向0~50(0为左边界,50为右边界)。

数据清洗关键步骤

import pandas as pd
# 读取原始CSV数据
df = pd.read_csv('shots_data.csv')
# 过滤出本场曼城vs阿森纳的比赛数据
df_match = df[(df['team'] == 'Manchester City') & (df['match_id'] == 123456)]
# 剔除缺失坐标的行
df_match = df_match.dropna(subset=['x_coord', 'y_coord'])
# 检查坐标范围是否合理(0-100, 0-50)
df_match = df_match[(df_match['x_coord'] >= 0) & (df_match['x_coord'] <= 100) &
                     (df_match['y_coord'] >= 0) & (df_match['y_coord'] <= 50)]

注意:部分数据源的坐标可能以像素或英尺为单位,需统一归一化处理,否则后续判定禁区边界时会出错。


Python代码实现:禁区射门坐标判定与统计

禁区范围定义

根据国际足联(FIFA)标准,禁区(Penalty Area)在球场坐标系中的对应范围如下(假设球场长为100,宽为50):

  • 纵向范围:X坐标 > 83(即对方底线前16.5米左右,对应100-16.5=83.5,取83为近似)。
  • 横向范围:Y坐标 > 16.7 且 Y < 33.3(禁区宽度约16.5米,对应50/2 ± 8.25)。

函数编写:判断射门是否在禁区内

def is_in_penalty_area(x, y):
    # 对方禁区(假设进攻方向为X增加)
    if x >= 83 and 16.7 <= y <= 33.3:
        return True
    return False
# 应用函数到数据框
df_match['in_penalty'] = df_match.apply(
    lambda row: is_in_penalty_area(row['x_coord'], row['y_coord']), axis=1
)
# 统计禁区内外射门次数
penalty_shots = df_match[df_match['in_penalty'] == True]
outside_shots = df_match[df_match['in_penalty'] == False]
print(f"禁区内射门次数: {len(penalty_shots)}")
print(f"禁区外射门次数: {len(outside_shots)}")

进阶:统计禁区内外进球分布

# 禁区内进球
penalty_goals = penalty_shots[penalty_shots['shot_result'] == 'goal']
outside_goals = outside_shots[outside_shots['shot_result'] == 'goal']
print(f"禁区内进球: {len(penalty_goals)} (转化率: {len(penalty_goals)/len(penalty_shots)*100:.1f}%)")
print(f"禁区外进球: {len(outside_goals)} (转化率: {len(outside_goals)/len(outside_shots)*100:.1f}%)")

数据可视化:用图表呈现禁区内外射门对比

使用matplotlibseaborn制作清晰的对比图表,便于报告展示。

射门位置散点图(含禁区矩形标注)

import matplotlib.pyplot as plt
import matplotlib.patches as patches
# 创建画布
fig, ax = plt.subplots(figsize=(10, 6))
# 绘制所有射门点,区分禁区内/外颜色
for idx, row in df_match.iterrows():
    if row['in_penalty']:
        ax.scatter(row['x_coord'], row['y_coord'], c='red', alpha=0.6, s=50)
    else:
        ax.scatter(row['x_coord'], row['y_coord'], c='blue', alpha=0.4, s=30)
# 绘制禁区矩形
penalty_rect = patches.Rectangle((83, 16.7), 17, 16.6, 
                                 linewidth=2, edgecolor='green', facecolor='none')
ax.add_patch(penalty_rect)
ax.set_xlim(0, 100)
ax.set_ylim(0, 50)
ax.set_title('曼城 vs 阿森纳:射门分布与禁区范围')
plt.show()

柱状图对比

labels = ['禁区内', '禁区外']
counts = [len(penalty_shots), len(outside_shots)]
plt.bar(labels, counts, color=['red', 'blue'])'禁区内/外射门次数对比')
plt.ylabel('射门次数')
plt.show()

常见问题与解决方案(Q&A)

❓ Q1:坐标数据不标准怎么办?

:大部分体育API默认使用“进攻方向为X递增”的坐标系,如果数据源的X坐标是0~105(国际标准场地长度),只需按比例缩放:

df['x_normalized'] = df['x_coord'] / 105 * 100  # 归一化到0~100

同理,Y坐标若为0~68(标准宽度),缩放为0~50。

❓ Q2:需要分析多家俱乐部的历史数据,代码如何复用?

:将核心函数封装成类或模块,例如创建ShotAnalyzer类,构造方法接受数据集和比赛ID,统一处理坐标转换和禁区判定,后续只需调用compare_penalty_shots(team_name)方法即可。

❓ Q3:如何获取公开的足球赛事数据?

:推荐以下免费/低成本渠道:

  • Kaggle数据库:如“European Football Data”包含多赛季射门坐标。
  • 体育数据API:Understat(提供详细xy坐标)、API-Football(部分免费额度)。
  • 注意:个人学习用途建议使用公开数据集;商业用途需购买正规授权。

结论与延伸应用

通过Python自动化统计禁区内射门次数,不仅节省了传统手动录像回放的时间(一场比赛约需2小时人工标注),更提供了可复用的量化分析框架,从上述输出结果可以看出:若曼城禁区内射门占比为65%,而阿森纳仅为38%,则能直观反映前者在禁区内的进攻威胁更高。

延伸应用场景

  1. 球员效率评估:统计某球员在禁区内外的射门转化率,判断其最佳射门区域。
  2. 战术调整建议:若某球队禁区外射门占比异常高(>70%),教练可针对性加强渗透传跑训练。
  3. 动态热力图:结合时间维度分析射门区域变化(例如下半场体能下降后,禁区外射门增多)。

最后提醒:本案例基于公开足球数据集,所有代码可在Jupyter Notebook中直接运行,如需完整代码包及示例数据,可关注“技术思维研究所”公众号发送“足球射门”获取,评论区欢迎讨论你在实际分析中遇到的坐标系问题或数据清洗难点!

上一篇这个Python案例显示远射次数哪队多?

下一篇当前分类已是最新一篇

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