Este taller tiene como objetivo hacer uso de las librerías dplyr, arrow y duckdb para realizar diferentes tipos de análisis en la data obtenida del censo nacional de población y vivienda realizado en el año 2018.
library(arrow)
##
## Attaching package: 'arrow'
## The following object is masked from 'package:utils':
##
## timestamp
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(duckdb)
## Loading required package: DBI
library(reshape2)
library(DBI)
library(readxl)
library(knitr)
Posteriormente, se procede a realizar la carga de los archivos parquet
#setwd("C:/Users/yulie/OneDrive/Documentos/Semestre 3/Big Data/censo_unificado")
setwd("C:/Users/yulie/OneDrive/Documentos/Semestre 3/Big Data/Censo_unificado/parquet")
df_viviendas_lz <-open_dataset("viviendas")
df_personas_lz <-open_dataset("personas")
df_hogares_lz <-open_dataset("hogares")
Finalizado este proceso, ya se pueden realizar diferentes análisis respecto a la data completa del censo.
Para realizar este análisis, se hace uso de la variable UA_CLASE de la base de viviendas, que es la que nos presenta la información de zona. Debido a que presenta 4 opciones, se parametriza para agrupar los valores de las variables en urbana o rural.
df_viviendas_lz2 <- df_viviendas_lz %>%select(COD_ENCUESTAS, UA_CLASE) %>% mutate(tipo_vivienda = ifelse(UA_CLASE %in% c("1","2"),"Urbana","Rural"))
Asimismo se carga el dataframe con el diccionario de datos de los diferentes grupos étnicos.
Grupo_etnia <- read_excel("C:/Users/yulie/OneDrive/Documentos/Semestre 3/Big Data/Censo_unificado/parquet/Grupo_etnico.xlsx")
grupos_etnias<-df_personas_lz %>% select(COD_ENCUESTAS, UA_CLASE,PA1_GRP_ETNIC )%>% right_join(Grupo_etnia)
Definido lo anterior, se procede a hacer el pipeline que permite identificar cual es la cantidad de población indígenas y afrocolombiana del área urbana y del área rural.
consulta_etnia <- grupos_etnias %>% right_join(df_viviendas_lz2) %>% select(COD_ENCUESTAS, UA_CLASE, PA1_GRP_ETNIC, Nombre_Grupo, tipo_vivienda) %>% filter(PA1_GRP_ETNIC==1 | PA1_GRP_ETNIC==5)%>% select(-COD_ENCUESTAS) %>% group_by(tipo_vivienda,Nombre_Grupo) %>% summarise(cuenta = n()) %>% collect()
consultaetnia_P <- dcast(data = consulta_etnia, formula =tipo_vivienda~Nombre_Grupo, value.var ="cuenta")%>% mutate(Proporción_Indigena=Indígena/sum(Indígena)*100) %>% mutate(Proporción_Afro=Afrodescendiente/sum(Afrodescendiente)*100) %>%select(1,2,5,3,4) %>% collect()
consultaetnia_P
## tipo_vivienda Afrodescendiente Proporción_Afro Indígena Proporción_Indigena
## 1 Rural 422877 14.33242 1282810 67.3095
## 2 Urbana 2527615 85.66758 623028 32.6905
Para este análisis se debe hacer uso los dos grupos de datos correspondientes a viviendas y personas.
consulta_estrato <- df_viviendas_lz %>% select(COD_ENCUESTAS, VA1_ESTRATO) %>%
right_join(df_personas_lz %>% select(COD_ENCUESTAS)) %>% filter( VA1_ESTRATO !=9 & VA1_ESTRATO !=0)%>% group_by(VA1_ESTRATO) %>% summarise(Frecuencia = n()) %>% collect() %>% mutate(Freq_relativa = (Frecuencia/sum(Frecuencia))*100) %>% arrange(desc(VA1_ESTRATO))
Obteniendo como resultado:
consulta_estrato
## # A tibble: 6 × 3
## VA1_ESTRATO Frecuencia Freq_relativa
## <dbl> <int> <dbl>
## 1 6 428676 1.03
## 2 5 789266 1.90
## 3 4 2093697 5.03
## 4 3 7997384 19.2
## 5 2 14137367 34.0
## 6 1 16169801 38.9
Para el siguiente análisis se hace uso de Duckdb y se realiza la consulta con lenguaje SQL. Aquí se hace uso únicamente del grupo de datos “Personas”
con3 <- DBI::dbConnect(duckdb::duckdb(),dbdir = "bd_col_personas")
df_personas_duck <- to_duckdb(df_personas_lz, con3,"personasColombia_duck")
sql_bogotanos <- "
SELECT U_DPTO, P_NIVEL_ANOSR, count(*) as Cantidad
FROM personasColombia_duck
WHERE U_DPTO = 11 AND P_EDADR > 6 AND P_NIVEL_ANOSR <>99 AND P_NIVEL_ANOSR <>10
GROUP BY U_DPTO,P_NIVEL_ANOSR
ORDER BY Cantidad DESC
"
consulta_bta <- dbGetQuery(con3, sql_bogotanos)
Posteriormente, se obtiene la proporción de cada uno de los niveles de educación:
consulta_bta %>% mutate(Nivel=case_when(P_NIVEL_ANOSR %in% c(1,2)~"Primaria o menos",P_NIVEL_ANOSR %in% c(3,4,5,6)~"Bachiller",P_NIVEL_ANOSR %in% c(7,8,9)~"Educación Superior o Posgrado"))%>% select(Nivel,Cantidad) %>% group_by(Nivel) %>% summarise(Total_grupo=sum(Cantidad)) %>% mutate(Proporcion_bta = (Total_grupo/sum(Total_grupo))*100) %>% arrange(desc(Total_grupo))
## # A tibble: 3 × 3
## Nivel Total_grupo Proporcion_bta
## <chr> <dbl> <dbl>
## 1 Educación Superior o Posgrado 1509993 40.4
## 2 Bachiller 1451412 38.8
## 3 Primaria o menos 774871 20.7
consulta_bta
## U_DPTO P_NIVEL_ANOSR Cantidad
## 1 11 4 958782
## 2 11 2 773196
## 3 11 8 687206
## 4 11 7 459778
## 5 11 3 406718
## 6 11 9 363009
## 7 11 5 67059
## 8 11 6 18853
## 9 11 1 1675
El siguiente análisis requiere usar el conjunto relacionado a hogares y el relacionado a viviendas, para finalmente calcular el promedio de personas por hogar en cada estrato
consulta_hogares <- df_viviendas_lz %>% select(COD_ENCUESTAS, VA1_ESTRATO) %>%
right_join(df_hogares_lz %>% select(COD_ENCUESTAS, HA_TOT_PER)) %>% filter( VA1_ESTRATO !=9 & VA1_ESTRATO !=0)%>% select(-COD_ENCUESTAS) %>% group_by(VA1_ESTRATO) %>% summarise(Personas_hogar = mean(HA_TOT_PER))%>% arrange(desc(Personas_hogar)) %>% collect()
consulta_hogares
## # A tibble: 6 × 2
## VA1_ESTRATO Personas_hogar
## <dbl> <dbl>
## 1 1 3.28
## 2 2 3.06
## 3 3 2.90
## 4 4 2.64
## 5 5 2.60
## 6 6 2.58
Para hacer el cálculo de la tabla solicitada, se importa el diccionario de los datos del nivel educativo y los estratos, para realizar un join por el ID de la encuesta:
Nivel_educativo <- read_excel("C:/Users/yulie/OneDrive/Documentos/Semestre 3/Big Data/Censo_unificado/parquet/Nivel_educativo.xlsx")
Estratos <- read_excel("C:/Users/yulie/OneDrive/Documentos/Semestre 3/Big Data/Censo_unificado/parquet/Estratos.xlsx")
grupos_nivel_edu<-df_personas_lz %>% select(COD_ENCUESTAS,P_NIVEL_ANOSR)%>% right_join(Nivel_educativo)
estratificacion<-df_viviendas_lz %>% select(COD_ENCUESTAS,VA1_ESTRATO)%>% right_join(Estratos)
consulta_est_educ <- grupos_nivel_edu %>% select(COD_ENCUESTAS,P_NIVEL_ANOSR,Nivel_Educativo) %>% right_join(estratificacion %>% select(COD_ENCUESTAS, VA1_ESTRATO,ESTRATO)) %>% select(-COD_ENCUESTAS) %>% mutate(Nivel_edu=case_when(P_NIVEL_ANOSR %in% c(1,2)~"Primaria o menos",P_NIVEL_ANOSR %in% c(3,4,5,6)~"Bachiller",P_NIVEL_ANOSR %in% c(7,8,9)~"Educación Superior o Posgrado")) %>% filter( VA1_ESTRATO !=9 & VA1_ESTRATO !=0 & P_NIVEL_ANOSR!= 10 & P_NIVEL_ANOSR!= 99)%>% group_by(ESTRATO,Nivel_edu) %>% summarise(cantidad = n()) %>% collect()
est_edu_pivot<-dcast(data = consulta_est_educ, formula =Nivel_edu~ESTRATO,
value.var ="cantidad")
proporcion_edu<-est_edu_pivot %>% mutate(Freq_R_E1=(Estrato_1/sum(Estrato_1)*100))%>% mutate(Freq_R_E2=(Estrato_2/sum(Estrato_2)*100))%>% mutate(Freq_R_E3=(Estrato_3/sum(Estrato_3)*100))%>% mutate(Freq_R_E4=(Estrato_4/sum(Estrato_4)*100))%>% mutate(Freq_R_E5=(Estrato_5/sum(Estrato_5)*100))%>% mutate(Freq_R_E6=(Estrato_6/sum(Estrato_6)*100)) %>% rename(Frec_est_1=Estrato_1,Frec_est_2=Estrato_2,Frec_est_3=Estrato_3,Frec_est_4=Estrato_4,Frec_est_5=Estrato_5,Frec_est_6=Estrato_6) %>% select(1,2,8,3,9,4,10,5,11,6,12,7,13)
totales <-proporcion_edu %>% summarise(across(2:13,sum))
consulta_totales <-proporcion_edu %>% add_row(totales)
El resultado del análisis realizado muestra la siguiente tabla, donde se muestra la frecuencia del nivel educativo (Frec_est) y la proporción de la misma (Freq_r_)
knitr::kable(consulta_totales)
| Nivel_edu | Frec_est_1 | Freq_R_E1 | Frec_est_2 | Freq_R_E2 | Frec_est_3 | Freq_R_E3 | Frec_est_4 | Freq_R_E4 | Frec_est_5 | Freq_R_E5 | Frec_est_6 | Freq_R_E6 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Bachiller | 6449491 | 47.017595 | 6024518 | 47.56202 | 3034238 | 41.40827 | 521586 | 27.04579 | 172056 | 23.56473 | 81385 | 20.56714 |
| Educación Superior o Posgrado | 1340939 | 9.775613 | 2572826 | 20.31180 | 2745418 | 37.46674 | 1159730 | 60.13547 | 478009 | 65.46795 | 272337 | 68.82341 |
| Primaria o menos | 5926756 | 43.206792 | 4069314 | 32.12619 | 1547957 | 21.12498 | 247213 | 12.81873 | 80077 | 10.96732 | 41982 | 10.60945 |
| NA | 13717186 | 100.000000 | 12666658 | 100.00000 | 7327613 | 100.00000 | 1928529 | 100.00000 | 730142 | 100.00000 | 395704 | 100.00000 |
¿En qué estrato socioeconómico está la gente más educada? Las personas con Educación Superior o Posgrado representan la mayor parte de la población de los estratos 5 (65.5.%) y 6 (68.8%).