Análisis Poblacional mediante los gráficos tipo pirámide poblacional

Se hace lectura de los datos del Tercer Censo Nacional Agropecuario del DANE en 2014, para las veredas Gualas Bajo Humadea, Alta mira, La Castañeda, Chaparral, Guaranana y Union, todas del municipio de San Martín, departamento de Meta, Colombia.

datos <- read.csv2("CNA2014_S15P_50.csv")

library(dplyr)
library(ggplot2)
library(plyr)
library(reshape2)
library(patchwork)


veredasAOI <- filter(datos,COD_VEREDA==50689006 | COD_VEREDA==50689007 | COD_VEREDA==50689011
                     | COD_VEREDA==50689012 | COD_VEREDA==50689013 | COD_VEREDA==50689014)


veredasAOI <- select(veredasAOI, PAIS, ENCUESTA, COD_VEREDA, P_S15P168, P_S15P169)

colnames(veredasAOI) <- c("Pais","Encuesta","Cod_vereda","Sexo","Edad")

iterador <- c(50689006,50689007,50689011,50689012,50689013,50689014)
veredas <- c("Gualas Bajo Humadea","Alta mira","La Castaneda","Chaparral","Guaranana","Union")

Nomb_vereda <- c()

for(i in 1:length(veredasAOI$Cod_vereda)){
    for(j in 1:length(iterador)){
        if(veredasAOI$Cod_vereda[i] == iterador[j]){
            Nomb_vereda[i] <- veredas[j]
        }else{
            next
        }
    }
}

veredasAOI$Nomb_vereda <- Nomb_vereda
Hombres <- veredasAOI[which(veredasAOI$Sexo == 1),]
Mujeres <- veredasAOI[which(veredasAOI$Sexo == 2),]


veredas <- c("Gualas Bajo Humadea","Alta mira","La Castaneda","Chaparral","Guaranana","Union")


mi_lista <- list()

for(k in veredas){
    mi_lista[[k]] <- filter(Hombres,Nomb_vereda==k)
}


nuevos <- data.frame()


for(j in 1:length(mi_lista)){
    
    conteo0_9 <- 0
    conteo10_19 <- 0
    conteo20_29 <- 0
    conteo30_39 <- 0
    conteo40_49 <- 0
    conteo50_59 <- 0
    conteo60_69 <- 0
    conteo70_79 <- 0
    conteo80 <- 0
    
    for(i in (mi_lista[[j]]$Edad)){
        
        if(i < 10){
            conteo0_9 = conteo0_9 + 1
        }
        else if(i > 9 & i < 20){
            conteo10_19 = conteo10_19 + 1
        }
        else if(i > 19 & i < 30){
            conteo20_29 = conteo20_29 + 1        
        }
        else if(i > 29 & i < 40){
            conteo30_39 = conteo30_39 + 1
        }
        else if(i > 39 & i < 50){
            conteo40_49 = conteo40_49 + 1
        }
        else if(i > 49 & i < 60){
            conteo50_59 = conteo50_59 + 1
        }
        else if(i > 59 & i < 70){
            conteo60_69 = conteo60_69 + 1
        }
        else if(i > 69 & i < 80){
            conteo70_79 = conteo70_79 + 1
        }
        else if(i > 79){
            conteo80 = conteo80 + 1
        }
        else(next)
        
}
    
nuevos <- rbind(nuevos,data.frame(Vereda=rep(names(mi_lista[j]),9),Genero=rep("Masculino",9),Edad=c("0-9","10-19","20-29","30-39","40-49","50-59","60-69","70-79",">80") , cantidad=-1*c(conteo0_9,conteo10_19,conteo20_29,conteo30_39,conteo40_49,conteo50_59,conteo60_69,conteo70_79,conteo80)))
    next
    
}


## Femenino



mi_lista <- list()

for(k in veredas){
    mi_lista[[k]] <- filter(Mujeres,Nomb_vereda==k)
}


nuevos2 <- data.frame()


for(j in 1:length(mi_lista)){
    
    conteo0_9 <- 0
    conteo10_19 <- 0
    conteo20_29 <- 0
    conteo30_39 <- 0
    conteo40_49 <- 0
    conteo50_59 <- 0
    conteo60_69 <- 0
    conteo70_79 <- 0
    conteo80 <- 0
    
    for(i in (mi_lista[[j]]$Edad)){
        
        if(i < 10){
            conteo0_9 = conteo0_9 + 1
        }
        else if(i > 9 & i < 20){
            conteo10_19 = conteo10_19 + 1
        }
        else if(i > 19 & i < 30){
            conteo20_29 = conteo20_29 + 1        
        }
        else if(i > 29 & i < 40){
            conteo30_39 = conteo30_39 + 1
        }
        else if(i > 39 & i < 50){
            conteo40_49 = conteo40_49 + 1
        }
        else if(i > 49 & i < 60){
            conteo50_59 = conteo50_59 + 1
        }
        else if(i > 59 & i < 70){
            conteo60_69 = conteo60_69 + 1
        }
        else if(i > 69 & i < 80){
            conteo70_79 = conteo70_79 + 1
        }
        else if(i > 79){
            conteo80 = conteo80 + 1
        }
        else(next)
        
}
    
nuevos2 <- rbind(nuevos2,data.frame(Vereda=rep(names(mi_lista[j]),9),Genero=rep("Femenino",9),Edad=c("0-9","10-19","20-29","30-39","40-49","50-59","60-69","70-79",">80"), cantidad=c(conteo0_9,conteo10_19,conteo20_29,conteo30_39,conteo40_49,conteo50_59,     conteo60_69,conteo70_79,conteo80)))
    next
    
}

La base de datos debe quedar organizada de la siguiente manera:

datos <- rbind(nuevos,nuevos2)
datos$Edad <- factor(datos$Edad,levels = datos$Edad, labels=datos$Edad)
head(datos,12)
##                 Vereda    Genero  Edad cantidad
## 1  Gualas Bajo Humadea Masculino   0-9      -23
## 2  Gualas Bajo Humadea Masculino 10-19      -27
## 3  Gualas Bajo Humadea Masculino 20-29      -27
## 4  Gualas Bajo Humadea Masculino 30-39      -14
## 5  Gualas Bajo Humadea Masculino 40-49      -33
## 6  Gualas Bajo Humadea Masculino 50-59      -33
## 7  Gualas Bajo Humadea Masculino 60-69      -15
## 8  Gualas Bajo Humadea Masculino 70-79       -7
## 9  Gualas Bajo Humadea Masculino   >80       -4
## 10           Alta mira Masculino   0-9       -4
## 11           Alta mira Masculino 10-19       -4
## 12           Alta mira Masculino 20-29       -2

Los valores del género masculino se dejan en negativo para poder acomodarlo en el gráfico de la pirámide poblacional.

veredas <- c("Gualas Bajo Humadea","Alta mira","La Castaneda","Chaparral","Guaranana","Union")

ListaDatos <- list()

for(j in veredas){
    ListaDatos[[j]] <- filter(datos,Vereda==j)
}

ListaGraficos <- list()

for(i in 1:length(ListaDatos)){
    ListaGraficos[[i]] <- ggplot(ListaDatos[[i]],aes(x=Edad,y=cantidad, fill=Genero))+
        geom_bar(stat="identity",width = 0.7)+
        scale_fill_manual(values = c("#FF6666","#26ABDD"))+
        scale_y_continuous(limit = c(-35,35),breaks=seq(-40,40,10),labels = as.character(c(40,30,20,10,0,10,20,30,40)))+
        coord_flip()+
        theme_bw()+
        xlab("Edad (años)")+
        ylab("Número de personas")+
        ggtitle(paste(i,") ", veredas[i]))+
        theme(plot.title = element_text(hjust = 0.5))+
        theme(legend.position = "bottom")

}


Collage <- (ListaGraficos[[1]]+ListaGraficos[[2]]) / (ListaGraficos[[3]]+ListaGraficos[[4]]) / 
    (ListaGraficos[[5]]+ListaGraficos[[6]])+
    plot_annotation(title = 'Pirámide poblacional por vereda de la zona de estudio',theme = theme(plot.title = element_text(size = 18)))&
    theme(plot.title = element_text(hjust = 0.5),plot.background = element_rect(fill="white"))


ggsave("Collage.png", plot=Collage,width = 30,height = 37.5,units="cm")

Finalmente, la pirámide poblacional por vereda queda así: