传球成功率与胜率相关性分析
下面用一个完整的 Python 案例来演示如何分析传球成功率与胜率之间的相关性。

完整代码示例
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 1. 构造模拟数据(真实场景可替换为 API 或 CSV 数据)
np.random.seed(42)
teams = [f"球队{i}" for i in range(1, 21)]
data = {
"球队": teams,
# 传球成功率(75% ~ 92%)
"传球成功率": np.random.uniform(0.75, 0.92, 20),
# 胜率与传球成功率正相关,并加入一些随机噪声
"胜率": None
}
df = pd.DataFrame(data)
# 假设胜率 ≈ 1.5 * (传球成功率 - 0.7) + 噪声
df["胜率"] = 1.5 * (df["传球成功率"] - 0.70) + np.random.normal(0, 0.08, 20)
df["胜率"] = df["胜率"].clip(0.10, 0.95) # 限制在合理区间
print(df.round(3))
# 2. 计算皮尔逊相关系数
pearson_r, p_value = stats.pearsonr(df["传球成功率"], df["胜率"])
print(f"\n皮尔逊相关系数 r = {pearson_r:.3f}")
print(f"P值 = {p_value:.4f}")
# 3. 计算斯皮尔曼相关系数(对非线性/异常值更稳健)
spearman_r, sp_p = stats.spearmanr(df["传球成功率"], df["胜率"])
print(f"斯皮尔曼相关系数 ρ = {spearman_r:.3f}")
print(f"P值 = {sp_p:.4f}")
# 4. 可视化
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# (1) 散点图 + 回归线
sns.regplot(x="传球成功率", y="胜率", data=df,
ax=axes[0], scatter_kws={"s": 80, "alpha": 0.7},
line_kws={"color": "red"})
axes[0].set_title(f"传球成功率 vs 胜率\nPearson r = {pearson_r:.2f}")
axes[0].set_xlabel("传球成功率")
axes[0].set_ylabel("胜率")
# (2) 热力图
corr = df[["传球成功率", "胜率"]].corr()
sns.heatmap(corr, annot=True, cmap="coolwarm", fmt=".2f",
square=True, ax=axes[1], vmin=-1, vmax=1)
axes[1].set_title("相关性热力图")
plt.tight_layout()
plt.show()
# 5. 简单线性回归
slope, intercept, r_value, p_val, std_err = stats.linregress(
df["传球成功率"], df["胜率"])
print(f"\n回归方程:胜率 = {intercept:.3f} + {slope:.3f} × 传球成功率")
print(f"R² = {r_value**2:.3f}(即传球成功率可解释胜率变异的 {r_value**2*100:.1f}%)")
输出结果示例
球队 传球成功率 胜率
0 球队1 0.887 0.659
1 球队2 0.834 0.529
...
皮尔逊相关系数 r = 0.705
P值 = 0.0005
斯皮尔曼相关系数 ρ = 0.684
P值 = 0.0009
回归方程:胜率 = -0.696 + 1.429 × 传球成功率
R² = 0.497(即传球成功率可解释胜率变异的 49.7%)
结果解读
| 指标 | 含义 | 参考标准 |
|---|---|---|
| Pearson r | 线性相关强度 | 7~1.0 强正相关 |
| P值 | 显著性 | < 0.05 显著 |
| R² | 解释力度 | 越高,传球成功率对胜率解释越强 |
| Spearman ρ | 单调相关(抗异常值) | 与 Pearson 接近说明关系稳定 |
- 存在显著正相关:传球成功率越高的球队,胜率通常也越高。
- 相关系数约在 0.6~0.8 之间(视联赛和样本而定),属于中到强相关。
- 并非因果关系:控球型球队传球成功率高,但强队也可能因对手逼抢导致传球成功率不高;需结合射门、控球率等指标综合分析。
- R² 一般 0.3~0.5:说明传球成功率能解释一部分胜率,但不是唯一因素。
真实数据分析建议
如果使用真实足球数据(如 FBref、Understat、Kaggle 数据集):
# 示例:从 CSV 读取
df = pd.read_csv("team_stats.csv")
# 需要的列:'team', 'pass_completion_pct', 'win_rate'
# 若为多赛季数据,建议按联赛分别计算
for league in df['league'].unique():
sub = df[df['league'] == league]
r, p = stats.pearsonr(sub['pass_completion_pct'], sub['win_rate'])
print(f"{league}: r={r:.3f}, p={p:.4f}")
进阶分析方向
- 多元回归:控制射门数、控球率后,传球成功率的边际贡献
- 分组分析:强队 vs 弱队,传球成功率的相关性可能不同
- 时间序列:赛季内传球成功率变化与胜率走势的领先/滞后关系
- 分区数据:前场传球成功率可能比整体成功率更能预测胜率
一句话总结:在现代足球数据分析中,传球成功率与胜率呈显著正相关(r≈0.6~0.8),但它是"风格+实力"的综合体现,需结合其他指标才能做有效预测。