本文目录导读:

“中路渗透成功率”在足球数据分析里没有一个统一的官方口径,需要先定义清楚才能计算,下面我用一个综合 Python 案例来演示:如何从事件数据(如 StatsBomb 风格)中定义并计算“中路渗透成功率”,并给出可复用的代码框架。
先定义“中路渗透”
常见的一种可操作定义:
中路渗透 = 进攻方通过中央区域(球场宽度中间 1/3),用传球方式向前推进,并最终把球送入进攻三区或禁区的过程。
一次“中路渗透尝试”可以定义为:
- 传球起点在中路区域(x 方向在中路,y 在中央 1/3)
- 传球方向向前(终点 x > 起点 x)
- 传球目标区域是更靠前的中路或禁区
“成功”可以定义为:
- 传球成功(未被拦截)
- 且球最终到达进攻三区(x > 60)或禁区(x > 83)
Python 综合案例
准备数据
假设我们有一份传球事件数据 passes.csv,字段如下:
| 字段 | 含义 |
|---|---|
| match_id | 比赛 ID |
| team | 球队 |
| player | 球员 |
| x_start, y_start | 传球起点坐标(0–100 归一化) |
| x_end, y_end | 传球终点坐标 |
| completed | 是否成功(1/0) |
import pandas as pd
import numpy as np
# 读取数据
df = pd.read_csv("passes.csv")
# 球场坐标假设:x 0-100(纵向),y 0-100(横向)
# 中路:y 在 33.3 - 66.7 之间
def is_central(y):
return (y >= 33.3) & (y <= 66.7)
# 进攻三区:x > 60
# 禁区:x > 83
标记“中路渗透尝试”
# 起点在中路
df["start_central"] = is_central(df["y_start"])
# 终点在中路
df["end_central"] = is_central(df["y_end"])
# 向前传球
df["forward"] = df["x_end"] > df["x_start"]
# 传球进入进攻三区或禁区
df["into_final_third"] = df["x_end"] > 60
df["into_box"] = df["x_end"] > 83
# 定义中路渗透尝试:
# 起点中路 + 向前 + 终点在中路或禁区方向
df["central_penetration_attempt"] = (
df["start_central"]
& df["forward"]
& (df["end_central"] | df["into_box"])
)
# 成功:尝试 + 传球成功 + 到达进攻三区
df["central_penetration_success"] = (
df["central_penetration_attempt"]
& (df["completed"] == 1)
& df["into_final_third"]
)
计算成功率
# 按球队统计
result = df.groupby("team").agg(
attempts=("central_penetration_attempt", "sum"),
successes=("central_penetration_success", "sum")
)
result["success_rate"] = result["successes"] / result["attempts"]
result = result.sort_values("success_rate", ascending=False)
print(result)
输出示例
| team | attempts | successes | success_rate |
|---|---|---|---|
| Team A | 120 | 54 | 45 |
| Team B | 98 | 39 | 40 |
| Team C | 110 | 38 | 35 |
说明:以上为示例数据。真实成功率通常在 30%–50% 之间,取决于定义严格程度和联赛水平。
更细粒度的分析
按区域细分
# 把中路再分为:中后场、中场、前场
def zone(x):
if x < 40:
return "后场"
elif x < 60:
return "中场"
else:
return "前场"
df["start_zone"] = df["x_start"].apply(zone)
zone_stats = df[df["central_penetration_attempt"]].groupby(
["team", "start_zone"]
).agg(
attempts=("central_penetration_attempt", "sum"),
successes=("central_penetration_success", "sum")
)
zone_stats["success_rate"] = zone_stats["successes"] / zone_stats["attempts"]
print(zone_stats)
可视化
import matplotlib.pyplot as plt
result["success_rate"].plot(kind="bar", figsize=(8,5))"中路渗透成功率 by Team")
plt.ylabel("Success Rate")
plt.ylim(0, 0.6)
plt.show()
用 mplsoccer 画传球路线图
from mplsoccer import Pitch
pitch = Pitch(pitch_type='statsbomb', line_color='black')
fig, ax = pitch.draw(figsize=(10,7))
# 只画中路渗透尝试
subset = df[df["central_penetration_attempt"]]
for _, row in subset.iterrows():
color = "green" if row["central_penetration_success"] else "red"
pitch.arrows(
row["x_start"], row["y_start"],
row["x_end"], row["y_end"],
color=color, ax=ax, width=1, headwidth=3
)
"中路渗透尝试(绿=成功,红=失败)")
plt.show()
中路渗透成功率大概是多少?
根据不同定义和赛事数据:
| 定义 | 典型成功率 |
|---|---|
| 中路向前传球成功率 | 75%–85%(但多数是安全球) |
| 中路渗透性传球(line-breaking)成功率 | 40%–55% |
| 中路渗透进入进攻三区成功率 | 30%–45% |
| 中路渗透进入禁区成功率 | 15%–25% |
| 中路渗透最终形成射门转化率 | 5%–12% |
综合结论:
- 中路渗透”指向前推进型传球,成功率约 40%–55%。
- 如果指真正打穿防线进入危险区域,成功率约 20%–35%。
- 如果指最终转化为射门,成功率通常 低于 15%。
关键提醒
- 定义决定数字:不同口径下成功率差异很大,必须先明确“尝试”和“成功”的标准。
- 数据源影响结果:StatsBomb、Opta、Wyscout 的事件定义不同。
- 对手强度要控制:强队对弱队的中路渗透成功率会明显偏高。
- 建议用 xT / xG 加权:单纯看成功率会忽略传球风险和价值。
如果你能提供具体数据源(StatsBomb / Opta)和你想要的“中路渗透”定义,我可以帮你写一份完整可运行的 Python 分析脚本,直接算出你数据里的成功率。