Skip to content

Instantly share code, notes, and snippets.

@JuveCampos
Created January 28, 2020 03:24
Show Gist options
  • Save JuveCampos/1edd1c3d9b6414508f9a4e5b80f2ec92 to your computer and use it in GitHub Desktop.
Save JuveCampos/1edd1c3d9b6414508f9a4e5b80f2ec92 to your computer and use it in GitHub Desktop.
title author date slug categories tags
Visualizando pirámides de población en R
Juvenal Campos
2020-01-26
visualizando-pirámides-de-población-en-r

https://gist.github.com/5ccfb487400d3dfe5b4f2a7d9e16f553

Las pirámides de población (o pirámide demográfica, como le dicen los demógrafos) son un tipo de gráfica que nos permite analizar la distribución de la población por edades en una región determinada (municipio, estado o país).

Desde el punto de vista gráfico, se trata de un doble histograma de frecuencias, dispuestos de manera horizontal, donde convencionalmente se ponen los grupos de edad masculina a la izquierda y los de poblaciòn femenina a la derecha. En el eje y (el de las ordenadas o el que va para arriba) se disponen los grupos de edad, moentras que en el eje x (el de las ordenadas, o el que va horizontal) van las cantidades de población. Para más información recomiendo leer este artículo de Wikipedia.

Desde el punto de vista de visualización de datos en R y a pesar de la gran utilidad y amplio uso de este tipo de gráficas, no hay una función geom_popPyramid() nativa en ggplot2 que nos permita hacer pirámides de población sin tanto dolor (aunque podríamos programarla 😏). Sin embargo, en esta entrada de blog, nos dispondremos a generar una de estas gráficas a partir de elementos ya conocidos de esta librería.

1. Antecedentes.

El viernes pasado estaba intentando hacer una de estas gráficas de población en mi trabajo, siendo (como casi siempre) mi primer impulso buscar en Google "como graficar pirámides de población en R". Estos son algunos de los tutoriales y artículos que me ayudaron:

Todos son muy buenos y sirven para complementar esta entrada. El problema que tuve al checarlos fué que 1) muchas funciones no estaban actualizadas y 2) las bases de datos eran inaccesibles, por lo que era imposible reproducir los ejemplos presentados. Es por eso que aquí presentamos una tercera opción (y en español :3) para aquellos que tengan la necesidad de hacer una gráfica de población en el futuro.

2. Descripción del problema.

Vamos a elaborar la pirámide de población del Estado de Morelos, México a partir de los datos reportados por la Encuensta Intercensal 2015 del INEGI en sus tabulados de Población.

2.1. Descarga de los datos.

Descargamos los datos de población de la página de la encuesta intercensal 2015.

La liga de descarga es la siguiente:

https://www.inegi.org.mx/contenidos/programas/intercensal/2015/tabulados/01_poblacion_mor.xls

(En caso de que algún gobierno austero decida eliminar las bases de datos de INEGI por algún motivo en los próximos años, igualmente guardaré una copia en mi Github de los datos).

Nota 1. Se supone que el lector sabe descargar librerias del CRAN.

https://gist.github.com/c91c769b809124395c72ad3f7c3cc918

https://gist.github.com/da6482cf6aff290339acf74762afdb90

https://gist.github.com/f4413cc490c5413d0780a6d74038f12f

La función anterior descargará el archivo en nuestro directorio de trabajo. La hoja 2 es la que contiene la población Por tamaño de localidad y las 6 líneas que se saltaron contienen el encabezado de logotipos que INEGI le pone a muchas de sus tablas.

2.2. Procesado de la información.

Necesitamos obtener una tabla adecuada para realizar nuestra gráfica, tal como se explica en el siguiente esquema:

{width=80%}

Este esquema nos permite declarar una columna única de una sola base de datos, y declarar estas columnas dentro de los estéticos globales del ggplot como se ve más adelante.

Para lograr esto, haremos el siguiente procesado de la información a través de la función tidyr::pivot_longer():

https://gist.github.com/1fdba22cd6f3dc47d116ff24c06020a7

https://gist.github.com/32be2fd8fb3fe99e96080ec5e5e94ab3

Ahora que tenemos la base como la necesitamos, procedemos a hacer la gráfica.

2.3. Graficando con ggplot().

Para graficar utilizamos la función ggplot().

Primera versión: utilizando geom_col().

La primera versión que realizaremos será utilizando la función geom_col(). Esta función nos permite realizar gráficas de barras en R.

https://gist.github.com/04d2b98f3ebaf450b07923622a0a4c14

Nótese las escalas del eje x

Ahora, tenemos que enfocarnos en la parte del eje de población. Primero que nada, tenemos que hacer un poco de análisis.

https://gist.github.com/e7f90cf2fc0e427abc718b745fdd6c8d

El máximo de población es 88,967 personas (correspondiente a Mujeres morelenses entre 20 a 24 años). Para el eje x, vamos a poner escalas cada 20,000 personas (para que sean unas 5 marcas en las escalas).

https://gist.github.com/41b51b08637ff034824e73531e3d39ee

Como vemos arriba, es una secuencia que va desde -100,000 hasta 100,000. Esto implica que, dentro de la gráfica, ggplot() va a poner las etiquetas en los puntos marcados arriba, como puede verse en la siguiente imágen:

Imágen de donde se van a marcar las etiquetas.

Ahora, pongamosle las etiquetas en los puntos que determinamos arriba, a través de la función

https://gist.github.com/e84a26307cd45fcaa6b4c8c402366979

Para este caso, las etiquetas son casi iguales que los quiebres que calculamos arriba, con la diferencia de que la parte de la población masculina tienen que ser positivos, no negativos (por eso los multiplicamos por -1).

Ahora, incorporamos esto en la gráfica que ya hicimos arriba a través de la función scale_y_continuous().

Empezamos declarando los elementos estéticos. Los estéticos globales que vamos a usar son el x, el y, y el fill. x nos determinará la variable categórica que irá en el eje x, y la variable numérica que irá en el eje y y fill la variable categórica que clasifica a los datos en dos categorías, Hombres y Mujeres, asignando un color distinto a cada tipo de dato.

https://gist.github.com/0ce9de0f9761bb420191e53f3dbc1c1e

Después añadimos las gráficas de columnas mediante la función geom_col() con subconjuntos de los datos filtrando por hombres y mujeres. Después hacemos un cambio de ejes y al final añadimos las etiquetas en los ejes de las gráficas. A continuación el código completo.

https://gist.github.com/3eae754b380fd5646a33a61ab4bc3a5d

Ya a partir de aquí lo que procede es personalizar el tema y las etiquetas.

2.4. Segunda versión: utilizando geom_linerange().

Otra versión muy común de las gráficas de pirámides de población consiste en poner los grupos de edad en el centro de la gráfica. Esto no es posible de realizar con las barras normales de ggplot, por lo que utilizaremos un elemento gráfico llamado geom_linerange(), el cual nos permite representar de manera gráfica intervalos con inicio y final.

La única diferencia entre el metodo anterior y el que viene a continuación, consiste en 1) Cambiar el geom_col() por un geom_linerange(), incluir dentro el aes(ymin, ymax) y 3) también introducir como etiquetas de texto en el centro de la gráfica con geom_label().

Igualmente, hay que programar un desplazamiento de las barras a la derecha y a la izquierda, para dejar el espacio para las etiquetas que van a ir en el centro. Para la gráfica que queremos hacer dejaremos un desplazamiento de 10,000 unidades de población (la magnitud de este desplazamiento depende de los datos del eje y, en este caso de los números de población).

Se escogió 10,000 como desplazamiento porque así cabe bien el texto de las categorias de edad.

https://gist.github.com/479705d14a3d75d1d141908d06aa7dbc

Para este caso modificaremos ligeramente las etiquetas:

https://gist.github.com/42bc9e4a40d2cc898c36dee0d90d1b78

Estas serán las nuevas coordenadas dentro del eje X en las que se van a colocar las nuevas etiquetas. Es lo mismo que con las anteriores, solo que sumandole/restándole el desplazamiento.

https://gist.github.com/17d76a7625932ba43f8cecaffa717a75

Ahora si, hacemos la gráfica:

https://gist.github.com/54add0c0f772a44cbc4a991c7c9ca777

2.5. ¿Qué sigue?

Lo que sigue a continuación es embellecer la gráfica modificando los temas: fondo de la gráfica, tipo de letra, colores, etc. Igualmente, añadir formato a los números, poner títulos, subtítulos y pies de página, modificar los colores (quizá el rosa para mujeres y azul para hombres no parezca tan adecuado), entre alguna otra función añadida que nos interese agregar.

Una de las ventajas de hacer visualizaciones en código es que es difícil solo la primera vez. Una vez que ya tenemos el código, podemos tenerlo guardado para hacer otras gráficas cuando salgan nuevos datos de población ( alguien dijo censo 2020?) o que podemos utilizarlo para graficar otros datos (por ejemplo, pirámides para municipios dentro de un estado o de otros estados, o por tamaños de comunidad). O ya de plano construir una aplicación en Shiny para que el usuario haga las pirámides de población que quiera. Explora las posibilidades.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment