足球传球成功率统计案例
下面我用一个完整的 Python 案例,演示如何统计两支球队的传球成功率并判断哪队更高。

场景说明
假设我们有一份比赛传球数据,记录每次传球是否成功(成功=1,失败=0)。
基础版(使用列表 + 手动统计)
# 模拟传球数据:'A' 表示 A 队,'B' 表示 B 队
# 1 = 传球成功,0 = 传球失败
passes = [
('A', 1), ('A', 1), ('A', 0), ('A', 1), ('A', 1),
('A', 1), ('A', 1), ('A', 1), ('A', 0), ('A', 1),
('B', 1), ('B', 0), ('B', 0), ('B', 1), ('B', 0),
('B', 1), ('B', 1), ('B', 0), ('B', 1), ('B', 1),
]
# 分别统计每队的总传球数和成功数
stats = {'A': {'total': 0, 'success': 0},
'B': {'total': 0, 'success': 0}}
for team, success in passes:
stats[team]['total'] += 1
stats[team]['success'] += success
# 计算成功率
for team in stats:
total = stats[team]['total']
succ = stats[team]['success']
rate = succ / total * 100
stats[team]['rate'] = rate
print(f"{team} 队:传球 {total} 次,成功 {succ} 次,成功率 {rate:.2f}%")
# 判断哪队更高
if stats['A']['rate'] > stats['B']['rate']:
print(f"\n🏆 A 队传球成功率更高({stats['A']['rate']:.2f}% > {stats['B']['rate']:.2f}%)")
elif stats['A']['rate'] < stats['B']['rate']:
print(f"\n🏆 B 队传球成功率更高({stats['B']['rate']:.2f}% > {stats['A']['rate']:.2f}%)")
else:
print("\n🤝 两队传球成功率相同")
运行结果:
A 队:传球 10 次,成功 8 次,成功率 80.00%
B 队:传球 10 次,成功 6 次,成功率 60.00%
🏆 A 队传球成功率更高(80.00% > 60.00%)
进阶版(使用 Pandas,适合真实比赛数据)
真实比赛数据通常存在 CSV 或 DataFrame 中,用 Pandas 更高效:
import pandas as pd
# 模拟读取比赛传球记录(也可以 pd.read_csv('match.csv'))
df = pd.DataFrame({
'team': ['A']*10 + ['B']*10,
'pass_success': [1,1,0,1,1,1,1,1,0,1, # A 队
1,0,0,1,0,1,1,0,1,1] # B 队
})
# 分组聚合计算
result = df.groupby('team')['pass_success'].agg(
total_passes='count',
successful_passes='sum'
)
result['success_rate(%)'] = (result['successful_passes'] / result['total_passes'] * 100).round(2)
print(result)
# 找出成功率最高的队伍
best_team = result['success_rate(%)'].idxmax()
print(f"\n🏆 传球成功率最高的球队是:{best_team} 队"
f"({result.loc[best_team, 'success_rate(%)']}%)")
运行结果:
total_passes successful_passes success_rate(%)
team
A 10 8 80.0
B 10 6 60.0
🏆 传球成功率最高的球队是:A 队(80.0%)
带详细分析的可视化版本
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame({
'team': ['A']*10 + ['B']*10,
'pass_success': [1,1,0,1,1,1,1,1,0,1,
1,0,0,1,0,1,1,0,1,1]
})
result = df.groupby('team')['pass_success'].agg(
total='count', success='sum'
)
result['rate'] = result['success'] / result['total'] * 100
# 柱状图对比
result['rate'].plot(kind='bar', color=['#3498db', '#e74c3c'], figsize=(6,4))'两队传球成功率对比')
plt.ylabel('成功率 (%)')
plt.xticks(rotation=0)
plt.ylim(0, 100)
for i, v in enumerate(result['rate']):
plt.text(i, v + 2, f'{v:.1f}%', ha='center')
plt.tight_layout()
plt.show()
| 步骤 | 说明 |
|---|---|
| 数据收集 | 每次传球记录:球队 + 是否成功(1/0) |
| 分组统计 | 按球队分组,统计总数和成功数 |
| 计算成功率 | 成功数 / 总数 × 100% |
| 比较判断 | 用 max() 或 idxmax() 找最高值 |
| 注意样本量 | 传球次数少时成功率波动大,需结合样本量分析 |
小提示
- 真实数据中还要考虑传球距离、区域、压力等因素,可进一步做分组分析(如"前场传球成功率")
- 若两队传球总数差异大,仅看成功率可能有偏差,可结合成功传球绝对数一起看
- 用
df.groupby(['team', 'zone'])可以做更细粒度的分析
需要我把它扩展成读取真实 CSV 比赛数据的版本,或者加入传球区域/球员维度的分析吗?