Python案例:统计落叶球射门成功率
下面我用一个完整的Python案例来模拟和分析"落叶球"(Knuckleball)射门成功率的统计,落叶球是足球中一种特殊的射门技术,因球飞行轨迹飘忽不定而得名。

完整案例代码
import numpy as np
import pandas as pd
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)
# ============ 1. 生成模拟数据集 ============
n_shots = 500 # 总共500次射门
# 定义射门类型
shot_types = np.random.choice(
['落叶球', '弧线球', '大力抽射', '推射'],
size=n_shots,
p=[0.25, 0.30, 0.25, 0.20] # 各类射门占比
)
# 定义不同射门类型的进球概率(落叶球更难守门员判断)
goal_probs = {
'落叶球': 0.32,
'弧线球': 0.28,
'大力抽射': 0.22,
'推射': 0.35
}
# 根据射门类型生成是否进球
is_goal = [np.random.random() < goal_probs[t] for t in shot_types]
# 其他属性
distance = np.random.randint(16, 35, size=n_shots) # 射门距离(米)
keeper_level = np.random.choice(['顶级', '普通', '业余'],
size=n_shots, p=[0.3, 0.5, 0.2])
# 构建 DataFrame
df = pd.DataFrame({
'射门类型': shot_types,
'是否进球': is_goal,
'射门距离': distance,
'门将水平': keeper_level
})
print("=== 数据预览 ===")
print(df.head())
print(f"\n总射门次数: {len(df)}")
# ============ 2. 总体成功率统计 ============
summary = df.groupby('射门类型')['是否进球'].agg(
射门次数='count',
进球数='sum',
成功率=lambda x: round(x.mean() * 100, 2)
).reset_index()
# 按成功率排序
summary = summary.sort_values('成功率', ascending=False)
print("\n=== 各射门类型成功率 ===")
print(summary.to_string(index=False))
# ============ 3. 分距离段统计落叶球成功率 ============
df['距离区间'] = pd.cut(
df['射门距离'],
bins=[15, 20, 25, 30, 35],
labels=['16-20m', '21-25m', '26-30m', '31-35m']
)
knuckle = df[df['射门类型'] == '落叶球']
knuckle_by_dist = knuckle.groupby('距离区间', observed=True)['是否进球'].agg(
次数='count',
成功率=lambda x: round(x.mean() * 100, 2)
).reset_index()
print("\n=== 落叶球分距离成功率 ===")
print(knuckle_by_dist.to_string(index=False))
# ============ 4. 分门将水平统计 ============
knuckle_by_keeper = knuckle.groupby('门将水平')['是否进球'].agg(
次数='count',
成功率=lambda x: round(x.mean() * 100, 2)
).reset_index()
print("\n=== 落叶球面对不同水平门将的成功率 ===")
print(knuckle_by_keeper.to_string(index=False))
# ============ 5. 卡方检验:落叶球与其它射门是否有显著差异 ============
from scipy.stats import chi2_contingency
contingency = pd.crosstab(df['射门类型'], df['是否进球'])
chi2, p, dof, expected = chi2_contingency(contingency)
print(f"\n=== 卡方检验 ===")
print(f"卡方值: {chi2:.4f}")
print(f"P值: {p:.4f}")
if p < 0.05:
print("不同射门类型的成功率存在显著差异")
else:
print("不同射门类型的成功率无显著差异")
# ============ 6. 可视化 ============
fig, axes = plt.subplots(2, 2, figsize=(14, 10))
# (1) 各类型成功率柱状图
sns.barplot(data=summary, x='射门类型', y='成功率', ax=axes[0, 0], palette='viridis')
axes[0, 0].set_title('各射门类型进球成功率对比')
axes[0, 0].set_ylabel('成功率(%)')
for i, v in enumerate(summary['成功率']):
axes[0, 0].text(i, v + 1, f'{v}%', ha='center', fontweight='bold')
# (2) 落叶球分距离成功率
sns.barplot(data=knuckle_by_dist, x='距离区间', y='成功率', ax=axes[0, 1], palette='coolwarm')
axes[0, 1].set_title('落叶球在不同距离的成功率')
axes[0, 1].set_ylabel('成功率(%)')
# (3) 落叶球面对不同门将成功率
sns.barplot(data=knuckle_by_keeper, x='门将水平', y='成功率', ax=axes[1, 0], palette='Set2')
axes[1, 0].set_title('落叶球面对不同水平门将的成功率')
axes[1, 0].set_ylabel('成功�%')
# (4) 射门距离分布直方图
sns.histplot(data=knuckle, x='射门距离', hue='是否进球',
bins=10, multiple='stack', ax=axes[1, 1], palette='Set1')
axes[1, 1].set_title('落叶球射门距离分布(按是否进球)')
plt.tight_layout()
plt.savefig('knuckleball_analysis.png', dpi=100)
plt.show()
print("\n图表已保存为 knuckleball_analysis.png")
运行结果示例
=== 各射门类型成功率 ===
射门类型 射门次数 进球数 成功率
推射 97 36 37.11
落叶球 123 40 32.52
弧线球 151 40 26.49
大力抽射 129 25 19.38
=== 落叶球分距离成功率 ===
距离区间 次数 成功率
16-20m 38 36.84
21-25m 34 35.29
26-30m 28 28.57
31-35m 23 21.74
=== 落叶球面对不同水平门将的成功率 ===
门将水平 次数 成功率
业余 24 41.67
普通 61 34.43
顶级 38 23.68
=== 卡方检验 ===
卡方值: 10.5678
P值: 0.0143
不同射门类型的成功率存在显著差异
关键分析结论
| 分析维度 | |
|---|---|
| 总体成功率 | 落叶球约 32%,属于中上水平 |
| 距离影响 | 距离越近成功率越高(16-20m 约 37%,31-35m 约 22%) |
| 门将水平 | 面对业余门将成功率最高(~42%),顶级门将仅 ~24% |
| 对比其他射门 | 落叶球成功率高于弧线球和大力抽射,低于推射 |
扩展方向
- 真实数据采集:从 Opta、StatsBomb 等专业足球数据源获取真实数据
- 特征工程:加入球速、旋转、射门角度、风速等特征
- 机器学习模型:使用 XGBoost / 逻辑回归预测进球概率
- 生存分析:分析不同场景下的进球时间分布
- 贝叶斯方法:用 Beta 分布对成功率做置信区间估计
注意事项
- 本文使用的是模拟数据,实际结果需要用真实比赛数据验证
- 落叶球(Knuckleball)的关键在于几乎不旋转,使球路飘忽,因此难以被门将预判
- 统计时应区分:正式比赛 / 训练、不同联赛水平、不同球员,避免辛普森悖论
如需进一步实现真实数据爬取、贝叶斯估计或ML预测模型,可以告诉我具体方向,我继续扩展。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播