Упражнение 5.6.4. Посмотрите на количество отмененных рейсов в день. Есть ли образец? Связана ли доля отмененных рейсов со средней задержкой?

В качестве предисловия: этот вопрос, а также массу полезной информации о языке программирования R можно найти бесплатно в разделе «R for Data Science. », основанный на книге, созданной Хэдли Уикхэм и Гарретом Гролемундом, включая установку и экзотические пакеты для запуска R и решения задач. Этот бесплатный доступ также содержит множество упражнений для изучения, и, к счастью, есть хороший компаньон, если вы застряли в каком-то упражнении внутри книги, задокументированной Джеффри Арнольдом. Пожалуйста, просмотрите страницы, прежде чем двигаться дальше, чтобы прочитать эту статью.

Меня, как человека, работающего в сфере технического обслуживания самолетов, очень интересует этот вопрос; как долго задержка является «приемлемой» и насколько велико влияние задержки на все операции авиакомпаний?

  • Подготовка R и пакетов

Сначала установите базовую систему R через веб-сайт R Cran (Comprehensive R Archive Network). После этого я настоятельно рекомендую RStudio IDE, чтобы получить лучший опыт кодирования с R. Следуйте книге или любому видео на YouTube, если вы обнаружите какие-либо проблемы с установкой.

После завершения начните наш анализ с подготовки пакетов R (или инструментов, можно сказать) для аналитики. На вкладке консоли R используйте приведенную ниже команду для установки и включения в библиотеку, к которой мы хотим получить доступ (# только для комментариев):

install.packages("tidyverse") #press enter and wait until complete
#Tools for data preparation and visualization
install.packages("nycflights13") #press enter and wait until complete
#Dataset for flights from New York 2013 for training purpose
#Include all packages in our environment using "library", and enter
library(tidyverse)
library(nycflights13)
  • Освойте процесс навигации по данным

Набор данных, который мы хотим использовать, исходит от nycflight13, поэтому мы хотим знать, какую таблицу содержат пакеты и какие данные в ней содержатся? Мы начнем с использования nycflights::, чтобы увидеть, какой набор данных содержится в пакетах, а именно: авиакомпания, аэропорт, самолеты, рейсы и погода. . Нас интересует набор данных flights, который содержит данные о своевременности всех рейсов, вылетевших из Нью-Йорка в 2013 году. Нам повезло, что эти данные были упакованы как обучающий модуль, поэтому мы можем проверить детали для каждого столбца, используя ?flights , но в большинстве случаев данные будут действительно беспорядочными, и нам нужно найти детали самостоятельно. Другой способ проникнуть в неизвестные данные — использовать str, чтобы показать все атрибуты для каждого столбца, как показано ниже:

> str(flights)
tibble [336,776 x 19] (S3: tbl_df/tbl/data.frame)
 $ year          : int [1:336776] 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
 $ month         : int [1:336776] 1 1 1 1 1 1 1 1 1 1 ...
 $ sched_arr_time: int [1:336776] 819 830 850 1022 837 728 854 723 846 745 ...
 $ arr_delay     : num [1:336776] 11 20 33 -18 -25 12 19 -14 -8 8 ...
 $ carrier       : chr [1:336776] "UA" "UA" "AA" "B6" ...
...
 $ time_hour     : POSIXct[1:336776], format: "2013-01-01 05:00:00" ...

Мы видим, что; во-первых, каждый столбец имеет тип данных int, num, chr и другие типы данных, что является базовым типом данных для любых баз данных; во-вторых, в каждом столбце есть $для каждого имени столбца; и в-третьих, всего данных 336776 элементов. Чтобы увидеть, как выглядит набор данных, мы можем использовать:

> print(flights) #or simply type flights and enter
# A tibble: 336,776 x 19
    year month   day dep_time sched_dep_time dep_delay
   <int> <int> <int>    <int>          <int>     <dbl>
 1  2013     1     1      517            515         2
 2  2013     1     1      533            529         4
 3  2013     1     1      542            540         2
 4  2013     1     1      544            545        -1
 5  2013     1     1      554            600        -6
# ... with 336,766 more rows, and 13 more variables:

Скажем, если нам нужен только столбец dep_time, мы можем использовать flights$dep_time или flights[4] (dep_time расположен в позиции 4 в столбцах) для выбора и отображения столбца. И если нам нужны конкретные строки с номерами 1 и 3, используйте flights[c(1,3),] (c обозначает одномерный массив, широко известный как вектор в языке R). Теперь, когда мы понимаем, как перемещаться по набору данных, мы готовы к следующему шагу.

  • «Приведите в порядок» свой набор данных

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

В этом случае нам нужно «создать» новые столбцы, чтобы содержать данные об отменах/днях и средней задержке. Базовый язык R позволяет нам сделать это с помощью метода cbind, но поскольку мы используем библиотеку tidyverse, у нас есть доступ к более сложному методу, который мы будем использовать позже. Перед этим давайте начнем с проверки данных с помощью view(flights), чтобы увидеть, какие данные у нас есть:

Эта таблица, похожая на Excel, удобна для глаз и дает нам лучшее представление о наборе данных. Чтобы просмотреть данные об отмененных рейсах, нам нужно найти столбцы dep_time и arr_time, в которых было значение NA, что указывает на отсутствующие данные. Базовая сортировка в столбце dep_time и прокрутка показывают несколько значений NA в этом столбце. Но будьте осторожны, некоторые arr_time могут иметь значения NA, но dep_time имеет значения. Почему это возможно?

Что касается моего опыта в индустрии ТОиР, то есть несколько причин, по которым у самолетов есть время отправления, но они не прибывают; он либо падает, либо перенаправляется на другую станцию, либо отменяется.

Следовательно, чтобы получить оптимальный параметр для поиска отмененных рейсов, нам нужно найти только рейсы, которые не вылетели, что указано в столбце dep_time, имеющем NA значений. Помимо традиционной сортировки и прокрутки, мы можем использовать filter из пакета tidyverse, сохраненного в пользовательской переменной depNa:

> depNa <- filter(flights, is.na(flights$dep_time))
> print(depNa)
# A tibble: 8,255 x 19
    year month   day dep_time sched_dep_time dep_delay arr_time
   <int> <int> <int>    <int>          <int>     <dbl>    <int>
 1  2013     1     1       NA           1630        NA       NA
 2  2013     1     1       NA           1935        NA       NA
 3  2013     1     1       NA           1500        NA       NA
 4  2013     1     1       NA            600        NA       NA
 5  2013     1     2       NA           1540        NA       NA
 6  2013     1     2       NA           1620        NA       NA
 7  2013     1     2       NA           1355        NA       NA
 8  2013     1     2       NA           1420        NA       NA
 9  2013     1     2       NA           1321        NA       NA
10  2013     1     2       NA           1545        NA       NA
# ... with 8,245 more rows, and 12 more variables: sched_arr_time <int>,
#   arr_delay <dbl>, carrier <chr>, flight <int>, tailnum <chr>,
#   origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>,
#   hour <dbl>, minute <dbl>, time_hour <dttm>

Теперь, когда мы понимаем наш набор данных и какой столбец нужно найти, мы будем использовать расширенную функцию из пакета tidyverse, group_by для столбца группировки и выбора, который нам нужен, и summarise для создания сводки для столбца и добавления нового вычисляемого столбца в наш анализ. Мы используем пользовательскую переменную cancel_delay_analysis :

> cancel_delay_analysis <- flights %>%
     group_by(year, month, day, origin) %>%
     summarise(
        monthly_flight = n(),
        avg_arrDel = mean(arr_delay[arr_delay>0], na.rm=TRUE),
        avg_depDel = mean(dep_delay[dep_delay>0], na.rm=TRUE),
        #na.rm=TRUE stands for removal of NA value 
        sum_cancelled = sum(is.na(dep_delay))
        )

Еще одна особенность пакета tidyverse — функция «pipe», %>%. На простом английском языке эта функция переводится как «…а затем…». Таким образом, наш приведенный выше код можно перевести следующим образом: «создайте функцию cancel_delay_analysis, вставьте в нее набор данных «рейсы», а затемсгруппируйте его по (год, месяц, день, происхождение) , а затемсоздать сводку ». Эта функция «конвейера» создает плавный поток при написании кода и облегчает его чтение. Однако на момент написания этой статьи эта функция по-прежнему не работает с пакетом ggplot2 на tidyverse.

  • Создайте сюжет и расскажите историю

Наша история с заказчиком действительно начинается на графике, в презентации. Поиск наилучшего графика, соответствующего нашим потребностям, получение правильного цвета и текста, а также помощь клиентам в выводах — это хлеб с маслом при обслуживании данных. Существует множество способов обработки этих данных, но для наших текущих вопросов мы хотим использовать данные как «корреляцию между средней задержкой и отмененными рейсами», вызвав мощный пакет ggplot2.

> ggplot(data = cancel_delay_analysis) +    
     geom_point(aes(x=avg_arrDel, y=sum_cancelled)) +
     geom_smooth(mapping = aes(x=avg_arrDel, y=sum_cancelled)) +
         facet_wrap(~origin, nrow = 2)

Краткое руководство: ggplot вызывает функцию построения графика, data указывает, какой фрейм данных будет использоваться для создания графика, + указывает следующее действие, которое необходимо выполнить, geom_point и geom_smooth вызывает метод точки и метод сглаживания для отображения данных, facet_wrap для создания отдельной вкладки ( или, фасет) для данных, а aes указывает на эстетический фактор, который нам нужно выявить в данных (в основном по осям x и y).

На основе данных из аэропорта LGA (LaGuardia), аэропорта JFK (John F Kennedy) и аэропорта EWR (Newark) за 2013 год по пакету nycflight13 сумма отмененных рейсов положительно коррелирует со средней задержкой; чем больше рейсов задерживается, тем выше общая отмена рейса. Баллы, набранные в начале графика, показывают, что в большинстве случаев задержка менее 25–35 минут свидетельствует о значительно низком уровне отмененных рейсов (приемлемо или нет, зависит от политики каждой компании), но задержка более 35 минут. минут приведет к катастрофическим последствиям для всех рейсов, прибывающих и вылетающих из пункта отправления.

Спасибо, что уделили время на чтение этой статьи, и я открыт для любых предложений, чтобы попрактиковаться и узнать больше, или, возможно, в моем подходе к этому преобразованию данных и заключению есть что-то неправильное. Продолжайте учиться и удачной охоты за данными!!

Дополнительные ресурсы:
[1] https://r4ds.had.co.nz/index.html ‹- для изучения среды R и tidyverse, бесплатно для всех.

[2] https://jrnold.github.io/r4ds-exercise-solutions/ ‹ — неофициальное руководство для ответов на вопросы по книге.

[3] http://rstudio-pubs-static.s3.amazonaws.com/503447_57eb680b5be348b6b965df58e3547672.html#1_objektif ‹- для tidyverse подхода к исследованию данных, написано на индонезийском языке.

[4] https://medium.com/@17611078/ekplorasi-data-menggunakan-packages-tidyverse-di-r-part-1-de463e92b6fb ‹ — еще одно объяснение R на простом и лаконичном индонезийском языке.