Instalación de paquetes y carga de librerías

#install.packages("data.table") 
#install.packages("readr")
#install.packages("tidyverse")
#install.packages("dplyr")
#install.packages("tidyr")
#install.packages("ggplot2")
#install.packages("sf")
#install.packages("extraFont")

library(data.table)
library(readr)
library(tidyverse)
library(dplyr)
library(magrittr)
library(ggplot2)
library(sf)
library(extrafont)
font_import()
## Importing fonts may take a few minutes, depending on the number of fonts and the speed of the system.
## Continue? [y/n]
loadfonts(device = "win")

Se quiere construir pirámide poblacional de los municipios del Área metropolitana de Puebla para los años 2000, 2010 y 2020, para ver la tendencia de envejecimiento de la población en este territorio.

En el área metropolitanan de Puebla se consideran los municipios: Amozoc, Coronango, Cuautlancingo, Huejotzingo, Juan C. Bonilla, Ocoyucan, Puebla, San Andrés y San Pedro Cholula

Carga de base de datos de población del Estado de Puebla por municipio, grupos de edad y sexo. Con información censal de los años 2000, 2010 y 2020, en formato csv

Para el Censo de 2000

Pue2000 <- read.csv("entradas/Pue_Gpos5_2000.csv", encoding = "UTF-8")

head(Pue2000)
##   X.U.FEFF.ENTFED CVEMUN     Municipio GpoEdad00    PT00     H00     M00
## 1              21    Tot Total entidad     Total 5076686 2448801 2627885
## 2              21    Tot Total entidad     00_04  578641  293332  285309
## 3              21    Tot Total entidad     05_09  623917  314710  309207
## 4              21    Tot Total entidad     10_14  600452  303571  296881
## 5              21    Tot Total entidad     15_19  532196  258724  273472
## 6              21    Tot Total entidad     20_24  460965  214250  246715
#summary(Pue2000)

#class(Pue2000$Municipio)

#Asignar clave de entidad, clave de municipio y nombre de municipio correctamente
Pue2000$CVE_ENT <- 21
Pue2000$CVE_MUN <- substr(Pue2000$Municipio, start = 1, stop = 3)
Pue2000$NOM_MUN <- substr(Pue2000$Municipio, start = 5, stop = 50)

#Eliminar columnas con errores, se asigna a otro objeto para no pisarlo
PUE_2000 <- Pue2000 %>%
  select(4:10)

colnames(PUE_2000)
## [1] "GpoEdad00" "PT00"      "H00"       "M00"       "CVE_ENT"   "CVE_MUN"  
## [7] "NOM_MUN"
#Uniformar nombres de columnas
PUE_2000 <- PUE_2000 %>%
  mutate(Hombres = H00*-1) %>%
  mutate(Mujeres = M00) %>%
  mutate(GrupoEdad = GpoEdad00) %>%
  mutate(year = 2000)
  

#Transformar las filas por grupo de edad a columnas para poder sumar <- OJOOOOOO
Pue2000_2 <- PUE_2000 %>%
  select(CVE_MUN, NOM_MUN, GrupoEdad, Hombres, Mujeres, year) %>%
  pivot_longer(cols = c(Hombres, Mujeres),
              names_to = "Sexo",
              values_to = "Pob") 

# Quitar totales, no especificados y último grupo de edad
piramide00 <- Pue2000_2 %>%
  #filter(GrupoEdad %in% c("00_04","05_09","10_14","15_19","20_24","25_29","30_34","35_39","40_44","45_49","50_54","55_59","60_64","65_69","70_74","75_79","80_84","85_89","90_94","95_99")) 
  filter(!(GrupoEdad %in% c("Total","No_especificado","100_y_mas")))  %>% # Más fácil
  #Quitar totales de entidad y de municipio
  filter(!(NOM_MUN %in% c("l entidad","l")))

##Pirámide de población Estado de Puebla, año 2000

piramide00 %>%
  ggplot(aes(x = GrupoEdad, y = Pob/1000, fill = Sexo)) +
    geom_col(position = "stack", alpha = 0.7) + 
    coord_flip() +
  # Asignar colores
    scale_fill_manual(values = c("midnightblue", "darkred")) +
  # etiquetas 
    theme_gray() +
    labs(
      title = "Pirámide de población Estado de Puebla, 2000", 
      subtitle = "Grupos quinquenales de edad",
      y = "Población en millares, por sexo",
      x = "Grupos de edad, en años",
      caption = "Fuente: Censo General de Población y Vivienda, INEGI, 2000") +
  # leyenda
    theme(
      legend.position = "bottom",
      text = element_text(family = "Candara")) 

Para el Censo de 2010

Pue2010 <- read.csv("entradas/Pue_Gpos5_2010.csv", fileEncoding = "latin1") #(Se usó fileEncoding porque cargaba mal los caracteres con acento y marcaba error)

head(Pue2010)
##   ENTFED Municipio10 GpoEdad10    PT10     H10     M10
## 1     21       Total     Total 5778539 2771400 3007139
## 2     21       Total     00_04  578669  296208  282461
## 3     21       Total     05_09  619535  313222  306313
## 4     21       Total     10_14  612393  311362  301031
## 5     21       Total     15_19  610213  300538  309675
## 6     21       Total     20_24  514638  243840  270798
summary(Pue2010)
##      ENTFED   Municipio10         GpoEdad10              PT10        
##  Min.   :21   Length:3437        Length:3437        Min.   :      1  
##  1st Qu.:21   Class :character   Class :character   1st Qu.:    268  
##  Median :21   Mode  :character   Mode  :character   Median :    678  
##  Mean   :21                                         Mean   :   6725  
##  3rd Qu.:21                                         3rd Qu.:   1775  
##  Max.   :21                                         Max.   :5778539  
##       H10               M10         
##  Min.   :      0   Min.   :      0  
##  1st Qu.:    125   1st Qu.:    142  
##  Median :    319   Median :    355  
##  Mean   :   3225   Mean   :   3500  
##  3rd Qu.:    859   3rd Qu.:    914  
##  Max.   :2771400   Max.   :3007139
#Asignar clave de entidad, clave de municipio y nombre de municipio correctamente
Pue2010$CVE_MUN <- substr(Pue2010$Municipio10, start = 1, stop = 3)
Pue2010$NOM_MUN <- substr(Pue2010$Municipio10, start = 5, stop = 50)

#Eliminar columnas con errores, se asigna a otro objeto para no pisarlo
PUE_2010 <- Pue2010 %>%
  select(1,3:8)

colnames(PUE_2010)
## [1] "ENTFED"    "GpoEdad10" "PT10"      "H10"       "M10"       "CVE_MUN"  
## [7] "NOM_MUN"
#Uniformar nombres de columnas
PUE_2010 <- PUE_2010 %>%
  mutate(Hombres = H10*-1) %>%
  mutate(Mujeres = M10) %>%
  mutate(GrupoEdad = GpoEdad10) %>%
  mutate(year = 2010)
  

#Transformar las filas por grupo de edad a columnas para poder sumar <- OJOOOOOO
Pue2010_2 <- PUE_2010 %>%
  select(CVE_MUN, NOM_MUN, GrupoEdad, Hombres, Mujeres, year) %>%
  pivot_longer(cols = c(Hombres, Mujeres),
              names_to = "Sexo",
              values_to = "Pob") 

# Quitar totales, no especificados y último grupo de edad
piramide10 <- Pue2010_2 %>%
  #filter(GrupoEdad %in% c("00_04","05_09","10_14","15_19","20_24","25_29","30_34","35_39","40_44","45_49","50_54","55_59","60_64")) 
  filter(!(GrupoEdad %in% c("Total","No_especificado","65_y_mas")))  %>% # Más fácil
  #Quitar totales de entidad y de municipio
  filter(!(NOM_MUN %in% c("l entidad","l")))

##Pirámide de población Estado de Puebla, 2010

piramide10 %>%
  ggplot(aes(x = GrupoEdad, y = Pob/1000, fill = Sexo)) +
    geom_col(position = "stack", alpha = 0.7) + 
    coord_flip() +
  # Asignar colores
    scale_fill_manual(values = c("midnightblue", "darkred")) +
  # etiquetas 
    theme_gray() +
    labs(
      title = "Pirámide de población Estado de Puebla, 2010", 
      subtitle = "Grupos quinquenales de edad",
      y = "Población en millares, por sexo",
      x = "Grupos de edad, en años",
      caption = "Fuente: Censo General de Población y Vivienda, INEGI, 2010") +
  # leyenda
    theme(
      legend.position = "bottom",
      text = element_text(family = "Candara")) 

Para el Censo de 2020

Pue2020 <- read.csv("entradas/Pue_Gpos5_2020.csv", encoding = "UTF-8")

head(Pue2020)
##   X.U.FEFF.ENTFED Municipio20 GpoEdad20    PT20     H20     M20
## 1              21       Total     Total 6567595 3159817 3407778
## 2              21       Total     00_04  587121  298791  288330
## 3              21       Total     05_09  608444  308404  300040
## 4              21       Total     10_14  604243  307360  296883
## 5              21       Total     15_19  606314  307731  298583
## 6              21       Total     20_24  564048  274819  289229
#summary(Pue2020)

#Asignar clave de entidad, clave de municipio y nombre de municipio correctamente
Pue2020$CVE_ENT <- 21
Pue2020$CVE_MUN <- substr(Pue2020$Municipio20, start = 1, stop = 3)
Pue2020$NOM_MUN <- substr(Pue2020$Municipio20, start = 5, stop = 50)

#Eliminar columnas con errores, se asigna a otro objeto para no pisarlo
PUE_2020 <- Pue2020 %>%
  select(3:9)

#colnames(PUE_2020)

#Uniformar nombres de columnas
PUE_2020 <- PUE_2020 %>%
  mutate(Hombres = H20*-1) %>%
  mutate(Mujeres = M20) %>%
  mutate(GrupoEdad = GpoEdad20) %>%
  mutate(year = 2020)
  

#Transformar las filas por grupo de edad a columnas para poder sumar <- OJOOOOOO
Pue2020_2 <- PUE_2020 %>%
  select(CVE_MUN, NOM_MUN, GrupoEdad, Hombres, Mujeres, year) %>%
  pivot_longer(cols = c(Hombres, Mujeres),
              names_to = "Sexo",
              values_to = "Pob") 

# Quitar totales, no especificados y último grupo de edad
piramide20 <- Pue2020_2 %>%
  #filter(GrupoEdad %in% c("00_04","05_09","10_14","15_19","20_24","25_29","30_34","35_39","40_44","45_49","50_54","55_59","60_64","65_69","70_74"))
  filter(!(GrupoEdad %in% c("Total","No_especificado","75_y_mas"))) %>% # Más fácil
  #Quitar totales de entidad y de municipio
  filter(!(NOM_MUN %in% c("l entidad","l")))

##Pirámide de población Estado de Puebla, 2020

piramide20 %>%
  ggplot(aes(x = GrupoEdad, y = Pob/1000, fill = Sexo)) +
    geom_col(position = "stack", alpha = 0.7) + 
    coord_flip() +
  # Asignar colores
    scale_fill_manual(values = c("midnightblue", "darkred")) +
  # etiquetas 
    theme_gray() +
    labs(
      title = "Pirámide de población Estado de Puebla, 2020", 
      subtitle = "Grupos quinquenales de edad",
      y = "Población en millares, por sexo",
      x = "Grupos de edad, en años",
      caption = "Fuente: Censo General de Población y Vivienda, INEGI, 2020") +
  # leyenda
    theme(
      legend.position = "bottom",
      text = element_text(family = "Candara")) 

##Pirámides de población municipios metropolitanos conurbados, excepto el municipio de Puebla, 2020

piramide20 %>%
  filter(CVE_MUN %in% c("015","034","041","074","090","106","119","140")) %>%
  filter(!(GrupoEdad %in% c("65_69","70_74","75_y_mas"))) %>%
    ggplot(aes(x = GrupoEdad, y = Pob, fill = Sexo)) +
    geom_col(position = "stack", alpha = 0.7) + 
    coord_flip() +
  # Asignar colores
    scale_fill_manual(values = c("midnightblue", "darkred")) +
  theme_bw()+
  # leyenda
    theme(
      legend.position = "bottom",
      text = element_text(family = "Candara")) +
    facet_wrap(~ NOM_MUN, ncol=2) +
  # etiquetas 
    scale_y_continuous(labels = abs) +
    labs(
      y = "Población",
      x = "Grupos de edad, en años",
      title = "Pirámide de población municipios metropolitanos conurbados, 2020", 
      subtitle = "Grupos quinquenales de edad, menores de 65 años",
      caption = "Fuente: Censo General de Población y Vivienda, INEGI, 2020")

##Pirámides de población municipios metropolitanos conurbados, excepto el municipio de Puebla, 2020

#Unir la información de los tres censos para hacer el face_wrap por año
# Se buscó cuál era la función para unir filas = rbind
piramides <- rbind(piramide00, piramide10, piramide20)  %>%
#Filtro para sacar valores grupos de edad mayores de 65 años, ya que las tres bases de datos tienen cortes diferentes
  filter(!(GrupoEdad %in% c("65_69","70_74","65_69","70_74","75_79","80_84","85_89","90_94","95_99","65_y_mas","75_y_mas","100_y_mas")))

piramides %>%
  #Filtro para el área metropolitana
  filter(CVE_MUN %in% c("015","034","041","074","090","106","114","119","140")) %>%
    ggplot(aes(x = GrupoEdad, y = Pob/1000, fill = Sexo)) +
    geom_col(position = "stack", alpha = 0.7) + 
    coord_flip() +
  # Asignar colores
    scale_fill_manual(values = c("midnightblue", "darkred")) +
  theme_gray()+
  # leyenda
    theme(
      legend.position = "bottom",
      text = element_text(family = "Candara")) +
    facet_wrap(~ year, ncol=3) +
  # etiquetas 
    scale_y_continuous(labels = abs) +
    labs(
      y = "Población en millares",
      x = "Grupos de edad, en años",
      title = "Pirámide de población Área Metropolitana de Puebla, años 2000, 2010, 2020", 
      subtitle = "Grupos quinquenales de edad, menores de 65 años",
      caption = "Fuente: Censo General de Población y Vivienda, INEGI, 2020")

#Unir la información de los tres censos para hacer el face_wrap por año
# Se buscó cuál era la función para unir filas = rbind
piramides <- rbind(piramide00, piramide10, piramide20)  %>%
#Filtro para sacar valores grupos de edad mayores de 65 años, ya que las tres bases de datos tienen cortes diferentes
  filter(!(GrupoEdad %in% c("65_69","70_74","65_69","70_74","75_79","80_84","85_89","90_94","95_99","65_y_mas","75_y_mas","100_y_mas")))

piramides %>%
  #Filtro para el área metropolitana, solamente los 4 municipios más grandes
  filter(CVE_MUN %in% c("041","114","119","140")) %>%
    ggplot(aes(x = GrupoEdad, y = Pob/1000, fill = Sexo)) +
    geom_col(position = "stack", alpha = 0.7, scale = "NULL") + 
    coord_flip() +
  # Asignar colores
    scale_fill_manual(values = c("midnightblue", "darkred")) +
  theme_gray()+
  # leyenda
    theme(axis.title.x=element_blank(), axis.text.x=element_blank(),
      legend.position = "bottom",
      text = element_text(family = "Candara")) +
  #Cuadricula de pirámides por Municipio y año
  facet_grid(vars(year), vars(NOM_MUN))