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>
#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.
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.
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
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.
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.