rm(list = ls())
cat("\014")
graphics.off()
library(pacman)
p_load(ggplot2, dplyr, datos, rsconnect, packrat)

1 Presentación

El presente documento contiene el solucionario a los ejercicios 5.6.7 del libro de R for Data Science de Hadley Wickham y Garrett Grolemund en su versión en español.

Este documento se realiza con fines académicos para el curso de Técnicas de Exploración de Datos de la carrera de Estadística e Informática de la Universidad Nacional Agraria La Molina de Lima, Perú.

2 Marco téorico

5.6.6 Desagrupar
Si necesitas eliminar la agrupación y regresar a las operaciones en datos desagrupados, usa ungroup().

diario %>% 
  ungroup() %>%             # ya no está agrupado por fecha
  summarise(vuelos = n())   # todos los vuelos
## # A tibble: 1 × 1
##   vuelos
##    <int>
## 1 336776

3 Ejercicios

3.1 Ejercicio 1

Las variables horario_salida y salida_programada tienen un formato conveniente para leer, pero es difícil realizar cualquier cálculo con ellas porque no son realmente números continuos. Transfórmalas hacia un formato más conveniente como número de minutos desde la medianoche.

3.2 Ejercicio 2

attach(vuelos)

no_cancelado <- vuelos %>%
  filter(!is.na(atraso_salida), !is.na(atraso_llegada))
#primer código:
no_cancelado %>%
  count(destino)
## # A tibble: 104 × 2
##    destino     n
##    <chr>   <int>
##  1 ABQ       254
##  2 ACK       264
##  3 ALB       418
##  4 ANC         8
##  5 ATL     16837
##  6 AUS      2411
##  7 AVL       261
##  8 BDL       412
##  9 BGR       358
## 10 BHM       269
## # ℹ 94 more rows
#nuevo enfoque para el código anterior es:
no_cancelado %>% group_by(destino) %>% summarise(n=n())
## # A tibble: 104 × 2
##    destino     n
##    <chr>   <int>
##  1 ABQ       254
##  2 ACK       264
##  3 ALB       418
##  4 ANC         8
##  5 ATL     16837
##  6 AUS      2411
##  7 AVL       261
##  8 BDL       412
##  9 BGR       358
## 10 BHM       269
## # ℹ 94 more rows
#segundo código: 
no_cancelado %>% count(codigo_cola, wt = distancia)
## # A tibble: 4,037 × 2
##    codigo_cola      n
##    <chr>        <dbl>
##  1 D942DN        3418
##  2 N0EGMQ      239143
##  3 N10156      109664
##  4 N102UW       25722
##  5 N103US       24619
##  6 N104UW       24616
##  7 N10575      139903
##  8 N105UW       23618
##  9 N107US       21677
## 10 N108UW       32070
## # ℹ 4,027 more rows
#nuevo enfoque para el código anterior es:
no_cancelado %>% group_by(codigo_cola) %>% summarise(wt=sum(distancia))
## # A tibble: 4,037 × 2
##    codigo_cola     wt
##    <chr>        <dbl>
##  1 D942DN        3418
##  2 N0EGMQ      239143
##  3 N10156      109664
##  4 N102UW       25722
##  5 N103US       24619
##  6 N104UW       24616
##  7 N10575      139903
##  8 N105UW       23618
##  9 N107US       21677
## 10 N108UW       32070
## # ℹ 4,027 more rows

3.3 Ejercicio 3

Nuestra definición de vuelos cancelados (is.na(atraso_salida) | is.na (atraso_llegada)) es un poco subóptima. ¿Por qué? ¿Cuál es la columna más importante?

Si un vuelo nunca sale, entonces no llegará. Un vuelo también podría salir y no llegar si se estrella, o si es desviado y aterriza en un aeropuerto distinto al de su destino previsto. Entonces, la columna más importante es “atraso_llegada”, que indica la cantidad de retraso en la llegada.

vuelos %>% filter( is.na(atraso_salida) | is.na
  (atraso_llegada) )
## # A tibble: 9,430 × 19
##     anio   mes   dia horario_salida salida_programada atraso_salida
##    <int> <int> <int>          <int>             <int>         <dbl>
##  1  2013     1     1           1525              1530            -5
##  2  2013     1     1           1528              1459            29
##  3  2013     1     1           1740              1745            -5
##  4  2013     1     1           1807              1738            29
##  5  2013     1     1           1939              1840            59
##  6  2013     1     1           1952              1930            22
##  7  2013     1     1           2016              1930            46
##  8  2013     1     1             NA              1630            NA
##  9  2013     1     1             NA              1935            NA
## 10  2013     1     1             NA              1500            NA
## # ℹ 9,420 more rows
## # ℹ 13 more variables: horario_llegada <int>, llegada_programada <int>,
## #   atraso_llegada <dbl>, aerolinea <chr>, vuelo <int>, codigo_cola <chr>,
## #   origen <chr>, destino <chr>, tiempo_vuelo <dbl>, distancia <dbl>,
## #   hora <dbl>, minuto <dbl>, fecha_hora <dttm>

En estos datos, horario_salida no puede faltar y atraso_llegada puede faltar, pero no puede faltar horario_llegada:

vuelos %>% filter(!is.na(atraso_salida), is.na(atraso_llegada)) %>%
  select(horario_salida, horario_llegada, llegada_programada, atraso_salida, atraso_llegada)
## # A tibble: 1,175 × 5
##    horario_salida horario_llegada llegada_programada atraso_salida
##             <int>           <int>              <int>         <dbl>
##  1           1525            1934               1805            -5
##  2           1528            2002               1647            29
##  3           1740            2158               2020            -5
##  4           1807            2251               2103            29
##  5           1939              29               2151            59
##  6           1952            2358               2207            22
##  7           2016              NA               2220            46
##  8            905            1313               1045            43
##  9           1125            1445               1146           120
## 10           1848            2333               2151             8
## # ℹ 1,165 more rows
## # ℹ 1 more variable: atraso_llegada <dbl>

3.4 Ejercicio 4

Mira la cantidad de vuelos cancelados por día. ¿Hay un patrón? ¿La proporción de vuelos cancelados está relacionada con el retraso promedio?

hay una relación entre cantidad de vuelos cancelados por dia y la cantidad total de vuelos en un día.

cancelados_por_dia <- vuelos %>%
  mutate(cancelado = (is.na(atraso_llegada) |
                        is.na(atraso_salida))) %>%
  group_by(anio) %>%
  summarize(cancelados_num = sum(cancelado),
            vuelos_num = n())
cancelados_por_dia
## # A tibble: 1 × 3
##    anio cancelados_num vuelos_num
##   <int>          <int>      <int>
## 1  2013           9430     336776

graficando vuelos_num contra cancelado_num muestra que el número de vuelos cancelados aumenta con el número total de vuelos.

ggplot(cancelados_por_dia) +
  geom_point(aes(x = vuelos_num, y = cancelados_num))

hay también una relación entre la proporción de vuelos cancelados y el retraso promedio

cancelado_y_atraso <-
  vuelos %>%
  mutate(cancelado = (is.na(atraso_llegada) |
                        is.na(atraso_salida))) %>%
  group_by(anio) %>%
  summarise(
    cancelado_prom = mean(cancelado),
    prom_salida_atraso = mean(atraso_salida, na.rm = TRUE),
    prom_llegada_atraso = mean(atraso_llegada, na.rm = TRUE)
  ) %>%
  ungroup()
cancelado_y_atraso
## # A tibble: 1 × 4
##    anio cancelado_prom prom_salida_atraso prom_llegada_atraso
##   <int>          <dbl>              <dbl>               <dbl>
## 1  2013         0.0280               12.6                6.90

3.5 Ejercicio 5

¿Qué compañía tiene los peores retrasos? Desafío: ¿puedes desenredar el efecto de malos aeropuertos vs. el efecto de malas aerolíneas? ¿Por qué o por qué no? (Sugerencia: piensa en vuelos %>% group_by(aerolinea, destino) %>% summarise(n()))

vuelos %>% group_by(aerolinea, destino) %>%
  summarise(n()) 
## # A tibble: 314 × 3
## # Groups:   aerolinea [16]
##    aerolinea destino `n()`
##    <chr>     <chr>   <int>
##  1 9E        ATL        59
##  2 9E        AUS         2
##  3 9E        AVL        10
##  4 9E        BGR         1
##  5 9E        BNA       474
##  6 9E        BOS       914
##  7 9E        BTV         2
##  8 9E        BUF       833
##  9 9E        BWI       856
## 10 9E        CAE         3
## # ℹ 304 more rows
vuelos %>%
  group_by(aerolinea) %>%
  summarise(atraso_llegada = mean(atraso_llegada, na.rm = TRUE)) %>%
  arrange(desc(atraso_llegada))
## # A tibble: 16 × 2
##    aerolinea atraso_llegada
##    <chr>              <dbl>
##  1 F9                21.9  
##  2 FL                20.1  
##  3 EV                15.8  
##  4 YV                15.6  
##  5 OO                11.9  
##  6 MQ                10.8  
##  7 WN                 9.65 
##  8 B6                 9.46 
##  9 9E                 7.38 
## 10 UA                 3.56 
## 11 US                 2.13 
## 12 VX                 1.76 
## 13 DL                 1.64 
## 14 AA                 0.364
## 15 HA                -6.92 
## 16 AS                -9.93

Encontramos a la aerolinea que tiene el código F9 es que tiene mayor retraso. para hallar el nombre de la aerolínea utilizamos el siguiente código:

filter(aerolineas, aerolinea == "F9")
## # A tibble: 1 × 2
##   aerolinea nombre                
##   <chr>     <chr>                 
## 1 F9        Frontier Airlines Inc.

La aerolínea que tiene mayores retrasos es la aerolínea Frontier Airlines Inc. Se puede obtener parte de la solución para desentrañar los efectos de los aeropuertos frente a las malas aerolíneas comparando el retraso promedio de cada aerolínea con el retraso promedio de los vuelos dentro de una ruta vuelos desde el mismo origen al mismo destino). La comparación de retrasos entre aerolineas y dentro de cada ruta desentraña el efecto de las aerolineas y los aeropuertos.

vuelos %>%
  filter(!is.na(atraso_llegada)) %>%
  # retraso total por aerolinea dentro de cada destino, origen
  group_by(origen, destino, aerolinea) %>%
  summarise(atraso_llegada = sum(atraso_llegada),
            vuelos = n())
## # A tibble: 437 × 5
## # Groups:   origen, destino [223]
##    origen destino aerolinea atraso_llegada vuelos
##    <chr>  <chr>   <chr>              <dbl>  <int>
##  1 EWR    ALB     EV                  6018    418
##  2 EWR    ANC     UA                   -20      8
##  3 EWR    ATL     9E                   -25      4
##  4 EWR    ATL     DL                 31149   3116
##  5 EWR    ATL     EV                 32330   1654
##  6 EWR    ATL     UA                  1071    102
##  7 EWR    AUS     UA                  2840    664
##  8 EWR    AUS     WN                 -3294    293
##  9 EWR    AVL     EV                  2210    251
## 10 EWR    BDL     EV                  2746    405
## # ℹ 427 more rows

3.6 Ejercicio 6

¿Qué hace el argumento sort a count() . ¿Cuándo podrías usarlo?

El argumento sort() lo que hace es ordenar de mayor a menor los datos. Se puede utilizar cuando se requiera ordenar de mayor a menor una variable determinada.

vuelos %>%
  count(horario_salida,sort = TRUE)
## # A tibble: 1,319 × 2
##    horario_salida     n
##             <int> <int>
##  1             NA  8255
##  2            555   834
##  3            755   820
##  4            556   818
##  5            557   799
##  6            655   798
##  7           1455   774
##  8           1454   769
##  9            654   751
## 10            855   743
## # ℹ 1,309 more rows