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
Ejemplo de análisis exploratorio de datos
Parte 1: Fundamentos de análisis exploratorio en R
R
Antes de cualquier análisis, enlistaremos las librerías que vamos a usar:
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:
- Graficar la incidencia semanal de casos por semana epidemiológica en SINALOA-
- Determinar la distribución de casos por grupo de edad (
<20
,20-60
,60>
) y sexo en SINALOA y realizar dicha tabla en Word. - 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
<- "https://datosabiertos.salud.gob.mx/gobmx/salud/datos_abiertos/etv/historicos/2021/datos_abiertos_dengue_301221.zip"
pagina_web
#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
<- read_csv("dengue.zip", show_col_types = FALSE) dengue
Por otro lado descargamos el diccionario de datos:
#Bajamos el diccionario
<- "https://datosabiertos.salud.gob.mx/gobmx/salud/datos_abiertos/etv/diccionario_datos_dengue.zip"
pagina_diccionario
#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
::unzip("diccionario_datos_dengue.zip", exdir = getwd())
zip
#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
<- read_excel("Catalogos_Dengue.xlsx", sheet = "CATÁLOGO ENTIDAD")
entidades <- read_excel("Catalogos_Dengue.xlsx", sheet = "CATÁLOGO MUNICIPIO") municipios
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:
<- dengue %>%
incidencia_semanal 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:
<- dengue %>%
tabla_1 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:+
<- flextable(tabla_1) %>%
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:
<- read_sf("sinaloa/conjunto_de_datos/25mun.shp") municipios
y les juntamos los casos de dengue contados por municipio:
#Conteo por municipio
<- dengue %>%
municipio_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"
)