Code
library(dplyr)
library(ggplot2)
library(highcharter)
library(lubridate)
library(plotly)
Roberto Valdez Rivera
December 10, 2024
Las proyecciones sobre los datos de la población son fundamentales para conocer cómo estarán conformados los grupos poblacionales en los próximos años. El análisis de la estructura de la sociedad a través del tiempo, de acuerdo con la realización de la agrupación por grupos de edades, permiten responder a preguntas que no solo corresponden a la formulación de políticas pública como, por ejemplo, la asignación del presupuesto a las pensiones contributivas y no contributivas. Es de interés, también, para conocer cómo estará conformada la población económica activa en las próximas décadas, entre otros factores.
En México el encargado de realizar estos cálculos, siguiendo una metodología propia, es el Consejo Nacional de Población (CONAPO).
El propósito del presente estudio es explorar los datos que nos encontramos en esta base de datos para, por medio de un filtrado inciando con el 2020 hasta el 2070, realizar el manejo correspondiente para poder visualizar la estructura de los grupos por medio de pirámides poblacionales.
Los datos se encontrarán fácilmente en formato csv mediante la página de Datos Abiertos del gobierno de México.
Primero, es necesario cargar las librerías necesarias. Para realizar la exploración, el manejo y filtrado correspondiente se utilizará la librería dplyr. El manejo de variables tipo fecha, aunque requiere una transformación sencilla, será con ayuda de la librería lubridate. Depués, será necesario visualizar el comportamiento de la población a través del tiempo con un gráfico interactivo por medio de highcharter. Por último, se realizarán las pirámides poblacionales con la ayuda de ggplot2 y a través de plotly se transoformarán los gráficos estáticos a dinámicos.
Para importar la base de datos con ayuda de la función read.csv(), con nombre “Pob_1950_2070” en formato csv (comma separated values), será de la siguiente forma en la que inmediatamente se trasnformarán los nombres de las columnas a minúsculas.
Para poder observar de forma general la estructura de los datos será necesario imprimir las primeras y últimas 5 filas:
renglon año entidad cve_geo edad sexo poblacion
1 1 1950 República Mexicana 0 0 Hombres 577250
2 2 1950 República Mexicana 0 0 Mujeres 564734
3 3 1950 República Mexicana 0 1 Hombres 520692
4 4 1950 República Mexicana 0 1 Mujeres 511958
5 5 1950 República Mexicana 0 2 Hombres 487298
renglon año entidad cve_geo edad sexo poblacion
744916 744916 2071 Zacatecas 32 107 Mujeres 44
744917 744917 2071 Zacatecas 32 108 Hombres 75
744918 744918 2071 Zacatecas 32 108 Mujeres 26
744919 744919 2071 Zacatecas 32 109 Hombres 50
744920 744920 2071 Zacatecas 32 109 Mujeres 15
Con base en lo anterior, conocemos que la estructura de la base de datos incia con los registros de la población desde 1950 hasta las proyecciones de 2071 y el listado de los datos inicia por los registros de la República Mexicana con clave goegráfica 0 hasta Zacatecas con clave 32, con iteraciones de acuerdo a cada año.
Esta base de datos es extensa: su estrucura es de 744,920 x 7, es decir, cerca de 745 mil filas y 7 columnas o variables.
Antes de realizar un manejo a los datos de la población es necesario conocer algunas estadísticas descriptivas como el promedio, la mediana, el máximo y mínimo, así como el tipo de variable –identificando, también, que la lectura de la base de datos se ha realizado de forma correcta– en la que R pueda distinguir entre las variables numéricas y de texto.
Para esto, pueden servirnos dos funciones: str() y summary(). La primera imprime un resumen que indica el tipo de variable entre “int” para variables numéricas –aunque pueden ser de otros tipos– y “chr” para indicar variables string que incluyen texto en su contenido. Se utilizará la segunda función porque, a parte de que nos indica el tipo de variable, nos imprimirá un breve resumen de estadísticos descriptivos para cada una de estas:
renglon año entidad cve_geo
Min. : 1 Min. :1950 Length:744920 Min. : 0.00
1st Qu.:186231 1st Qu.:1995 Class :character 1st Qu.: 8.00
Median :372461 Median :2020 Mode :character Median :16.00
Mean :372461 Mean :2020 Mean :15.91
3rd Qu.:558690 3rd Qu.:2046 3rd Qu.:24.00
Max. :744920 Max. :2071 Max. :32.00
edad sexo poblacion
Min. : 0.0 Length:744920 Min. : 0
1st Qu.: 27.0 Class :character 1st Qu.: 2017
Median : 54.5 Mode :character Median : 10182
Mean : 54.5 Mean : 32890
3rd Qu.: 82.0 3rd Qu.: 24356
Max. :109.0 Max. :1260813
Por su parte, en muchos casos es imperante identificar si dentro de la base de datos se encuentran registros faltantes (NA) porque cuando se desea realizar algunas tranformaciones y análisis pueden interferir en el procedimiento. Una manera sencilla de ubicarlos es mediante la función is.na(), pero como al imprimirla nos arrojará una matriz booleana (valores falsos y verdaderos) de n x m, será mejor incorporar la función table() para que realice solo el conteo de los mismos.
Se identifica entonces que no se encuentran valores faltanes, lo que nos resulta extraordinario.
Antes de pasar de lleno con el manejo de los datos, resulta interesante realizar un gráfico de serie temporal que nos permita conocer el comportamiento que ha presentado el crecimiento de la población desde 1950 hasta las proyecciones que realizó la CONAPO para el 2070. Primero, tenemos que transformar la variable “año” en formato fecha. Segundo, sintetizando los pasos por medio de los pipes o tuberías —sobre todo, para concatenar funciones y reducir las líneas de código— se filtrará para después agrupar por “año” y “sexo” para poder obtener la suma de la población para cada año y correspondiente a cada sexo.
Para poder realizar el gráfico con características interactivas, y con una barra inferior para cambiar el rango de las fechas a visualizar, es necesario crear un hchart de la librería highcharter indicando las caraterísticas de presentación deseadas.
pob_s <- pob
pob_s$año <-ymd(paste0(pob_s$año, "-01-01"))
pob_s%>%filter(entidad=="República Mexicana") %>%
group_by(año, sexo) %>%
summarise(poblacion=sum(poblacion)) %>%
hchart(type = "line", hcaes(x=año, y=poblacion,group=sexo)) %>%
hc_title(text="Población por Sexo a través del tiempo") %>%
hc_xAxis(title = list(text = "Año")) %>%
hc_yAxis(title=list(text="Población")) %>%
hc_navigator(enabled=T)%>%
hc_colors(c("#AEEEEE","#FFB5C1"))%>%
hc_credits(text="Elaboración propia con base en datos de la CONAPO.",
enabled=T,
style=list(fontSize="12px"), color="black")
Ahora bien, lo que nos puede interesar, con base en el gráfico anterior, es conocer el año en que se alcance el punto máximo de la población de acuerdo al sexo. Es necesario agrupar los datos de acuerdo al sexo y año por medio de la función group_by(), creado así un nuevo objeto. Después, por medio de dos filtros, se puede hallar cuál será el año en que se alcanzará el número máximo de población de acuerdo al sexo.
# A tibble: 2 × 3
# Groups: año [2]
año sexo poblacion
<int> <chr> <int>
1 2052 Mujeres 75335014
2 2053 Hombres 71697430
De acuerdo con los datos de la CONAPO, y realizando la exploración, encontramos que el número máximo de mujeres se alcanzará en 2052 cuando ascienda a 75 millones 335 mil 14 personas, mientras que en el caso de los hombres se encontrará un año después, en el 2053, cuando alcance los 71 millones 697 mil 430 personas. Con base en la gráfica, podemos observar que es a partir de la década de 1990 cuando comenzó la tendencia de que las mujeres representaran un número mayor en comparación con los hombres que, a partir de las proyecciones que encontramos en los datos, la tendencia es que se mantenga e incluso se profundice. Por su parte, lo preocupante es que a partir de mediados de la década de 2050 la población comenzará a disminuir.
Podemos observar que algunas columnas no nos sirven como la de “renglón” y “cve_geo”. Lo mejor será quitarlas para que no nos estorben. De esta forma estaremos iniciando en el manejo y transformación de la base de datos.
año entidad edad sexo poblacion
1 1950 República Mexicana 0 Hombres 577250
2 1950 República Mexicana 0 Mujeres 564734
3 1950 República Mexicana 1 Hombres 520692
Nota: Para términos prácticos es necesario que se considere que el código observable siguiente solo se ha realizado para el año 2020. Sin embargo, las líneas de código son replicables para el 2030 hasta 2070.
Asimismo, es necesario crear un nuevo objeto que guarde los datos específicos para el 2020, en otras palabras, crear un objeto que guarde un subconjunto específico de datos. El método de filtrado puede realizarse mediante la función filter(), pero para este caso se hará indicando las filas que cumplan la condición de que el año sea igual a 2020 y la entidad sea igual a la República Mexicana.
Posteriormente, por medio de la función mutate() en conjunto con case_when() será necesario crear una nueva variable que identifique los rangos de edades sobre los cuales queremos agrupar a la población. En las siguientes líneas de código se encontrará la agrupación de los grupos de edades que, expresado en términos sencillos, se realizó arbitrariamente —solo correspondiendo a que fuesen varios grupos—.
veintes <- mutate(veintes, grupo_edad= case_when(
edad>=0 & edad<=8 ~1,
edad>=9 & edad<=16 ~2,
edad>=17 & edad<=24 ~3,
edad>=25 & edad<=32 ~4,
edad>=33 & edad<=40 ~5,
edad>=41 & edad<=48 ~6,
edad>=49 & edad<=56 ~7,
edad>=57 & edad<=64 ~8,
edad>=65 & edad<=72 ~9,
edad>=73 & edad<=80 ~10,
edad>=81 & edad<=88 ~11,
edad>=89 & edad<=96 ~12,
edad>=97 ~13
))
Depués de la creación de la nueva variable, es necesario transformarla a tipo factor a través de la función factor() para que, cuando llegue el momento de la visualización, los grupos de edades estén perfectamente acomodados. Es aquí, también, que se añaden las etiquetas representativas de los grupos de edades, iniciando en “0 a 8 años” hasta “97 años y más”.
Para que el número de personas expresado en millones no nos complique la representación visual, lo recomendable es dividir la población entre un millón. Posteriormente, las cifras dentro de los gráficos tendremos que leerlos como “población en millones de personas”. Por último, por medio de la función group_by() agruparemos los datos de acuerdo a los grupos de edades y sexo, seguido de obtener una suma para cada uno de los trece grupos de edad.
De esta forma ¡Estamos listos para poder visualizar los datos de las pirámides poblacionales con ayuda de ggplot2 y plotly!
Para poder realizar una visualización en forma de pirámide poblacional con ggplot2 será necesario definir dentro de geom_col() un subconjunto de datos del objeto de acuerdo al sexo. Se indica que de lado izquierdo se coloquen los grupos de edades de los hombres y de lado derecho a las mujeres, así como establecer colores representativos de las columnas. Por último, por medio de ggplotly() (de la librería plotly), se indica que el objeto que contiene el gráfico estático se transforme a interactivo con características interesantes.
g1 <- ggplot(data = veintes,
mapping = aes(x = grupo_edad, y = pob,
text = paste("Grupo de Edad:", grupo_edad, "<br>Sexo:", sexo,
"<br>Población:", abs(pob)))) +
geom_col(data = subset(veintes, sexo == "Hombres") %>%
mutate(pob = -1 * pob),
fill = "lightblue", width = 0.95) +
geom_col(data = subset(veintes, sexo == "Mujeres"),
fill = "lightpink", width = 0.95) +
coord_flip() +
theme_bw() +
scale_y_continuous(
breaks = c(seq(-12, -2, 2), seq(2, 12, 2)),
labels = c(seq(-12, -2, 2) * -1, seq(2, 12, 2))
) +
theme(legend.position = "bottom") +
labs(title = "Pirámide poblacional del 2020",
y = "Millones de personas", x = "Grupo de edades",
caption ="Fuente: Elaboración propia con base en datos de la CONAPO.")
ggplotly(g1, tooltip="text")
Por medio de la siguiente interfaz interactiva puede seleccionar el año que desee observar. La selección del año inicia desde 2020 hasta el 2070, permitiéndole analizar detenidamente los cambios que, de acuerdo con la CONAPO, tendrán los grupos poblacionales en México en las próximas décadas.
Por último, con base en el análisis realizado, la estructura de la población en los próximos años representará serios desafios para la planeación e implementación de políticas públicas; la estructura de la sociedad estará ampliamente concentrada en los grupos de mayor edad, siendo el de tercera edad una cifra —juzgándolo por lo que presenta en nuestros días— alarmante.