Power Bi数据分析案例:国际足球分析
基于1872年以来的51,225场国际男子足球比赛数据,使用Power BI构建足球比赛分析系统以实现多维度的足球比赛历史数据分析。
一、数据来源与预处理
数据集包含自1872年以来国际男子足球比赛的51225场比赛,共11列(主队、客队、主队进球、客队进球、总进球数数、获胜者、比赛名称、日期、年份、中立场地以及举办比赛国家),分享者已对源数据集进行预处理和翻译。通过Python初步了解数据集的基本情况,明确数据集没有缺失值、重复值,存在一定数量的异常值,但经过复核该异常值符合实际,不需要进行额外处理。
将数据集matchZn.csv导入Power Bi Desktop,将日期列的格式从文本调整为日期,同时新增年代列,总进球数分层列以及赛果列。
列名 |
DAX表达式 |
| 年代 |
年代 = FLOOR('matchZn'[年份], 10) |
| 总进球数分层 |
总进球数分层 = SWITCH( TRUE(), 'matchZn'[总进球数] <= 3, "0-3", 'matchZn'[总进球数] <= 6, "4-6", "7+" ) |
| 赛果 |
赛果 = SWITCH(TRUE(), 'matchZn'[主队进球] > 'matchZn'[客队进球], "主队胜", 'matchZn'[主队进球] < 'matchZn'[客队进球], "客队胜", "平" ) |
二、搭建星型架构和度量值
2.1 星型架构
2.1.1 搭建日期表
| 日期表 |
日期表 = ADDCOLUMNS( CALENDAR(FIRSTDATE('matchZn'[日期]),LASTDATE('matchZn'[日期])), "年", YEAR ( [Date] ), "季度", ROUNDUP(MONTH([Date])/3,0), "月", MONTH([Date]), "周", weeknum([Date]), "年季度", year([date]) & "Q" & ROUNDUP(MONTH([Date])/3,0), "年月", year([Date]) * 100 + MONTH([Date]), "年周", year([Date]) * 100 + weeknum([Date]), "星期几", WEEKDAY([Date]) ) |
完成日期表搭建后,并将其标记为日期表

2.1.2 搭建主要赛事表
| 主要赛事表 |
MajorTournaments = DATATABLE( "比赛名称", STRING, { {"世界杯"}, {"欧洲杯"}, {"美洲杯"}, {"奥运会"}, {"非洲杯"}, {"亚洲杯"}, {"中北美及加勒比海足球锦标赛"}, {"联合会杯"}, {"大洋洲国家杯"}, {"欧洲国家联赛"} } ) |
2.1.3 球队表
| 球队表 |
Teams = DISTINCT(UNION(SELECTCOLUMNS('matchZn',"球队",'matchZn'[主队]), SELECTCOLUMNS('matchZn',"球队",'matchZn'[客队]))) |
2.1.4 管理关系

2.2 搭建度量值
度量值 |
DAX表达式 |
| 记录数 |
记录数 = COUNTROWS('matchZn') |
| 进球数(总) |
进球数(总) = SUM('matchZn'[总进球数]) |
| 中立场地场次 |
中立场地场次 = CALCULATE( COUNTROWS('matchZn'), 'matchZn'[中立场地] = "是" ) |
| 平均进球 |
平均进球 = CALCULATE( AVERAGE('matchZn'[总进球数]), ALLEXCEPT('matchZn', 'matchZn'[年代]) ) |
| 中位数进球 |
中位数进球 = CALCULATE( MEDIAN('matchZn'[总进球数]), ALLEXCEPT('matchZn', 'matchZn'[年代]) ) |
| 3期移动平均 |
MA3 = VAR CurY = SELECTEDVALUE('matchZn'[年代]) VAR vTable = ADDCOLUMNS( SUMMARIZE( FILTER(ALL('matchZn'[年代]), 'matchZn'[年代] <= CurY), 'matchZn'[年代] ), "@avg", [平均进球] ) VAR Last3 = TOPN(3, vTable, 'matchZn'[年代], DESC) RETURN IF(COUNTROWS(Last3) = 3, AVERAGEX(Last3, [@avg])) |
| 主队获胜数量 |
主队获胜数量 = CALCULATE( COUNTROWS('matchZn'), 'matchZn'[赛果] = "主队胜" ) |
| 客队获胜数量 |
客队获胜数量 = CALCULATE( COUNTROWS('matchZn'), 'matchZn'[赛果] = "客队胜" ) |
| 平均主队进球 |
平均主队进球 = CALCULATE( AVERAGE('matchZn'[主队进球]), ALLEXCEPT('matchZn', 'matchZn'[年代]) ) |
| 平均客队进球 |
平均客队进球 = CALCULATE( AVERAGE('matchZn'[客队进球]), ALLEXCEPT('matchZn', 'matchZn'[年代]) ) |
| 主场优势 |
主场优势 = [平均主队进球] - [平均客队进球] |
| 有效赛事数量 |
有效赛事数量 = CALCULATE( COUNTROWS('matchZn'), KEEPFILTERS('matchZn'[比赛名称] <> "友谊赛"), KEEPFILTERS(NOT CONTAINSSTRING('matchZn'[比赛名称], "预选赛")) ) |
| 总参赛次数 |
主队参赛次数 = CALCULATE( COUNTROWS('matchZn'), TREATAS(VALUES(MajorTournaments[比赛名称]), 'matchZn'[比赛名称]), 'matchZn'[主队] = SELECTEDVALUE('Teams'[球队]) ) 客队参赛次数 = CALCULATE( COUNTROWS('matchZn'), TREATAS(VALUES(MajorTournaments[比赛名称]), 'matchZn'[比赛名称]), 'matchZn'[客队] = SELECTEDVALUE('Teams'[球队]) ) 总参赛次数 = [主队参赛次数] + [客队参赛次数] |
| 场均进球 |
总进球 = VAR t = SELECTEDVALUE('Teams'[球队]) RETURN CALCULATE( SUM('matchZn'[主队进球]), 'matchZn'[主队] = t ) + CALCULATE( SUM('matchZn'[客队进球]), 'matchZn'[客队] = t ) 总场次 = CALCULATE( COUNTROWS('matchZn'), ('matchZn'[主队] = SELECTEDVALUE('Teams'[球队]) || 'matchZn'[客队] = SELECTEDVALUE('Teams'[球队])) ) 场均进球 = DIVIDE([总进球], [总场次]) |
| 场均失球 |
总失球 = VAR t = SELECTEDVALUE('Teams'[球队]) RETURN CALCULATE( SUM('matchZn'[客队进球]), 'matchZn'[主队] = t ) + CALCULATE( SUM('matchZn'[主队进球]), 'matchZn'[客队] = t ) 场均失球 = DIVIDE([总失球], [总场次]) |
| 攻防效率比 |
攻防效率比 = DIVIDE([场均进球], [场均失球]) |
三、可视化看板设计
3.1 总进球数
左上角:总进球数频数分布图
选择簇状柱形图,X轴选择matchZn表格里的总进球数,Y轴选择记录数度量值
右上角:总进球数分层饼图
选择饼图,X轴选择matchZn表格里的总进球数分层,Y轴选择记录数度量值
底部:各年代平均进球数变化趋势图

选择折线图,X轴选择matchZn表格里的年代,Y轴选择平均进球、中位数进球、MA3这三个度量值,然后细调每根折线以便于区分。
3.2 比赛数量
左上角:中立场地分布饼图

右上角:不同比赛中立场地排行
底部:每年比赛数目变化趋势图
3.3 主客队获胜数量
左上角:不同比赛主客队获胜数量分布条形图

右上角:各年代主客队获胜数量分布柱形图
底部:各年代主客队平均进球及主场优势变化趋势图

3.4 主要赛事参赛次数

3.5 综合能力排行榜
总体上还是选择条形图展示不同球队的场均进球、场均失球以及攻防效率比,同时增加主要赛事比赛名称的切片器,以进一步比对重要赛事不同球队的综合能力。

更多推荐

所有评论(0)