Utiliza los datos de vuelos del aeropuerto de Houston(flights) para responder las siguientes preguntas.

Comenzaremos leyendo los datos.

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(readr)
library(normtest)
library(nortest)
flights <- read_csv("data/flights.csv")
## Parsed with column specification:
## cols(
##   date = col_datetime(format = ""),
##   hour = col_double(),
##   minute = col_double(),
##   dep = col_double(),
##   arr = col_double(),
##   dep_delay = col_double(),
##   arr_delay = col_double(),
##   carrier = col_character(),
##   flight = col_double(),
##   dest = col_character(),
##   plane = col_character(),
##   cancelled = col_double(),
##   time = col_double(),
##   dist = col_double()
## )
#Modificamos el tipo de dato del parametro fecha. 
flights <- mutate(flights,date=as.Date(date))
flights
## # A tibble: 227,496 x 14
##    date        hour minute   dep   arr dep_delay arr_delay carrier flight
##    <date>     <dbl>  <dbl> <dbl> <dbl>     <dbl>     <dbl> <chr>    <dbl>
##  1 2011-01-01    14      0  1400  1500         0       -10 AA         428
##  2 2011-01-02    14      1  1401  1501         1        -9 AA         428
##  3 2011-01-03    13     52  1352  1502        -8        -8 AA         428
##  4 2011-01-04    14      3  1403  1513         3         3 AA         428
##  5 2011-01-05    14      5  1405  1507         5        -3 AA         428
##  6 2011-01-06    13     59  1359  1503        -1        -7 AA         428
##  7 2011-01-07    13     59  1359  1509        -1        -1 AA         428
##  8 2011-01-08    13     55  1355  1454        -5       -16 AA         428
##  9 2011-01-09    14     43  1443  1554        43        44 AA         428
## 10 2011-01-10    14     43  1443  1553        43        43 AA         428
## # ... with 227,486 more rows, and 5 more variables: dest <chr>,
## #   plane <chr>, cancelled <dbl>, time <dbl>, dist <dbl>
¿A que hora del dia debo volar(cualquier destino) para evitar, lo más posible, retrasos de salida?
#Comenzamos filtrando los datos en dep_delay que sean NA. 
flights_no_miss <- filter(flights,!is.na(dep_delay))
#Agrupamos por fecha y destino. 
flight_por_grupos <- group_by(flights_no_miss,date,dest)
#Encontramos el minimo
flight_por_horas <- filter(flight_por_grupos,dep_delay==min(dep_delay))
flight_por_horas
## # A tibble: 43,462 x 14
## # Groups:   date, dest [38,232]
##    date        hour minute   dep   arr dep_delay arr_delay carrier flight
##    <date>     <dbl>  <dbl> <dbl> <dbl>     <dbl>     <dbl> <chr>    <dbl>
##  1 2011-01-03    13     52  1352  1502        -8        -8 AA         428
##  2 2011-01-26    13     53  1353  1455        -7       -15 AA         428
##  3 2011-01-09     7     14   714   829        -6        -6 AA         460
##  4 2011-01-10     7     15   715   818        -5       -17 AA         460
##  5 2011-01-23     7     10   710   814       -10       -21 AA         460
##  6 2011-01-05    19     58  1958  2106        -7       -14 AA         533
##  7 2011-01-06    19     55  1955  2103       -10       -17 AA         533
##  8 2011-01-16    19     56  1956  2119        -9        -1 AA         533
##  9 2011-01-18    19     57  1957  2106        -8       -14 AA         533
## 10 2011-01-22    16     23  1623  1742        -7        -3 AA        1121
## # ... with 43,452 more rows, and 5 more variables: dest <chr>,
## #   plane <chr>, cancelled <dbl>, time <dbl>, dist <dbl>

Asi pues obtenemos un data.frame donde se muestra la hora del dia a la que debo volar para evitar lo mas posible restrasos de salida, con la consideracion de que los valores negativos representan que la salida del vuelo fue adelantada, y esto no representa un problema de retraso en la salida.

Encuentra los destinos que se vuelan por al menos dos compañias(carriers).

Comenzaremos definiendo la siguiente funcion:

valores_unicos <- function(x){
  aux <- unique(x)
  n <- length(aux)
  return(n)
}

La cual nos permitira encontrar aquellos destinos que tengan mas de dos vuelos asociados.

flight_destino_compania <- group_by(flights,dest)
vuelos_companias <- summarise(flight_destino_compania,n=valores_unicos(carrier))
numero_de_vuelos_compania <- filter(vuelos_companias,n>2)
numero_de_vuelos_compania
## # A tibble: 35 x 2
##    dest      n
##    <chr> <int>
##  1 ABQ       4
##  2 ATL       6
##  3 AUS       4
##  4 BHM       3
##  5 CLT       5
##  6 CMH       3
##  7 CVG       4
##  8 DAL       3
##  9 DEN       6
## 10 DFW       5
## # ... with 25 more rows

Asi pues obtenemos un data.frame donde se muestra el destino y el numero de compañias que tienen un vuelo a dicho destino.

Con respecto a la pregunta 1, ¿Cual es la probabilidad de que se retrase mas de 2 minutos en el arribo un vuelo?, sabiendo que salio puntual.

Usando el data.frame del primer ejercicio, tenemos:

n <- length(flight_por_horas$arr_delay)
proporcion <- filter(flight_por_horas,arr_delay >2)
m <- length(proporcion)
p <- m/n
p
## [1] 0.0003221205

Asi pues la probabilidad de que el vuelo se retrase mas de 2 minutos en el arribo, sabiendo que el vuelo salio puntual, sera: 0.0003221205

Para cada destino calcula el promedio de minutos de retraso de salida y determina un intervalo de confianza al 95%. Para cada vuelo calculo su proporcion del total de retrasos de su destino y realiza un intervalo de confianza.
Nota! Considerar primero la comprobacion de los supuestos de homogeneidad(normalidad) e independencia.

Comenzaremos definiendo algunas funciones que nos ayudaran en el calculo de lo que necesitamos:

#Funcion que realiza una prueba de normalidad
# Y retorna un p.valor
Prueba_Normalidad <- function(x){
  prueba <- lillie.test(x)
  return(prueba$p.value)
}
#Funcion que realiza una prueba de independencia
# Y retorna un p.valor
Prueba_Independencia <- function(x){
  prueba <- Box.test(x)
  return(prueba$p.value)
}

Tambien necesitaremos funciones para calcular los limites en el intervalo de confianza.

LimiteInferior <- function(x,alpha){
  m <- mean(x)
  sigma <- sd(x)
  n <- length(x)
  alpha <- alpha/2
  t0 <- qt(alpha,n-1)
  LI <- m-(t0*(sigma/sqrt(n)))
  return(LI)
}
LimiteSuperior <- function(x,alpha){
  m <- mean(x)
  sigma <- sd(x)
  n <- length(x)
  alpha <- alpha/2
  t0 <- qt(alpha,n-1)
  LS <- m+(t0*(sigma/sqrt(n)))
  return(LS)
}

Comenzaremos encontrando los promedios, y realizando las pruebas de homogeneidad e independencia por destino:

flights_destinos <- group_by(flights_no_miss,dest)
promedios <- summarise(flights_destinos,mean(dep_delay))
Independencia <- summarise(filter(flights_destinos,length(dep_delay)>4),Prueba_Independencia(dep_delay))
Normalidad <- summarise(filter(flights_destinos,length(dep_delay)>4),Prueba_Normalidad(dep_delay))

Asi pues obtenemos un data.frame donde se nos muestran los p.valores correspondientes a las pruebas de Independencia y Normalidad para el tiempo de retraso de despegue por destino.

Independencia$Prueba_Normalidad <- Normalidad$`Prueba_Normalidad(dep_delay)`
Independencia
## # A tibble: 114 x 3
##    dest  `Prueba_Independencia(dep_delay)` Prueba_Normalidad
##    <chr>                             <dbl>             <dbl>
##  1 ABQ                          0.319              0.       
##  2 AEX                          0.502              8.62e-188
##  3 AMA                          0.0534             5.73e-306
##  4 ANC                          0.861              8.48e- 21
##  5 ASE                          0.558              7.73e- 24
##  6 ATL                          0                  0.       
##  7 AUS                          0.00000220         0.       
##  8 AVL                          0.930              1.26e- 82
##  9 BFL                          0.257              1.34e-125
## 10 BHM                          0.318              0.       
## # ... with 104 more rows

Para calcular los intervalos de confianza puesto que desconocemos la desviacion estandar poblacional, usaremos la distribución T, y entonces tenemos:

LI <- summarise(flights_destinos,LimiteInferior(dep_delay,0.05))
## Warning in qt(alpha, n - 1): NaNs produced
LS <- summarise(flights_destinos,LimiteSuperior(dep_delay,0.05))
## Warning in qt(alpha, n - 1): NaNs produced
Intervalos_de_Confianza_por_Destinos <- tibble(Destinos=promedios$dest,Limite_Inferior=LS$`LimiteSuperior(dep_delay, 0.05)`,Media=promedios$`mean(dep_delay)`, Limite_Superior=LI$`LimiteInferior(dep_delay, 0.05)`)
Intervalos_de_Confianza_por_Destinos
## # A tibble: 116 x 4
##    Destinos Limite_Inferior Media Limite_Superior
##    <chr>              <dbl> <dbl>           <dbl>
##  1 ABQ                 7.57  8.48            9.39
##  2 AEX                 4.41  6.38            8.35
##  3 AGS               NaN    10             NaN   
##  4 AMA                 5.16  6.70            8.25
##  5 ANC                17.0  25.0            33.0 
##  6 ASE                 8.26 16.0            23.7 
##  7 ATL                 9.45 10.3            11.1 
##  8 AUS                 7.78  8.42            9.06
##  9 AVL                 5.30  8.90           12.5 
## 10 BFL                 3.05  5.06            7.07
## # ... with 106 more rows

Hay que tener en cuenta lo siguiente.

  • La prueba de normalidad lillie.test, necesita muestras de tamaño mayor a 4, lo cual es un problema para algunos destinos que no tienen ese numero de vuelos No cancelados.
  • Al momento de encontrar los quantiles dentro de las funciones para encontrar los limites del intervalo de confinza, existira un problema para aquellos destinos que tengan un numero de vuelos menor o igual a 1. Lo cual nos origina valores NaN.
  • Dado que muchos pvalores correspondientes a la prueba de normalidad, nos indican que debemos rechazar la hipotesis, para poder encontrar los intervalos de confianza, necesitaremos filtrar los datos, para aquellos que posean un tamaño de muestra de n>30.
Para cada vuelo calcula su proporcion del total de retrasos de su destino y realiza un intervalo de confianza.

Comenzaremos definiendo una funcion que nos permita calcular la proporcion del total de retrasos.

Proporcion_Retrasos <- function(x){
  n <- length(x)
  m <- 0
  for (i in 1:n) {
    if(x[i] > 0){
      m <- m+1
    }
  }
  return((m*100)/n)
  
}
flights_vuelos_destinos <- group_by(filter(flights,!is.na(arr_delay)),flight,dest)
Proporcion_por_total_retrasos <- summarise(flights_vuelos_destinos,Proporcion_Retrasos(arr_delay))
Proporcion_por_total_retrasos
## # A tibble: 8,925 x 3
## # Groups:   flight [3,737]
##    flight dest  `Proporcion_Retrasos(arr_delay)`
##     <dbl> <chr>                            <dbl>
##  1      1 CRP                               26.9
##  2      1 DEN                               25.7
##  3      1 EWR                                0  
##  4      1 HNL                               45.6
##  5      1 HRL                               48  
##  6      1 JAN                               26.8
##  7      1 MCO                               66.7
##  8      1 TPA                               44.4
##  9      2 DAL                               21.8
## 10      3 ABQ                                0  
## # ... with 8,915 more rows

Obtenemos un data.frame que nos muestra por vuelo-destino, el porcentaje de retrasos en el arrivo de sus vuelos.

Para encontrar los intervalos de confianza, haremos uso de las siguientes funciones:

LimiteInferiorProporcion <- function(x,alpha){
  m <- mean(x)
  p <- Proporcion_Retrasos(x)/100
  n <- length(x)
  alpha <- alpha/2
  z0 <- qnorm(alpha)
  LI <- m-(z0*(sqrt(p*(1-p))/sqrt(n)))
  return(LI)
}
LimiteSuperiorProporcion <- function(x,alpha){
  m <- mean(x)
  p <- Proporcion_Retrasos(x)/100
  n <- length(x)
  alpha <- alpha/2
  z0 <- qnorm(alpha)
  LS <- m+(z0*(sqrt(p*(1-p))/sqrt(n)))
  return(LS)
}

Luego, filtraremos los datos en arr_delay que tengan una asignacion de NA. Asi usando las funciones declaradas anteriormente, tenemos: + Hay que notar que como hicimos en el literal anterior deberemos comprobar homogeneidad e Independencia para arr_delay por vuelo-destinos.

Independencia <- summarise(filter(flights_vuelos_destinos,length(arr_delay)>4),Prueba_Independencia(arr_delay))
Normalidad <- summarise(filter(flights_vuelos_destinos,length(arr_delay)>4),Prueba_Normalidad(arr_delay))
Independencia$Prueba_Normalidad <- Normalidad$`Prueba_Normalidad(arr_delay)`
Independencia
## # A tibble: 5,696 x 4
## # Groups:   flight [3,104]
##    flight dest  `Prueba_Independencia(arr_delay)` Prueba_Normalidad
##     <dbl> <chr>                             <dbl>             <dbl>
##  1      1 CRP                             0.910            4.71e-12
##  2      1 DEN                             0.590            3.08e- 4
##  3      1 HNL                             0.00237          2.33e-93
##  4      1 HRL                             0.498            2.70e- 2
##  5      1 JAN                             0.945            2.83e- 7
##  6      1 TPA                             0.391            3.62e- 2
##  7      2 DAL                             0.0215           3.87e-26
##  8      3 ECP                             0.863            1.64e- 3
##  9      3 HRL                             0.937            6.20e-49
## 10      3 JAN                             0.613            1.07e- 7
## # ... with 5,686 more rows

Luego:

LI <- summarise(flights_vuelos_destinos,LimiteInferiorProporcion(arr_delay,0.05))
LS <- summarise(flights_vuelos_destinos,LimiteSuperiorProporcion(arr_delay,0.05))
promedios <- summarise(flights_vuelos_destinos,mean(arr_delay))


Intervalos_de_confianza_por_vuelos <- tibble(flight=promedios$flight,destino=promedios$dest,p=Proporcion_por_total_retrasos$`Proporcion_Retrasos(arr_delay)`,media=promedios$`mean(arr_delay)`,Limite_Superior=LI$`LimiteInferiorProporcion(arr_delay, 0.05)`,Limite_Inferior=LS$`LimiteSuperiorProporcion(arr_delay, 0.05)`)
Intervalos_de_confianza_por_vuelos
## # A tibble: 8,925 x 6
##    flight destino     p   media Limite_Superior Limite_Inferior
##     <dbl> <chr>   <dbl>   <dbl>           <dbl>           <dbl>
##  1      1 CRP      26.9  -0.731          -0.648          -0.815
##  2      1 DEN      25.7  -0.686          -0.541          -0.831
##  3      1 EWR       0   -12             -12             -12    
##  4      1 HNL      45.6  11.1            11.1            11.0  
##  5      1 HRL      48     2.4             2.60            2.20 
##  6      1 JAN      26.8  -0.339          -0.223          -0.455
##  7      1 MCO      66.7   4.33            4.87            3.80 
##  8      1 TPA      44.4   9.11            9.44            8.79 
##  9      2 DAL      21.8  -1.64           -1.59           -1.69 
## 10      3 ABQ       0   -11             -11             -11    
## # ... with 8,915 more rows

Debemos tener en cuenta lo siguiente:

  • Existen vuelos-Destinos, que solo poseen un vuelo, esto debido a que filtramos aquellos vuelos que no poseen un valor NA en arr_delay.

  • Dado que muchos valores del pvalor correspondiente a la prueba de normalidad, deberemos considerar aquellas muestras con un tamaño n>30.