大數據帶你看穿航班晚點的套路
「我們很抱歉地通知您,您乘坐的由XX飛往XX的XXXX航班延誤。」
相信很多在機場等待飛行的旅客都不願意聽到這句話。隨著乘坐飛機這種交通方式的逐漸普及,航延延誤問題也一直困擾著我們。航班延誤通常會造成兩種結果,一種是航班取消,一種是航班晚點。
本節項目課中,讓我們一起來用大數據破解航班晚點的套路。
圖片來自http://pexels.com
本項目完整教程及在線練習地址:大數據帶你看穿航班晚點的套路(更多大數據項目請查看大數據工程師 - 學習路徑)
一、實驗說明
1. 內容簡介
在本課程中,我們將通過Spark提供的 DataFrame、 SQL 和機器學習框架等工具,結合數據可視化技術,對航班起降的記錄數據進行分析,嘗試找出造成航班延誤的原因,以及對航班延誤情況進行預測。
2. 知識點
Spark DataFrame操作
Spark SQL常用操作
Spark MLlib 機器學習框架使
3. 準備工作
(1)Spark應用基礎
本課程需要你具有一定的Spark基礎,以下為推薦在本課程之前需要學習的課程(已按先後順序進行排列):
Spark大數據動手實驗
Spark DataFrame入門
Spark DataFrame詳解
Spark 講堂之 SQL 入門
(2)準備草稿紙
在學習過程中,建議手邊能夠準備紙和筆做相應的記錄。代碼寫起來是非常快的,然而更重要的是如何通過思考去設計這些代碼。因此我們會有大量的工作在書寫偽代碼和記錄相關的欄位上。
這也是數據分析工作中常見的一個習慣。
4. 效果
由於是美國航班數據,最終結果用美國地圖呈現。用滑鼠指向每一個州,都能看到對應的詳細信息。圖中顏色最深的兩個州為 CA 和 TX 。一定程度上表明這兩個州的航空活動更加活躍。
二、問題設計
本節實驗用到的航班數據集是 2009 年 Data Expo 上提供的飛行準點率統計數據。
在探索數據之前,我們已經知道該數據共有29個欄位。根據出發時間、出發/抵達延誤時間等信息,我們可以大膽地提出下面這些問題:
每天航班最繁忙的時間段是哪些?通常早晚都容易有大霧等極端天氣,是否中午的時候到港和離港航班更多呢?
飛哪最準時?在設計旅行方案時,如果達到某個目的地有兩個相鄰的機場,我們似乎可以比較到哪裡更準時,以減少可能發生的延誤給我們出行帶來的影響。
出發延誤的重災區都有哪些?同樣,從哪些地方出發最容易遭到延誤?下次再要從這些地方出發的時候,就要考慮是不是要改乘地面交通工具了。
請用一張紙記錄下上述問題。如果你還有自己想要探索的問題,也請記錄下來,稍後嘗試自己完成。
三、問題解答
圖片來自http://pexels.com
我們首先把數據註冊為臨時表,對於上述問題的解答實際上就變成了如何設計合適的 SQL 查詢語句。在數據量非常大的時候,Spark SQL 的使用尤為方便,它能夠直接從 HDFS 等分散式存儲系統中拉取數據進行查詢,並且能夠最大化地利用集群性能進行查詢計算。
3.1 每天航班最繁忙的時間段是哪些
分析某個問題時,要想辦法將解答問題的來源落實在數據集的各個指標上。當問題不夠詳細時,可以取一些具有代表性的值作為該問題的答案。
例如,航班分為到港(Arrive)和離港(Depart)航班,若統計所有機場在每天的某個時間段內離港航班數量,就能在一定程序上反映這個時段的航班是否繁忙。
那麼,當我們提到「統計……的數量」的時候,我們在說什麼?
數據集中的每一條記錄都樸實地反映了航班的基本情況,但它們並不會直接告訴我們每一天、每一個時段都發生了什麼。為了得到後者這樣的信息,我們需要對數據進行篩選和統計。
於是我們會順理成章地用到 AVG(平均值)、COUNT(計數)和 SUM(求和)等統計函數。
為了分時間段統計航班數量,我們可以大致地將一天的時間分為以下五段:
- 凌晨(00:00 - 06:00):大部分人在這個時段都在休息,所以我們可以合理假設該時間段內航班數量較少。
- 早上(06:01 - 10:00):一些早班機會選擇在此時間出發,機場也通常從這個時間段起逐漸進入高峰。
- 中午(10:01 - 14:00):早上從居住地出發的人們通常在這個時候方便抵達機場,因此選擇在該時間段出發的航班可能更多。
- 下午(14:01 - 19:00):同樣,在下午出發更為方便,抵達目的地是剛好是晚上,又不至於太晚,方便找到落腳之處。
- 晚上(19:01 - 23:59):在一天結束之際,接近凌晨的航班數量可能會更少。
這樣的分段都是基於一些假設的。如果你認為你有更合理的分段方式,不妨將它們用到後續的分析工作中。
不要忘了在草稿紙上記錄下這些重要的時間段,在設計代碼時會用到它們。
當我們所需的數據不是單個離散的數據而是基於一定範圍的時候,我們可以用關鍵字 BETWEEN x AND y 來設置數據的起止範圍。
有了上述準備,我們可以嘗試寫出統計離港時間在 0 點 至 6 點 間的航班總數。首先選取的目標是 flights 這張表,即 FROM flights。航班總數可以對 FlightNum 進行統計(使用COUNT函數),即 COUNT(FlightNum)。限定的條件是離港時間在 0 (代表 00:00)至 600 (代表 6:00)之間,即 WHERE DepTime BETWEEN 0 AND 600。所以我們要寫出的語句是:
請在 Spark Shell 中輸入以下代碼。
val queryFlightNumResult = sqlContext.sql("SELECT COUNT(FlightNum) FROM flights WHERE DepTime BETWEEN 0 AND 600")n
查看其中 1 條結果。
請在 Spark Shell 中輸入以下代碼。 注意:此步驟比較耗時,請耐心等待計算完成。
queryFlightNumResult.take(1)n
在此基礎上我們可以細化一下,計算出每天的平均離港航班數量,並且每次只選擇 1 個月的數據。這裡我們選擇的時間段為 10:00 至 14:00 。
請在 Spark Shell 中輸入以下代碼。
// COUNT(DISTINCT DayofMonth)的作用是計算每個月的天數nval queryFlightNumResult1 = sqlContext.sql("SELECT COUNT(FlightNum)/COUNT(DISTINCT DayofMonth) FROM flights WHERE Month = 1 AND DepTime BETWEEN 1001 AND 1400")n
查詢得到的結果只有一條,即該月每天的平均離港航班數量。查看一下:
請在 Spark Shell 中輸入以下代碼。 注意:此步驟比較耗時,請耐心等待計算完成。
queryFlightNumResult1.take(1)n
你可以嘗試計算出其他時間段的平均離港航班數量,並作記錄。你的結論是否與下方的結論相同呢?
最終統計的結果表明:1998年1月,每天最繁忙的時段為下午。該時段的平均離港航班數量為4356.7個。
其他問題詳解可以在實驗樓中查看並在線完成:
Spark - 大數據帶你看穿航班晚點的套路
3.2 飛哪最準時
3.3 出發延誤的重災區都有哪些
3.4 航班延誤時間預測
3.5 數據可視化設計
更多經典的編程練手項目:全部課程 - 實驗樓
大數據學習路徑:大數據工程師-學習路徑
微信關注公眾號[實驗樓],手機查看海量項目教程。
推薦閱讀:
※編譯原理和演算法導論是不是屠龍技 有技而無龍可屠?
※上海交通大學 ACM 的 Dreadnought 隊伍怎麼這麼強?
※會好幾門編程語言,對做好產品經理有什麼作用?
※在python的socket編程中,如果使用socket.recv()接收數據,到下次接收的時候又是上次沒接收完的信息,我怎麼才可以再次重新接收數據?