Introducción

El paquete nycflights13, disponible en CRAN, contiene datos sobre 336.776 vuelos que despegaron de alguno de los tres aeropuertos que dan servicio a la ciudad de Nueva York (EE.UU.) en 2013, procedentes del Bureau of Transport Statistics:

El conjunto principal de datos sobre los vuelos está disponible en el data.frame flights, dentro de este paquete. Adicionalmente, su autor (Hadley Wickham) también ha incluido datos sobre los propios aeropuertos, condiciones meteorológicas, etc. Para más detalles, ver archivo de descripción del paquete con el comando ?nycflights13.

Preparación del ejercicio

Durante el ejercicio, se utilizarán las bibliotecas ggplot2 y dplyr, ya introducidas en clase.

Nota importante 1: Se recomienda revisar y practicar con los ejemplos del documento de introducción a dplyr antes de realizar este ejercicio, así como los ejemplos incluidos en el seminario de H. Wickham sobre “Tidy Data”, enlazado en la sección referencias del Tema 2 en Aula Virtual.

Nota importante 2: intente utilizar el operador %>% (forward pipe) para el código de resolución de todos los ejercicios.

# Importamos bibliotecas y datos
library(ggplot2)
library(dplyr)
library(nycflights13)
# Para la resolución de los ejercicios, vamos a importar el paquete magrittr y así poder utilizar el operador %>%
library(magrittr)

library(stringr)

En este chunk declararé funciones que he considerado necesarias para mejorar la legibilidad del código y evitar repetir código.

add_full_carrier_name <- function(df) {
  return(
    df %>%
      left_join(airlines)
  )
}

Ejercicio 1 (30 puntos)

Utiliza las funciones incluidas en el paquete dplyr, para responder a las siguientes preguntas:

  1. ¿Cuantos vuelos se realizan en total cada mes?
flights %>% 
  select(month, flight) %>% 
  mutate(month = factor(month.abb[month], levels = month.abb, ordered = 'TRUE')) %>%
  group_by(month) %>% 
  summarise(number_of_flights = n())
## # A tibble: 12 × 2
##    month number_of_flights
##    <ord>             <int>
## 1    Jan             27004
## 2    Feb             24951
## 3    Mar             28834
## 4    Apr             28330
## 5    May             28796
## 6    Jun             28243
## 7    Jul             29425
## 8    Aug             29327
## 9    Sep             27574
## 10   Oct             28889
## 11   Nov             27268
## 12   Dec             28135
  1. ¿Qué aeropuerto acumula el mayor número de salidas de vuelos en todo el año?

El aeropuerto con mayor número de salidas de vuelos en todo el año es el correspondiente a las siglas EWR (Newark Liberty International Airport), con 120.835 vuelos.

add_full_airport_name <- function(df) {
  airports_df <- airports %>%
                  select(faa, name)
  
  return(
    df %>%
      left_join(airports_df, by = c("origin"="faa")) 
  )
}

flights %>%
  select(origin, flight) %>% 
  group_by(origin) %>%
  summarise(number_of_flights = n()) %>%
  arrange(desc(number_of_flights)) %>%
  head(1) %>%
  add_full_airport_name() %>%
  select(origin, full_name = name, number_of_flights) # Realizo este select para mostrar las columnas ordenadas y que el nombre completo aparezca al lado de la abreviatura
## # A tibble: 1 × 3
##   origin           full_name number_of_flights
##    <chr>               <chr>             <int>
## 1    EWR Newark Liberty Intl            120835
  1. ¿Qué compañía acumula el mayor número de salida de vuelos en los meses de verano (jun-sep.)?

La compañía con mayor número de salidas de vuelos en los meses de verano es UA (United Airlines), con 19.859 vuelos.

flights %>%
  select(carrier, month, flight) %>%
  group_by(carrier) %>%
  filter(month >= 6 & month <= 9) %>%
  summarise(number_of_flights = n()) %>%
  arrange(desc(number_of_flights)) %>%
  head(1) %>%
  add_full_carrier_name() %>%
  select(carrier, full_carrier_name = name, number_of_flights) # Realizo este select para mostrar las columnas ordenadas y que el nombre completo aparezca al lado de la abreviatura
## Joining, by = "carrier"
## # A tibble: 1 × 3
##   carrier     full_carrier_name number_of_flights
##     <chr>                 <chr>             <int>
## 1      UA United Air Lines Inc.             19859
  1. ¿Qué compañia acumula más tiempo de vuelo en todo el año?

La compañía con más minutos de vuelo a lo largo del año es UA, con 8.975.080 minutos (149.584 horas y 40 minutos)

# He considerado que el tiempo de vuelo real es el tiempo de llegada menos el tiempo de salida

to_posixct <- function(time, year, month, day) {
  groups <- str_match_all(time, '(\\d{0,2})(\\d{2})')
  
  hour <- groups[[1]][2]
  
  if(is.na(hour) | hour == '') {
    hour = '00'
  }
  
  minutes <- groups[[1]][3]
  
  right_time_format <- paste(hour, minutes, sep=':')
  
  date <- paste(year, month, day, sep = '-')
  
  as_posixct <- as.POSIXct(paste(right_time_format, date), format = '%H:%M %Y-%m-%d')
  
  return(as_posixct)
}

times_diff <- function(time_after, time_before) {
  if(!is.na(time_after) & !is.na(time_before)) {
    epoch1 <- as.numeric(time_after)
    epoch2 <- as.numeric(time_before)
    
    if (epoch2 > epoch1) {
      # Ejemplo: las 02:00 menos las 23:00 -> hay que hacer esto para tener en cuenta que las 02:00 son del día siguiente
      epoch1 <- epoch1 + 24 * 3600
    }
    
    return(epoch1 - epoch2)    
  } else {
    return(NA)
  }
}

#Como uso el campo actual_flight_time en otros apartados, lo dejo aquí para modificar la tabla y así no tener que realizar esos cálculos de nuevo
flights <- flights %>%
             rowwise() %>%
             mutate(actual_flight_time = times_diff(to_posixct(arr_time, year, month, day), to_posixct(dep_time, year, month, day)) / 60) %>%
             inner_join(flights, .)
## Joining, by = c("year", "month", "day", "dep_time", "sched_dep_time", "dep_delay", "arr_time", "sched_arr_time", "arr_delay", "carrier", "flight", "tailnum", "origin", "dest", "air_time", "distance", "hour", "minute", "time_hour")
flights %>%
  select(carrier, actual_flight_time) %>%
  filter(!is.na(actual_flight_time)) %>%
  group_by(carrier) %>%
  mutate(total_time = sum(actual_flight_time)) %>%
  select(carrier, total_time) %>%
  arrange(desc(total_time)) %>%
  head(1) %>%
  add_full_carrier_name() %>%
  select(carrier, full_carrier_name = name, total_time) # Realizo este select para mostrar las columnas ordenadas y que el nombre completo aparezca al lado de la abreviatura
## Joining, by = "carrier"
## Source: local data frame [1 x 3]
## Groups: carrier [1]
## 
##   carrier     full_carrier_name total_time
##     <chr>                 <chr>      <dbl>
## 1      UA United Air Lines Inc.    8975080
  1. ¿Qué compañía registra los mayores retrasos de salida de sus vuelos? ¿Tienen los retrasos alguna correlación con la duración de los vuelos?

La compañía aérea con mayores retrasos de salida es aquella con las siglas EV (ExpressJet Airlines Inc.), acumulando un total de 1.024.829 minutos de retraso

flights %>%
  select(carrier, dep_delay) %>%
  group_by(carrier) %>%
  summarise(total_dep_delay = sum(dep_delay, na.rm = TRUE)) %>%
  arrange(desc(total_dep_delay)) %>%
  head(1) %>%
  add_full_carrier_name() %>%
  select(carrier, full_carrier_name = name, total_dep_delay) # Realizo este select para mostrar las columnas ordenadas y que el nombre completo aparezca al lado de la abreviatura
## Joining, by = "carrier"
## # A tibble: 1 × 3
##   carrier        full_carrier_name total_dep_delay
##     <chr>                    <chr>           <dbl>
## 1      EV ExpressJet Airlines Inc.         1024829

Los coeficientes de correlación son cercanos a 0, por lo que podríamos pensar que entre ambas variables la relación es inexistente. A pesar de esto, vamos a estudiar una posible relación entre estas dos variables ya que, dependiendo del área del conocimiento en el que estemos trabajando, los valores de los coeficientes de relación pueden ser significativos o no aunque estos sean muy próximos a cero.

# El coeficiente de correlación entre las variables es de r = -0.003853311
cor(flights$dep_delay, flights$actual_flight_time, use="complete") # Se utiliza use="complete" para no tener encuenta observaciones con valores faltantes
## [1] -0.003853311
# Por otro lado, vemos que el coeficiente de Spearman es de r = 0.07894596
cor(flights$dep_delay, flights$actual_flight_time, use="complete", method = "spearman")
## [1] 0.07894596

A medida que los vuelos son más largos, se producen menos retrasos y más cortos. Sin embargo, en los vuelos más cortos es donde se producen los retrasos más duraderos.

Hay que tener en cuenta que se tienen menos observaciones de viajes largos que de cortos. En el histograma siguiente se aprecia que hay picos de datos en vuelos de 170 minutos, 70 y 110. Cuando los vuelos son de 70 y 110 (o cercanos a estos valores), hay mayor retraso que en los vuelos de 170 (o cercanos a este valor), y es que hay más valores de 170 minutos (o cercanos a este valor) que de 70 y 110.

Por lo tanto, podemos decir que para estos valores no hay problema en que haya menos observaciones. Lamentablemente, no podemos decir lo mismo de valores mayores de 170 minutos (o cercanos a este valor) en los que la función de distribución de probabilidad muestra que hay una disminución pronunciada en las observaciones.

Los diagramas siguientes al histograma me han servido de apoyo para llegar a la conclusión sobre la relación entre la duración de los vuelos y los retrasos.

# Histogram actual_flight_time
flights %>%
  select(actual_flight_time) %>%
  mutate(count = n()) %>%  
  ggplot(aes(x = actual_flight_time)) +
  geom_histogram(aes(y = ..density..), binwidth=10, colour="black", fill="white") +
  geom_density(alpha=.2, fill="#FF6666") +  
  xlim(0, 600) 

# Scatter plot
flights %>%
  select(actual_flight_time, dep_delay) %>%
  mutate(count = n()) %>%
  ggplot(aes(actual_flight_time, dep_delay)) +
  geom_point(aes(size = count), alpha = 1/2) +
  labs(x="Tiempo de vuelo (min)", y="Retraso (min)") +
  geom_smooth(method = 'gam') +
  scale_size_area() +
  ggtitle("Relación entre tiempo de vuelo y retrasos en los vuelos") +
  xlim(0, 600) + 
  scale_radius(name="Núm. vuelos")
## Scale for 'size' is already present. Adding another scale for 'size',
## which will replace the existing scale.

# Scatter plot con colour division
flights %>%
  select(actual_flight_time, dep_delay) %>%
  mutate(count = n(), ratio = dep_delay / actual_flight_time) %>%
  ggplot(aes(actual_flight_time, dep_delay)) +
  geom_point(aes(size = count, colour = ratio), alpha = 0.25) +
  labs(x="Tiempo de vuelo (min)", y="Retraso (min)") +
  geom_smooth(method = 'gam') +
  scale_size_area() +
  scale_radius(name="Núm. vuelos") +
  scale_colour_gradient2(high = "red", mid="green", space = "Lab") +
  xlim(0, 600) + 
  ggtitle("Relación entre tiempo de vuelo y retrasos en los vuelos. Colour = ratio") 
## Scale for 'size' is already present. Adding another scale for 'size',
## which will replace the existing scale.

# Line plot
flights %>%
  select(actual_flight_time, dep_delay) %>%
  mutate(ratio = dep_delay/actual_flight_time) %>%
  ggplot(aes(actual_flight_time, ratio, colour=ratio)) +
  geom_line() +
  labs(x="Tiempo de vuelo (min)", y="dep_delay/actual_flight_time (min)") +
  xlim(0, 600) +
  ggtitle("Relación entre tiempo de vuelo y ratio retraso/tiempo de vuelo") 

# Diagrama de azulejos
flights %>%
  select(actual_flight_time, dep_delay) %>%
  ggplot(aes(x = actual_flight_time, y = dep_delay, fill = dep_delay / actual_flight_time)) +
  geom_tile() + 
  scale_fill_gradient2(high = "red", mid = "blue") +
  labs(x="Tiempo de vuelo (min)", y="Retraso (min)") +
  xlim(0, 600) + 
  ggtitle("Relación entre tiempo de vuelo y retrasos en los vuelos. Colour = ratio") 

Ejercicio 2 (30 puntos)

La siguiente figura, tomada de la introducción a dplyr, muestra un gráfico en ggplot2 de la relación entre distancia de los vuelos y retraso experimentado para todos los aeropuertos de NYC.

by_tailnum <- group_by(flights, tailnum)
delay <- summarise(by_tailnum,
  count = n(),
  dist = mean(distance, na.rm = TRUE),
  delay = mean(arr_delay, na.rm = TRUE))
delay <- filter(delay, count > 20, dist < 2000)

# Interestingly, the average delay is only slightly related to the
# average distance flown by a plane.
ggplot(delay, aes(dist, delay)) +
  geom_point(aes(size = count), alpha = 1/2) +
  labs(x = "Distancia (millas)", y = "Retraso (mins.)") +
  geom_smooth(method = 'gam') +
  scale_size_area() +
  ggtitle("Relación entre distancia y retrasos en los vuelos") +
  scale_radius(name = "Núm. vuelos")
## Scale for 'size' is already present. Adding another scale for 'size',
## which will replace the existing scale.

A la vista del resultado, parece que exista una cierta correlación negativa, aunque no muy fuerte, entre ambas variables. Sin embargo, veamos que sucede si desglosamos los datos utilizando otras variables disponibles.

En este ejercicio, se propone representar el retraso de llegadas en función de la distancia recorrida, utilizando una gráfica como la anterior, pero desglosado por meses (es decir, una gráfica como la anterior para cada mes).

La solución óptima debería construir un panel de 12 gráficas, una para cada mes. Cada gráfica se debe etiquetar con el nombre abreviado de ese mes, no con el número de mes. Además, se debe presentar las gráficas en el orden correcto de los meses del calendario (primero el gráfico de enero, luego febrero, etc.), no por orden alfabético de los nombres del mes.

¿Qué conclusiones puedes extraer a la vista de estos gráficos? Intenta ofrecer argumentos basados en los resultados obtenidos para elaborar la respuesta.

dist_and_delay <- flights %>%
                    select(tailnum, distance, arr_delay, month) %>%
                    mutate(month = factor(month.abb[month], levels = month.abb, ordered = 'TRUE')) %>%
                    group_by(month, tailnum) %>%
                    summarise(count = n (), dist = mean(distance, na.rm = TRUE), delay = mean(arr_delay, na.rm = TRUE)) %>%
                    filter(count > 20, dist < 2000) 

dist_and_delay %>%
  ggplot(aes(dist, delay)) +
  facet_wrap(~ month) +
  geom_point(aes(size = count), alpha = 1/2) +
  labs(x = "Distancia (millas)", y = "Retraso (min)") +
  geom_smooth(method = 'gam') +
  scale_size_area() +
  ggtitle("Relación entre distancia y retrasos en los vuelos por mes") +
  scale_radius(name = "Núm. vuelos")
## Scale for 'size' is already present. Adding another scale for 'size',
## which will replace the existing scale.

flights %>%
  select(tailnum, distance, arr_delay, month) %>%
  mutate(month = factor(month.abb[month], levels = month.abb, ordered = 'TRUE')) %>%
  group_by(month) %>%
  summarise(count = n (), dist = mean(distance, na.rm = TRUE), delay = mean(arr_delay, na.rm = TRUE)) %>%
  filter(count > 20, dist < 2000) %>%
  arrange(desc(delay))
## # A tibble: 12 × 4
##    month count     dist      delay
##    <ord> <int>    <dbl>      <dbl>
## 1    Jul 29425 1058.596 16.7113067
## 2    Jun 28243 1057.125 16.4813296
## 3    Dec 28135 1064.656 14.8703553
## 4    Apr 28330 1038.733 11.1760630
## 5    Jan 27004 1006.844  6.1299720
## 6    Aug 29327 1062.138  6.0406524
## 7    Mar 28834 1011.987  5.8075765
## 8    Feb 24951 1000.982  5.6130194
## 9    May 28796 1040.913  3.5215088
## 10   Nov 27268 1050.305  0.4613474
## 11   Oct 28889 1038.876 -0.1670627
## 12   Sep 27574 1041.250 -4.0183636

Durante los meses de abril, junio, julio, y diciembre se producen los mayores retrasos de media. Es destacable que en los meses de julio y agosto los mayores retrasos surgen en los viajes con mayor distancia.

Esto último contrasta con el resto de meses, cuyo retraso suele ser mayor en los viajes con menor distancia.

En los meses de septiembre, octubre y noviembre es cuando se producen, de media, los retrasos más cortos.

Ejercicio 3 (20 puntos)

Representar el retrasos de salida de los vuelos que parten del aeropuerto JFK (código ‘JFK’), desglosado por meses (como en el ejercicio anterior). Se mostrarán solo los vuelos domésticos, imponiendo como condición de filtrado de datos: distancia recorrida < 1.000 millas.

¿Qué conclusiones puedes extraer a la vista de estos gráficos?

flights %>%
  select(origin, dep_delay, distance, month, tailnum) %>%
  filter(origin == 'JFK', distance < 1000) %>%
  mutate(month = factor(month.abb[month], levels = month.abb, ordered = 'TRUE')) %>%
  group_by(month, tailnum) %>%
  summarise(count = n (), dist = mean(distance, na.rm = TRUE), delay = mean(dep_delay, na.rm = TRUE)) %>%
  ggplot(aes(dist, delay)) +
  facet_wrap(~ month) +
  geom_point(aes(size = count), alpha = 1/2) +
  labs(x = "Distancia (millas)", y = "Retraso (min)") +
  geom_smooth(method = 'gam') +
  scale_size_area() +
  ggtitle("Relación entre distancia y retrasos en los vuelos por mes desde el aeropuerto JFK") +
  scale_radius(name = "Núm. vuelos") +
  scale_y_continuous(breaks = round(seq(min(-20), max(250), by = 10), 1), limits = c(-20, 250))
## Scale for 'size' is already present. Adding another scale for 'size',
## which will replace the existing scale.

  ylim(0, 250) # Limitamos el eje de ordenadas para poder apreciar mejor la mayoría de observaciones y determinar su tendencia
## <ScaleContinuousPosition>
##  Range:  
##  Limits:    0 --  250

En todos los meses menos en julio, agosto y septiembre los retrasos son menores a medida que los viajes tienen más distancia.

Además, se aprecian cuatro grupos de viajes:

Los cuatro grupos de viajes pueden tener una explicación común: viajes de negocio.

A Boston porque alberga una gran cantidad de empresas y centros de educación superior, de hecho Boston es la sexta ciudad con la economía más grande en los Estados Unidos. A Charlotte ya que esta ciudad es la segunda ciudad de los Estados Unidos tras Nueva York con mayor número de sedes de bancos. A Atlanta porque tiene la octava economía más fuerte de los E.E.U.U., ser la tercera ciudad que alberga mayor número de sedes de compañías que pertenecen al Fortune 500 y además el 75% de las empresas del Fortune 1000 están en esta ciudad. Por último Orlando, en la cual se asientan muchas empresas que se dedican a la alta tecnología y en la que el turismo supone una fuente de ingresos muy importante para esta ciudad porque en Orlando se localizan parques temáticos como el Disney Land Resort y los Universal Studios.

flights %>%
  select(origin, distance, month, tailnum) %>%
  filter(origin == 'JFK', distance < 1000) %>%
  mutate(month = factor(month.abb[month], levels = month.abb, ordered = 'TRUE')) %>%
  group_by(month, tailnum) %>%
  summarise(dist = mean(distance, na.rm = TRUE)) %>%
  filter(dist == 187 | dist == 541 | dist == 760 | dist == 944) %>%
  mutate(destinations = factor(dist, levels = c(187, 541, 760, 944), labels = c('BOS', 'CLT', 'ATL', 'ORL'))) %>%
  select(destinations, month) %>%
  group_by(destinations, month) %>%
  summarise(count = n()) %>%
  ggplot(aes(month, count)) +
  geom_line(aes(colour = destinations, group=destinations)) +
  labs(y = "Vuelos") + 
  ggtitle("Vuelos por destino en cada mes desde el aeropuerto JFK")

Es más, en el caso de Orlando es, de las cuatro ciudades nombradas, la que recibe más visitas en los meses de verano y es en esos meses cuando más vuelos tiene. Esto confirma que además de tener vuelos por negocios, muchos puden ser debidos a su interés turístico.

Ejercicio 4 (20 puntos)

Utilizando boxplots (geom_boxplot), representar gráficamente una comparativa de los retrasos de salida entre las distintas compañías aéreas, en el mes de diciembre, para el aeropuerto de Newark (código ‘EWR’). ¿Se observan diferencias notables?

Teniendo en cuenta la línea que separa las cajas en dos mitades (que representa la mediana o segundo cuartil, q2) se observa que los aeropuertos con más retrasos son los correspondientes a las siglas WN (8 minutos), UA (7 minutos), AS (4 minutos) y EV (3 minutos). En el caso contrario tenemos varias compañías cuya mediana de los retrasos es negativa: es decir, los vuelos parten antes de la hora programada.

Además, en todos ellos, se aprecia cómo la mayoría de las observaciones se encuentran en el q3, es decir, por encima de la mediana. Considero importante remarcar este detalle ya que al ser la mediana una medida de tendencia central y por lo tanto se tienen en cuenta hasta el 50% de los datos ordenados, que haya más observaciones en el q3 indica la tendencia de los vuelos para estas compañías a que tengan retrasos más duraderos.

flights %>%
  select(carrier, month, dep_delay, origin) %>%
  mutate(carrier = factor(carrier, levels = carrier)) %>%
  filter(origin == 'EWR', month == 12) %>%
  select(carrier, dep_delay) %>%
  group_by(carrier) %>%
  ggplot(aes(carrier, dep_delay)) +
  geom_boxplot(aes(fill = carrier)) +
  labs(y = "Retraso (min)") +
  ggtitle("Comparativa de los retrasos de salida por compañía para el mes de diciembre en el aeropuerto de Newawrk") +
  scale_y_continuous(breaks = round(seq(min(-20), max(500), by = 20), 1), limits = c(-20, 440)) # He limitado el número de valores a mostrar para poder estudiar mejor las diferencias entre compañías centrándome donde se encuentran la mayoría de las observaciones

flights %>%
  select(carrier, month, dep_delay, origin) %>%
  add_full_carrier_name() %>%
  mutate(carrier = factor(carrier, levels = carrier)) %>%
  filter(origin == 'EWR', month == 12) %>%
  select(carrier, full_carrier_name = name, dep_delay) %>%
  group_by(carrier, full_carrier_name) %>%
  summarise(delay = median(dep_delay, na.rm = TRUE)) %>%
  arrange(desc(delay)) 
## Joining, by = "carrier"
## Source: local data frame [11 x 3]
## Groups: carrier [11]
## 
##    carrier        full_carrier_name delay
##     <fctr>                    <chr> <dbl>
## 1       WN   Southwest Airlines Co.     8
## 2       UA    United Air Lines Inc.     7
## 3       AS     Alaska Airlines Inc.     4
## 4       EV ExpressJet Airlines Inc.     3
## 5       DL     Delta Air Lines Inc.     0
## 6       MQ                Envoy Air     0
## 7       VX           Virgin America     0
## 8       AA   American Airlines Inc.    -1
## 9       B6          JetBlue Airways    -1
## 10      9E        Endeavor Air Inc.    -2
## 11      US          US Airways Inc.    -3

Para intentar explicar mejor los motivos de los retrasos, he calculado los coeficientes de correlación entre el retraso de salida (dep_delay) y todas las variables de la tabla weather. El resultado es que las cuatro variables con más coeficiente de correlación con la variable dep_delay son visib (visibilidad), dewp (punto de rocío), temp (temperatura) y humid (humedad).

El motivo por el que he decidido intentar sacar alguna conclusión mediante la tala weather ha sido gracias a esta entrada del sitio Web de la Administración Federal de Aviación: https://www.faa.gov/nextgen/programs/weather/faq/

aux <- flights %>%
        select(origin, year, month, day, hour, dep_delay) %>%
        left_join(weather) %>%
        filter(origin == 'EWR', month == 12) 
## Joining, by = c("origin", "year", "month", "day", "hour")
cor(aux$dep_delay, aux$visib, use = "complete")
## [1] -0.1990595
cor(aux$dep_delay, aux$dewp, use = "complete")
## [1] 0.1933991
cor(aux$dep_delay, aux$temp, use = "complete")
## [1] 0.1638679
cor(aux$dep_delay, aux$humid, use = "complete")
## [1] 0.1480303
cor(aux$dep_delay, aux$precip, use = "complete")
## [1] 0.08892274
cor(aux$dep_delay, aux$pressure, use = "complete")
## [1] -0.08076794
cor(aux$dep_delay, aux$wind_dir, use = "complete")
## [1] -0.04726228
cor(aux$dep_delay, aux$wind_speed, use = "complete")
## [1] -0.009806783
cor(aux$dep_delay, aux$wind_gust, use = "complete")
## [1] -0.009806783

A continuación, he realizado 4 scatter plots para intentar apreciar mejor la relación entre los retrasos y los parámetros meteorológicos para cada compañía.

common_block <- flights %>%
                    select(origin, year, month, day, hour, carrier, month, dep_delay, actual_flight_time, tailnum) %>%
                    left_join(weather) %>%
                    filter(origin == 'EWR', month == 12) 
## Joining, by = c("origin", "year", "month", "day", "hour")
common_block %>%
  select(carrier, dep_delay, visib) %>%
  group_by(carrier) %>%
  ggplot(aes(visib, dep_delay)) +
  facet_wrap(~ carrier) +
  geom_point(alpha = 1/2) +
  geom_smooth(method = 'gam') +
  scale_y_continuous(breaks = round(seq(min(-50), max(500), by = 50), 1), limits = c(-50, 500)) 

common_block %>%
  select(carrier, dep_delay, dewp) %>%
  group_by(carrier) %>%
  ggplot(aes(dewp, dep_delay)) +
  facet_wrap(~ carrier) +
  geom_point(alpha = 1/2) +
  geom_smooth(method = 'gam') +
  scale_y_continuous(breaks = round(seq(min(-50), max(500), by = 50), 1), limits = c(-50, 500)) 

common_block %>%
  select(carrier, dep_delay, temp) %>%
  group_by(carrier) %>%
  ggplot(aes(temp, dep_delay)) +
  facet_wrap(~ carrier) +
  geom_point(alpha = 1/2) +
  geom_smooth(method = 'gam') +
  scale_y_continuous(breaks = round(seq(min(-50), max(500), by = 50), 1), limits = c(-50, 500)) 

common_block %>%
  select(carrier, dep_delay, humid) %>%
  group_by(carrier) %>%
  ggplot(aes(humid, dep_delay)) +
  facet_wrap(~ carrier) +
  geom_point(alpha = 1/2) +
  geom_smooth(method = 'gam') +
  scale_y_continuous(breaks = round(seq(min(-50), max(500), by = 50), 1), limits = c(-50, 500)) 

El resultado es que, mientras en unas compañías los vuelos a penas se ven afectados por estos elementos del tiempo, las compañías que presentan más retraso se ven muy afectadas por ellos.

Desafortunadamente, no tenemos datos suficientes como para determinar el motivo de porqué en algunas compañías estos parámetros producen más retrasos que en otras.

Notas finales y apreciaciones

Para la realización de esta práctica se ha utilizado el IDE RStudio, además de utilizar la herramienta de control de versiones Git, siempre intentando seguir las pautas git-flow. Esta práctica se encuentra en el siguiente repositorio de Github: https://github.com/jvicentem/dplyr-and-ggplot2-assignment

En algunos ejercicios he intentado dar una explicación a las tendencias que se apreciaban en las gráficas, en algunas ocasiones buscando información en la Red.

Esta práctica me ha servido para afianzar los conocimientos adquiridos sobre R a lo largo de las clases.