One question: what is the relationship between flight distance and delay time?
航行距離到底和延誤時間有沒有關(guān)系斥季?只要是乘坐過飛機(jī)的人都知道亭姥,航班延誤是正常的事情谨设,不延誤就有點(diǎn)不正常了割粮。本文通過學(xué)習(xí)猴子大數(shù)據(jù)課程蜒程,對學(xué)習(xí)內(nèi)容進(jìn)行一次回顧和總結(jié)纽什。
一绒极、數(shù)據(jù)預(yù)處理
文中的航班數(shù)據(jù)來自R中nycflights13包。
#安裝數(shù)據(jù)處理包
install.packages("dplyr")
#安裝數(shù)據(jù)包
install.packages("nycflights13")
#載入安裝的包
library(dplyr)
library(nycflights13)#for data
> flights
第一步從數(shù)據(jù)中選擇需要分析的目標(biāo)數(shù)據(jù)伦乔,也就是課程中說的選擇子集厉亏。
分析目標(biāo):航班距離和到達(dá)延誤時間。
航班數(shù)據(jù)集中相關(guān)的字段有:year烈和,month爱只、day航班日期,dep_delay起飛延遲時間(份)招刹,arr_delay到達(dá)延遲時間(分)恬试,diatance航行距離(英里),dest目的地疯暑。
其它:dep_time训柴,完整的是departure time 即飛機(jī)起飛時間,sched_dep_time妇拯,完整的是schdeule departure time 即幻馁,按照飛行計劃表起飛時間≡叫猓可以上面表格中看到這個的差值就是dep_time,起飛延遲時間仗嗦,這個時間有早一點(diǎn)的有晚一點(diǎn)的。
同理后面的arr_time 和schedule arrive time甘凭,就是到達(dá)時間和計劃到達(dá)時間稀拐。carrier,flight丹弱,tailnum德撬,即為客機(jī)類型以及相關(guān)型號編號等,rigin,dest(destnation)即為出發(fā)地和目的地蹈矮。后面distance即為飛行距離砰逻。
利用函數(shù)選取子集如下:
#從flights中取子集
> myFlight<-select(flights,year,
+ month,day,dep_delay,
+ arr_delay,distance,dest)
> myFlight
嘗試生成數(shù)據(jù)文件查看一下:
#指定myFlight數(shù)據(jù)保存的文件名
save(myFlight,file = "E:/R語言筆記/實(shí)踐筆記/第四課實(shí)踐筆記/myFlight.rData")
#寫入到指定的文件中
write.csv(myFlight,file = "E:/R語言筆記/實(shí)踐筆記/第四課實(shí)踐筆記/myFlight.csv")
#生成了myFlight.csv文件
備注:講解一下select()函數(shù)的使用方法。使用help查看泛鸟。
01,select()函數(shù)只保留提到的變量元素蝠咆。(而rename()函數(shù)則保留所有變量,注意區(qū)別)
02, select(.data, ...)
,select_(.data, ..., .dots)
北滥。其中.data應(yīng)為目標(biāo)數(shù)據(jù)集刚操,...為不帶引號的表達(dá)式,即需要保留的變量元素再芋,正值表示保留變量菊霜,負(fù)值表示刪除變量。猴子君課程中提到的:select(myFlight,year:day)
,select(myFlight,-(year:day))
济赎。
03,詳細(xì)情況請參考help(“select”)
示例中關(guān)于鳶尾花(iris)數(shù)據(jù)的一系列操作鉴逞。其中就有關(guān)于模糊查詢的例子记某。
select(iris, -starts_with("Petal"))
select(iris, -ends_with("Width"))
select(iris, -contains("etal"))
select(iris, -matches(".t."))
select(iris, -Petal.Length, -Petal.Width)
第二步進(jìn)行列名重命名
> #列名重命名
> myFlight<-rename(myFlight,destination=dest)
> myFlight
第三步刪除缺失數(shù)據(jù)
由于存在航班取消等情況,因此就不存在起飛和到達(dá)延遲時間构捡,更可能為空或NA液南,在數(shù)據(jù)處理中,需要刪除這些噪音勾徽,提升數(shù)據(jù)分析質(zhì)量滑凉。
前期學(xué)習(xí)過na.omit()函數(shù),可以用來刪除所有含有缺失數(shù)據(jù)的行喘帚。上次的實(shí)踐課程使用的是is.na()函數(shù)畅姊,并通過邏輯運(yùn)算符!(非)吹由,!is.na的意思就是不是缺失數(shù)據(jù)若未,!is.na(excelData$購藥時間)作用是保留購藥時間不是缺失的數(shù)據(jù)。
本例使用dplyr包中filter()函數(shù)(表示過濾溉知,篩選的意思)陨瘩,返回具有匹配條件的行腕够。filter(.data, ...)
其中.data
和上面的select()函數(shù)级乍、rename()函數(shù)一樣,一個包含數(shù)據(jù)集的表帚湘,...
玫荣,為邏輯判斷條件,繼續(xù)使用!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(多個參數(shù)相當(dāng)于并列關(guān)系)
filter(mtcars, cyl < 6, vs == 1)
猴子君講課中的例子:
#查找日期為12月25日的數(shù)據(jù)情況
filter(myFlight,month==12,day==25)
#查找延誤時間(包括起飛和到達(dá)兩種情況)大于2小時的數(shù)據(jù)情況
filter(myFlight,arr_delay>120 | dep_delay>120)
第四步捅厂,數(shù)據(jù)的排序(本例中對日期要求不高,不需要對日期進(jìn)行處理)
以前是使用order函數(shù)進(jìn)行排序资柔。本例使用dplyr包中的arrange()函數(shù)進(jìn)行排序焙贷。相比較而言后者更為簡單易用。
arrange(.data, ...)
函數(shù)用法:.data
同上贿堰,...
表示“用逗號分隔的辙芍,無引號變量名的列表,使用desc按降序排序變量羹与」使瑁”
myFlight<-arrange(myFlight,dep_delay)#按照升序排序
myFlight<-arrange(myFlight,desc(dep_delay))#按照降序排序
以上就完成了數(shù)據(jù)的預(yù)處理。下面進(jìn)行數(shù)據(jù)的計算纵搁。
</br>
二吃衅、數(shù)據(jù)的計算
使用dplyr包中分組函數(shù)group_by()和組合函數(shù)summarise()。
數(shù)據(jù)處理的模式是:數(shù)據(jù)拆分腾誉,函數(shù)應(yīng)用徘层,組合結(jié)果(Split-Apply-Combine)峻呕。
01.數(shù)據(jù)分組。
到達(dá)同一目的地為一組(因為航程距離基本一樣)
> by_dest<-group_by(myFlight,destination)#按照目的地進(jìn)行分組
> 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
**(問題:分組后是依據(jù)延遲時間降序輸出數(shù)據(jù)趣效,如何看出是分過組的山上?)
**
02函數(shù)應(yīng)用和合并結(jié)果,移除數(shù)據(jù)量較小的樣本英支,并使用%>%(管道)優(yōu)化代碼佩憾。
> delay<-summarise(by_dest,
+ count=n(),#統(tǒng)計航班數(shù)
+ 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
若是出現(xiàn)警告信息,可以在函數(shù)中使用encoding = "UTF-8"干花。(具體原因應(yīng)該是數(shù)據(jù)源代碼在讀取過程中妄帘,由于中文Windows用戶的默認(rèn)中文編碼和源代碼兼容問題,只有當(dāng)源代碼與編碼同時存儲UTF-8時池凄,工作正常抡驼,非英語環(huán)境極易出現(xiàn)類似問題。具體請參考:In grepl("\n", lines, fixed = TRUE) : input string 1 is invalid in this locale #396和What is Unicode, UTF-8, UTF-16?
#移除噪音數(shù)據(jù)
delay<-filter(delay,count > 20)#航班數(shù)量大于20為有效值
優(yōu)化后的代碼如下:(優(yōu)化掉了7行數(shù)據(jù))
> 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
三肿仑、數(shù)據(jù)顯示
數(shù)據(jù)顯示繪圖包ggplot2()函數(shù)
> #繪制圖形
> ggplot(data = delay) +
+ geom_point(mapping = aes(x=dist,y=delay)) +
+ geom_smooth(mapping = aes(x=dist,y=delay))
從最后可視化圖形可以看出:
- 1.延遲時間基本集中在15分鐘左右致盟;
- 2.飛機(jī)延誤情況在航程1000(相當(dāng)于1600公里左右,北京到廣州大概是2000公里左右)英里以內(nèi)尤為明顯尤慰,在航程距離500英里(相當(dāng)于800公里左右馏锡,北京到西安的距離,北京到上海大概是1100公里左右)左右達(dá)到高峰伟端,隨后持續(xù)下降杯道。
- 3.飛行距離和延誤時間存在一定的關(guān)系。