Tidyverse para análisis de datos

La suite de tidyverse contiene muchos paquetes para manejo de datos.

library(readr)
library(dplyr)

Con la función read_tsv() podemos importar un archivo de datos separado por tabs.

poblacion <- read_tsv("data/poblacion.tsv")

El dataset de población contiene datos del INEGI del censo de población 2020.

glimpse(poblacion)
## Rows: 2,469
## Columns: 9
## $ entidad   <chr> "01", "01", "01", "01", "01", "01", "01", "01", "01", "01", …
## $ nom_ent   <chr> "Aguascalientes", "Aguascalientes", "Aguascalientes", "Aguas…
## $ mun       <chr> "001", "002", "003", "004", "005", "006", "007", "008", "009…
## $ nom_mun   <chr> "Aguascalientes", "Asientos", "Calvillo", "Cosío", "Jesús Ma…
## $ pobtot    <dbl> 948990, 51536, 58250, 17000, 129929, 47646, 57369, 9552, 224…
## $ pobfem    <dbl> 486917, 26275, 29687, 8708, 65710, 24269, 29268, 5020, 11371…
## $ pob0_14   <dbl> 240583, 16266, 16720, 5183, 38303, 14140, 17703, 3033, 6858,…
## $ pob15_64  <dbl> 639532, 31919, 35854, 10699, 84949, 30491, 35926, 5838, 1400…
## $ pob65_mas <dbl> 67941, 3331, 5641, 1118, 6538, 2977, 3579, 681, 1566, 1392, …

El verbo filter() de dplyr nos permite seleccionar un subconjunto de las filas de acuerdo a alguna condición.

bajio <- c("Aguascalientes", "Guanajuato", "Querétaro", "San Luis Potosí", "Zacatecas")
poblacion <- poblacion %>% 
  filter(nom_ent %in% bajio)

El verbo select() nos permite seleccionar y renombrar un subconjunto de las columnas

poblacion <- poblacion %>%
  select(entidad = nom_ent, municipio = nom_mun, infantil = pob0_14, 
         adultos = pob15_64, adultos_mayores = pob65_mas)

head(poblacion)
## # A tibble: 6 × 5
##   entidad        municipio           infantil adultos adultos_mayores
##   <chr>          <chr>                  <dbl>   <dbl>           <dbl>
## 1 Aguascalientes Aguascalientes        240583  639532           67941
## 2 Aguascalientes Asientos               16266   31919            3331
## 3 Aguascalientes Calvillo               16720   35854            5641
## 4 Aguascalientes Cosío                   5183   10699            1118
## 5 Aguascalientes Jesús María            38303   84949            6538
## 6 Aguascalientes Pabellón de Arteaga    14140   30491            2977

Con ggplot2 podemos construir gráficas

library(ggplot2)

Por ejemplo, esta es la distribución de la población infantil

ggplot(data = poblacion) + 
  geom_boxplot(aes(x = entidad, y = infantil, color = entidad)) + 
  labs(title = "Distribución de la población infantil en los estados del bajío", y = "Población infantil", x = "")  +
  scale_color_brewer(name = "Entidad", palette = "Set2") +
  theme_classic()

Con pivot_longer() de tidyr pasamos de un dataset ancho a un dataset largo.

library(tidyr)
poblacion_por_edades <- poblacion %>%
  pivot_longer(cols = c(infantil, adultos, adultos_mayores), 
               names_to = "tipo_poblacion", values_to = "cantidad")

head(poblacion_por_edades)
## # A tibble: 6 × 4
##   entidad        municipio      tipo_poblacion  cantidad
##   <chr>          <chr>          <chr>              <dbl>
## 1 Aguascalientes Aguascalientes infantil          240583
## 2 Aguascalientes Aguascalientes adultos           639532
## 3 Aguascalientes Aguascalientes adultos_mayores    67941
## 4 Aguascalientes Asientos       infantil           16266
## 5 Aguascalientes Asientos       adultos            31919
## 6 Aguascalientes Asientos       adultos_mayores     3331
ggplot(data = poblacion_por_edades) +
  geom_violin(aes(x = tipo_poblacion, y = cantidad, color = tipo_poblacion)) + 
  facet_wrap(~entidad, nrow = 3, scales = "free_y") +
  scale_color_brewer(name = "Tipo de población", palette = "Dark2") +
  labs(y = "Población", x = "", title = "Distribución de la población en los estados del bajío") +
  theme_bw()  +
  theme(axis.text.x = element_blank())