Cargar datos de población del INE en R (y 2)

23 de marzo de 2020

Herramientas: ggplot2, dplyr, tidyr

En un post anterior explicamos los pasos para cargar los datos de población por provincias del INE. Sin embargo, en aquella ocasión nos quedamos con los datos totales por provincia, dejando de lado los datos desagregados por género y edad.

En este post vamos a ver cómo cargar los datos del archivo Excel para tener los datos en el nivel más desagregado posible y en formato tidy. Preparar los pasos conlleva bastantes revisiones manuales del fichero de datos original, ya que contiene datos que no necesitamos:

  • Además de las filas con los datos de población por género, edad, provincia y fecha (que son los que nos interesan), hay muchas filas que contienen datos agregados por alguna de las variables categóricas: totales por provincia y fecha, por género y fecha, o por género, edad y fecha. Debemos eliminar todas esas filas, ya que con un fichero de datos limpios podremos volver a calcularlas sin problema (mientras que si las mantenemos, es muy probable que cometamos errores al agregar los datos).
  • En el caso de la edad, el dato está recogido a nivel de agregación de un año: 0 años, 1 año, etc. Sin embargo, tenemos dos valores especiales, “100 y más años” y “85 y más años”. Dado que tenemos la edad año a año, debemos eliminar todas las filas que contengan la edad “85 y más años” para que no interfiera en los cálculos (nuevamente, podemos reclasificar esta variable si fuera necesario).

Parte del código es el que ya usamos anteriormente;

library(readxl)
library(dplyr)
library(tidyr)
library(janitor)
library(lubridate)
library(ggplot2)
library(here)
datos <- readxl::read_xlsx("31304.xlsx", skip = 5)
datos_todos_limpios <- datos %>% 
  janitor::row_to_names(row_number = 1) %>% 
  janitor::clean_names() %>% 
  dplyr::rename(provincia = na) %>% 
  # eliminamos todas las filas con datos agregados de una u otra forma
  dplyr::slice(5564:n()) %>% # elimnar totales
  dplyr::slice(1:(n()-6)) %>% # eliminar metadatos al final del archivo
  dplyr::slice(-2:-55) %>% # eliminar total hombres
  dplyr::slice(-5456:-5509) %>% # eliminar grupo 85+ hombres
  dplyr::slice(-5457:-5510) %>% # eliminar total mujeres
  dplyr::slice(-10911:-n()) %>% # eliminar grupo 85+ mujeres
  dplyr::filter(str_detect(provincia, "^(?!.*Total).*$")) %>% # eliminar totales de cada grupo de edad
  # creamos y rellenamos la variable genero
  dplyr::mutate(genero = if_else(str_detect(provincia, "Hombres|Mujeres"), provincia,"")) %>% # crear nueva columna para recoger el género
  dplyr::mutate(genero = na_if(genero, "")) %>% # cambiar texto vacío por NA para luego poder rellenar
  tidyr::fill(genero, .direction ="down") %>% # rellenar columna
  dplyr::filter(str_detect(provincia, "^(?!.*(Hombres|Mujeres)).*$")) %>% # eliminar filas que en provincia tengan la palabra Hombres o Mujeres
  # creamos y rellenamos la variable edad
  dplyr::mutate(edad = if_else(str_detect(provincia, "años"), provincia,"")) %>% # crear nueva columna para recoger la edad; los pasos siguientes se repiten
  dplyr::mutate(edad = na_if(edad, "")) %>% # cambiar texto vacío por NA para luego poder rellenar
  tidyr::fill(edad, .direction ="down") %>%  
  dplyr::filter(str_detect(provincia, "^(?!.*años).*$")) %>%
  dplyr::select(genero, edad, everything()) %>%  # reordenar variables
  # a partir de aquí el código es el mismo que en el post anterior
  tidyr::pivot_longer(starts_with("x"), names_to = "fecha", values_to = "poblacion") %>% # pivotar datos
  # convertimos edad y población a tipo numérico
  dplyr::mutate(edad = gsub("^(\\d+).+","\\1",edad)) %>% 
  dplyr::mutate(edad = as.integer(edad)) %>% # cambiar a tipo numérico
  dplyr::mutate(poblacion = as.integer(poblacion)) %>% # cambiar a tipo numérico
  tidyr::separate(provincia, sep =" ", into=c("codigo","provincia"), extra = "merge") %>% # separar código y nombre de provincia
  # arreglamos las fechas
  dplyr::mutate(fecha = gsub("^x","", fecha)) %>% 
  dplyr::mutate(fecha = gsub("_de_","-", fecha)) %>% 
  dplyr::mutate(fecha = as.Date(fecha, "%d-%B-%Y"))

Para comprobar si los datos tienen la estructura adecuada, creamos una visualización para ver la evolución de la población en Gipuzkoa por género y edad:

ggplot(filter(datos_todos_limpios, provincia == "Gipuzkoa"), aes(fecha, poblacion, color = genero)) +
  geom_line() +
  facet_wrap(~edad, ncol = 10)


Más posts