Основы статистической обработки педагогической информации - страница 31
группы_по_дням %>%
ungroup() %>% # разгруппируем данные обратно
summarise(полётов = n()) # подсчитаем все полёты
Упражнения
1. Примените мозговой штурм чтобы изобрести как минимум 7 различных способов анализа типовых причин серийной задержки рейсов, учитывая следующие сценарии:
а) в 50% случаев вылет осуществляется на 15 минут раньше запланированного, и в 50% рейс задерживается на 15 минут.
б) рейс всегда опаздывает на 10 минут.
в) 50% рейсов вылетает на 30 минут раньше, и 50% на 30 минут опаздывает.
г) в 99% случаев рейс выполняется точно по графику, а в оставшемся 1% происходит опоздание на 2 часа.
Что более важно для пассажира, задержка прибытия или задержка вылета, а для работы аэропортов?
2. Придумайте альтернативный способ решения той же задачи, что и в примерах неотмененные %>% count (dest), неотмененные %>% count(tailnum, wt = distance), но без использования функции count().
3. Следующее определение отмененных рейсов не оптимально:
отмененные <– flights %>%
filter( is.na(dep_delay) | is.na(arr_delay) )
Почему? Какая колонка важнее в этом случае: задержка времени вылета (dep_delay) или задержка времени прилёта (arr_delay)?
4. Посмотрите на ежедневное количество отмененных рейсов. Есть ли здесь закономерность? Связана ли доля отмененных рейсов со средней задержкой?
5. Какой перевозчик (carrier) имеет худшую статистику по задержкам рейсов? Можно ли обнаружить зависимость плохих статистических показателей аэропортов от качества работы перевозчиков? Если да, то как, если нет, то почему?
6. За что отвечает аргумент выбора способа сортировки sort в функции count()? Когда уместно его использование?
Группирование данных бывает полезным в сочетании с функцией подведения итогов summarise(), но есть удобные шаблоны и для операций преобразования mutate() с фильтрацией filter(). Вспомним про укороченный_вариант_таблицы <– select(flights, year:day, ends_with("delay"), distance, air_time), хранящий лишь сведения об опозданиях, и выделим по 5 злостных нарушителей регламента полётов на каждый день:
укороченный_вариант_таблицы %>% group_by(year, month, day) %>%
filter(rank(desc(arr_delay)) <= 5)
Сгруппируем рейсы по направлениям и оставим лишь такие группы, объем которых превышает некоторое пороговое значение:
( популярные_направления <– flights %>% group_by(dest) %>%
filter(n() > 17282) )
Преобразуем их для дальнейшего вычисления метрических характеристик внутри каждой из полученных групп:
популярные_направления %>% filter(arr_delay > 0) %>%
mutate(относительная_задержка = arr_delay / sum(arr_delay)) %>%
select(year:day, dest, arr_delay, относительная_задержка)
Как видим, группирующая фильтрация приводит к изменениям, за которыми следует обычная фильтрация. Желательно избегать подобного, за исключением поверхностного анализа данных, в противном случае бывает трудно проверить корректность выполненных манипуляций. Функции, которые наиболее естественно работают со сгруппированными данными, например mutate() и filter(), называются оконными функциями, в отличие от резюмирующих функций типа summary(). Узнать больше об оконных функциях можно вызвав соответствующий раздел справки, введя консольную команду vignette("window-functions").
Упражнения
1. Вернитесь к примерам использования функций mutate() и filter() со списками. Как меняется результат каждой операции при создании промежуточных групп данных?