足球长短传比例统计案例分析
下面用 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
# 模拟传球数据
np.random.seed(42)
n = 1000
df = pd.DataFrame({
'player': np.random.choice(['球员A','球员B','球员C','球员D'], n),
'pass_length': np.random.exponential(scale=15, size=n) + 2, # 传球距离(米)
'success': np.random.choice([0, 1], n, p=[0.2, 0.8])
})
# 长短传划分(通常以30米为界,也可按25/35调整)
SHORT_THRESHOLD = 30
df['pass_type'] = np.where(df['pass_length'] < SHORT_THRESHOLD, '短传', '长传')
print(df.head())
print(df['pass_type'].value_counts())
整体长短传比例分布
# 1. 整体比例
ratio = df['pass_type'].value_counts(normalize=True) * 100
print("整体长短传比例:")
print(ratio.round(2))
# 2. 按球员统计
player_ratio = pd.crosstab(df['player'], df['pass_type'], normalize='index') * 100
print("\n各球员长短传比例(%):")
print(player_ratio.round(2))
可视化分布
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
# 饼图 - 整体比例
ratio.plot.pie(ax=axes[0], autopct='%1.1f%%', colors=['#66b3ff','#ff9999'])
axes[0].set_ylabel('')
axes[0].set_title('整体长短传比例')
# 分组柱状图 - 各球员比例
player_ratio.plot.bar(stacked=True, ax=axes[1], color=['#66b3ff','#ff9999'])
axes[1].set_title('各球员长短传比例')
axes[1].set_ylabel('百分比 (%)')
axes[1].legend(title='传球类型')
plt.tight_layout()
plt.show()
传球距离分布直方图
plt.figure(figsize=(10, 5))
sns.histplot(data=df, x='pass_length', hue='pass_type', bins=40, kde=True,
palette={'短传':'#66b3ff','长传':'#ff9999'})
plt.axvline(SHORT_THRESHOLD, color='red', linestyle='--', label=f'{SHORT_THRESHOLD}m 分界线')'传球距离分布')
plt.xlabel('传球距离 (米)')
plt.legend()
plt.show()
进阶:按位置/区域分组
如果数据包含位置信息,可以进一步细分:
# 模拟位置数据 df['position'] = np.random.choice(['后卫','中场','前锋'], n) # 按位置统计长短传比例 pos_ratio = pd.crosstab(df['position'], df['pass_type'], normalize='index') * 100 print(pos_ratio.round(2)) # 热力图展示 plt.figure(figsize=(6, 4)) sns.heatmap(pos_ratio, annot=True, fmt='.1f', cmap='YlOrRd')'不同位置长短传比例(%)') plt.show()
关键输出示例
整体长短传比例:
短传 86.40
长传 13.60
各球员长短传比例(%):
短传 长传
球员A 86.02 13.98
球员B 86.29 13.71
球员C 87.11 12.89
球员D 86.24 13.76
分析要点
| 指标 | 说明 |
|---|---|
| 阈值选择 | 一般 25-30m;也可按 Opta 标准 (短传 <32m) |
| 比例计算 | 用 normalize='index' 得行百分比 |
| 成功率差异 | 可对比长传/短传的成功率 |
| 分组维度 | 球员、位置、区域、比赛阶段 |
成功率对比示例
success_rate = df.groupby('pass_type')['success'].mean() * 100
print(success_rate.round(2))
# 短传: ~81%, 长传: ~76%
需要我针对具体场景 (如某联赛/某球员 Opta 数据、传球路线图、区域划分) 进一步展开吗?