Python统计定位球得分占比案例
下面我用一个完整的案例,演示如何用Python统计足球比赛中定位球得分占比。

场景说明
假设你要分析某支球队一个赛季的进球数据:
- 总进球数
- 其中定位球进球(角球、任意球、点球等)
需要计算:定位球得分占比 = 定位球进球数 / 总进球数 × 100%
基础版:手动录入数据
# 定义赛季进球数据
goals_data = {
"运动战进球": 30,
"角球进球": 8,
"任意球进球": 5,
"点球进球": 6,
"乌龙球(对方)": 2
}
# 定位球类型(角球、任意球、点球都属于定位球)
set_piece_types = ["角球进球", "任意球进球", "点球进球"]
# 计算
total_goals = sum(goals_data.values())
set_piece_goals = sum(goals_data[k] for k in set_piece_types)
ratio = set_piece_goals / total_goals * 100
# 输出结果
print(f"总进球数:{total_goals}")
print(f"定位球进球数:{set_piece_goals}")
print(f"定位球得分占比:{ratio:.2f}%")
输出:
总进球数:51
定位球进球数:19
定位球得分占比:37.25%
进阶版:多队对比 + 可视化
import pandas as pd
import matplotlib.pyplot as plt
# 各队进球数据(运动战、角球、任意球、点球)
data = {
"球队": ["曼城", "阿森纳", "利物浦", "曼联", "切尔西"],
"运动战": [45, 38, 42, 28, 30],
"角球": [10, 9, 7, 6, 5],
"任意球": [4, 5, 3, 4, 3],
"点球": [6, 4, 5, 7, 6]
}
df = pd.DataFrame(data)
df["总进球"] = df[["运动战", "角球", "任意球", "点球"]].sum(axis=1)
df["定位球进球"] = df[["角球", "任意球", "点球"]].sum(axis=1)
df["定位球占比"] = (df["定位球进球"] / df["总进球"] * 100).round(2)
print(df[["球队", "总进球", "定位球进球", "定位球占比"]])
# 可视化
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
plt.figure(figsize=(8, 5))
bars = plt.bar(df["球队"], df["定位球占比"], color="steelblue")
plt.bar_label(bars, fmt="%.1f%%")
plt.ylabel("定位球得分占比 (%)")"各队定位球得分占比对比")
plt.ylim(0, 50)
plt.tight_layout()
plt.show()
输出:
球队 总进球 定位球进球 定位球占比
0 曼城 65 20 30.77
1 阿森纳 56 18 32.14
2 利物浦 57 15 26.32
3 曼联 45 17 37.78
4 切尔西 44 14 31.82
用真实比赛事件数据统计(更专业)
如果拿到每场比赛的事件数据(event data),可以自动识别定位球:
import pandas as pd
# 模拟比赛事件数据(实际可从 OPTA / StatsBomb / whoscored 爬取)
events = pd.DataFrame([
{"比赛": "第1轮", "进球方式": "运动战", "球队": "曼城"},
{"比赛": "第1轮", "进球方式": "点球", "球队": "曼城"},
{"比赛": "第2轮", "进球方式": "角球", "球队": "曼城"},
{"比赛": "第2轮", "进球方式": "任意球", "球队": "曼城"},
{"比赛": "第3轮", "进球方式": "运动战", "球队": "曼城"},
{"比赛": "第4轮", "进球方式": "角球", "球队": "曼城"},
])
# 标记定位球
set_piece_kinds = ["角球", "任意球", "点球", "间接任意球"]
events["是否定位球"] = events["进球方式"].isin(set_piece_kinds)
# 统计
total = len(events)
set_piece = events["是否定位球"].sum()
ratio = set_piece / total * 100
print(f"总进球:{total}")
print(f"定位球进球:{set_piece}")
print(f"定位球占比:{ratio:.2f}%")
# 分类汇总
print("\n各进球方式分布:")
print(events["进球方式"].value_counts())
输出:
总进球:6
定位球进球:4
定位球占比:66.67%
各进球方式分布:
运动战 2
角球 2
点球 1
任意球 1
关键统计公式
$$ \text{定位球得分占比} = \frac{\text{角球进球} + \text{任意球进球} + \text{点球进球}}{\text{总进球数}} \times 100\% $$
注意点:
- 点球是否算作定位球有争议——FIFA统计中通常算,但分析时有些机构会单独列出;
- 间接任意球和直接任意球要区分统计;
- 如果做跨赛季对比,需要统一口径。
扩展建议
- 📊 用
matplotlib/seaborn做占比饼图或堆叠柱状图 - 🤖 用
requests + BeautifulSoup爬取 flashscore / whoscored 数据 - 📈 分析定位球得分与比赛结果相关性(胜/平/负)
- ⚽ 从公开数据集 StatsBomb Open Data 获取真实事件数据
需要我帮你写爬取真实数据或做饼图可视化的代码吗?