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.
Reconocer herramientas que facilitan la limpieza de datos
Listar buenas prácticas de la limpieza de datos
Reconocer el proceso de limpieza y organización de bases de datos
En esta práctica se desarrollarán los siguientes conceptos:
Caracterización de una base de datos
Clasificación de variables
Normalidad
Medidas de tendencia central
Medidas de dispersión
Tablas de contingencia
—> 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.
Exploración y caracterización
Limpieza y corrección
Organización
Dentro de exploración y caracterización se pueden encontrar algunas actividades como:
Revisión de la documentación
Revisión de la estructura de los datos
Revisión del formato de los datos
Revisión de la coherencia del contenido de las variables. Esta actividad se puede realizar mediante la creación de gráficas; por ejemplo, con fechas se pueden crear curvas históricas
Revisión del contenido de las variables para la verificación de valores sin sentido. Esto incluye casos tales como: fechas o variables numéricas que erroneamente contienen caracteres, así como variables con información inconsistente (ej. niño, niao, nino, ni$no)
Dentro de limpieza y corrección se pueden encontrar actividades como:
Eliminación de variables que no tengan utilidad en responder la pregunta de investigación
Corrección de formato de las variables (ej. de numérica a caracter o viceversa)
Corrección de datos que no correspondan a la definición de la variable
Corrección de datos con nombres o caracteres erróneos
Eliminación de datos que no se puedan corregir
Finalmente, dentro de organización se pueden encontrar actividades como:
Organización de las variables (ej. dar nombres significativos)
Almacenamiento de la base de datos limpia
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.
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.
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:
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"
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)
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.
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.
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")
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 >
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?
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
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?
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.
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)
Licencia: CC-BY Copyright: José M. Velasco-España, Guido Camargo-España & Zulma M. Cucunubá, 2022