大數據社群第四課《復雜數據分析和處理》

One question: what is the relationship between flight distance and delay time?

航行距離到底和延誤時間有沒有關系?只要是乘坐過飛機的人都知道,航班延誤是正常的事情,不延誤就有點不正常了。本文通過學習猴子大數據課程,對學習內容進行一次回顧和總結。

一、數據預處理

文中的航班數據來自R中nycflights13包。

#安裝數據處理包
install.packages("dplyr")
#安裝數據包
install.packages("nycflights13")
#載入安裝的包
library(dplyr)
library(nycflights13)#for data
> flights
航班數據截圖
第一步從數據中選擇需要分析的目標數據,也就是課程中說的選擇子集。

分析目標:航班距離和到達延誤時間。
航班數據集中相關的字段有:year,month、day航班日期,dep_delay起飛延遲時間(份),arr_delay到達延遲時間(分),diatance航行距離(英里),dest目的地。

其它:dep_time,完整的是departure time 即飛機起飛時間,sched_dep_time,完整的是schdeule departure time 即,按照飛行計劃表起飛時間。可以上面表格中看到這個的差值就是dep_time,起飛延遲時間,這個時間有早一點的有晚一點的。

同理后面的arr_time 和schedule arrive time,就是到達時間和計劃到達時間。carrier,flight,tailnum,即為客機類型以及相關型號編號等,rigin,dest(destnation)即為出發地和目的地。后面distance即為飛行距離。

利用函數選取子集如下:

#從flights中取子集
> myFlight<-select(flights,year,
+                  month,day,dep_delay,
+                  arr_delay,distance,dest)
> myFlight
 
取子集后的數據

嘗試生成數據文件查看一下:

#指定myFlight數據保存的文件名
save(myFlight,file = "E:/R語言筆記/實踐筆記/第四課實踐筆記/myFlight.rData")
#寫入到指定的文件中
write.csv(myFlight,file = "E:/R語言筆記/實踐筆記/第四課實踐筆記/myFlight.csv")
#生成了myFlight.csv文件
保存為.csv格式的情況

備注:講解一下select()函數的使用方法。使用help查看。
01,select()函數只保留提到的變量元素。(而rename()函數則保留所有變量,注意區別)
02, select(.data, ...),select_(.data, ..., .dots)。其中.data應為目標數據集,...為不帶引號的表達式,即需要保留的變量元素,正值表示保留變量,負值表示刪除變量。猴子君課程中提到的:select(myFlight,year:day),select(myFlight,-(year:day))
03,詳細情況請參考help(“select”)示例中關于鳶尾花(iris)數據的一系列操作。其中就有關于模糊查詢的例子。

select(iris, -starts_with("Petal"))
select(iris, -ends_with("Width"))
select(iris, -contains("etal"))
select(iris, -matches(".t."))
select(iris, -Petal.Length, -Petal.Width)
第二步進行列名重命名
> #列名重命名
> myFlight<-rename(myFlight,destination=dest)
> myFlight
dest目的地重命名成功
第三步刪除缺失數據

由于存在航班取消等情況,因此就不存在起飛和到達延遲時間,更可能為空或NA,在數據處理中,需要刪除這些噪音,提升數據分析質量。

前期學習過na.omit()函數,可以用來刪除所有含有缺失數據的行。上次的實踐課程使用的是is.na()函數,并通過邏輯運算符!(非),!is.na的意思就是不是缺失數據,!is.na(excelData$購藥時間)作用是保留購藥時間不是缺失的數據。

本例使用dplyr包中filter()函數(表示過濾,篩選的意思),返回具有匹配條件的行。filter(.data, ...)其中.data和上面的select()函數、rename()函數一樣,一個包含數據集的表,...,為邏輯判斷條件,繼續使用!is.na()。

> myFlight<-filter(myFlight,
+                  !is.na(dep_delay),
+                         !is.na(arr_delay))
> myFlight
未刪除數據前
刪除數據后

也可以這樣用:

filter(mtcars, cyl == 8)
filter(mtcars, cyl < 6)
# Multiple criteria(多重條件)
filter(mtcars, cyl < 6 & vs == 1)
filter(mtcars, cyl < 6 | vs == 1)
# Multiple arguments are equivalent to and(多個參數相當于并列關系)
filter(mtcars, cyl < 6, vs == 1)

猴子君講課中的例子:

#查找日期為12月25日的數據情況
filter(myFlight,month==12,day==25)
#查找延誤時間(包括起飛和到達兩種情況)大于2小時的數據情況
filter(myFlight,arr_delay>120 | dep_delay>120)
課件
第四步,數據的排序(本例中對日期要求不高,不需要對日期進行處理)

以前是使用order函數進行排序。本例使用dplyr包中的arrange()函數進行排序。相比較而言后者更為簡單易用。
arrange(.data, ...)函數用法:.data同上,...表示“用逗號分隔的,無引號變量名的列表,使用desc按降序排序變量。”

myFlight<-arrange(myFlight,dep_delay)#按照升序排序
myFlight<-arrange(myFlight,desc(dep_delay))#按照降序排序
按照降序排序后的數據

以上就完成了數據的預處理。下面進行數據的計算。

</br>

二、數據的計算

使用dplyr包中分組函數group_by()組合函數summarise()。
數據處理的模式是:數據拆分,函數應用,組合結果(Split-Apply-Combine)。

01.數據分組。

到達同一目的地為一組(因為航程距離基本一樣)

> by_dest<-group_by(myFlight,destination)#按照目的地進行分組
> by_dest
Source: local data frame [327,346 x 7]
Groups: destination [104]

    year month   day dep_delay arr_delay distance destination
   <int> <int> <int>     <dbl>     <dbl>    <dbl>       <chr>
1   2013     1     9      1301      1272     4983         HNL
2   2013     6    15      1137      1127      483         CMH
3   2013     1    10      1126      1109      719         ORD
4   2013     9    20      1014      1007     2586         SFO
5   2013     7    22      1005       989      589         CVG

**(問題:分組后是依據延遲時間降序輸出數據,如何看出是分過組的?)
**

02函數應用和合并結果,移除數據量較小的樣本,并使用%>%(管道)優化代碼。
> delay<-summarise(by_dest,
+                  count=n(),#統計航班數
+                  dist=mean(distance,na.rm = TRUE),
+                  delay=mean(arr_delay,na.rm = TRUE))

> delay
# A tibble: 104 × 4
   destination count      dist     delay
         <chr> <int>     <dbl>     <dbl>
1          ABQ   254 1826.0000  4.381890
2          ACK   264  199.0000  4.852273
3          ALB   418  143.0000 14.397129
4          ANC     8 3370.0000 -2.500000
5          ATL  16837  757.1383 11.300113
6          AUS  2411 1514.2522  6.019909
# ... with 94 more rows
若是出現警告信息,可以在函數中使用encoding = "UTF-8"。(具體原因應該是數據源代碼在讀取過程中,由于中文Windows用戶的默認中文編碼和源代碼兼容問題,只有當源代碼與編碼同時存儲UTF-8時,工作正常,非英語環境極易出現類似問題。具體請參考:In grepl("\n", lines, fixed = TRUE) : input string 1 is invalid in this locale #396What is Unicode, UTF-8, UTF-16?
#移除噪音數據
delay<-filter(delay,count > 20)#航班數量大于20為有效值

優化后的代碼如下:(優化掉了7行數據)

> delay<-myFlight %>%
+   group_by(destination) %>%
+   summarise(count=n(),
+             dist=mean(distance,na.rm=TRUE),
+             delay=mean(arr_delay,na.rm=TRUE)
+   ) %>%
+   filter(count>20)
> delay
# A tibble: 97 × 4
   destination count      dist     delay
         <chr> <int>     <dbl>     <dbl>
1          ABQ   254 1826.0000  4.381890
2          ACK   264  199.0000  4.852273
3          ALB   418  143.0000 14.397129
4          ATL 16837  757.1383 11.300113
5          AUS  2411 1514.2522  6.019909
6          AVL   261  583.6130  8.003831
# ... with 87 more rows

三、數據顯示

數據顯示繪圖包ggplot2()函數

> #繪制圖形
> ggplot(data = delay) +
+   geom_point(mapping = aes(x=dist,y=delay)) +
+   geom_smooth(mapping = aes(x=dist,y=delay))

飛行距離和延誤時間關系
從最后可視化圖形可以看出:
  • 1.延遲時間基本集中在15分鐘左右;
  • 2.飛機延誤情況在航程1000(相當于1600公里左右,北京到廣州大概是2000公里左右)英里以內尤為明顯,在航程距離500英里(相當于800公里左右,北京到西安的距離,北京到上海大概是1100公里左右)左右達到高峰,隨后持續下降。
  • 3.飛行距離和延誤時間存在一定的關系。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容