问题一
通过头脑风暴,至少找出 5 种方法来确定一组航班的典型延误特征。思考以下场景。
- 一架航班 50% 的时间会提前 15 分钟,50% 的时间会延误 15 分钟。
- 一架航班总是会延误 10 分钟。
- 一架航班 50% 的时间会提前 30 分钟,50% 的时间会延误 30 分钟。
- 一架航班 99% 的时间会准时,1% 的时间会延误 2 个小时。哪一种更重要:到达延误还是出发延误?
解答
这个问题是数据分析的一个基本问题:成本函数。作为分析人员,我们之所以对航班延误感兴趣,是因为对乘客来说代价高昂。在许多情况下,到达延迟更重要。在大多数情况下,迟到对乘客来说成本更高,因为这可能会打乱其下一阶段的旅行,例如转机或预定的会议。如果出发在不影响到达时间的情况下延迟,则此延迟不会影响计划,也不会影响旅行总时间。如果在飞机上狭窄的范围内花费更少的时间,如果这种延迟时间仍然花在跑道上的狭窄范围内,那么这种延迟可能是有益的。
问题二
找出另外一种方法,这种方法要可以给出与not_cancelled %>% count(dest) 和 not_ cancelled %>% count(tailnum, wt = distance)同样的输出(不能使用count())。
解答
- 方法一
not_cancelled %>% count(dest)
- 方法二
not_cancelled %>% group_by(dest) %>% summarise(n = length(dest))
- 方法三
not_cancelled %>% group_by(dest) %>% summarise(n = n())
问题三
我们对已取消航班的定义(is.na(dep_delay)) | (is.na(arr_delay))稍有欠佳。为什么?哪一列才是最重要的?
解答
如果一架飞机从来没有离开过,那么它就不会到达。如果飞机坠毁,飞机也可能离开而没有到达,或者飞机改道而降落在目的地以外的机场。因此,最重要的列是arr_delay
,它表示到达延误次数。
问题四
查看每天取消的航班数量。其中存在模式吗?已取消航班的比例与平均延误时间有关系吗?
解答
一种模式是,取消航班的数量随着每天航班总数的增加而增加。取消航班的比例随着航班的平均延误而增加。从下列代码中可以看出规律:
cancelled_per_day <- flights %>% mutate(cancelled = (is.na(arr_delay) | is.na(dep_delay))) %>% group_by(year, month, day) %>% summarise( cancelled_num = sum(cancelled), flights_num = n(), ) ggplot(cancelled_per_day) + geom_point(aes(x = flights_num, y = cancelled_num))
航班取消的比例和平均起飞延误之间的关系:
cancelled_and_delays <- flights %>% mutate(cancelled = (is.na(arr_delay) | is.na(dep_delay))) %>% group_by(year, month, day) %>% summarise( cancelled_prop = mean(cancelled), avg_dep_delay = mean(dep_delay, na.rm = TRUE), avg_arr_delay = mean(arr_delay, na.rm = TRUE) ) %>% ungroup() ggplot(cancelled_and_delays) + geom_point(aes(x = avg_dep_delay, y = cancelled_prop))
问题五
哪个航空公司的延误情况最严重?挑战:你能否分清这是由于糟糕的机场设备,还是航空公司的问题?为什么能?为什么不能?(提示:考虑一下flights %>% group_by(carrier, dest) %>% summarize(n())。)
解答
延误情况最严重的航空公司:
1:3 + 1:10 flights %>% group_by(carrier) %>% summarise(arr_delay = mean(arr_delay, na.rm = TRUE)) %>% arrange(desc(arr_delay))
通过比较每个航空公司的平均延误和同一航线内航班的平均延误(从同一出发地到同一目的地的航班),你可以弄清机场和航空公司的影响。比较承运人之间和每条航线内的延误,可以理清承运人和机场的影响。更好的分析方法是将一家航空公司航班的平均延误与同一航线内所有其他航空公司航班的平均延误进行比较。
flights %>% filter(!is.na(arr_delay)) %>% group_by(origin, dest, carrier) %>% summarise( arr_delay = sum(arr_delay), flights = n() ) %>% group_by(origin, dest) %>% mutate( arr_delay_total = sum(arr_delay), flights_total = sum(flights) ) %>% ungroup() %>% mutate( arr_delay_others = (arr_delay_total - arr_delay) / (flights_total - flights), arr_delay_mean = arr_delay / flights, arr_delay_diff = arr_delay_mean - arr_delay_others ) %>% filter(is.finite(arr_delay_diff)) %>% group_by(carrier) %>% summarise(arr_delay_diff = mean(arr_delay_diff)) %>% arrange(desc(arr_delay_diff))
问题六
count() 函数中的 sort 参数的作用是什么?何时应该使用这个参数?
解答
排序参数,以对结果进行排序。想对结果排序的时候都可以使用sort。