rm(list = ls())
cat("\014")
graphics.off()
library(pacman)
p_load(ggplot2, dplyr, datos, rsconnect, packrat)
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ú.
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
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.
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
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>
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
¿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
¿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