Ejemplo de análisis exploratorio de datos

Parte 1: Fundamentos de análisis exploratorio en R

Autores

Rodrigo Zepeda-Tello

Última actualización

October 12, 2022

Resumen
Mostramos un ejemplo de análisis de datos con R

Antes de cualquier análisis, enlistaremos las librerías que vamos a usar:

library(tidyverse)   #Análisis exploratorio de datos y gráficas
library(officer)     #Paquete para que R trabaje con Microsoft Office (Word / Power Point)
library(readxl)      #Para leer archivos de Excel
library(flextable)   #Armar tablas en formato word  
library(sf)          #Para usar mapas
library(httr)        #Descargar archivos web
library(lubridate)   #Para calcular fechas

1 Datos

Para este análisis usaremos los datos de dengue de la dirección general de epidemiología. Primero utilizaremos los datos del año 2021 disponibles aquí. Y armaremos nuestro análisis. Después cambiaremos los datos por los del 2022 disponibles acá y realizaremos el mismo reporte.

El propósito del reporte es lo siguiente:

  1. Graficar la incidencia semanal de casos por semana epidemiológica en SINALOA-
  2. Determinar la distribución de casos por grupo de edad (<20, 20-60, 60>) y sexo en SINALOA y realizar dicha tabla en Word.
  3. Generar un mapa de calor para mostrar la incidencia per capita anual por municipio de SINALOA.

Comenzamos leyendo los casos:

#Nota que podemos bajar el archivo directo de la página web
pagina_web <- "https://datosabiertos.salud.gob.mx/gobmx/salud/datos_abiertos/etv/historicos/2021/datos_abiertos_dengue_301221.zip"

#Descagamos los datos
GET(pagina_web, write_disk("dengue.zip", overwrite=TRUE))
Response [https://datosabiertos.salud.gob.mx/gobmx/salud/datos_abiertos/etv/historicos/2021/datos_abiertos_dengue_301221.zip]
  Date: 2022-10-12 22:04
  Status: 200
  Content-Type: application/x-zip-compressed
  Size: 553 kB
<ON DISK>  /home/rodrigo/CursoR/dengue.zip
#Los leemos
dengue <- read_csv("dengue.zip", show_col_types = FALSE)

Por otro lado descargamos el diccionario de datos:

#Bajamos el diccionario
pagina_diccionario <- "https://datosabiertos.salud.gob.mx/gobmx/salud/datos_abiertos/etv/diccionario_datos_dengue.zip"

#Descagamos los datos
GET(pagina_diccionario, write_disk("diccionario_datos_dengue.zip", overwrite=TRUE))
Response [https://datosabiertos.salud.gob.mx/gobmx/salud/datos_abiertos/etv/diccionario_datos_dengue.zip]
  Date: 2022-10-12 22:04
  Status: 200
  Content-Type: application/x-zip-compressed
  Size: 100 kB
<ON DISK>  /home/rodrigo/CursoR/diccionario_datos_dengue.zip
#Descomprimimos el archivo
zip::unzip("diccionario_datos_dengue.zip", exdir = getwd())

#Le cambio de nombre porque sale con problemas
file.rename("Cat\xa0logos_Dengue.xlsx","Catalogos_Dengue.xlsx")
[1] TRUE
#Leemos el catálogo de datos en hoja entidad y en hoja municipio
entidades  <- read_excel("Catalogos_Dengue.xlsx", sheet = "CATÁLOGO ENTIDAD")
municipios <- read_excel("Catalogos_Dengue.xlsx", sheet = "CATÁLOGO MUNICIPIO")

Pegamos a los datos el nombre de la entidad de residencia y de municipio de residencia a partir del diccionario

#Pegamos las bases y luego
#Cambiamos los nombres a algo más informativo que entidad y abreviatura
dengue <- dengue %>%
  left_join(entidades, by = c("ENTIDAD_RES" = "CLAVE_ENTIDAD")) %>%
  rename(ENTIDAD_RESIDENCIA = ENTIDAD_FEDERATIVA) %>%
  rename(ABREVIATURA_RESIDENCIA = ABREVIATURA)

Repetimos el proceso para municipio

dengue <- dengue %>%
  left_join(municipios, 
            by = c("ENTIDAD_RES" = "CLAVE_ENTIDAD", "MUNICIPIO_RES" = "CLAVE_MUNICIPIO")) %>%
  rename(MUNICIPIO_RESIDENCIA = MUNICIPIO)

2 Incidencia semanal

Calculo la incidencia semanal de casos para ello primero obtengo las semanas:

dengue <- dengue %>%
  mutate(Semana_epi = epiweek(FECHA_SIGN_SINTOMAS)) %>%
  mutate(Año_epi = epiyear(FECHA_SIGN_SINTOMAS))

Y luego agrupo a quedarme sólo con Sinaloa y cuento:

incidencia_semanal <- dengue %>%
  filter(ENTIDAD_RESIDENCIA == "SINALOA") %>%
  group_by(Semana_epi, Año_epi) %>%
  tally()

finalmente grafico:

ggplot(incidencia_semanal) +
  geom_col(aes(x = Semana_epi, y = n), fill = "#F37911") +
  theme_classic() +
  labs(
    x = "Semana epidemiológica",
    title = "Incidencia semanal de dengue en Sinaloa",
    y = "Casos nuevos"
  ) +
  scale_y_continuous(labels = scales::comma)

3 Tabla en Word

Para hacer la tabla primero creamos un tibble con los resultados tal como los queremos:

tabla_1 <- dengue %>%
  filter(ENTIDAD_RESIDENCIA == "SINALOA") %>%
  mutate(EDAD_GRUPO = cut(EDAD_ANOS, 
                          breaks = c(0, 20, 60, 120), 
                          labels = c("0-20","21-60","61 +"),
                          include.lowest = TRUE)) %>%
  group_by(SEXO, EDAD_GRUPO) %>%
  tally() %>%
  mutate(SEXO = if_else(SEXO == 1, "Hombre","Mujer")) %>%
  pivot_wider(id_cols = EDAD_GRUPO, names_from = SEXO, values_from = n)
# A tibble: 3 × 3
  EDAD_GRUPO Hombre Mujer
  <fct>       <int> <int>
1 0-20          734   748
2 21-60        1395  1089
3 61 +          158   157

La podríamos guardar con write_excel_csv pero ahora vamos a aprender a pasarla a Word usando flextable. Por ahora se vería así:

flextable(tabla_1)

EDAD_GRUPO

Hombre

Mujer

0-20

734

748

21-60

1,395

1,089

61 +

158

157

Podemos arreglar para que sexo tenga un encabezado add_header_row:

flextable(tabla_1) %>%
  add_header_row(
    colwidths = c(1, 2),
    values = c("", "Sexo")
  ) 

Sexo

EDAD_GRUPO

Hombre

Mujer

0-20

734

748

21-60

1,395

1,089

61 +

158

157

Y cambiar el EDAD_GRUPO de la primera fila:

flextable(tabla_1) %>%
  add_header_row(
    colwidths = c(1, 2),
    values = c("", "Sexo")
  ) %>%
  set_header_labels("EDAD_GRUPO" = "Grupo de edad") 

Sexo

Grupo de edad

Hombre

Mujer

0-20

734

748

21-60

1,395

1,089

61 +

158

157

Así como poner título y nota al pie:+

tabla_1 <- flextable(tabla_1) %>%
  add_header_row(
    colwidths = c(1, 2),
    values = c("", "Sexo")
  ) %>%
  set_header_labels("EDAD_GRUPO" = "Grupo de edad") %>%
  add_footer_lines(
    "Datos de la Dirección General de Epidemiología"
  ) %>%
  set_caption(caption = "Casos de dengue en Sinaloa") %>%
  theme_vanilla()

Sexo

Grupo de edad

Hombre

Mujer

0-20

734

748

21-60

1,395

1,089

61 +

158

157

Datos de la Dirección General de Epidemiología

Finalmente guardamos en Word:

tabla_1 %>%
  save_as_docx(path = "Tabla_1.docx")

4 Mapa de calor

Leemos los datos del marco geoestadístico del INEGI:

municipios <- read_sf("sinaloa/conjunto_de_datos/25mun.shp")

y les juntamos los casos de dengue contados por municipio:

#Conteo por municipio
municipio_dengue <- dengue %>%
  filter(ENTIDAD_RESIDENCIA == "SINALOA") %>%
  group_by(MUNICIPIO_RES, MUNICIPIO_RESIDENCIA) %>%
  tally()

Unimos al mapa

municipios <- municipios %>%
  left_join(municipio_dengue, by = c("CVE_MUN" = "MUNICIPIO_RES"))

Finalmente mapeamos:

ggplot(municipios) +
  geom_sf(aes(fill = n), color = "white", lwd = 0.5) +
  theme_void() +
  scale_fill_viridis_c(option = "turbo") +
  geom_sf_text(aes(label = NOMGEO), color = "white", size = 1.4) +
  labs(
    title = "Dengue en Sinaloa"
  )