0

我正在研究 R for Data Science 的问题和网站的解决方案:https ://jrnold.github.io/r4ds-exercise-solutions/exploratory-data-analysis.html 。

我正在研究的问题是:

使用 geom_tile() 和 dplyr 来探索平均航班延误如何随目的地和一年中的月份而变化。是什么让情节难以阅读?你怎么能改进它?

这是他们正在使用的数据,来自 nycflights123 “flights” 数据集:

dput(head(flights))
structure(list(year = c(2013L, 2013L, 2013L, 2013L, 2013L, 2013L
), month = c(1L, 1L, 1L, 1L, 1L, 1L), day = c(1L, 1L, 1L, 1L, 
1L, 1L), dep_time = c(517L, 533L, 542L, 544L, 554L, 554L), sched_dep_time = c(515L, 
529L, 540L, 545L, 600L, 558L), dep_delay = c(2, 4, 2, -1, -6, 
-4), arr_time = c(830L, 850L, 923L, 1004L, 812L, 740L), sched_arr_time = c(819L, 
830L, 850L, 1022L, 837L, 728L), arr_delay = c(11, 20, 33, -18, 
-25, 12), carrier = c("UA", "UA", "AA", "B6", "DL", "UA"), flight = c(1545L, 
1714L, 1141L, 725L, 461L, 1696L), tailnum = c("N14228", "N24211", 
"N619AA", "N804JB", "N668DN", "N39463"), origin = c("EWR", "LGA", 
"JFK", "JFK", "LGA", "EWR"), dest = c("IAH", "IAH", "MIA", "BQN", 
"ATL", "ORD"), air_time = c(227, 227, 160, 183, 116, 150), distance = c(1400, 
1416, 1089, 1576, 762, 719), hour = c(5, 5, 5, 5, 6, 5), minute = c(15, 
29, 40, 45, 0, 58), time_hour = structure(c(1357034400, 1357034400, 
1357034400, 1357034400, 1357038000, 1357034400), tzone = "America/New_York", class = c("POSIXct", 
"POSIXt"))), row.names = c(NA, -6L), class = c("tbl_df", "tbl", 
"data.frame"))

所以这是他们在我分享的链接中给出的答案:

flights %>%
      group_by(month, dest) %>%                                 # This gives us (month, dest) pairs
      summarise(dep_delay = mean(dep_delay, na.rm = TRUE)) %>%
      group_by(dest) %>%                                        # group all (month, dest) pairs by dest ..
      filter(n() == 12) %>%                                     # and only select those that have one entry per month 
      ungroup() %>%
      mutate(dest = reorder(dest, dep_delay)) %>%
      ggplot(aes(x = factor(month), y = dest, fill = dep_delay)) +
      geom_tile() +
      labs(x = "Month", y = "Destination", fill = "Departure Delay")
    #> `summarise()` regrouping output by 'month' (override with `.groups` argument)

这产生了这个:

阴谋

我对此有很多疑问:

  1. 首先,他/她为什么要分组两次?我看到有一个按月/目的地进行的初始分组,但随后它们按目的地向下两行分组。
  2. 接下来,那么取消分组的目的是什么?也许 ungroup 功能有一个我不知道的目的,但听起来违反直觉。
  3. 最后,这些数据仍然不像本书想要的那样“干净”。当然,它按月显示了一些热图,但是绘制在 y 上的目的地看起来就像字母汤,所以很难得出任何实际的上下文。

我想我现在的两个主要问题是我不明白他们是如何提出这个问题的,我也不明白为什么这是一个可以接受的答案,因为它没有显示太多。

4

2 回答 2

4

我会分部分回答你的问题。

  1. 首先,他/她为什么要分组两次?我看到有一个按月/目的地进行的初始分组,但随后它们又按目的地向下两行分组。

首先,分组两次会提供不同的信息。例如,在这种情况下,他们按目的地和月份分组。

group_by(month, dest)

然后将此分组与汇总相结合,以计算每个目的地每月的平均出发延误。

summarise(dep_delay = mean(dep_delay, na.rm = TRUE))

然后他们从那里再次在目的地分组,他们过滤了分组的数据集(对于问题 2 很重要)。

group_by(dest) %>%                                        
filter(n() == 12) %>%  

这样做的目的是不删除整个数据集。重新组合会导致操作对目标计数而不是目标月份执行。换句话说,我们将确保每个目的地每个月都有一个计数,而不是每个目的地和月份都有一个计数,因为如果您的数据集中有多年,这可能是错误的。(即为什么我们按 12 过滤)。换句话说,我们的最终数据框将是一个长表,其中一个目的地恰好与 12 个点有关。

  1. 接下来,那么取消分组的目的是什么?也许 ungroup 功能有一个我不知道的目的,但听起来违反直觉。

取消组合无论如何都不是违反直觉的,它实际上是必不可少的。根据帮助文件,分组采用现有表并将其转换为分组表。这使得操作按执行,而不是按观察执行。取消组合会反转此功能。由于本例中的操作是重新排序,因此作者希望重新排序整个数据集,而不是按每个目的地自己的点重新排序。

  1. 最后,这些数据仍然不像本书想要的那样“干净”。当然,它按月显示了一些热图,但是绘制在 y 上的目的地看起来就像字母汤,所以很难得出任何实际的上下文。

在不同的显示器上查看绘图甚至复制/保存绘图看起来不同。该图将自动缩放到您的显示器尺寸。很可能作者的显示器比您大,并且默认尺寸在他们的情况下很好。对于您,我建议您更改绘图的尺寸或简单地最大化您的绘图窗口。

总的来说,如果您查看了帮助文件、使用了解决方案(即注释掉一个组以查看会发生什么)并真正检查了情节,那么您的问题很容易回答。

于 2021-09-03T11:54:36.203 回答
2

我同意情节很难阅读。我认为使用更不同的色标、更小的 y 轴标签和月份名称而不是数字更容易理解,如下所示:

library(ggplot2)
library(dplyr)

nycflights13::flights %>%
  group_by(month, dest) %>%
  summarise(dep_delay = mean(dep_delay, na.rm = TRUE)) %>%
  group_by(dest) %>%
  filter(n() == 12) %>%
  ungroup() %>%
  mutate(dest = reorder(dest, dep_delay)) %>%
  ggplot(aes(
    x = factor(month.name[month], levels = month.name),
    y = dest,
    fill = dep_delay
  )) +
  geom_tile() +
  labs(x = "Month", y = "Destination", fill = "Departure Delay") +
  scale_fill_gradient(low = "white", high = "red") +
  theme(
    axis.text.y = element_text(size = 4),
    axis.text.x = element_text(size = 7),
    legend.position = "bottom"
  )

这更清楚地表明,6 月、7 月和 12 月是最糟糕的月份。

于 2021-09-03T12:09:33.467 回答