1. Introducción

En este taller usted aprenderá un abordaje para la limpieza y organización de datos epidemiológicos mediante el uso de RStudio. Este taller se realizará a tráves del uso de una guía de aprendizaje.

2. Objetivos

3. Conceptos básicos a desarrollar

En esta práctica se desarrollarán los siguientes conceptos:

4. ¿En qué consiste el proceso de limpieza de datos?

—> Por favor lea y reflexione sobre este tema (10 minutos)

La limpieza de datos es un proceso dinámico que debe ajustarse a las exigencias de la base de datos, si bien al ser un proceso que no tiene siempre un mismo camino no se puede establecer un flujo de actividades único, es posible agrupar estas actividades en tres grupos de procesos esenciales.

  1. Exploración y caracterización

  2. Limpieza y corrección

  3. Organización

Dentro de exploración y caracterización se pueden encontrar algunas actividades como:

Dentro de limpieza y corrección se pueden encontrar actividades como:

Finalmente, dentro de organización se pueden encontrar actividades como:

Paquetes útiles para la limpieza de datos

La limpieza de datos depende de ciertas preferencias y del análisis o procesamiento que se vaya a efectuar sobre las mismas.

Sin embargo, aquí se presentan algunas librerías que pueden ser de gran utilidad para este taller.

  • tidyverse: es una librería que viene ligada a otras como readr, tidyr, dplyr, ggplot2, entre otras esenciales para el manejo, limpieza y organización de datos

  • epitrix: es una librería que contiene funciones como clean_names, la cual permite limpiar nombres para que cumplan con estádnares de buenas practicas.

5. Documentación básica de los datos

Antes de empezar a trabajar con datos es necesario conocer los datos para no caer en errores analíticos que puedan llevar a perder la validez científica de la investigación por el uso de herramientas incorrectas. Para la caracterización se puede empezar por conocer información de la base de datos como el formato en el que está, licencia de distribución (sus derechos de uso), el peso de la base de datos, número de variables recolectadas, número de datos, descripción de las variables, definición y tipo de las mismas, fecha de actualización, frecuencia de actualización, que variables contiene y cómo fueron recolectadas, metodología de su recolección, entre otros elementos necesarios para comprender cómo se obtuvo y cómo puede ser usada. Por ejemplo, información sobre la base de datos de COVID a nivel nacional puede encontrarse en: https://www.datos.gov.co/Salud-y-Protecci-n-Social/Casos-positivos-de-COVID-19-en-Colombia/gt2j-8ykr o http://url.ins.gov.co/dataset-covid-info.

Por favor, diligencie la siguiente tabla con la información contenida en el enlace.

Tabla 1. Información de caracterización de una base de datos
Categoría Información
Formato
Licencia de distribución
Peso
Número de variables (escriba algunos ejemplos)
Número de datos recolectados
Hay descripción de las variables
Tipo de las variables que contiene
Fecha de creación
Última fecha de actualización
Frecuencia de actualización
¿A qué se refiere N/A en cada variable?

Antes de proseguir con la caracterización de los datos conviene recordar un poco sobre la clasificación de la variables.

Gráfica 1: Clasificación de variables

Para efectos de este ejercicio solo contemplaremos las 3 primeras clasificaciones: naturaleza, continuidad y escala. Clasificar las variables antes de procesarlas resulta necesario para operarlas correctamente. Por ejemplo, la variable “nombre del grupo étnico” contiene números en sus valores, sin embargo, se establece qué un número representa una etnia (1-Indígena 2-ROM 3-Raizal 4-Palenquero 5-Negro 6-Otro), por tanto, analizarlo como una variable numérica resultaría en un error. En este caso es una variable cualitativa, discreta, nominal. Por favor, complete la siguiente tabla clasificando cada variable.

Nombre de la variable Clasificación de la variable. Según naturaleza, continuidad y escala. Tipo de dato Almacenamiento Valores que puede tomar la variable
Fecha de reporte en web
ID de caso
Fecha de notificación
Código DIVIPOLA departamento
Nombre departamento
Código DIVIPOLA municipio
Nombre municipio
Edad
Unidad de medida de edad
Sexo
Tipo de contagio
Ubicación del caso
Estado
Código ISO del país
Nombre del país
Recuperado
Fecha de inicio de síntomas
Fecha de muerte
Fecha de diagnóstico
Fecha de recuperación
Tipo de recuperación
Pertenencia étnica
Nombre del grupo étnico

Ahora que se ha completado el abordaje inicial es necesario cargar la base de datos para una exploración más profunda. En la parte A se aprendió a cargar una base desde Internet. Por favor, cargue esta base de datos https://github.com/TRACE-LAC/TRACE-LAC-data/blob/main/datos_covid.RDS.

Es hora de explorar la base de datos. Para este ejercicio se ha obtenido una muestra aleatoria de la base de datos, por favor con lo aprendido en la parte A del taller revise la cantidad de datos que contiene la muestra, limpie los nombres de las variables y verifique que tipo de datos están almacenados en cada variable.

Para explorar los datos se puede realizar una aproximación general o específica a cada variable. Por ejemplo, usando la función summary.

summary(covid)
##  fecha_reporte_web                  id_de_caso     
##  Min.   :1970-01-01 00:00:55.00   Min.   :     21  
##  1st Qu.:2020-12-25 00:00:00.00   1st Qu.:1564671  
##  Median :2021-05-18 00:00:00.00   Median :3134341  
##  Mean   :2021-05-08 06:24:56.91   Mean   :3133223  
##  3rd Qu.:2021-07-23 00:00:00.00   3rd Qu.:4699940  
##  Max.   :2022-07-28 00:00:00.00   Max.   :6265834  
##                                                    
##  fecha_de_notificacion            codigo_divipola_departamento
##  Min.   :2020-03-11 00:00:00.00   Min.   :    5               
##  1st Qu.:2020-12-17 00:00:00.00   1st Qu.:   11               
##  Median :2021-05-10 00:00:00.00   Median :   17               
##  Mean   :2021-04-30 00:35:03.84   Mean   : 1337               
##  3rd Qu.:2021-07-14 00:00:00.00   3rd Qu.:   68               
##  Max.   :2022-07-26 00:00:00.00   Max.   :47001               
##                                                               
##  nombre_departamento codigo_divipola_municipio nombre_municipio  
##  Length:502010       Min.   : 5001             Length:502010     
##  Class :character    1st Qu.:11001             Class :character  
##  Mode  :character    Median :11001             Mode  :character  
##                      Mean   :28472                               
##                      3rd Qu.:50606                               
##                      Max.   :99773                               
##                                                                  
##       edad        unidad_de_medida_de_edad     sexo          
##  Min.   :  1.00   Min.   :1.000            Length:502010     
##  1st Qu.: 27.00   1st Qu.:1.000            Class :character  
##  Median : 38.00   Median :1.000            Mode  :character  
##  Mean   : 39.89   Mean   :1.005                              
##  3rd Qu.: 52.00   3rd Qu.:1.000                              
##  Max.   :113.00   Max.   :3.000                              
##                                                              
##  tipo_de_contagio   ubicacion_del_caso    estado          codigo_iso_del_pais
##  Length:502010      Length:502010      Length:502010      Mode:logical       
##  Class :character   Class :character   Class :character   NA's:502010        
##  Mode  :character   Mode  :character   Mode  :character                      
##                                                                              
##                                                                              
##                                                                              
##                                                                              
##  nombre_del_pais  recuperado        fecha_de_inicio_de_sintomas
##  Mode:logical    Length:502010      Min.   :2020-02-29         
##  NA's:502010     Class :character   1st Qu.:2020-12-13         
##                  Mode  :character   Median :2021-05-05         
##                                     Mean   :2021-04-27         
##                                     3rd Qu.:2021-07-16         
##                                     Max.   :2022-07-25         
##                                     NA's   :40014              
##  fecha_de_muerte    fecha_de_diagnostico             fecha_de_recuperacion
##  Length:502010      Min.   :2020-03-14 00:00:00.00   Min.   :2000-01-01   
##  Class :character   1st Qu.:2020-12-21 00:00:00.00   1st Qu.:2021-01-06   
##  Mode  :character   Median :2021-05-13 00:00:00.00   Median :2021-05-27   
##                     Mean   :2021-05-04 07:26:20.71   Mean   :2021-05-01   
##                     3rd Qu.:2021-07-18 00:00:00.00   3rd Qu.:2021-07-31   
##                     Max.   :2022-07-26 00:00:00.00   Max.   :2022-07-28   
##                     NA's   :258                      NA's   :14905        
##  tipo_de_recuperacion pertenencia_etnica nombre_del_grupo_etnico
##  Length:502010        Min.   :1.000      Length:502010          
##  Class :character     1st Qu.:6.000      Class :character       
##  Mode  :character     Median :6.000      Mode  :character       
##                       Mean   :5.911                             
##                       3rd Qu.:6.000                             
##                       Max.   :6.000                             
##                       NA's   :1403                              
##  fecha_de_nacimiento
##  Min.   :1909       
##  1st Qu.:1970       
##  Median :1984       
##  Mean   : Inf       
##  3rd Qu.:1995       
##  Max.   : Inf       
##  NA's   :8992

Esta función permitirá dar un vistazo general a la información, brindando más detalle para las variables numéricas y fechas, como es el caso de fecha_reporte_Web o edad. Mientras que no brinda mucha información en variables de tipo carácter, lógicas o donde el número tiene un significado de identificación como es el caso de id_de_caso o sexo. Para obtener información de estas variables es necesario convertirlas en variables tipo factor. En el taller anterior se mencionó sobre estas variables y se mencionó que son útiles para categorías. Pueden haber variables tanto ordinales (con orden) como nominales. Además, convertir una variable en factor resulta especialmente útil para gráficos y regresiones. Convierta las variables nombre_departamento, nombre_municipio, tipo_de_contagio, tipo_de_recuperacion, ubicacion_del_caso, estado, recuperado, pertenencia_etnica, nombre_del_grupo_etnico en tipo factor y luego ejecute nuevamente summary.

En caso de que la información suministrada no sea la esperada es necesario hacer una evaluación individual de los datos.

Para variables cuantitativas se puede realizar una exploración de información descriptiva como:

Tabla 3. Exploración de variables cuantitativas
Información Función Resultado
Obtener valor mínimo min(covid$edad) 1
Obtener valor máximo max(covid$edad) 113
Obtener el valor máximo y mínimo range(covid$edad) 1, 113
Obtener el promedio mean(covid$edad) 39.8893707
Obtener la varianza var(covid$edad) 335.9251706
Obtener la desviación estándar sd(covid$edad) 18.3282615
Obtener un valor en un cuantil. En este caso el valor medio o mediana quantile(covid$edad, .5) 38
Obtener el rango intercuartílico IQR(covid$edad) 25
Obtener al tiempo valor mínimo, primer cuartil, mediana, media, tercer cuartil, valor máximo y número de NA summary(covid$edad) 1, 27, 38, 39.8893707, 52, 113

Al realizar la exploración anterior no se tuvo en cuenta la documentación y por tanto, la exploración podría tener errores. ¿Sabe qué error se cometió? ¿Cómo lo solucionaría?

Para variables cualitativas, que no se quiera transformar a tipo factor, se puede usar la función table, al no ser una función del paquete tidyverse para poder acceder a una variable interna es necesario emplear el símbolo $ después del nombre de la base y el nombre de la variable después del símbolo $.

table(covid$sexo)
## 
##      F      m      M 
## 267913      2 234095

Se obtuvo información de los datos al interior de la variable explorada, tanto los nombres como las veces que esos nombres se repiten. Esta función se puede usar para cualquier tipo de variable. Sin embargo, es preferible su uso en variables cualitativas, cuando se emplea para variables con un gran número de datos usar table puede resultar en una gran demanda de recursos del sistema y en la obtención de datos sin valor analítico.

La función table tiene una variación que permite observar los datos en proporciones:

prop.table(table(covid$sexo))
## 
##            F            m            M 
## 5.336806e-01 3.983984e-06 4.663154e-01

Aunque también se pueden redondear y observar como porcentajes

proporciones <- prop.table(table(covid$sexo))
proporciones
## 
##            F            m            M 
## 5.336806e-01 3.983984e-06 4.663154e-01
redondeado <- round(proporciones, 3)
redondeado
## 
##     F     m     M 
## 0.534 0.000 0.466
redondeado*100
## 
##    F    m    M 
## 53.4  0.0 46.6

Otra forma de adquirir información de las variables cualitativas es a través de la función unique de la librería tidyverse. La cual permitirá acceder a los valores de la variable sin que se repitan. Es similar al resultado obtenido de la función table pero brinda exclusivamente el contenido.

unique(covid$sexo)
## [1] "M" "F" "m"

6. Exploración gráfica

Además de los métodos anteriores para explorar datos, es posible realizarlo mediante gráficos. Para este objetivo se pueden emplear histogramas, cajas de bigotes, entre otros.

Como se mencionó antes los histogramas resultan de utilidad para explorar fechas. Dado que los datos son de Covid, resulta coherente tener fechas de reporte que estén ubicadas entre 2020 y 2022. Un error usual es encontrar fechas por fuera de ese rango. Como en el siguiente caso:

hist(covid$fecha_reporte_web,breaks = "weeks")

Como se puede ver en el gráfico hay algunos datos inconsistentes que causan que la gráfica se afecte.

covid %>% arrange(fecha_reporte_web) %>% head
## # A tibble: 6 × 24
##   fecha_reporte_web   id_de_caso fecha_de_notificacion codigo_…¹ nombr…² codig…³
##   <dttm>                   <dbl> <dttm>                    <dbl> <chr>     <dbl>
## 1 1970-01-01 00:00:55    1631715 2020-12-21 00:00:00       47001 STA MA…   47001
## 2 2020-03-14 00:00:00         21 2020-03-11 00:00:00           5 ANTIOQ…    5001
## 3 2020-03-14 00:00:00         43 2020-03-14 00:00:00          41 HUILA     41001
## 4 2020-03-15 00:00:00         40 2020-03-14 00:00:00          11 BOGOTA    11001
## 5 2020-03-15 00:00:00         30 2020-03-13 00:00:00          54 NORTE …   54001
## 6 2020-03-16 00:00:00         56 2020-03-14 00:00:00          11 BOGOTA    11001
## # … with 18 more variables: nombre_municipio <chr>, edad <dbl>,
## #   unidad_de_medida_de_edad <dbl>, sexo <chr>, tipo_de_contagio <chr>,
## #   ubicacion_del_caso <chr>, estado <chr>, codigo_iso_del_pais <lgl>,
## #   nombre_del_pais <lgl>, recuperado <chr>,
## #   fecha_de_inicio_de_sintomas <date>, fecha_de_muerte <chr>,
## #   fecha_de_diagnostico <dttm>, fecha_de_recuperacion <date>,
## #   tipo_de_recuperacion <chr>, pertenencia_etnica <dbl>, …

En este caso es un valor pero podrían existir varios cientos de estos. Para corregir este tipo de errores se puede eliminar las filas que contienen estos datos o reasignar a estos valores con datos tipo NA para no perder la demás información.

#Primero es necesario buscar los valores para luego reemplazarlos
## Busque los valores
covid %>% filter(fecha_reporte_web < as.Date("2020-03-01"))
## # A tibble: 1 × 24
##   fecha_reporte_web   id_de_caso fecha_de_notificacion codigo_…¹ nombr…² codig…³
##   <dttm>                   <dbl> <dttm>                    <dbl> <chr>     <dbl>
## 1 1970-01-01 00:00:55    1631715 2020-12-21 00:00:00       47001 STA MA…   47001
## # … with 18 more variables: nombre_municipio <chr>, edad <dbl>,
## #   unidad_de_medida_de_edad <dbl>, sexo <chr>, tipo_de_contagio <chr>,
## #   ubicacion_del_caso <chr>, estado <chr>, codigo_iso_del_pais <lgl>,
## #   nombre_del_pais <lgl>, recuperado <chr>,
## #   fecha_de_inicio_de_sintomas <date>, fecha_de_muerte <chr>,
## #   fecha_de_diagnostico <dttm>, fecha_de_recuperacion <date>,
## #   tipo_de_recuperacion <chr>, pertenencia_etnica <dbl>, …
#Reemplácelos

covid$fecha_reporte_web <- replace(covid$fecha_reporte_web, covid$fecha_reporte_web < as.Date("2020-03-01"), NA)

Ahora vuelva a producir la gráfica y observela.

#Observe cómo cambio la gráfica
hist(covid$fecha_reporte_web,breaks = "weeks")

Otra forma de visualizar las variables con fechas es modificando cómo se la mide. Por ejemplo, puede pasar la fecha a días.

covid$fecha_reporte_web_dias <- as.numeric((as.Date(covid$fecha_reporte_web) - min(as.Date(covid$fecha_reporte_web), na.rm = TRUE))) 

hist(covid$fecha_reporte_web_dias)

Sin embargo, es necesario considerar su utilidad. Por ejemplo, podría observar el retraso entre el tiempo de inicio de síntomas y el de reporte.

covid$retraso <- as.numeric((as.Date(covid$fecha_de_notificacion) - as.Date(covid$fecha_de_inicio_de_sintomas)))

hist(covid$retraso)

¿Qué observa en la gráfica? ¿Cómo lo interpretaría?

Acerque un poco la gráfica

hist(covid$retraso[covid$retraso < 25])

hist(covid$retraso[covid$retraso > 25 & covid$retraso < 50])

hist(covid$retraso[covid$retraso > 50])

Tras acercar la gráfica. ¿Cambiaron sus conclusiones?

Los histogramas también son útiles para explorar otros tipos de datos numéricos.

hist(covid$edad)

Mientras que otros tipos de gráficos como cajas de bigotes no resultan útiles para la exploración de fechas.

boxplot(covid$fecha_reporte_web)

Pero pueden resultar de gran utilidad para explorar otras variables numéricas. Dado que brinda visualización de datos como mediana, rango intercuartílico y permite visualizar datos atípicos.

covid %>% filter(unidad_de_medida_de_edad == 1) %>% select(edad) %>% boxplot()

Para explorar frecuencias en variables categóricas resultan de utilidad los gráficos de barras.

barplot(table(covid$sexo))

barplot(table((covid$nombre_departamento)),las=2, cex.names = 0.5)

7. Correcciones dentro de la base de datos

Cómo pudo verse en el último ejemplo la variable sexo presenta 3 valores, “F”, “M” y “m”. Dado que la base en su documentación refiere que los valores recolectados fueron: “F-Femenino M-Masculino”. Para corregir ese error y otros que puedan aparecer se puede hacer uso de la función replace. Ejecute el código a continuación:

## Corrija el problema

covid$sexo <- replace(covid$sexo, covid$sexo == "m", "M")
#Para empezar escriba la variable que modificará y aignele la función replace
#Replace tiene tres argumento. El primero vector o variable donde se hará el cambio. 
#Segundo las posiciones donde está el termino a reemplazar puede hacer con el comparador "==". 
#Finalmente ponga el termino que reemplazará esas posiciones.

#Revise si se solucionó
unique(covid$sexo)
## [1] "M" "F"

Este problema también se esta presentando en la variable nombre_departamento y estado. Por favor, corrijalo.

Esta función puede emplearse también en corrección de fechas.

7. Eliminación de variables innecesarias

Cuando se realizó la exploración con summary entre los datos se encontró que las variables nombre_del_pais y codigo_iso_del_pais son del tipo lógico. Explorelas para observar su contenido

unique(covid$codigo_iso_del_pais)
## [1] NA
str(covid$codigo_iso_del_pais)
##  logi [1:502010] NA NA NA NA NA NA ...
glimpse(covid$codigo_iso_del_pais)
##  logi [1:502010] NA NA NA NA NA NA ...

Como se puede observar son variables que no tienen nada en su interior. Además, al ser datos únicamente de Colombia no nos resultarían útiles aún si tuvieran contenido. Una vez identificadas las variables que no tienen relevancia en el análisis a realizar se procede a eliminarlas. Esta eliminación no afecta la base de datos almacenada en el computador o la nube, unicamente a la de la sesión de R. Para eliminar estas variables ejecute el código a continuación:

#La base covid tiene 23 variables
ncol(covid)
## [1] 26
#Para eliminarlas se le pedirá a R a través de las función select, que seleccione todas las columnas excepto las que van dentro del vector, para este objetivo se añadirá el símbolo "-" delante del vector. 
covid <- covid %>% select (-c("codigo_iso_del_pais", "nombre_del_pais"))
#Es necesario comprobar el cambio.
ncol(covid)
## [1] 24

Por favor, explore las variables codigo_divipola_departamento y codigo_divipola_municipio. En caso que considere que no son necesarias para este proceso eliminelas.

8. Corrección de formato en las variables

Como se mencionó antes algunas variables podrían tener un formato errado. Cuando examinó la variable fecha de muerte ¿en qué formato estaba? ¿qué formato debería tener? ¿Afectará la exploración y procesamiento de los datos?

hist(covid$fecha_de_muerte,breaks = "weeks")
#Error in hist.default(covid$fecha_de_muerte, breaks = "weeks") : 'x' must be numeric

¿En qué afecto?

En esos casos el error puede corregirse al modificar el formato de la variable. Para esto es necesario llamar la variable con el error y asignarle la misma variable pero con el formato correcto.

covid$fecha_de_muerte <- as.Date(covid$fecha_de_muerte)
hist(covid$fecha_de_muerte,breaks = "weeks")

9. Manejo de NAN, NA e Inf.

Al examinar la variable anterior se puede notar que existen varios datos “NA”. Por favor, medite cúal sería la razón detrás de esto. ¿Es un error?

Para verificar la existencia de datos tipo NA y su ubicación puede usar la función `is.na`. Para evitar una lista muy larga y sin sentido se pueden almacenar en un objeto o usar la función table para obtener un resumen.

table(is.na(covid$fecha_nacimiento))
## Warning: Unknown or uninitialised column: `fecha_nacimiento`.
## < table of extent 0 >

En algunos casos este tipo de datos pueden afectar la obtención del resultado

mean(c(3,2,NA))
## [1] NA

Para omitir este tipo de datos en algunas funciones se puede agregar `na.rm` de forma que se omitan y no afecten el resultado.

mean(c(3,2,NA), na.rm = TRUE)
## [1] 2.5

Sin embargo, no es el único tipo de datos que puede alterar el resultado. También se puede encontrar NAN e Inf. En el ejemplo de abajo se omite los valores NA pero aún así sigue arrojando un resultado no deseado.

mean(covid$fecha_nacimiento)
## Warning: Unknown or uninitialised column: `fecha_nacimiento`.
## Warning in mean.default(covid$fecha_nacimiento): argument is not numeric or
## logical: returning NA
## [1] NA
mean(covid$fecha_nacimiento, na.rm = TRUE)
## Warning: Unknown or uninitialised column: `fecha_nacimiento`.
## Warning in mean.default(covid$fecha_nacimiento, na.rm = TRUE): argument is not
## numeric or logical: returning NA
## [1] NA

Para identificar estos valores y su posición se puede emplear la función `is.infinite`

table(is.infinite(covid$fecha_nacimiento))
## Warning: Unknown or uninitialised column: `fecha_nacimiento`.
## < table of extent 0 >

Antes de eliminar estos valores o impostarlos es importante saber su origen para evitar perder información valiosa. Normalmente son el origen de operaciones como dividir entre 0.

Otro tipo de valores que pueden representarse como error son los valores NAN, estos se refieren a que no son numéricos. Puede suceder cuando en un vector numérico se ingresan caracteres no numéricos como el número en palabras o el número acompañado de símbolos.

Para identificar estos valores se emplea la función is.nan

table(is.nan(covid$fecha_nacimiento))
## Warning: Unknown or uninitialised column: `fecha_nacimiento`.
## < table of extent 0 >

10. Identificación y eliminación de datos incosistentes

Como se menciono anteriormente es importante identificar los datos con errores para corregirlos o en última instancia corregirlos. Un error frecuente en datos con fechas es cuando una fecha que debe ir antes como por ejemplo la fecha de infección esta antes de otra fecha como la de recuperación que debería ir después. Para realizar esta revisión lo primero será asegurarse que las fechas estén en el formato correcto.

covid$fecha_de_inicio_de_sintomas <- as.Date(covid$fecha_de_inicio_de_sintomas, format = "%Y-%m-%d")

#verifique el cambio
str(covid$fecha_de_inicio_de_sintomas)
##  Date[1:502010], format: "2021-09-06" "2020-07-28" "2020-08-20" "2021-03-17" "2021-06-19" ...
covid$fecha_de_recuperacion <- as.Date(covid$fecha_de_recuperacion, format = "%Y-%m-%d")

#verifique el cambio
str(covid$fecha_de_recuperacion)
##  Date[1:502010], format: "2021-09-23" "2020-08-23" "2020-09-10" "2021-03-31" "2021-07-05" ...

Ahora es necesario verificar si existe errores en estas. Para ello ejecute el siguiente código:

errores <- which((covid$fecha_de_recuperacion < covid$fecha_de_inicio_de_sintomas))

Ahora tiene un vector con las posiciones de los errores ¿Cómo eliminaría estas filas con errores?

¿Qué otras variables corregiría? ¿Qué otros errores cree que podrían existir?

11. Identificación y eliminación de duplicados

Cuando se trabaja con datos pueden presentarse casos donde se registra más de una vez al mismo sujeto, los mismos datos para dos sujetos o dos sujetos bajo un mismo código. Cada uno de estos casos requiere una revisión minuciosa para tomar la decisión si eliminar el dato o impostarlo.

En el caso cuando hay filas con infomación de sujetos duplicadas se puede hacer uso de la función distinc de dplyr, la cual permite saber cuantas de las filas son distintas.

nrow(covid)
## [1] 502010
nrow(distinct(covid))
## [1] 501151

Ahora para mantener solo las filas distintas se debe almacenar estas en el objeto que contiene la base.

covid <- distinct(covid)
nrow(covid)
## [1] 501151

Sin embargo, esta función no afectará aquellas que no sean idénticas. Piense ¿Qué pasaría si hay reinfecciones? ¿Cómo las identificaría?

¿Qué observa en está tabla?

conteo_reinfecciones <- covid %>% group_by(id_de_caso) %>% summarise(N = n())

table(conteo_reinfecciones$N)
## 
##      1      2 
## 498849   1151

12. Organización de la base de datos

Parte de la organización es dar nombres apropiados a las variables de forma que permitan un adecuado análisis y evitar confusión. Como se vio anteriormente, esto se puede lograr mediante la función rename de dplyr.

covid <- covid %>% rename(fecha_recuperacion = fecha_de_recuperacion)

¿A qué otras columnas les cambiaría el nombre?

13. Guardar conjuntos de datos procesados

Cuando se haya terminado de procesar los datos es importante guardar la base de datos en el disco del computador, dado que todos los cambios realizados hasta el momento se han realizado únicamente en la sesión de R y una vez cerrada se perderían. Para esto se puede emplear la función saveRDS.

dir.create("datos/limpios") # cree un directorio de datos limpio si no existe

saveRDS(covid, "datos/limpios/datos_limpios_covid.RDS")#guarde los datos

En su carpeta de datos verá que ahora existe un archivo llamado datos_limpios_covid.RDS. El archivo puede almacenarlo en formato xls o xlsx para excel o en multiples formatos. Sin embargo, se recomienda RDS por su bajo peso y capacidad de almacenamiento.

14. Otras formas de explorar los datos

Una vez la base está limpia es importante explorar la base de datos en cuanto a normalidad de los datos, cómo se comportan frente a otras, entre otros.

La normalidad puede ser evaluada gráficamente o con una prueba estadística como Shapiro-Wilk.

hist(covid$edad)

¿Considera que la edad tiene una distribución normal? Haga una prueba.

#Para esta prueba necesitamos el paquete nortest
#install.packages("nortest")
library(nortest)
ad.test(covid$edad)
## 
##  Anderson-Darling normality test
## 
## data:  covid$edad
## A = 2279.2, p-value < 2.2e-16

El test de normalidad de Anderson-Darling toma como hipótesis nula que los valores son normales. Si el valor de p es significativo la hipótesis nula será rechazada.

¿Qué observa en la gráfica? ¿Qué podría evaluar?

boxplot(covid$edad ~ covid$sexo + covid$estado)

Sobre este documento

Contribuciones

  • José M. Velasco-España: versión inicial
  • Guido Camargo-España & Zulma M. Cucunubá: ediciones a la versión inicial

Asuntos legales

Licencia: CC-BY Copyright: José M. Velasco-España, Guido Camargo-España & Zulma M. Cucunubá, 2022