Capítulo7 Transformación: Valores Faltantes

## [1] "2024-11-07"

Fecha de la ultima revisión

library(tidyverse)
library(datos)

7.1 Valores faltantes

  • NA: Not Available

7.1.1 ¿Qué pasa con los valores faltantes y resultados de analisis sin sentido?

2^2
## [1] 4
1^2
## [1] 1
1^0
## [1] 1
NA^0
## [1] 1
#NA==1
NA|TRUE
## [1] TRUE
NA|FALSE
## [1] NA
FALSE & NA
## [1] FALSE
TRUE & NA
## [1] NA
FALSE * NA
## [1] NA
TRUE * NA
## [1] NA
NA * 0  
## [1] NA
NA * 1
## [1] NA
12 * 3
## [1] 36
NA - 3
## [1] NA

7.2 Contabilizar los NA

  • ¿Cuántos vuelos tienen datos faltantes en horario_salida?
  • ¿Qué otras variables tienen valores faltantes?
  • ¿Qué representan estas filas?
vuelos %>%
dplyr::select(horario_salida) %>%
is.na() %>% 
  table()
## .
##  FALSE   TRUE 
## 328521   8255

7.3 Seleccionar solamente los vuelos donde el “horario de salida” es desconocido

vuelos %>% 
  dplyr::select(anio, mes, dia, horario_salida, aerolinea) |> 
filter(is.na(horario_salida))
## # A tibble: 8,255 × 5
##     anio   mes   dia horario_salida aerolinea
##    <int> <int> <int>          <int> <chr>    
##  1  2013     1     1             NA EV       
##  2  2013     1     1             NA AA       
##  3  2013     1     1             NA AA       
##  4  2013     1     1             NA B6       
##  5  2013     1     2             NA EV       
##  6  2013     1     2             NA EV       
##  7  2013     1     2             NA EV       
##  8  2013     1     2             NA EV       
##  9  2013     1     2             NA EV       
## 10  2013     1     2             NA AA       
## # ℹ 8,245 more rows

7.4 Otras funciones: NA

  • na.rm=TRUE
  • !is.na() = is not NA, pq al frente tiene “!”
no_cancelados <- vuelos %>% 
  filter(!is.na(atraso_salida), !is.na(atraso_llegada))
no_cancelados
## # A tibble: 327,346 × 19
##     anio   mes   dia horario_salida salida_programada atraso_salida
##    <int> <int> <int>          <int>             <int>         <dbl>
##  1  2013     1     1            517               515             2
##  2  2013     1     1            533               529             4
##  3  2013     1     1            542               540             2
##  4  2013     1     1            544               545            -1
##  5  2013     1     1            554               600            -6
##  6  2013     1     1            554               558            -4
##  7  2013     1     1            555               600            -5
##  8  2013     1     1            557               600            -3
##  9  2013     1     1            557               600            -3
## 10  2013     1     1            558               600            -2
## # ℹ 327,336 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>
no_cancelados %>% 
  group_by(anio, mes, dia) %>% 
  summarise(mean = mean(atraso_salida))
## # A tibble: 365 × 4
## # Groups:   anio, mes [12]
##     anio   mes   dia  mean
##    <int> <int> <int> <dbl>
##  1  2013     1     1 11.4 
##  2  2013     1     2 13.7 
##  3  2013     1     3 10.9 
##  4  2013     1     4  8.97
##  5  2013     1     5  5.73
##  6  2013     1     6  7.15
##  7  2013     1     7  5.42
##  8  2013     1     8  2.56
##  9  2013     1     9  2.30
## 10  2013     1    10  2.84
## # ℹ 355 more rows
vuelos %>% 
  group_by(anio, mes, dia) %>% 
  summarise(mean = mean(atraso_salida, na.rm=TRUE))
## # A tibble: 365 × 4
## # Groups:   anio, mes [12]
##     anio   mes   dia  mean
##    <int> <int> <int> <dbl>
##  1  2013     1     1 11.5 
##  2  2013     1     2 13.9 
##  3  2013     1     3 11.0 
##  4  2013     1     4  8.95
##  5  2013     1     5  5.73
##  6  2013     1     6  7.15
##  7  2013     1     7  5.42
##  8  2013     1     8  2.55
##  9  2013     1     9  2.28
## 10  2013     1    10  2.84
## # ℹ 355 more rows
#,
#            max=max(atraso_salida,na.rm = TRUE),
#            n=n())

Reemplazar los NA por “0” en el archivo de datos

datos_NA=c(1:8, NA, 10:20)

datos_NA=as.data.frame(datos_NA)

datos_NA %>%  # Cual es el problema de replace_na(datos_NA, 0) para los analisis?
  mutate(Prom_cum=cummean(replace_na(datos_NA, 0))) %>% 
  mutate(Var_cum=cumstats::cumvar(replace_na(datos_NA, 0)))
##    datos_NA  Prom_cum   Var_cum
## 1         1  1.000000        NA
## 2         2  1.500000  0.500000
## 3         3  2.000000  1.000000
## 4         4  2.500000  1.666667
## 5         5  3.000000  2.500000
## 6         6  3.500000  3.500000
## 7         7  4.000000  4.666667
## 8         8  4.500000  6.000000
## 9        NA  4.000000  7.500000
## 10       10  4.600000 10.266667
## 11       11  5.181818 12.963636
## 12       12  5.750000 15.659091
## 13       13  6.307692 18.397436
## 14       14  6.857143 21.208791
## 15       15  7.400000 24.114286
## 16       16  7.937500 27.129167
## 17       17  8.470588 30.264706
## 18       18  9.000000 33.529412
## 19       19  9.526316 36.929825
## 20       20 10.050000 40.471053

Remover las filas que tienen NA con la función drop_na()

datos_NA %>% 
  drop_na() |> 
  mutate(Prom_cum=cummean(datos_NA)) %>% 
  mutate(Var_cum=cumstats::cumvar(datos_NA))
##    datos_NA  Prom_cum   Var_cum
## 1         1  1.000000        NA
## 2         2  1.500000  0.500000
## 3         3  2.000000  1.000000
## 4         4  2.500000  1.666667
## 5         5  3.000000  2.500000
## 6         6  3.500000  3.500000
## 7         7  4.000000  4.666667
## 8         8  4.500000  6.000000
## 9        10  5.111111  8.611111
## 10       11  5.700000 11.122222
## 11       12  6.272727 13.618182
## 12       13  6.833333 16.151515
## 13       14  7.384615 18.756410
## 14       15  7.928571 21.456044
## 15       16  8.466667 24.266667
## 16       17  9.000000 27.200000
## 17       18  9.529412 30.264706
## 18       19 10.055556 33.467320
## 19       20 10.578947 36.812865