本文目录导读:

球门球长传准确率”的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或案例用的是 x 和 y 坐标,那么你需要用欧几里得距离公式:
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%+,那么在数据分析报告中,他会被标记为“优秀的组织型门将”。
第三部分:命中率”指的是射门?
与你确认一下,如果那个案例真的是 “球门球直接助攻”(比如门将球门球直接找到前锋形成射门),那么代码的核心逻辑是加一个“关联字段”:
- 判断球门球结束后,下一个动作是否为“Shot”且队友接球。
- 计算“产生射门”的比例。
但通常主流的“球门球准确率”指标就是传球成功接通率。
这个案例只需把其中的“长传距离阈值”调整好,就会得出你想要的答案,如果上面的数据和模拟逻辑与你的PPT案例不符,请提供下述信息,我帮你修正代码:
- 数据字段名(是
length还是distance?) - 成功的字段值(是
accuracy还是outcome?) - 长传的定义是否明确在注释里?