從零開始 打造產品級的航空數據可視化報告
來自專欄 Power BI 專欄16 人贊了文章
八月的某天,結束了北京的出差,
在去往機場的路上,我問和我一起回上海的同事:
「最近北京機場延誤挺嚴重的,你說咱倆能準時飛不」
「這個不好說,不過我肯定早到,我的航班早一個小時」
「嗯,正常情況是這樣,不過延誤就不好說了,說不定我在你前面到哦」
… …
以前,航班是否延誤,延誤多久,只能通過機場的航班信息顯示屏或者廣播了
隨著技術發展,空管局、機場、航空公司等多個渠道的數據已經可以被很多民用app獲取,它們用一套演算法把這些基礎數據轉換成乘客需要的簡單明了的信息,我們熟知的很多app已經可以做到實時掌握航班動態。
通過航旅縱橫我查到同事的飛機因為前序航班延誤,出港順序排到了我的後面,最終我們幾乎同時到達上海。
感受到了實時數據的強大力量,我突發奇想:
用BI工具能不能實現類似的功能?把航班數據做成一個可視化報告,甚至再進一步,加入定時刷新功能,持續更新數據,讓報告變成一個產品?
少啰嗦 先看東西
這篇文章是報告製作過程的復盤,文章較長,限於篇幅,主要介紹功能和思路,分成四部分,技術細節就不展開了。
- 數據獲取:志向遠大,也得白手起家
- 數據清洗:費工費力,耗時最長
- 數據分析:參考專業報告,獨立計算所有指標
- 報告設計:壓軸環節
文章約4300字,閱讀需要11分鐘
數據獲取 志向遠大 白手起家
有了想法,首先要調查市面上有哪些公開數據、能不能獲取。上面提到的渠道數據有些是公開的,有些需要企業購買或交換,比如空管局和機場的很多數據不對外開放,個人用戶拿不到。
而且考慮到公開發布的報告最多也只能間隔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,做法是在固定尺寸的飛機尾翼圖上加入航司標誌
數據分析 參考專業報告
定義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、火狐瀏覽器可能顯示不正常,自定義控制項載入慢、內存佔用大的情況,推薦你用谷歌瀏覽器瀏覽報告,希望這些問題可以被微軟慢慢改善。
報告已經開始每天定時更新,大家十一假期如果有出行安排,不妨試試看這個報告能否準確抓取你的航班數據。
最後,也是最重要的,附上報告在線地址,從圖表導航進入
https://app.powerbi.cn/view?r=eyJrIjoiYzE4MDZmMTYtNDU5ZC00MzZlLWFiNDMtNTI0ZGUwNjI2ZDQ1IiwidCI6IjlhZGNkZDRiLTQ5YTktNDA3Ni1iZTUyLTlkZWNiYTE4YzIzNiJ9
頂部選擇報告即可看到報告鏈接
祝各位假期愉快。
推薦閱讀: