Не понимаю, почему это книжное решение «правильно» для очистки данных в наборе данных полетов

#r #ggplot2 #dplyr #geom-tile

Вопрос:

Я работаю над вопросами R для науки о данных и решениями веб-сайта здесь: https://jrnold.github.io/r4ds-exercise-solutions/exploratory-data-analysis.html.

Вопрос, над которым я работаю, заключается в следующем:

Используйте geom_tile() вместе с dplyr, чтобы изучить, как средние задержки рейсов варьируются в зависимости от пункта назначения и месяца года. Что затрудняет чтение сюжета? Как вы могли бы его улучшить?

Это данные, с которыми они работают, которые поступают из набора данных «рейсы» nycflights123:

 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. Во-первых, почему он/она группирует это дважды? Я вижу, что есть начальная группировка по месяцам/dest, но затем они снова группируются по dest двумя строками вниз.
  2. Далее, какова цель его последующей разгруппировки? Возможно, функция разгруппировки служит какой-то цели, о которой я не знаю, но звучит нелогично.
  3. Наконец, эти данные все еще не выглядят «чистыми», как того, по-видимому, хочет книга. Конечно, он показывает некоторое сопоставление температуры по месяцам, но пункты назначения, нанесенные на y, выглядят просто как алфавитный суп, поэтому трудно определить какой-либо реальный контекст.

Я предполагаю, что две мои основные проблемы прямо сейчас заключаются в том, что я не понимаю, как они пришли к этому, и я не понимаю, почему это приемлемый ответ, учитывая, что он мало что показывает.

Комментарии:

1. Если мой ответ правильный, пожалуйста, отметьте его как правильный, спасибо.

Ответ №1:

Я отвечу на ваш вопрос по частям.

  1. Во-первых, почему он/она группирует это дважды? Я вижу, что есть начальная группировка по месяцам/dest, но затем они снова группируются по dest двумя строками вниз.

Ну, во-первых, группировка дважды дает разную информацию. Например, в этом случае они сгруппированы по месту назначения и месяцу.

group_by(month, dest)

Затем эта группа была объединена с обобщением, чтобы рассчитать среднюю задержку отправления в пункте назначения в месяц.

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

Затем они снова сгруппировались по месту назначения, оттуда они отфильтровали этот сгруппированный набор данных (важно для вопроса 2).

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

Цель этого состоит в том, чтобы не удалять весь набор данных. Перегруппировка приводит к тому, что операция выполняется по количеству пунктов назначения вместо пункта назначения и месяца. Другими словами, вместо этого мы будем следить за тем, чтобы у каждого пункта назначения было одно количество в один месяц, а не у каждого пункта назначения и месяца было одно количество, поскольку это может быть ложным, если в вашем наборе данных несколько лет. (т. Е. Почему мы фильтруем по 12). Другими словами, наш конечный кадр данных будет представлять собой длинную таблицу с одним пунктом назначения, относящимся ровно к 12 точкам.

  1. Далее, какова цель его последующей разгруппировки? Возможно, функция разгруппировки служит какой-то цели, о которой я не знаю, но звучит нелогично.

Разгруппировка вовсе не противоречит здравому смыслу, это действительно важно. Группировка, согласно файлу справки, берет существующую таблицу и преобразует ее в сгруппированную таблицу. Это делает так, что операции выполняются группой, а не наблюдением. Разгруппировка отменяет эту функцию. Поскольку операция в этом случае была переупорядочена, автор хотел переупорядочить весь набор данных, а не переупорядочивать каждый пункт назначения по своим собственным точкам.

  1. Наконец, эти данные все еще не выглядят «чистыми», как того, по-видимому, хочет книга. Конечно, он показывает некоторое сопоставление температуры по месяцам, но пункты назначения, нанесенные на y, выглядят просто как алфавитный суп, поэтому трудно определить какой-либо реальный контекст.

Просмотр графика или даже копирование/сохранение графика на разных мониторах выглядит по-разному. График будет автоматически масштабироваться до размера вашего монитора. Скорее всего, у автора был монитор большего размера, чем у вас, и размеры по умолчанию в их случае были в порядке. Для вас я бы рекомендовал изменить размеры участка или просто увеличить окно вашего участка.

В целом, на ваши вопросы было просто ответить, если бы вы посмотрели файлы справки, поиграли с решением (т. Е. прокомментировали группу, чтобы посмотреть, что произойдет) и действительно изучили сюжет.

Комментарии:

1. Я все время пытаюсь использовать справку в R, но я понятия не имею, что она пытается сказать в половине случаев, даже когда я снова сверяюсь с документацией R, в которой часто есть странно запутанные объяснения даже простых операций для новичков. Я попытался разрезать команду на части, чтобы каждый раз видеть, что она делает, но, поскольку каждая часть, похоже, каждый раз отображает строки в строках данных, это не дает мне хорошего представления о том, что на самом деле происходит. Наверное, у меня все еще много вопросов: почему месяц нужно фильтровать по 12, когда он уже пронумерован? Зачем вам нужны сгруппированные таблицы? Все это сбивает с толку.

2. Его нумеруют по месяцам, а затем фильтр фильтрует по количеству n() каждого пункта назначения. Другими словами, он следит за тем, чтобы в каждом пункте назначения было ровно 12 наблюдений. Сгруппированные таблицы, как я объяснил в своем ответе, позволяют выполнять функцию/операцию над определенной группой. Например, если я хочу подсчитать количество пунктов назначения, я бы сгруппировал их по пунктам назначения, а затем использовал функцию суммирования для подсчета. Если бы я хотел подсчитать количество пунктов назначения в месяц, я бы сгруппировал их по пунктам назначения и месяцам, а затем подсчитал. На самом деле это совсем не сбивает с толку.

3. Я просто приму ваш ответ, потому что вы, похоже, потратили на это много времени, я просто никогда не могу понять R очень хорошо, независимо от того, сколько раз я в гневе бросаю свой компьютер, пытаясь заставить его делать то, что я хочу.

4. Правильно, так как же вы переходите от «разгруппировать данные», как я уже говорил, к тому, что вы сказали ранее, а именно «это группирует их в таблицу». Это два предложения, которые противоречат друг другу по своему значению. И нет, ты на самом деле не очень внимателен, учитывая, что это уже третий раз, когда ты снисходительно комментируешь, каким идиотом я должен быть, чтобы не понимать. Если вы не хотите помогать, есть тысячи других сообщений, о которых вы можете быть грубыми вместо этого.

5. Я думаю, что также стоит отметить, что summarize() изменения, как правило, изменяют статус ваших групп. Он занимает блок строк и (как правило) объединяет их в один. Это означает, что у вас больше нет групп, теперь у вас есть отдельные записи. Поэтому довольно часто group_by() после a summarize() снова переопределяют ваши «фрагменты» строк, которые вас интересуют.

Ответ №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"
  )
 

Это проясняет, что июнь, июль и декабрь-худшие месяцы.

Комментарии:

1. Спасибо. Это определенно отвечает на третью часть моего вопроса.