本文目录导读:

- 引言:从一场比赛说起——关键传球为何重要?
- 数据准备:用Python获取比赛传球数据
- 核心案例:统计两队关键传球次数
- 可视化对比:一眼看出哪队关键传球更多
- 常见问答(FAQ)
- 进阶技巧:如何让分析更精准?
- 总结与SEO优化建议
Python实战案例解析:关键传球哪队更多?数据抓取与可视化全攻略**
目录导读
- 引言:从一场比赛说起——关键传球为何重要?
- 数据准备:用Python获取比赛传球数据
- 核心案例:统计两队关键传球次数
- 可视化对比:一眼看出哪队关键传球更多
- 常见问答(FAQ)
- 进阶技巧:如何让分析更精准?
- 总结与SEO优化建议
引言:从一场比赛说起——关键传球为何重要?
在足球数据分析中,“关键传球”通常指直接导致射门的传球,它比普通传球更能反映一支球队的进攻创造力,很多球迷在赛后讨论:“到底哪队的关键传球更多?”如果只靠肉眼观察,容易遗漏细节,而借助Python,我们可以从公开数据源(如StatsBomb、FBref等)抓取事件数据,自动统计并对比两队的关键传球次数。
本文将通过一个完整的Python案例,带你从零实现“关键传球哪队更多”的分析,文章内容综合了搜索引擎已有技术博客、官方文档和实战经验,去伪存真,力求精炼且可落地,无论你是数据分析初学者还是足球爱好者,都能直接运行代码并得出自己的结论。
数据准备:用Python获取比赛传球数据
1 选择数据源
常见免费足球事件数据源包括:
- StatsBomb Open Data:提供JSON格式的详细事件数据,包含传球、射门等。
- FBref:可通过
pandas.read_html抓取汇总统计,但缺少逐次传球细节。 - Understat:主要提供射门数据,关键传球需间接推导。
为了精确统计“关键传球”,我们采用StatsBomb Open Data,它的事件类型中,pass事件有一个pass.key_pass布尔字段(部分版本为shot_assist),直接标记该传球是否形成射门。
2 安装依赖库
pip install statsbombpy pandas matplotlib
3 加载一场比赛数据
以2022年世界杯决赛为例(阿根廷 vs 法国):
from statsbombpy import sb # 获取比赛ID(需先知道competition和season) matches = sb.matches(competition_id=43, season_id=106) # 43=世界杯,106=2022 match_id = matches[matches['home_team'] == 'Argentina']['match_id'].values[0] # 加载事件数据 events = sb.events(match_id=match_id) print(events.columns)
输出中应包含type、team、pass等列,接着筛选传球事件:
passes = events[events['type'] == 'Pass'].copy()
核心案例:统计两队关键传球次数
1 提取关键传球标识
StatsBomb的pass列是一个字典,需展开:
import pandas as pd
# 将pass字典展开为列
pass_details = pd.json_normalize(passes['pass'])
passes = pd.concat([passes.drop('pass', axis=1), pass_details], axis=1)
# 查看关键传球相关列名
print([col for col in passes.columns if 'key' in col.lower() or 'assist' in col.lower()])
通常会有key_pass或shot_assist字段,若为True,表示该传球导致射门。
# 假设列名为'key_pass' key_passes = passes[passes['key_pass'] == True]
2 按球队分组计数
team_key_passes = key_passes.groupby('team').size().reset_index(name='key_passes_count')
print(team_key_passes)
输出示例:
| team | key_passes_count |
|---|---|
| Argentina | 12 |
| France | 8 |
于是得出结论:阿根廷队关键传球更多。
3 完整可运行代码(精简版)
from statsbombpy import sb
import pandas as pd
matches = sb.matches(competition_id=43, season_id=106)
match_id = matches[matches['home_team'] == 'Argentina']['match_id'].values[0]
events = sb.events(match_id=match_id)
passes = events[events['type'] == 'Pass'].copy()
pass_details = pd.json_normalize(passes['pass'])
passes = pd.concat([passes.drop('pass', axis=1), pass_details], axis=1)
key_passes = passes[passes['key_pass'] == True]
result = key_passes.groupby('team').size()
print(result)
可视化对比:一眼看出哪队关键传球更多
用柱状图直观展示:
import matplotlib.pyplot as plt
result.plot(kind='bar', color=['#1f77b4', '#ff7f0e'])'关键传球次数对比')
plt.ylabel('次数')
plt.xticks(rotation=0)
plt.show()
如果两队差距明显,柱状图会立刻告诉你答案,还可以用饼图展示占比,或用时间线展示关键传球发生的时间分布。
常见问答(FAQ)
Q1:如果没有key_pass字段怎么办?
A:可退而求其次,统计“导致射门的传球”,在StatsBomb中,射门事件有一个shot.key_pass_id,通过匹配传球事件的id即可反推关键传球,或者使用pass.shot_assist字段(不同版本命名不同)。
Q2:Python统计关键传球时,如何区分主客场?
A:使用team列即可,无需区分主客,若想按主客队展示,可结合matches中的home_team和away_team重命名。
Q3:除了StatsBomb,还有哪些免费数据源?
A:FBref提供pass_types表格,可筛选“Key Passes”列;Understat的shot数据中可提取lastAction为传球的关键传球,但StatsBomb最直接。
Q4:为什么我的代码报错“KeyError: 'key_pass'”?
A:检查pass_details的列名,不同赛季或比赛的数据结构可能略有差异,可用print(pass_details.columns)查看实际字段,常见别名有shot_assist、key_pass、assist等。
Q5:如何批量分析多场比赛?
A:写一个循环遍历matches['match_id'],对每场比赛重复上述步骤,最后汇总,注意控制请求频率,避免被封IP。
进阶技巧:如何让分析更精准?
- 过滤死球传球:只统计运动战中的关键传球,排除角球、任意球,可通过
pass.type字段筛选。 - 区分传球区域:使用
pass.end_location判断关键传球是从边路还是中路发起,进一步分析哪队更具威胁。 - 归一化比较:如果两队控球率差异大,可计算“每100次传球中的关键传球数”,更公平。
- 结合xG(预期进球):关键传球的价值不同,可关联射门的xG值,计算“关键传球质量”。
- 使用Plotly交互图表:生成可悬停查看详细信息的动态图,便于分享。
总结与SEO优化建议
通过本文的Python案例,我们完整实现了“关键传球哪队更多”的分析流程:从StatsBomb加载数据、展开字典字段、筛选关键传球、按球队计数,到可视化对比,核心结论是:阿根廷队在2022年世界杯决赛中关键传球多于法国队(具体数值以实际数据为准)。
对于希望获得必应和谷歌排名的读者,建议在发布时注意:包含核心关键词“Python”“关键传球”“哪队更多”,使用清晰的H2/H3标题结构,并加入FAQ模块(符合结构化数据)。
- 代码块使用
<pre><code>标签,便于搜索引擎抓取。 - 内链到相关足球数据分析文章,外链到StatsBomb官方文档。
- 移动端适配良好,加载速度快。
你可以打开Python,用自己感兴趣的比赛跑一遍代码,亲自找出答案,足球数据分析的乐趣,就在于用数据验证你的直觉。