[Tutorial] Hacer una pirámide de población en R y Python

Con el censo 2020 de México de Inegi

[Tutorial] Hacer una pirámide de población en R y Python

La mejor forma de mostrar la dinámica de una población es con un gráfico de pirámide.

Se le llama así porque por años esa es la forma que ha tomado, cuando ponemos dos gráficos de barras contiguos. Cada barra es la suma de todas las personas en un rango de edades.

En este tutorial:

  • Te daré el código para hacer tus pirámides de población en R y Python.
  • Luego veremos un ejemplo real descargando datos del INEGI
  • Y finamente personalizaremos el gráfico.

Comencemos.

¿Para qué se usan las pirámides de población?

Es la forma más sencilla de entender la dinámica de la población de un lugar.

Es un vistazo al presente y al futuro de la población. Los jóvenes de ahora son los adultos del mañana, que a su vez serán los adultos mayores después. Entender esto de un vistazo te ayuda a proyectar la fuerza laboral, el estado de las pensiones y el futuro de las finanzas públicas.

Entre muchas otras cosas.

Este es el código para hacer una pirámide de población

Esta vez comenzaremos con el código.

Los scripts que te daré te harán el gráfico que buscas en python y R. Sólo tienes que modificar las cifras y los rangos, si es necesario.

Copia este código y úsalo en un script de python. También puedes usarlo en Google Colab.

El único módulo que necesitamos es matplotlib.

# Importamos las librerías necesarias
import matplotlib.pyplot as plt

# Definimos los datos manualmente
rangos_edades = ['0 - 5', '6 - 10', '11 - 15', '16 - 20', '21 - 25', '26 - 30', '31 - 35', '36 - 40', '41 - 45', '46 - 50', '51 - 55', '56 - 60', '61 - 65', '66 - 70', '71 - 75', '76 - 80', '81+']
hombres = [-30320, -24326, -20658, -19694, -16580, -13560, -10634, -8900, -7386, -6094, -4984, -4084, -3284, -2504, -1824, -1284, -896]
mujeres = [29144, 22493, 19878, 21686, 16947, 14374, 12220, 10800, 9634, 8056, 6804, 5634, 4512, 3500, 2642, 1904, 1208]

# Creamos la figura y los ejes
plt.figure(figsize=(10, 8))

# Graficamos la población masculina (lado izquierdo) y femenina (lado derecho)
plt.barh(rangos_edades, hombres, label='Hombres', color="#154957")
plt.barh(rangos_edades, mujeres, label='Mujeres', color="#05cd86")

# Añadimos etiquetas y título en español
plt.xlabel('Población')
plt.ylabel('Rango de Edad')
plt.title('Pirámide Poblacional para el año 1900')
plt.legend(loc='upper right')

# Mostramos el gráfico
plt.show()

Para hacer lo mismo en R, usamos este código. Nota que, como le estamos dando las cifras directamente en el código, no es necesario cargar ninguna base de datos (eso lo haremos más adelante con los datos del INEGI).

# Instalamos (si es necesario) y cargamos la librería ggplot2
if (!require(ggplot2)) install.packages("ggplot2")
library(ggplot2)

# Definimos los datos manualmente
rangos_edades <- c("0 - 5", "6 - 10", "11 - 15", "16 - 20", "21 - 25", 
                   "26 - 30", "31 - 35", "36 - 40", "41 - 45", "46 - 50", 
                   "51 - 55", "56 - 60", "61 - 65", "66 - 70", "71 - 75", 
                   "76 - 80", "81+")
hombres <- c(-30320, -24326, -20658, -19694, -16580, -13560, -10634, -8900, -7386, 
             -6094, -4984, -4084, -3284, -2504, -1824, -1284, -896)
mujeres <- c(29144, 22493, 19878, 21686, 16947, 14374, 12220, 10800, 9634, 
             8056, 6804, 5634, 4512, 3500, 2642, 1904, 1208)

# Creamos un data frame con los datos
datos <- data.frame(
  RangoEdad = factor(rangos_edades, levels = rev(rangos_edades)),  # Invertimos los niveles
  Hombres = hombres,
  Mujeres = mujeres
)

# Transformamos los datos a un formato largo para ggplot
datos_largo <- reshape2::melt(datos, id.vars = "RangoEdad", variable.name = "Genero", value.name = "Poblacion")

# Creamos la pirámide poblacional
ggplot(datos_largo, aes(x = Poblacion, y = RangoEdad, fill = Genero)) +
  geom_bar(stat = "identity", width = 0.8) +
  scale_x_continuous(labels = abs, name = "Población") +  # Etiquetas del eje x como valores absolutos
  labs(y = "Rango de Edad", title = "Pirámide Poblacional para el año 1900") +
  scale_fill_manual(values = c("Hombres" = "#154957", "Mujeres" = "#05cd86")) +  # Colores para cada género
  theme_minimal() +
  theme(legend.position = "top") +
  guides(fill = guide_legend(title = "Género"))

Debes de obtener como resultado un gráfico como este:

El truco en ambos casos es proporcionar los datos de un género en positivo y los otros en negativo.

Si ya tienes los datos y ya organizaste las sumas, basta con que cambies los números en el código y ya tienes el gráfico listo para usar.

Pero ¿qué hacer con los datos como vienen en el censo?

Hagámoslo.

Tutorial para hacer una pirámide de población con los datos del INEGI en R y Python

Normalmente no nos vamos a encontrar los datos listos para hacer nuestra gráfica.

Generalmente es necesario ordenar los datos y limpiarlos antes de comenzar a hacer los gráficos. Afortunadamente, tanto R como Python tienen funciones que facilitan mucho el trabajo. El código que te voy a pasar funciona sin cambios para el censo 2020 de México en Inegi. Si deseas usarlo en otras bases de datos, lo puedes hacer con cambios ligeros.

No te preocupes, te guiaré en el camino.

Si ya estás listo, comienza por aquí.

Paso #1: Descarga la base de datos

Para este ejemplo usaremos el censo 2020 de Inegi.

Entra el la siguiente página y descarga los tabulados del cuestionario básico de población.

Censo de Población y Vivienda 2020
Enumeración exhaustiva de la población y las viviendas existentes en el país, brinda características de ambas. Datos de 2020.

La hoja 03 contiene los datos que buscamos. Los únicos detalles son que hay que filtrar el estado que queremos que nos muestre y que nos arroja todas las edades. Para hacer una pirámide que sea fácil de leer, necesitamos dividir estos datos en rangos.

Así se ve la pantalla de los datos en Excel.

💡
En esa misma página puedes encontrar una pirámide poblacional ya hecha por INEGI en formato PDF. Puedes usarla para comparar tus resultados.

Paso #2: Carga la base de datos en Python/R

Ahora que tienes el archivo descargado, es momento de cargarlo en tu entorno de trabajo. Te mostraré cómo hacerlo tanto en Python como en R, y te explicaré cada paso para que entiendas lo que estamos haciendo y cómo puedes adaptar el código a tus necesidades.

Cargando los datos en Python

Primero, asegúrate de tener instaladas las librerías necesarias. En este caso, usaremos pandas para manejar los datos y matplotlib para las gráficas.

# Importamos las librerías necesarias
import pandas as pd
import matplotlib.pyplot as plt

Ahora, especifica la ruta al archivo que descargaste y el nombre de la hoja que contiene los datos que necesitamos (en este caso, la hoja "03").

# Especifica la ruta al archivo y el nombre de la hoja
file_path = 'ruta/a/tu/archivo.xlsx'  # Reemplaza con la ruta real de tu archivo
sheet_name = '03'  # Nombre de la hoja que contiene los datos

Leemos los datos del archivo Excel, omitiendo las primeras filas que contienen metadatos y no nos sirven para el análisis.

# Leemos la hoja de Excel, omitiendo las primeras 5 filas de metadatos
data = pd.read_excel(file_path, sheet_name=sheet_name, skiprows=5)

Renombramos las columnas para facilitar su manejo.

# Renombramos las columnas para mayor claridad
data.columns = ["Entidad", "Edad", "Poblacion_Total", "Hombres", "Mujeres", "Relacion_H_M"]

Cargando los datos en R

En R, utilizaremos el paquete readxl para leer archivos Excel y ggplot2 para las gráficas. Asegúrate de tenerlos instalados.

# Instalamos y cargamos los paquetes necesarios
if (!require("readxl")) install.packages("readxl")
if (!require("ggplot2")) install.packages("ggplot2")

library(readxl)
library(ggplot2)

Especifica la ruta al archivo y el nombre de la hoja.

# Especifica la ruta al archivo y el nombre de la hoja
file_path <- "ruta/a/tu/archivo.xlsx"  # Reemplaza con la ruta real de tu archivo
sheet_name <- "03"  # Nombre de la hoja que contiene los datos

Leemos los datos, omitiendo las primeras filas innecesarias.

# Leemos la hoja de Excel, omitiendo las primeras 5 filas de metadatos
data <- read_excel(file_path, sheet = sheet_name, skip = 5)

Renombramos las columnas.

# Renombramos las columnas para mayor claridad
colnames(data) <- c("Entidad", "Edad", "Poblacion_Total", "Hombres", "Mujeres", "Relacion_H_M")

Paso #3: Filtra y limpia los datos

Los datos que hemos cargado incluyen información de todas las entidades federativas y edades individuales. Para nuestra pirámide poblacional, vamos a enfocarnos en el nivel nacional. Pero si deseas analizar un estado específico, como Durango, te mostraré cómo hacerlo.

Filtrando los datos en Python

Primero, filtramos los datos para quedarnos solo con la entidad que nos interesa. Para el nivel nacional, la entidad se llama "Estados Unidos Mexicanos".

¡Genial! Te has registrado exitosamente.

¡Bienvenido de vuelta! Has iniciado sesión correctamente.

Te has suscrito correctamente a Escribe tu primer paper de Economía usando Inteligencia Artificial.

¡Éxito! Revisa tu correo electrónico para obtener el enlace mágico para iniciar sesión.

¡Éxito! Se ha actualizado la información de facturación.

No se actualizó tu información de facturación.