Introducción

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.

Carga de información y librerías

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.

1. Calcular la proporción de indígenas, afrocolombianos por área urbana y rural

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

2. Utilice la tabla de viviendas y calcule la tabla de frecuencias y relativas

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

3. Calcule con arrow y duckdb la proporción de bogotanos mayores (estricto) de 25 años que han alcanzado el siguiente máximo nivel educativo: primaria o menos, bachiller, técnica profesional/tecnológica o educación superior o posgrado:

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

4. Calcule el número de personas por hogar por nivel socioeconómico

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

5. Calcular la siguiente tabla:

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%).