航行距离和延误时间到底有没有关系呢?

今天想和大家讨论的问题是:飞机航行距离和延误时间有没有关系呢?我们的数据是R 中nycflights13包的航班数据。好了,搬好小板凳,我们要开始分析了。

先简单了解下我们的数据

> install.packages("dplyr")       #安装数据处理包
> install.packages("nycflights13")   #安装数据包
> library(dplyr)       #载入安装的数据处理包
> library(nycflights13)     #载入安装的数据包
> flights
# A tibble: 336,776 x 19
    year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
                                      
 1  2013     1     1      517            515         2      830            819
 2  2013     1     1      533            529         4      850            830
 3  2013     1     1      542            540         2      923            850
 4  2013     1     1      544            545        -1     1004           1022
 5  2013     1     1      554            600        -6      812            837
 6  2013     1     1      554            558        -4      740            728
 7  2013     1     1      555            600        -5      913            854
 8  2013     1     1      557            600        -3      709            723
 9  2013     1     1      557            600        -3      838            846
10  2013     1     1      558            600        -2      753            745
# ... with 336,766 more rows, and 11 more variables: arr_delay , carrier ,
#   flight , tailnum , origin , dest , air_time ,
#   distance , hour , minute , time_hour 

观察运行的程序能够得知所要分析的数据有336776行19列,包括航班日期:year,month、day;起飞延迟时间:dep_delay(以分为单位);到达延迟时间:arr_delay(分);航行距离:distance(英里);目的地:dest等数据。其实那么多数据,只选择足够分析问题的数据就好了。

数据处理

数据处理之前,再看下分析目标:航班距离和到达延误时间的关系。

与分析目标相关的字段有:包括航班日期:year,month、day;起飞延迟时间:dep_delay(单位:分);到达延迟时间:arr_delay(单位:分);航行距离:distance(单位:英里);目的地:dest。

  • 选择子集(与目标相关的字段)
> myflight<-select(flights,year,month,day,dep_delay,arr_delay,distance,dest)
> myflight
# A tibble: 336,776 x 7
    year month   day dep_delay arr_delay distance  dest
                    
 1  2013     1     1         2        11     1400   IAH
 2  2013     1     1         4        20     1416   IAH
 3  2013     1     1         2        33     1089   MIA
 4  2013     1     1        -1       -18     1576   BQN
 5  2013     1     1        -6       -25      762   ATL
 6  2013     1     1        -4        12      719   ORD
 7  2013     1     1        -5        19     1065   FLL
 8  2013     1     1        -3       -14      229   IAD
 9  2013     1     1        -3        -8      944   MCO
10  2013     1     1        -2         8      733   ORD
# ... with 336,766 more rows

select用法延伸:

  1. select(数据集,字段1,字段2,......),其中字段前为正值表示保留变量,负值表示删除变量。
  2. select(数据集,(字段1:字段n)),表示能够把字段1和字段n之间的字段都能筛选出来。
  3. select(数据集,starts_with("a")),表示筛选以"a"开始的字段;select(数据集,ends_with("a")),表示筛选以"a"结束的字段;select(数据集,contains("a")),表示筛选包含"a"的字段;
  • 进行列名重命名
> myflight<-rename(myflight,destination=dest)
> myflight
# A tibble: 336,776 x 7
    year month   day dep_delay arr_delay distance destination
                          
 1  2013     1     1         2        11     1400         IAH
 2  2013     1     1         4        20     1416         IAH
 3  2013     1     1         2        33     1089         MIA
 4  2013     1     1        -1       -18     1576         BQN
 5  2013     1     1        -6       -25      762         ATL
 6  2013     1     1        -4        12      719         ORD
 7  2013     1     1        -5        19     1065         FLL
 8  2013     1     1        -3       -14      229         IAD
 9  2013     1     1        -3        -8      944         MCO
10  2013     1     1        -2         8      733         ORD
# ... with 336,766 more rows
  • 删除缺失值
    考虑到因为天气等原因航班会有取消的情况,所以延误时间就会存在有空值,这时为保证数据分析的质量,需要删除缺失值。使用 filter(): subsets your data by keeping rows that meet specified conditions,表示筛选出符合条件的行。
> myflight<-filter(myflight,!is.na(dep_delay),!is.na(arr_delay))
> myflight
# A tibble: 327,346 x 7
year month   day dep_delay arr_delay distance destination
                        
1  2013     1     1         2        11     1400         IAH
 2  2013     1     1         4        20     1416         IAH
 3  2013     1     1         2        33     1089         MIA
 4  2013     1     1        -1       -18     1576         BQN
 5  2013     1     1        -6       -25      762         ATL
 6  2013     1     1        -4        12      719         ORD
 7  2013     1     1        -5        19     1065         FLL
 8  2013     1     1        -3       -14      229         IAD
 9  2013     1     1        -3        -8      944         MCO
10  2013     1     1        -2         8      733         ORD
# ... with 327,336 more rows
    1     1        -2         8      733         ORD
    # ... with 336,766 more rows

处理前有336776行,处理后有327346行,所以缺失值为 9430。
延伸,查找某些特些特定的值

#查找日期为12月25日的数据情况
filter(myFlight,month==12,day==25)  #查找12月25日的航班情况,注意用的是"=="
#查找延误时间(包括起飞和到达两种情况)大于2小时的数据情况
filter(myFlight,arr_delay>120 | dep_delay>120)
  • 数据的排序

这里为了演示下arrange()函数的用法

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

数据的预处理结束,下面开始数据的计算

数据的计算

一切都是套路,数据计算的套路:数据拆分,函数应用,组合结果(Split-Apply-Combine)

  • 数据拆分

用group_by()函数进行分组,在这里将选择以目的地进行分组

> by_dest<-group_by(myflight,destination)
> by_dest
# A tibble: 327,346 x 7
# Groups:   destination [104]
    year month   day dep_delay arr_delay distance destination
                          
 1  2013    12     7       -43        48     1626         DEN
 2  2013     2     3       -33       -58     1183         MSY
 3  2013    11    10       -32       -10      229         IAD
 4  2013     1    11       -30       -10     1010         TPA
 5  2013     1    29       -27       -10     1620         DEN
 6  2013     8     9       -26         7      502         DTW
 7  2013    10    23       -25         0      631         TYS
 8  2013     3    30       -25       -37      502         DTW
 9  2013     3     2       -24       -30      301         BUF
10  2013     5     5       -24       -44     1076         FLL
# ... with 327,336 more rows
  • 按照分组,利用函数进行组合
> delay<-summarise(by_dest,count=n(),mean(distance,na.rm = TRUE),mean(arr_delay,na.rm=TRUE),encoding = "UTF-8")
> delay
# A tibble: 104 x 5
   destination count `mean(distance, na.rm = TRUE)` `mean(arr_delay, na.rm = TRUE)`
                                                               
 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
 7         AVL   261                       583.6130                        8.003831
 8         BDL   412                       116.0000                        7.048544
 9         BGR   358                       378.0000                        8.027933
10         BHM   269                       865.9963                       16.877323
# ... with 94 more rows, and 1 more variables: encoding 
  • 删除噪音值

对于飞往目的地数量少于20的数据,我们选择删除,不做参考

现在我们能够得知所要分析的数据有336,776行19列

> delay<-filter(delay,count>20)
> delay
# A tibble: 97 x 5
   destination count `mean(distance, na.rm = TRUE)` `mean(arr_delay, na.rm = TRUE)`
                                                               
 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
 7         BDL   412                       116.0000                        7.048544
 8         BGR   358                       378.0000                        8.027933
 9         BHM   269                       865.9963                       16.877323
10         BNA  6084                       758.2206                       11.812459
# ... with 87 more rows, and 1 more variables: encoding 
  • 简化数据计算

The %>% operator:In the dplyr syntax, we “chain” commands together using the %>% operator. We use the %>% operator to connect one command to another. The output of one command becomes the input for the next command.简单解释下,"%>%"的作用是连接两个命令,并且上一个命令的输出是下一个命令的输入。

> delay<-myflight%>%group_by(destination)%>%summarise(count=n(),dist=mean(distance,na.rm = TRUE),dela=mean(arr_delay,na.rm=TRUE))%>%filter(count>20)%>%arrange(count)
> delay
# A tibble: 97 x 4
   destination count      dist       dela
                     
 1         JAC    21 1875.9048 28.0952381
 2         BZN    35 1882.0000  7.6000000
 3         CHO    46  305.0000  9.5000000
 4         MYR    58  550.6724  4.6034483
 5         TVC    95  652.4526 12.9684211
 6         CAE   106  603.6981 41.7641509
 7         ILM   107  500.0000  4.6355140
 8         CRW   134  444.0000 14.6716418
 9         EGE   207 1735.8019  6.3043478
10         MVY   210  173.0000 -0.2857143
# ... with 87 more rows

数据可视化

选择用视图更加直观的说明数据的意义,使用ggplot2包。

 > install.packages("ggplot2")
 > library(ggplot2)

1.先创建画板

> ggplot(data=delay)
航行距离和延误时间到底有没有关系呢?_第1张图片

2.添加点图层

> ggplot(data=delay)+geom_point(mapping = aes(x=dist,y=dela));
航行距离和延误时间到底有没有关系呢?_第2张图片

3.添加平滑曲线图层

> ggplot(data=delay)+geom_point(mapping = aes(x=dist,y=dela))+geom_smooth(mapping = aes(x=dist,y=dela))
航行距离和延误时间到底有没有关系呢?_第3张图片
结论

飞行距离在1000英里以内,延迟时间多为20分钟以内,且延迟分布还比较均匀。飞行距离在1000英里以后,延迟时间会大多为10分钟以内。

你可能感兴趣的:(航行距离和延误时间到底有没有关系呢?)