根据python案例,球门球长传准确率?

wen python案例 6

本文目录导读:

根据python案例,球门球长传准确率?

  1. 场景设定
  2. 第一部分:Python代码实现
  3. 第二部分:核心要点与业务解释
  4. 第三部分:如果“命中率”指的是射门?

球门球长传准确率”的Python案例,是一个非常典型的体育数据分析场景,在足球(soccer)数据中,这通常是指Goal Kicks(球门球)Long Balls(长传)成功率

由于我没有你提到的具体“Python案例”代码文件,我根据足球数据科学(如StatsBomb, Opta)的通用标准,为你提供一套完整的、可运行的Python分析案例,并附上代码和逻辑解释。

这套案例将涵盖:数据清洗 -> 指标定义 -> 计算 -> 可视化


场景设定

假设我们有一个CSV文件(或DataFrame),包含了某场比赛或整个赛季的门将数据,字段如下:

  • player_name:球员姓名
  • event_type:事件类型(此处固定为“Goal Kick”)
  • outcome:结果(“Successful” 或 “Unsuccessful”)
  • pass_length:传球距离(米)
  • start_x, start_y:起始坐标
  • end_x, end_y:结束坐标

核心定义

  • 长传:通常定义为传球距离 > 35米(或根据统计分析,>40码)。
  • 准确率 = 成功长传次数 / 总长传次数 * 100%。

第一部分:Python代码实现

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 设置中文显示(如果电脑有中文字体)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
# ------------------------------
# 1. 模拟数据生成(假设你没有真实数据)
# ------------------------------
def generate_synthetic_data(rows=500):
    np.random.seed(42)
    data = {
        'player_name': np.random.choice(['A_GoalKeeper', 'B_GoalKeeper', 'C_GoalKeeper'], size=rows),
        'event_type': ['Goal Kick'] * rows,
        'pass_length': np.random.uniform(20, 65, size=rows).round(1),  # 距离20-65米
        'outcome': np.random.choice(['Successful', 'Unsuccessful'], size=rows, p=[0.6, 0.4]),
    }
    # 让距离与成功率有点相关性(距离越远越难)
    df = pd.DataFrame(data)
    # 调整逻辑:距离>55米的,成功率降低
    mask_long = df['pass_length'] > 55
    df.loc[mask_long & (df['outcome'] == 'Successful'), 'outcome'] = 'Unsuccessful'  # 强制降低长距离成功率
    df.loc[mask_long, 'outcome'] = np.random.choice(['Successful', 'Unsuccessful'], size=mask_long.sum(), p=[0.3, 0.7])
    return df
df = generate_synthetic_data()
print("模拟数据前5行:")
print(df.head())
# ------------------------------
# 2. 核心指标计算:球门球长传准确率
# ------------------------------
def calculate_goal_kick_long_ball_accuracy(dataframe, long_distance_threshold=35):
    """
    计算球门球中的长传准确率。
    参数:
    - dataframe: 包含事件数据的DataFrame
    - long_distance_threshold: 将传球判定为“长传”的距离阈值(米)
    返回:
    - 总览DataFrame(包含球员、总长传数、成功数、准确率)
    """
    # 筛选球门球事件
    goal_kicks = dataframe[dataframe['event_type'] == 'Goal Kick'].copy()
    # 筛选长传(距离大于阈值)
    long_balls = goal_kicks[goal_kicks['pass_length'] > long_distance_threshold].copy()
    # 如果没有任何长传,返回空
    if long_balls.empty:
        print("警告:在设定的阈值下没有长传记录。")
        return pd.DataFrame()
    # 按球员分组计算
    grouped = long_balls.groupby('player_name').agg(
        total_long_balls=('outcome', 'count'),
        successful_long_balls=('outcome', lambda x: (x == 'Successful').sum())
    ).reset_index()
    # 计算准确率
    grouped['long_ball_accuracy'] = (grouped['successful_long_balls'] / grouped['total_long_balls'] * 100).round(2)
    # 排序
    grouped = grouped.sort_values('long_ball_accuracy', ascending=False).reset_index(drop=True)
    return grouped
# 调用函数(设定长传阈值=35米)
result = calculate_goal_kick_long_ball_accuracy(df, long_distance_threshold=35)
print("\n球门球长传准确率统计(阈值35米):")
print(result)
# ------------------------------
# 3. 深入分析:距离-准确率关系(散点图)
# ------------------------------
def plot_accuracy_vs_distance(dataframe):
    goal_kicks = dataframe[dataframe['event_type'] == 'Goal Kick']
    # 计算每个距离段的成功率(简单分箱)
    bins = [20, 30, 40, 50, 60, 70]
    labels = ['20-30m', '30-40m', '40-50m', '50-60m', '60m+']
    goal_kicks['distance_bin'] = pd.cut(goal_kicks['pass_length'], bins=bins, labels=labels, right=False)
    success_rate = goal_kicks.groupby('distance_bin', observed=False)['outcome'].apply(
        lambda x: (x == 'Successful').mean() * 100
    ).reset_index(name='success_rate')
    plt.figure(figsize=(10, 6))
    sns.barplot(x='distance_bin', y='success_rate', data=success_rate, palette='viridis')
    plt.title('球门球远端传球距离 vs 成功率')
    plt.xlabel('传球距离区间')
    plt.ylabel('成功率 (%)')
    plt.ylim(0, 100)
    for index, row in success_rate.iterrows():
        plt.text(index, row['success_rate'] + 2, f"{row['success_rate']:.0f}%", ha='center')
    plt.show()
plot_accuracy_vs_distance(df)

第二部分:核心要点与业务解释

指标定义非唯一

  • 阈值:在StatsBomb数据中,长传(Long Pass)的定义通常是基于开方坐标计算距离,有的模型用35米,有的用40码(约36.6米)。如果你的案例代码中使用了别的阈值(比如传入参数),替换 long_distance_threshold 即可
  • 成功标准:成功的定义往往是“球权归属本方”,即队友接到球,而不是仅仅“落在场内”。

如果案例代码中有坐标轴

有很多案例(比如绘制度图)会根据传球起点和终点坐标计算距离,如果那个PPT或案例用的是 xy 坐标,那么你需要用欧几里得距离公式:

import numpy as np
df['pass_length_computed'] = np.sqrt(
    (df['end_x'] - df['start_x'])**2 + (df['end_y'] - df['start_y'])**2
)

如何解读结果(商业/战术意义)

  • 高准确率:说明门将的长传决策冷静、脚法精准,或者战术上倾向于短长传(找边后卫/中场)。
  • 低准确率:说明门将主打“大脚”开球(如英式长传冲吊),虽然威胁大但成功率低。
  • 案例应用:如果某门将长传准确率高达70%+,那么在数据分析报告中,他会被标记为“优秀的组织型门将”。

第三部分:命中率”指的是射门?

与你确认一下,如果那个案例真的是 “球门球直接助攻”(比如门将球门球直接找到前锋形成射门),那么代码的核心逻辑是加一个“关联字段”:

  1. 判断球门球结束后,下一个动作是否为“Shot”且队友接球。
  2. 计算“产生射门”的比例。

但通常主流的“球门球准确率”指标就是传球成功接通率


这个案例只需把其中的“长传距离阈值”调整好,就会得出你想要的答案,如果上面的数据和模拟逻辑与你的PPT案例不符,请提供下述信息,我帮你修正代码:

  1. 数据字段名(是 length 还是 distance?)
  2. 成功的字段值(是 accuracy 还是 outcome?)
  3. 长传的定义是否明确在注释里?

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