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文件
備注:講解一下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
第三步刪除缺失數據
由于存在航班取消等情況,因此就不存在起飛和到達延遲時間,更可能為空或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 #396和What 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.飛行距離和延誤時間存在一定的關系。