Упражнение 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 на простом и лаконичном индонезийском языке.