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.飞行距离和延误时间存在一定的关系。