从数据到信息
从信息到洞察

从零开始 制作航空数据可视化报告

八月的某天,结束了北京的出差,在去往机场的路上,我问身边的同事:

“最近北京机场延误挺严重的,你说咱俩能准时飞不”

“这个不好说,不过我肯定早到,我的航班早一个小时”

“嗯,正常情况是这样,不过延误就不好说了,说不定我在你前面哦”

  … …

从零开始 打造产品级的航空数据可视化报告

我们习惯通过机场的航班信息显示屏或者广播了解航班信息

随着技术发展,空管局、机场、航空公司等多个渠道的数据已经可以被很多民用 app 获取,它们用一套算法把这些基础数据转换成乘客需要的简单明了的信息,我们熟知的很多 app 已经可以做到实时掌握航班动态。

从零开始 打造产品级的航空数据可视化报告

航旅纵横

成品报告

感受到了实时数据的强大力量,我突发奇想:用 BI 工具能不能实现类似的功能?把航班数据做成一个可视化报告,甚至再进一步,加入定时刷新功能,持续更新数据,让报告变成一个产品?

少啰嗦,先看东西

点此全屏观看

本文是报告制作过程的复盘,文章较长,限于篇幅,主要介绍功能和思路,分成四部分,技术细节就不展开了。

  • 数据获取:志向远大,也得白手起家
  • 数据清洗:费工费力,耗时最长
  • 数据分析:参考专业报告,独立计算所有指标
  • 报告设计:压轴环节

数据获取: 白手起家

有了想法,首先要调查市面上有哪些公开数据、能不能获取。上面提到的渠道数据有些是公开的,有些需要企业购买或交换,比如空管局和机场的很多数据不对外开放,个人用户拿不到。

而且考虑到公开发布的报告最多也只能间隔 1 个多小时刷新一次,类似进出港航班排队信息这样的近乎实时的数据首先被排除。票价信息也不在此次分析范围内,未做搜集。

时刻表数据

可以公开获取的是航班时刻表信息和航班飞行数据,时刻表源头是中航信,在 OTA 网站也可以找到,我用爬虫搞定了除春秋航空外的所有国内航班数据。国际航班、香港和台湾机场的时刻表都没有找到可供抓取的数据源,暂时放弃。

春秋航空作为廉航为了控制成本没接入中航信的系统,这样每笔交易就不必向中航信上缴佣金
从零开始 打造产品级的航空数据可视化报告

每个航班在一周内可能有不同的计划,并不固定

航班飞行数据

飞机在飞行中会通过无线电实时向地面发送位置、速度、高度以及天气状况等信息,空管据此分析飞机的状况,提供保障服务。这些数据并不加密,可以通过一个名为 ads-b 的系统的接收,国外甚至做到了抬头看到一架飞机,拿着手机对着飞机拍照,能显示出这架飞机的数据,不过这套设备在国内限制进口。

从零开始 打造产品级的航空数据可视化报告
所以航班飞行数据在国外很多航迹追踪网站(flightradar24、flightware、flightstats)上都能查到,国内类似飞常准业内版估计也提供类似服务,这些网站和应用都提供全面、完整的航班历史数据下载,但都属于付费服务,不在考虑范围。

从零开始 打造产品级的航空数据可视化报告

最后通过抓包分析,从某航迹网站页面上截取到了包含航班信息的 json 数据,可以作为数据源使用(限于篇幅,具体技术细节不再展开),

从零开始 打造产品级的航空数据可视化报告

Json 中包含每个航班在抓取时刻的详细信息

综合以上两个数据源,已经可以拼凑出一架飞机从起飞到降落的整个轨迹,通过航班号和飞行日期可以匹配到它的时刻表信息,进一步计算出航班延误。

其实这么做并非最佳选择,因为实际飞行数据往往比较复杂,比如涉及到跨零点起降的航班,要准确计算延误时间需要考虑的情况非常多,而类似飞常准这样的网站已经提供了计算好的数据,但是这类网站的反爬措施也非常完善,比如数字转图片格式,IP 访问频率限制,很难突破。

从零开始 打造产品级的航空数据可视化报告

红框里是用图片显示的数字

控制文件大小

json 数据以机场为单位抓取,每次抓取的文件在十几 M 到几十 M 之间。为了兼顾文件大小和航班轨迹的完整性(文件太大清洗效率下降,文件太小轨迹不完整),最终选定了 8 个机场,24 小时的数据来分析,即每隔一小时为 8 个机场统一抓取数据,共生成 24 个文件,数据源整体大小在 600M 左右。

从零开始 打造产品级的航空数据可视化报告

爬虫工具

既然报告不是一锤子买卖,需要定时抓取数据,而且数据量比较大,PowerQuery 就不在考虑范围了,数据清洗的时候再让它出场。爬虫是用 R 写的定时任务。

数据清洗:费工费力 耗时最长

常规的清洗操作不做赘述,结构转换、异常值过滤这些步骤是必须的。说一个性能问题的坑,我在 Powerquery 的局限这篇文章里提过,对于需要每行执行的计算,数据量上去之后 PQ 的效率会有明显下降,我这个 case 里清洗环节的用时可以增加 5 倍,所以必须优化掉行级别计算。

转换中文信息

原始数据以英文为主,比如航司、机场使用 icao 和 iata 代码来标记,为了在报告中使用统一规范的中文名,需要做建立一个中文信息库。最后一共整理了全球 600 多个机场、130 多个航司、70 多种机型的详细信息用来匹配,这个环节耗时比较长。

最耗时环节

为了提升最后的可视化效果,在航司分析环节,加入各家的 logo 是个不错的选择,也比较容易获取。但是因为 logo 形状各异,最终效果不理想

 

从零开始 打造产品级的航空数据可视化报告
为了统一视觉,我最后决定重绘所有 logo,做法是在固定尺寸的飞机尾翼图上加入航司标志

从零开始 打造产品级的航空数据可视化报告
一共绘制了 140 个航司,这个过程耗时最久,还落下了喜欢看飞机尾翼猜航司的后遗症。

数据分析:自主探索,参考专业报告

定义 KPI 时参考了一些业内专业网站和报告的分析思路,在可视化环节介绍,也可以参考报告的说明页面和指标解释页面

计算航班延误

跨零点起降航班和空驶航段容易造成延误数据异常,具体情况比较复杂,主要计算花在优化这两种情况上。分析中涉及的具体的计算过程不在这篇文章里讨论了。

报告设计:压轴环节

之前的内容都是铺垫,对于使用自助 BI 分析师,有个比较尴尬的现实,如果报告扑街,前面的工作做了再多,价值也基本归 0。想要出彩,每个环节都不能有明显的短板。

配合 Powerbi 图表控件的扩展能力,报告实现了一些很实用的交互功能,有的甚至可以比肩专业的航班分析服务。同时为了取得比较好的视觉效果,报告也做了很多细节优化和妥协。

报告分为机场概况、机场报告航司报告三个主题。

机场概况:实时天气+机场流量趋势

机场天气状况是航班延误的主要因素之一,Powerbi 中的 iconmap 控件自带 openweathermap 服务,可以实时显示全球范围内最近两小时的天气状况,之前介绍台风山竹的文章使用的也是这个控件。

从零开始 打造产品级的航空数据可视化报告
风力分布中的红色区域是正在日本登陆的台风谭美,切换到降水分布可以看到台风登陆范围产生了大量降水。
注:控件使用免费 api 服务,有并发限制。

动态计算机场出港航班准点率

对航班延误的判定,业内默认标准是航班起飞时间比计划起飞时间推迟 30 分钟以上,不超过 30 分钟都视为准点。报告中将推迟时间设置为自定义项,用户可以自行改变延误时长,查看各机场对应的出港准点率。

圆圈大小代表机场昨日出港航班总数,出港准点率只以匹配到时刻表信息的航班为 base 计算。

从零开始 打造产品级的航空数据可视化报告

昨日进出港航班流量趋势图

受页面尺寸限制,只放出了六个机场的流量趋势图,红点代表峰值时刻。右侧可以切换进港和出港两种状态

从零开始 打造产品级的航空数据可视化报告

机场报告:掌握机场整体运行情况和航班详情

分钟粒度的航班出港流量趋势图:红色代表延误航班,绿色是准点航班,灰色是未匹配到时刻表的航班。可以按状态和任意时间段筛选航班

  • 右侧切换为进港状态:趋势图代表所有进港航班在各自始发地起飞的时间和状态。
  • 右侧切换为国际航线:只显示流量趋势,没有延误状态信息

从零开始 打造产品级的航空数据可视化报告

飞行轨迹地图

显示当前机场昨日 24 小时所有航班的飞行轨迹,每条航线由起点、终点、途中位置、飞行角度四个要素组成,其中途中位置来自飞行轨迹上所有打点位置的平均值,并非航班的实时位置。
如果当期航线的途中位置只捕捉到起点或终点(短途航线存在这种可能),飞机图标就会落在起点或者终点,当某一点飞机图标过多时,会产生溢出,显示为飞机图标一字排开。

飞行角度:飞机在途中回传的瞬时数据,飞行全程中可能有多种角度,很多航线并不是直线飞行。

从零开始 打造产品级的航空数据可视化报告

从起点到途中位置的实线表示已完成的航线,剩余未完成的航线用虚线表示

航班轨迹回放

以小时为单位回放当前机场昨日 24 小时航班活动轨迹,间隔 2s。地图右下角显示当前回放时刻

从零开始 打造产品级的航空数据可视化报告

机场 KPI 数据

反映机场运行情况的数据指标,所有指标均与切片器联动,比如下图反映的是国内航线所有出港航班的数据,按住 ctrl 可以选择多个维度。
旅客数预估:基于每个航班的执飞机型,按预估的平均座位数乘以 100%上座率计算得来,仅供参考。
高峰时刻:指小时航班数量最高的时刻,高峰频次乘以 60 是其峰值航班数量
放行准点率:航班出港准点率的平均值,筛选器为出港状态时,指标反映当前机场出港准点率;进港状态反映的是所有进港航班在各自出发机场的出港准点率均值。
放行平均延误:每个航班的平均延误时间,正值代表推迟起飞,负值代表提前起飞。
到港指标参照以上两条解释。

从零开始 打造产品级的航空数据可视化报告

航司排名 Top12

显示当前机场航班数量排名 top12 的航司,受页面筛选器影响,动态变化。也可以用作筛选器,查看指定航司的所有航班。
从零开始 打造产品级的航空数据可视化报告

航班时刻表

显示当前机场航班详情数据,对于没有计划时间的航班,其到达状态未知;对于尚未降落的航班,到达状态为“-”(通常集中在跨 0 点到达的航班)

从零开始 打造产品级的航空数据可视化报告

航班详情信息

鼠标悬停在时刻表任意航班上,显示更多飞行详情。
从零开始 打造产品级的航空数据可视化报告
这里的飞行高度指气压高度,不保证准确反映航班距地面或海平面的真实高度。

机场简报

简单总结当前机场运行情况,只在切换机场时刷新

从零开始 打造产品级的航空数据可视化报告

航司报告:对比分析不同的航司数据表现

航司排行榜

按准点率统计最准时/最不准时、平均延误时长、平均飞行时间,繁忙程度和目的地数量共六项指标,每项指标排名首位的航司显示 logo,鼠标悬停显示 top5 航司。

从零开始 打造产品级的航空数据可视化报告

当筛选某个航司时,同时显示被筛选航司结果

分钟级航司出港流量趋势图

显示当前航司的所有航班数据,按每个航班的最终状态做标记,不同于机场报告中的出港状态。
可选择指定状态查看其详情;可筛选任意时间段查看在此期间的流量详情。(起始时刻显示可能有瑕疵,请忽略)

从零开始 打造产品级的航空数据可视化报告

统一的航司视觉效果

显示民航、货航、公务机在内的超过 120 家航司的 logo,可按中文简称搜索并筛选任意航司,也可以按联盟搜索。

从零开始 打造产品级的航空数据可视化报告

航线视角地图

显示城市间飞行轨迹(连线)和航班状态(颜色),可按状态筛选航线。 (默认视图,加载稍慢,只在选择航司或联盟后生效,无筛选时为空)

从零开始 打造产品级的航空数据可视化报告

目的地视角地图

显示当前选择航司的所有目的地城市,icon 越大代表航线数量越多。

从零开始 打造产品级的航空数据可视化报告

航司目的地 top10

按类别显示航司的目的地航线数量 top10 的结果,选中类别可以查看对应的航司

从零开始 打造产品级的航空数据可视化报告

机型分类统计

按通用标准将客机分为小型、中型和大型,统计每个类别对应的航班架次和预估的乘客人数。(乘客数按每个机型的平均座位数和上座率 100%估算)

从零开始 打造产品级的航空数据可视化报告

按联盟筛选当前报告

单独查看三大联盟(天合联盟、寰宇一家、星空联盟)各自的数据表现,包括航司排行榜在内的结果将重新计算。(右上角航线类型的选择会影响筛选结果)

尾声

之前一次线下活动上,有人问我,PowerBI 能不能做出一个产品形式的报告,持续提供价值,其实这个并不难,很多公司内部已经在用这种报告,最大的障碍其实是数据安全,内部数据不能分享,而公开的数据往往又很难持续更新。

这个航空数据可视化报告是这个方向上的一个尝试,当然它自身也有一些兼容性的问题,比如用 IE、火狐浏览器可能显示不正常,自定义控件加载慢、内存占用大的情况,推荐你用谷歌浏览器浏览报告,希望这些问题可以被微软慢慢改善。

报告数据每天都会更新,点此全屏观看

[simple-author-box]

17
说点什么

1000
 
鼓掌微笑开心憧憬爱你色并不觉得吃瓜doge二哈喵喵思考笑哭捂脸悲伤大哭抓狂汗偷笑打脸捂眼黑线问号晕拜拜闭嘴衰咒骂ok作揖
7 评论数
10 被回复的评论
11 订阅评论的人数
 
查看最近回复
查看最热评论
  订阅本文评论  
最新 最旧 得票最多
提醒
游客
踏雪飞鸿

我能说我是跪着看完的么 doge

成员
wety

界面太友好

游客
乔一

老师您好,我有个小问题,就是成品报表嵌入到此页面当中,为啥中间底部可以自行选择页面呀?我之前都没见过这样式的,是怎样做到的呢?

游客
HYR

真的很厉害,无论是从可视化或者数据处理上,太佩服了。可否分享.pbix文件仅供学习呢,谢谢

成员
rieterxq

太厉害了

成员
张浩然

这个报告的performance很快啊。。。
有专门的贴子讲performance优化的吗?

游客
duang

厉害~~~