一、研究背景
2026 FIFA 世界杯采用扩军后的 48 队规模,比赛数量、晋级路径和洲际代表性均显著提升。对于数据分析而言,扩军不仅意味着样本量增加,也带来更多小组间差异、跨洲对抗和淘汰赛组合,使比赛级与球队级的多维探索更有价值。
本研究使用两张结构化数据表:matches.csv 记录 92 场比赛的日期、阶段、小组、对阵、比分、胜者、点球决胜与备注;teams.csv 记录 48 支球队的小组、洲际足联、东道主身份、首次参赛身份和当前出局轮次。比赛数据截至 2026-07-05,因此属于赛事进行中的阶段性快照。
研究流程遵循标准 EDA 方法:首先核验数据质量与业务语义,其次进行比赛级和球队级特征工程,再依次分析单场进球、赛事阶段、小组排名、球队攻防、洲际表现与特殊球队群体,最后总结可复现结论和数据限制。
二、研究意义
1.比赛规律识别:通过总进球、比分频次、零封率、双方进球率和淘汰赛净胜球等指标,刻画赛事开放程度与比赛紧张度。
2.球队表现评价:将比赛记录转换为球队粒度,统一计算胜平负、进失球、净胜球、胜率、场均进球、场均失球和零封次数,避免只用单一指标判断强弱。
3.结构性比较:使用场均积分、场均净胜球和出线率比较不同洲际足联,降低球队数量差异带来的总量偏差。
4.博客复现价值:Notebook 中的数据读取、质量检查、函数封装和高清可视化均可独立运行,适合形成完整的技术博客案例。
5.建模风险识别:发现 team_1 为胜者优先排序,明确指出位置变量可能导致目标泄漏,为后续机器学习任务提供必要的数据治理依据。
三、实证分析
1. 基础数据特征与质量核验
数据表 | 记录数 | 字段数 | 重复行 | 缺失单元格 |
matches.csv | 92 | 15 | 0 | 106 |
teams.csv | 48 | 6 | 0 | 12 |
两张表均不存在重复行,match_id 与 team 均可作为唯一标识。matches 表中的 group 缺失 20 条,恰好对应 20 场淘汰赛,属于结构性缺失;notes 只在特殊比赛中填写,缺失不需要插补。teams 表中的 eliminated_round 为空表示当前快照下尚未记录出局,也不能直接解释为最终晋级。
关系 | 场次 |
score_1 > score_2 | 69 |
score_1 = score_2 | 23 |
score_1 < score_2 | 0 |
非平局且 winner != team_1 | 0 |
2. 参赛球队结构
conf_counts = teams['confederation'].value_counts().sort_values(ascending=True) fig, ax = plt.subplots(figsize=(10, 5.8)) bars = ax.barh(conf_counts.index, conf_counts.values, color=sns.color_palette('crest', len(conf_counts)), edgecolor='white') ax.bar_label(bars, padding=4, fontsize=10, fontweight='bold') ax.set_title('2026 FIFA 世界杯参赛球队的洲际足联构成') ax.set_xlabel('球队数量') ax.set_ylabel('') ax.xaxis.set_major_locator(MaxNLocator(integer=True)) sns.despine(left=True, bottom=True) save_show('01_confederation_team_counts.png', fig)UEFA 共有 16 支球队,是数量最多的洲际足联;CAF 有 10 支,AFC 有 9 支。数据中包含 3 支东道主和 4 支世界杯新军。参赛数量差异意味着洲际表现不能用总胜场直接比较,后续需要转为场均指标和比例指标。
3. 赛事阶段与进球分布
赛事阶段 | 场次 | 进球 | 场均进球 | 平局 | 点球决胜 |
Group Stage | 72 | 215 | 2.99 | 20 | 0 |
Round of 32 | 16 | 42 | 2.62 | 0 | 3 |
Round of 16 | 4 | 12 | 3.00 | 0 | 0 |
全部 92 场比赛共打入 269 球,场均 2.92 球,中位数为 3 球。小组赛场均 2.99 球,32 强赛下降至 2.62 球,说明进入淘汰赛后比赛整体更谨慎。当前仅有 4 场 16 强赛,其场均值仍容易受个别比赛影响。
总进球的四分位数分别为 2、3 和 4 球,说明一半比赛集中在 2—4 球区间。共有 32 场比赛至少打入 4 球,占全部比赛的 34.8%。
4. 比分结构与比赛形态
5. 时间节奏与高比分比赛
daily = matches.groupby('date').agg( Matches=('match_id', 'count'), Goals=('total_goals', 'sum'), Avg_Goals=('total_goals', 'mean') ).reset_index() fig, ax1 = plt.subplots(figsize=(13, 6)) ax1.bar(daily['date'], daily['Goals'], color=COLORS['blue'], alpha=0.78, label='每日总进球') ax1.set_ylabel('每日总进球', color=COLORS['blue']) ax1.tick_params(axis='y', labelcolor=COLORS['blue']) ax1.xaxis.set_major_locator(mdates.DayLocator(interval=3)) ax1.xaxis.set_major_formatter(mdates.DateFormatter('%m-%d')) plt.setp(ax1.get_xticklabels(), rotation=45, ha='right') ax2 = ax1.twinx() ax2.plot(daily['date'], daily['Avg_Goals'], color=COLORS['gold'], marker='o', linewidth=2.2, label='场均进球') ax2.set_ylabel('当日场均进球', color=COLORS['gold']) ax2.tick_params(axis='y', labelcolor=COLORS['gold']) ax1.set_title('赛事期间每日进球产出与场均进球变化') ax1.set_xlabel('比赛日期') ax1.grid(axis='x', visible=False) lines1, labels1 = ax1.get_legend_handles_labels() lines2, labels2 = ax2.get_legend_handles_labels() ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper right') save_show('05_daily_goal_trend.png', fig)每日总进球同时受比赛数量和比赛开放程度影响。2026-06-24 共进行 6 场比赛并产生 20 球,是当前总进球最高的比赛日;但若观察场均指标,部分仅有 4 场比赛的日期也可能更加开放。因此博客分析中应同时呈现总量与均值,避免把“赛程密集”误判为“进攻效率更高”。
6. 小组赛积分与竞争强度
本文用平局率(权重 45%)、积分极差的反向得分(35%)和净胜球极差的反向得分(20%)构建竞争强度指数。G 组以 73.0 分排名第一,主要原因是平局比例高且积分分布相对集中;I 组竞争强度最低,法国的全胜与伊拉克的大比分失利拉大了组内差距。该指数属于解释性指标,其权重可根据博客主题调整。
7. 球队攻防效率
team_scatter = team_stats[team_stats['MP'] >= 3].copy() fig, ax = plt.subplots(figsize=(11, 7)) sns.scatterplot(data=team_scatter, x='GF_per_Match', y='GA_per_Match', size='MP', hue='confederation', sizes=(70, 220), alpha=0.82, ax=ax, palette='tab10') for _, row in team_scatter.nlargest(8, 'GD').iterrows(): ax.annotate(row['team'], (row['GF_per_Match'], row['GA_per_Match']), xytext=(5, 5), textcoords='offset points', fontsize=8) ax.axvline(team_scatter['GF_per_Match'].median(), color=COLORS['gray'], linestyle='--', linewidth=1) ax.axhline(team_scatter['GA_per_Match'].median(), color=COLORS['gray'], linestyle='--', linewidth=1) ax.set_title('球队攻防效率定位图') ax.set_xlabel('场均进球(越高越好)') ax.set_ylabel('场均失球(越低越好)') ax.legend(bbox_to_anchor=(1.02, 1), loc='upper left') save_show('11_team_attack_defense_scatter.png', fig)\
攻防散点图以场均进球为横轴、场均失球为纵轴。右下象限代表“高进球、低失球”的理想区域;左上象限则代表进攻不足且防守承压。气泡大小对应出场次数,能够提醒读者不同球队的样本量并不完全相同。
8. 洲际足联表现
洲际足联 | 球队数 | 场均积分 | 场均进球 | 场均净胜球 | 出线率 |
CONMEBOL | 6 | 1.83 | 1.44 | 0.72 | 83.3% |
UEFA | 16 | 1.75 | 2.02 | 0.69 | 81.2% |
CAF | 10 | 1.33 | 1.33 | -0.10 | 80.0% |
CONCACAF | 6 | 1.11 | 1.39 | -0.17 | 50.0% |
AFC | 9 | 0.67 | 0.85 | -1.26 | 22.2% |
OFC | 1 | 0.33 | 1.33 | -2.00 | 0.0% |
出线率与场均积分的结论基本一致,但两者并非完全等价:积分反映小组赛过程,出线率反映结果阈值。由于 OFC 仅有 1 支球队,0% 出线率不能代表稳定的洲际水平;小样本比例必须谨慎解释。
9. 东道主与世界杯新军
10. 淘汰赛紧张度与指标相关性![]()
当前共有 20 场淘汰赛,其中 11 场在常规比分上只差 1 球,另有 3 场进入点球决胜。32 强赛场均进球较小组赛下降,且一球差比赛占比较高,说明淘汰赛的容错空间更小。
、
四、核心结论
1.赛事进球产出较高:92 场比赛共 269 球,场均 2.92 球;小组赛场均 2.99 球,32 强赛降至 2.62 球。
2.比分以中低比分为主:最常见比分是 1-0,至少一方零封的比赛占 45.7%;但仍有 34.8% 的比赛达到 4 球或以上。
3.法国是当前综合表现最突出球队之一,5 战全胜并打入 14 球;西班牙 4 场比赛全部零封,防守效率领先。
4.小组均衡度差异显著:G 组在本文竞争强度指数中排名最高,I 组因头尾差距较大而最低。
5.洲际表现方面,CONMEBOL 小组赛场均积分最高,UEFA 在场均积分、进球和出线率上也保持较强整体表现。
。。。。。。
五、局限性与扩展方向
1.阶段性数据:只有 92 场比赛,尚未覆盖完整 104 场赛程,淘汰赛样本尤其有限。
2.变量维度有限:缺少控球率、射门、射正、角球、犯规、球员事件、xG、FIFA 排名和 Elo 等解释变量。
具体细节见原文
创造不易,谢谢各位多多点赞收藏!