八月的某天,结束了北京的出差,在去往机场的路上,我问身边的同事:
“最近北京机场延误挺严重的,你说咱俩能准时飞不”
“这个不好说,不过我肯定早到,我的航班早一个小时”
“嗯,正常情况是这样,不过延误就不好说了,说不定我在你前面哦”
… …
随着技术发展,空管局、机场、航空公司等多个渠道的数据已经可以被很多民用 app 获取,它们用一套算法把这些基础数据转换成乘客需要的简单明了的信息,我们熟知的很多 app 已经可以做到实时掌握航班动态。
成品报告
感受到了实时数据的强大力量,我突发奇想:用 BI 工具能不能实现类似的功能?把航班数据做成一个可视化报告,甚至再进一步,加入定时刷新功能,持续更新数据,让报告变成一个产品?
少啰嗦,先看东西
本文是报告制作过程的复盘,文章较长,限于篇幅,主要介绍功能和思路,分成四部分,技术细节就不展开了。
- 数据获取:志向远大,也得白手起家
- 数据清洗:费工费力,耗时最长
- 数据分析:参考专业报告,独立计算所有指标
- 报告设计:压轴环节
数据获取: 白手起家
有了想法,首先要调查市面上有哪些公开数据、能不能获取。上面提到的渠道数据有些是公开的,有些需要企业购买或交换,比如空管局和机场的很多数据不对外开放,个人用户拿不到。
而且考虑到公开发布的报告最多也只能间隔 1 个多小时刷新一次,类似进出港航班排队信息这样的近乎实时的数据首先被排除。票价信息也不在此次分析范围内,未做搜集。
时刻表数据
可以公开获取的是航班时刻表信息和航班飞行数据,时刻表源头是中航信,在 OTA 网站也可以找到,我用爬虫搞定了除春秋航空外的所有国内航班数据。国际航班、香港和台湾机场的时刻表都没有找到可供抓取的数据源,暂时放弃。
航班飞行数据
飞机在飞行中会通过无线电实时向地面发送位置、速度、高度以及天气状况等信息,空管据此分析飞机的状况,提供保障服务。这些数据并不加密,可以通过一个名为 ads-b 的系统的接收,国外甚至做到了抬头看到一架飞机,拿着手机对着飞机拍照,能显示出这架飞机的数据,不过这套设备在国内限制进口。
所以航班飞行数据在国外很多航迹追踪网站(flightradar24、flightware、flightstats)上都能查到,国内类似飞常准业内版估计也提供类似服务,这些网站和应用都提供全面、完整的航班历史数据下载,但都属于付费服务,不在考虑范围。
最后通过抓包分析,从某航迹网站页面上截取到了包含航班信息的 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]
我能说我是跪着看完的么
界面太友好
老师您好,我有个小问题,就是成品报表嵌入到此页面当中,为啥中间底部可以自行选择页面呀?我之前都没见过这样式的,是怎样做到的呢?
真的很厉害,无论是从可视化或者数据处理上,太佩服了。可否分享.pbix文件仅供学习呢,谢谢
太厉害了
这个报告的performance很快啊。。。
有专门的贴子讲performance优化的吗?
厉害~~~