Cargar datos de población del INE en R (y 2)
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)