Agregación de Datos del Censo de Población y Vivienda 2012 por Municipio
Author
JTRO43
Published
May 15, 2025
Introducción
El censo de población y vivienda 2012 (CPV 2012) fue un censo de hecho con cobertura nacional y absoluta, es decir que se visitaron todas las viviendas, independientemente de que esta haya estado ocupada o no. Los datos de cada vivienda del CPV 2012 se agregaron en una base de datos única donde cada fila representa una vivienda y cada columna representa o un valor de localización de la vivienda o una de las respuestas a cada una de las preguntas del censo referidas a la vivienda. La base de datos original está en formato “.sav” el cual es nativo y propio de SPSS.
La intención del presente script es la de extraer los valores de una o varias preguntas de interés del CPV 2012 y agregar los datos a nivel de localidad y/o municipal en función de un archivo (csv, tsv, xls, xlsx o txt) que contenga la codificación de los municipios a ser utilizada, optimizando el manejo de la memoria por parte de R. El script eventualmente podría ser utilizado para todas las preguntas de este censo u otros censos con estructuración de datos similar. Los datos de viviendas del Censo de Población y Vivienda 2012 disponibles en: https://censo.ine.gob.bo/cuestionarios-censales/.
Preprocesamiento
Importación de librerías requeridas:
Code
# Preprocesamiento # Sección de preparación inicial.# Cargar paquetes necesarios.library(tidyverse) # Carga el conjunto de paquetes 'tidyverse' (incluye dplyr, ggplot2, etc.) para manipulación y visualización de datos.
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.5
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 3.5.2 ✔ tibble 3.2.1
✔ lubridate 1.9.4 ✔ tidyr 1.3.1
✔ purrr 1.0.4
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Code
library(writexl) # Carga el paquete 'writexl' para escribir archivos Excel (.xlsx).library(arrow) # Carga el paquete 'arrow' para leer archivos Parquet (.parquet).
Attaching package: 'arrow'
The following object is masked from 'package:lubridate':
duration
The following object is masked from 'package:utils':
timestamp
Librerías Utilizadas.
Lectura de la base de datos de boletas censales:
Code
## Read the parquet file # Leer el archivo de datos de viviendas.dtib2 <-read_parquet("CENSO_2012_VIV_corr_com_local_code.parquet") # Lee el archivo Parquet especificado y lo guarda en la variable 'dtib2'. Asume que el archivo está en esa ruta.## Get a glimpse of dtib # Obtener un resumen rápido de los datos.summary(dtib2) # Muestra un resumen estadístico de cada columna en el dataframe 'dtib2'.
I02_DEPTO I03_PROV I04_SECC I06_CIUCOM
Length:3172321 Length:3172321 Length:3172321 Length:3172321
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
I05_DIST I07_ZONAC I22_LOCALIDAD I08_SECTOR
Length:3172321 Length:3172321 Length:3172321 Length:3172321
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
I09_SEGM I10_MANZ ID_UNICO I00_FOLIO
Length:3172321 Length:3172321 Length:3172321 Length:3172321
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
I_BC_VIV
Length:3172321
Class :character
Mode :character
P01_TIPOVIV
Casa / Choza / Pahuichi :2544747
Cuarto(s) o habitación(es) suelta(s) : 365384
Departamento : 154584
Vivienda colectiva (Hoteles, Hospitales, Asilos, Cuarteles, Otros): 34182
Local no destinado para vivienda : 32739
Vivienda improvisada : 27714
(Other) : 12971
P02_CONDOCUPA
0 : 25285
Vivienda ocupada con personas presentes :2778697
Vivienda ocupada con personas temporalmente ausentes: 178694
Vivienda desocupada para alquilar y/o vender : 19153
Vivienda desocupada en construcción o reparación : 36732
Vivienda abandonada : 86607
NA's : 47153
P03_PARED P04_REVOQ
Ladrillo, bloque de cemento, hormigón:1462533 Si :2123375
Adobe, tapial :1048395 No : 680607
Madera : 167806 NA's: 368339
Tabique,quinche : 36657
Piedra : 33095
(Other) : 55496
NA's : 368339
P05_TECHO P06_PISOS
Calamina o plancha metálica :1488363 Cemento :1041333
Teja de arcilla, teja de cemento, fibrocemento: 781503 Tierra : 839651
Losa de hormigón armado : 173447 Cerámica : 437277
Paja, palma, caña, barro : 305738 Machihembre: 142585
Otro : 54931 Ladrillo : 128597
NA's : 368339 (Other) : 214539
NA's : 368339
P07_AGUAPRO
Cañería de red :1915226
Lluvia, río, vertiente, acequia: 242962
Pileta pública : 240983
Pozo o noria sin bomba : 193998
Pozo o noria con bomba : 101378
(Other) : 109435
NA's : 368339
P08_AGUADIST
Por cañería dentro la vivienda :1362581
Por cañería fuera de la vivienda , pero dentro del lote o terreno: 823386
Por cañería fuera de la vivienda, del lote o terreno : 65986
No se distribuye por cañería : 552029
Ignorado : 0
NA's : 368339
P09_SERVSANIT P10_DESAGUE
Si, de uso privado :1076725 Al alcantarillado :1129113
Si, de uso compartido: 882089 A una cámara séptica : 226215
No tiene : 845168 A un pozo ciego : 590709
NA's : 368339 A la calle : 5373
A la quebrada, río : 6581
A un lago, laguna, curichi: 823
NA's :1213507
P11_ENERGIA
Red de empresa eléctrica (servicio público):2225608
Motor propio : 25971
Panel solar : 31544
Otra : 24196
No tiene : 496663
NA's : 368339
P12_COMBUS P13_COCINA P14_HABITAC
Gas en garrafa :1698602 Sí :2100252 1 :898479
Leña : 664304 No : 703730 2 :700567
Gas domiciliario (por cañería): 312869 NA's: 368339 3 :512537
Guano, bosta o taquia : 56472 4 :338100
No cocina : 49295 5 :158037
(Other) : 22440 (Other):196262
NA's : 368339 NA's :368339
P15_DORMIT
1 :1502846
2 : 698315
3 : 374423
4 : 146183
5 : 46750
(Other): 35465
NA's : 368339
P16_BASURA
Utilizan el servicio público de recolección (carro basurero):1239713
La queman : 640357
La depositan en el basurero público o contenedor : 376688
La botan en un terreno baldío o en la calle : 196625
La botan al río : 195794
(Other) : 154805
NA's : 368339
P17A_RADIO P17B_TV P17C_COMPUT P17D_INTERNET P17E_TELEF
Si :2117300 Si :1864461 Si : 662683 Si : 268334 Si :1825374
No : 686682 No : 939521 No :2141299 No :2535648 No : 978608
NA's: 368339 NA's: 368339 NA's: 368339 NA's: 368339 NA's: 368339
P18A_VEHIC P18B_BICIC P18C_MOTO P18D_CARRETA P18E_BOTE
Si : 614383 Si : 854404 Si : 319813 Si : 112619 Si : 23826
No :2189599 No :1949578 No :2484169 No :2691363 No :2780156
NA's: 368339 NA's: 368339 NA's: 368339 NA's: 368339 NA's: 368339
P19_TENENCIA P20A_EMIGRA P20B_EMIGPERS
Propia :1954913 Si : 310182 Min. :1.00
Alquilada : 455081 No :2493800 1st Qu.:1.00
Prestada por parientes o amigos: 189015 NA's: 368339 Median :1.00
En contrato anticrético : 87068 Mean :1.58
Cedida por servicios : 65443 3rd Qu.:2.00
(Other) : 52462 Max. :4.00
NA's : 368339 NA's :2862139
P21A_MORTA P21B_MORTPERS P22A_DISCAPACIDAD URBRUR
Si : 127327 Min. :0.00 Si : 287667 Área Urbana:2024299
No :2676655 1st Qu.:0.00 No :2516315 Área Rural :1148022
NA's: 368339 Median :0.00 NA's: 368339
Mean :0.05
3rd Qu.:0.00
Max. :4.00
NA's :368339
TOTPERS_VIV TOT_HOMBRES_VIV TOT_MUJERES_VIV NOMBRE_COMUNIDAD
Min. : 1.00 Min. : 1.00 Min. : 1.00 Length:3172321
1st Qu.: 2.00 1st Qu.: 1.00 1st Qu.: 1.00 Class :character
Median : 3.00 Median : 2.00 Median : 2.00 Mode :character
Mean : 3.53 Mean : 2.04 Mean : 2.14
3rd Qu.: 5.00 3rd Qu.: 3.00 3rd Qu.: 3.00
Max. :544.00 Max. :491.00 Max. :253.00
NA's :321186 NA's :716279 NA's :812876
PROV MUN
Murillo : 548554 Santa Cruz de la Sierra: 396565
Andrés Ibañez : 449009 El Alto : 280321
Cercado : 195775 La Paz : 249120
Cercado_duplicated_0401: 104637 Cochabamba : 195775
Quillacollo : 99272 Oruro : 88609
Chapare : 94229 Sucre : 77759
(Other) :1680845 (Other) :1884172
Agua_OK Saneamiento_OK Electricidad_OK Num_Serv_Basic
Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.000
1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.000
Median :1.0000 Median :0.0000 Median :1.0000 Median :2.000
Mean :0.6037 Mean :0.3559 Mean :0.7021 Mean :1.662
3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:3.000
Max. :1.0000 Max. :1.0000 Max. :1.0000 Max. :3.000
filter_$ ElecOK AguaOK SanOK
Not Selected: 346471 Min. :0.0000 Min. :0.0000 Min. :0.0000
Selected :2778697 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000
NA's : 47153 Median :1.0000 Median :1.0000 Median :1.0000
Mean :0.7273 Mean :0.7117 Mean :0.6134
3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:1.0000
Max. :1.0000 Max. :1.0000 Max. :1.0000
NumServicios PERS_DORM DUM_HACINAMIENTO PERS_HAB
Min. :0.000 Min. : 0.12 Min. :0.0000 Min. : 0.12
1st Qu.:1.000 1st Qu.: 1.00 1st Qu.:0.0000 1st Qu.: 1.00
Median :3.000 Median : 2.00 Median :0.0000 Median : 1.33
Mean :2.052 Mean : 2.31 Mean :0.2203 Mean : 1.78
3rd Qu.:3.000 3rd Qu.: 3.00 3rd Qu.:0.0000 3rd Qu.: 2.00
Max. :3.000 Max. :25.00 Max. :1.0000 Max. :25.00
NA's :372820 NA's :368339
DEP_CODE DEP_CODE_CHAR LOCAL_CODE
Min. :1.000 Length:3172321 Length:3172321
1st Qu.:2.000 Class :character Class :character
Median :3.000 Mode :character Mode :character
Mean :4.076
3rd Qu.:7.000
Max. :9.000
Extracción de datos para las preguntas 7, 8 y 9 del CPV 2012:
Code
# Data Extraction for Questions 7, 8, 9 and 10 of 2012 Census # Sección para extraer datos relevantes.## Water Access # Subsección para datos de acceso a agua.### Water Tibble # Crear tabla (tibble) con datos de agua.water_tib <- dtib2 %>%# Inicia una cadena de operaciones sobre 'dtib2'.select(I02_DEPTO, # Selecciona la columna código de departamento. DEP_CODE, # Selecciona la columna código de departamento (parece duplicado o alternativo). I03_PROV, # Selecciona la columna código de provincia. I04_SECC, # Selecciona la columna código de sección municipal. I06_CIUCOM, # Selecciona la columna código de ciudad/comunidad. LOCAL_CODE, # Selecciona la columna código de localidad (probablemente un identificador único). NOMBRE_COMUNIDAD, # Selecciona la columna nombre de la comunidad/localidad. P07_AGUAPRO, # Selecciona la columna con la respuesta a la pregunta 7 (procedencia del agua). P08_AGUADIST, # Selecciona la columna con la respuesta a la pregunta 7 (procedencia del agua) TOT_HOMBRES_VIV, # Selecciona la columna con el valor de la cantidad de hombres en la vivienda) TOT_MUJERES_VIV, # Selecciona la columna con el valor de la cantidad de mujeres en la vivienda) TOTPERS_VIV) # Selecciona la columna con el valor de la cantidad total de personas en la vivienda). # El resultado se guarda en 'water_tib'.### Water Tibble Summary # Resumen de la tabla de agua.summary(water_tib) # Muestra un resumen estadístico de la tabla 'water_tib'.
I02_DEPTO DEP_CODE I03_PROV I04_SECC
Length:3172321 Min. :1.000 Length:3172321 Length:3172321
Class :character 1st Qu.:2.000 Class :character Class :character
Mode :character Median :3.000 Mode :character Mode :character
Mean :4.076
3rd Qu.:7.000
Max. :9.000
I06_CIUCOM LOCAL_CODE NOMBRE_COMUNIDAD
Length:3172321 Length:3172321 Length:3172321
Class :character Class :character Class :character
Mode :character Mode :character Mode :character
P07_AGUAPRO
Cañería de red :1915226
Lluvia, río, vertiente, acequia: 242962
Pileta pública : 240983
Pozo o noria sin bomba : 193998
Pozo o noria con bomba : 101378
(Other) : 109435
NA's : 368339
P08_AGUADIST
Por cañería dentro la vivienda :1362581
Por cañería fuera de la vivienda , pero dentro del lote o terreno: 823386
Por cañería fuera de la vivienda, del lote o terreno : 65986
No se distribuye por cañería : 552029
Ignorado : 0
NA's : 368339
TOT_HOMBRES_VIV TOT_MUJERES_VIV TOTPERS_VIV
Min. : 1.00 Min. : 1.00 Min. : 1.00
1st Qu.: 1.00 1st Qu.: 1.00 1st Qu.: 2.00
Median : 2.00 Median : 2.00 Median : 3.00
Mean : 2.04 Mean : 2.14 Mean : 3.53
3rd Qu.: 3.00 3rd Qu.: 3.00 3rd Qu.: 5.00
Max. :491.00 Max. :253.00 Max. :544.00
NA's :716279 NA's :812876 NA's :321186
Tibble de Saneamiento:
Code
## Sanitation Access # Subsección para datos de saneamiento.### Sanitation Tibble # Crear tabla (tibble) con datos de saneamiento.sanitation_tib <- dtib2 %>%# Inicia una cadena de operaciones sobre 'dtib2'.select(I02_DEPTO, # Selecciona código de departamento. DEP_CODE, # Selecciona código de departamento alternativo/duplicado. I03_PROV, # Selecciona código de provincia. I04_SECC, # Selecciona código de sección municipal. I06_CIUCOM, # Selecciona código de ciudad/comunidad. LOCAL_CODE, # Selecciona código de localidad. NOMBRE_COMUNIDAD, # Selecciona nombre de la comunidad/localidad. P09_SERVSANIT, # Selecciona la respuesta a la pregunta 9 (tenencia de servicio sanitario). P10_DESAGUE) # Selecciona la respuesta a la pregunta 10 (tipo de desagüe). # El resultado se guarda en 'sanitation_tib'.
Agregación de Datos
Extracción de las respuestas existentes a la pregunta 7 del CPV.
Code
# Aggregation of Data at a Municipality Level # Sección para agregar datos (aunque el código agrupa por LOCAL_CODE, no municipio).## Aggregation of Data for Question 7 # Agregar datos de la Pregunta 7.### Extraction of all Unique Values for Question 7 # Obtener respuestas únicas de P7.water_tib %>%# Usa la tabla de agua.distinct(P07_AGUAPRO) %>%# Obtiene filas con valores únicos en la columna P07_AGUAPRO. pull(P07_AGUAPRO) # Extrae esos valores únicos como un vector. # El resultado se imprime en la consola.
[1] Cañería de red Pileta pública
[3] <NA> Lluvia, río, vertiente, acequia
[5] Carro repartidor (aguatero) Pozo o noria con bomba
[7] Lago, laguna, curichi Pozo o noria sin bomba
7 Levels: Cañería de red Pileta pública ... Lago, laguna, curichi
Pregunta 7 del CPV-2012
Agregación de los datos a nivel municipal:
Code
### Creation of the Aggregated data frame for Question 7 # Crear tabla agregada para P7.P07_L_aggregated_tib <- water_tib %>%# Usa la tabla de agua.mutate(P07_AGUAPRO_CHAR =as.character(P07_AGUAPRO)) %>%# Crea una nueva columna convirtiendo P07 a texto. group_by(LOCAL_CODE) %>%# Agrupa las filas por el código de localidad. summarise( # Calcula resúmenes para cada grupo (localidad).Nombre_Localidad =first(NOMBRE_COMUNIDAD), # Toma el primer nombre de comunidad encontrado en el grupo. Cañería_de_red =sum(P07_AGUAPRO_CHAR =="Cañería de red", na.rm =TRUE), # Cuenta cuántas viviendas respondieron "Cañería de red", ignorando NAs. Pileta_pública =sum(P07_AGUAPRO_CHAR =="Pileta pública", na.rm =TRUE), # Cuenta cuántas respondieron "Pileta pública".carro_repartidor_aguatero =sum(P07_AGUAPRO_CHAR =="Carro repartidor (aguatero)", na.rm =TRUE), # Cuenta cuántas respondieron "Carro repartidor (aguatero)". pozo_o_noria_con_bomba =sum(P07_AGUAPRO_CHAR =="Pozo o noria con bomba", na.rm =TRUE), # Cuenta cuántas respondieron "Pozo o noria con bomba". pozo_o_noria_sin_bomba =sum(P07_AGUAPRO_CHAR =="Pozo o noria sin bomba", na.rm =TRUE), # Cuenta cuántas respondieron "Pozo o noria sin bomba". lluvia_río_vertiente_acequia =sum(P07_AGUAPRO_CHAR =="Lluvia, río, vertiente, acequia", na.rm =TRUE), # Cuenta cuántas respondieron "Lluvia, río, vertiente, acequia". lago_laguna_curichi =sum(P07_AGUAPRO_CHAR =="Lago, laguna, curichi", na.rm =TRUE), # Cuenta cuántas respondieron "Lago, laguna, curichi". n_missing_aguapro =sum(is.na(P07_AGUAPRO_CHAR)), # Cuenta cuántos valores NA (faltantes) hay en P07 para esa localidad. n_observations =n() # Cuenta el número total de filas (viviendas) en ese grupo (localidad). ) # El resultado se guarda en 'P07_aggregated_tib'.
Guardar los datos extraídos en formato csv y xlsx:
Code
### Save the data frame as csv # Guardar la tabla agregada como CSV.#write_csv(P07_L_aggregated_tib, "P07_aggregated.csv") # Escribe el contenido de 'P07_L_aggregated_tib' en un archivo CSV. ### Save the data frame as xlsx # Guardar la tabla agregada como XLSX.#write_xlsx(P07_L_aggregated_tib, "P07_aggregated.xlsx") # Escribe el contenido de 'P07_L_aggregated_tib' en un archivo Excel.
Pregunta 8 del CPV 2012
Extracción de las respuestas únicas existentes a la pregunta 8 del CPV.
Code
## Aggregation of Data for Question 8 # Agregar datos de la Pregunta 8.### Extraction of all Unique Values for Question 8 # Obtener respuestas únicas de P8.water_tib %>%# Usa la tabla de agua.distinct(P08_AGUADIST) %>%# Obtiene valores únicos de la columna P08_AGUADIST. pull(P08_AGUADIST) # Extrae esos valores como vector. # El resultado se imprime en la consola.
[1] Por cañería dentro la vivienda
[2] Por cañería fuera de la vivienda , pero dentro del lote o terreno
[3] No se distribuye por cañería
[4] Por cañería fuera de la vivienda, del lote o terreno
[5] <NA>
5 Levels: Por cañería dentro la vivienda ...
Pregunta 8 del CPV-2012
Agregación de los datos a nivel de localidad:
Code
### Creation of the Aggregated data frame for Question 8 # Crear tabla agregada para P8.P08_L_aggregated_tib <- water_tib %>%# Usa la tabla de agua.mutate(P08_AGUADIST_CHAR =as.character(P08_AGUADIST)) %>%# Convierte P08 a texto. group_by(LOCAL_CODE) %>%# Agrupa por localidad. summarise( # Calcula resúmenes por localidad.Nombre_Localidad =first(NOMBRE_COMUNIDAD), # Toma el primer nombre de la localidad. Cañería_dentro_vivienda_dentro_lote =sum(P08_AGUADIST_CHAR =="Por cañería dentro la vivienda", na.rm =TRUE), # Cuenta respuestas "Por cañería dentro la vivienda". Cañería_fuera_vivienda_dentro_lote =sum(P08_AGUADIST_CHAR =="Por cañería fuera de la vivienda , pero dentro del lote o terreno", na.rm =TRUE), # Cuenta respuestas "Por cañería fuera de la vivienda , pero dentro del lote o terreno". [cite: 5, 6] Cañería_fuera_vivienda_fuera_lote =sum(P08_AGUADIST_CHAR =="Por cañería fuera de la vivienda, del lote o terreno", na.rm =TRUE), # Cuenta respuestas "Por cañería fuera de la vivienda, del lote o terreno". n_missing_aguaviv =sum(is.na(P08_AGUADIST_CHAR)), # Cuenta los NAs en P08 para la localidad. n_observations =n() # Cuenta el total de viviendas en la localidad. ) # El resultado se guarda en 'P08_aggregated_tib'.
Guardar los datos extraídos en formato csv y xlsx:
Code
### Guardar como CSV.#write_csv(P08_L_aggregated_tib, "P08_L_aggregated.csv") # Escribe la tabla agregada P08 a CSV. ### Guardar como XLSX.#write_xlsx(P08_L_aggregated_tib, "P08_L_aggregated.xlsx") # Escribe la tabla agregada P08 a Excel.
Pregunta 9 del CPV 2012
Extracción de las respuestas existentes a la pregunta 9 del CPV.
Code
## Aggregation for Question 9 # Agregar datos de la Pregunta 9.### Extraction of all Unique Values for Question 9 # Obtener respuestas únicas de P9.sanitation_tib %>%# Usa la tabla de saneamiento.distinct(P09_SERVSANIT) %>%# Obtiene valores únicos de P09_SERVSANIT. pull(P09_SERVSANIT) # Extrae como vector. # El resultado se imprime en la consola.
[1] Si, de uso compartido No tiene Si, de uso privado
[4] <NA>
Levels: Si, de uso privado Si, de uso compartido No tiene
Pregunta 9 del CPV-2012
Agregación de los datos a nivel de localidad:
Code
### Creation of the Aggregated data frame for Question 9 # Crear tabla agregada para P9.P09_L_aggregated_tib <- sanitation_tib %>%# Usa la tabla de saneamiento.mutate(P09_SERVSANIT_CHAR =as.character(P09_SERVSANIT)) %>%# Convierte P09 a texto. group_by(LOCAL_CODE) %>%# Agrupa por localidad. summarise( # Calcula resúmenes por localidad.Nombre_Localidad =first(NOMBRE_COMUNIDAD), # Toma el primer nombre de la localidad. Baño_compartido =sum(P09_SERVSANIT_CHAR =="Si, de uso compartido", na.rm =TRUE), # Cuenta respuestas "Si, de uso compartido". Baño_privado =sum(P09_SERVSANIT_CHAR =="Si, de uso privado", na.rm =TRUE), # Cuenta respuestas "Si, de uso privado". Sin_baño =sum(P09_SERVSANIT_CHAR =="No tiene", na.rm =TRUE), # Cuenta respuestas "No tiene". n_missing_baños =sum(is.na(P09_SERVSANIT_CHAR)), # Cuenta los NAs en P09 para la localidad. n_observations =n() # Cuenta el total de viviendas en la localidad. ) # El resultado se guarda en 'P09_L_aggregated_tib'.
Guardar los datos extraídos en formato csv y xlsx:
Code
### Guardar como CSV.#write_csv(P09_L_aggregated_tib, "P09_L_aggregated.csv") # Escribe la tabla agregada P09 a CSV. ### Guardar como XLSX.#write_xlsx(P09_L_aggregated_tib, "P09_Laggregated.xlsx") # Escribe la tabla agregada P09 a Excel.
Pregunta 10 del CPV 2012
Extracción de las respuestas existentes a la pregunta 10 del CPV.
Code
## Aggregation for Question 10 # Agregar datos de la Pregunta 10.### Extraction of all Unique Values for Question 10 # Obtener respuestas únicas de P10.sanitation_tib %>%# Usa la tabla de saneamiento.distinct(P10_DESAGUE) %>%# Obtiene valores únicos de P10_DESAGUE. pull(P10_DESAGUE) # Extrae como vector. # El resultado se imprime en la consola.
[1] Al alcantarillado <NA>
[3] A un pozo ciego A la calle
[5] A la quebrada, río A una cámara séptica
[7] A un lago, laguna, curichi
6 Levels: Al alcantarillado A una cámara séptica ... A un lago, laguna, curichi
Pregunta 10 del CPV-2012
Agregación de los datos a nivel de localidad:
Code
### Creation of the Aggregated data frame for Question 10 # Crear tabla agregada para P10.P10_L_aggregated_tib <- sanitation_tib %>%# Usa la tabla de saneamiento.mutate(P10_DESAGUE_CHAR =as.character(P10_DESAGUE)) %>%# Convierte P10 a texto. group_by(LOCAL_CODE) %>%# Agrupa por localidad. summarise( # Calcula resúmenes por localidad.Nombre_Localidad =first(NOMBRE_COMUNIDAD), # Toma el primer nombre de la localidad. Conexion_Alcantarillado =sum(P10_DESAGUE_CHAR =="Al alcantarillado", na.rm =TRUE), # Cuenta respuestas "Al alcantarillado". Pozo_Ciego =sum(P10_DESAGUE_CHAR =="A un pozo ciego", na.rm =TRUE), # Cuenta respuestas "A un pozo ciego". A_Calle =sum(P10_DESAGUE_CHAR =="A la calle", na.rm =TRUE), # Cuenta respuestas "A la calle". A_Rio =sum(P10_DESAGUE_CHAR =="A la quebrada, río", na.rm =TRUE), # Cuenta respuestas "A la quebrada, río". A_Camara_Septica =sum(P10_DESAGUE_CHAR =="A una cámara séptica", na.rm =TRUE), # Cuenta respuestas "A una cámara séptica". A_lago_laguna_curichi =sum(P10_DESAGUE_CHAR =="A un lago, laguna, curichi", na.rm =TRUE), # Cuenta respuestas "A un lago, laguna, curichi". n_missing_sanitation =sum(is.na(P10_DESAGUE_CHAR)), # Cuenta los NAs en P10 para la localidad. n_observations =n(), # Cuenta el total de viviendas en la localidad. COD =first(I06_CIUCOM) ) # El resultado se guarda en 'P10_L_aggregated_tib'.
Guardar los datos extraídos en formato csv y xlsx:
Code
### Guardar como CSV.#write_csv(P10_L_aggregated_tib, "P10_L_aggregated.csv") # Escribe la tabla agregada P10 a CSV. ### Guardar como XLSX.#write_xlsx(P10_L_aggregated_tib, "P10_L_aggregated.xlsx") # Escribe la tabla agregada P10 a Excel.
Cruce de Información con la base de datos de 343 Municipios
A nivel Localidad
Lectura de la base de datos de localidades de los 343 municipios:
Code
# Matching from SDSN localities data set # Sección para cruzar con datos de SDSN.## Importation the SDSN Localities data set # Importar datos de localidades de SDSN.sdsn_localities <-read_csv("R:/SDSN/Datasets/Internal Sources/RO BASE DE DATOS DE POBLACIONES.csv") # Lee un archivo CSV externo y lo guarda en 'sdsn_localities'.
Rows: 19413 Columns: 13
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr (7): Departamento, Provincia, Municipio, Nom_Comunidad, DEPARTAMENTO_343...
dbl (6): Cod_Comunidad, id_unico_r, poblacion_, viviendas_, CODIGO_MUNI, Cod...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Code
## Renombrar la variable para la unión.sdsn_localities <- sdsn_localities %>%# Usa la tabla de SDSN.rename(LOCAL_CODE = Cod_Comunidad) %>%# Renombra la columna 'Cod_Comunidad' a 'LOCAL_CODE'. mutate(LOCAL_CODE =as.character(LOCAL_CODE)) # Convierte la nueva columna 'LOCAL_CODE' a texto.
Unión de las bases de datos generadas y las de SDSN a nivel de localidad:
Code
#Unión para Pregunta 7merged_L_P07_tib <-left_join(P07_L_aggregated_tib, sdsn_localities, by =join_by(LOCAL_CODE))#Unión para Pregunta 8merged_L_P08_tib <-left_join(P08_L_aggregated_tib, sdsn_localities, by =join_by(LOCAL_CODE))#Unión para Pregunta 9merged_L_P09_tib <-left_join(P09_L_aggregated_tib, sdsn_localities, by =join_by(LOCAL_CODE))#Unión para Pregunta 10merged_L_P10_tib <-left_join(P10_L_aggregated_tib, sdsn_localities, by =join_by(LOCAL_CODE))
Detección de errores en la extracción:
Code
## Error Detection### Missing Entries P07missing_entries <- merged_L_P07_tib %>%filter(is.na(MUNICI_343)) %>%select(LOCAL_CODE, Nombre_Localidad, DEPARTAMENTO_343, MUNICI_343)# Entries present in INE DB and not in GeoBolivia DBmissing_2 <-anti_join(P07_L_aggregated_tib,sdsn_localities, by ='LOCAL_CODE')# Entries present in GeoBolivia DB and not in INE DBanti_join(sdsn_localities, P07_L_aggregated_tib, by ='LOCAL_CODE')
# A tibble: 0 × 13
# ℹ 13 variables: Departamento <chr>, Provincia <chr>, Municipio <chr>,
# LOCAL_CODE <chr>, Nom_Comunidad <chr>, id_unico_r <dbl>, poblacion_ <dbl>,
# viviendas_ <dbl>, CODIGO_MUNI <dbl>, DEPARTAMENTO_343 <chr>,
# PROVINCI_343 <chr>, MUNICI_343 <chr>, Codigo_343 <dbl>
Agregación a Nivel Municipal
Agregación Municipal de la Pregunta 7:
Code
## P07 Municipal Aggregation merged_M343_P07_tib <- merged_L_P07_tib %>%group_by(Codigo_343) %>%summarise(Nombre_Municipio =first(MUNICI_343), Cañería_de_red =sum(Cañería_de_red, na.rm =TRUE), Pileta_pública =sum(Pileta_pública, na.rm =TRUE),Carro_repartidor_aguatero =sum(carro_repartidor_aguatero, na.rm =TRUE),Pozo_o_noria_con_bomba =sum(pozo_o_noria_con_bomba, na.rm =TRUE),Pozo_o_noria_sin_bomba =sum(pozo_o_noria_sin_bomba, na.rm =TRUE), Lluvia_río_vertiente_acequia =sum(lluvia_río_vertiente_acequia, na.rm =TRUE),lago_laguna_curichi =sum(lago_laguna_curichi, na.rm =TRUE), n_missing_aguapro =sum(is.na(n_missing_aguapro)), # Counts the NAs found in the Municipalityn_observations =n() # Count the number of rows in each group or total) )
Agregación Municipal de la Pregunta 8:
Code
merged_M343_P08_tib <- merged_L_P08_tib %>%group_by(Codigo_343) %>%summarise(Nombre_Municipio =first(MUNICI_343), Cañería_dentro_vivienda_dentro_lote =sum(Cañería_dentro_vivienda_dentro_lote, na.rm =TRUE), Cañería_fuera_vivienda_dentro_lote =sum(Cañería_fuera_vivienda_dentro_lote, na.rm =TRUE), Cañería_fuera_vivienda_fuera_lote =sum(Cañería_fuera_vivienda_fuera_lote, na.rm =TRUE),n_missing_aguaviv =sum(is.na(n_missing_aguaviv)), # Counts the NAs found in the Localityn_observations =n() # Count the number of rows in each group or total )
Agregación Municipal de la Pregunta 9:
Code
merged_M343_P09_tib <- merged_L_P09_tib %>%group_by(Codigo_343) %>%summarise(Nombre_Municipio =first(MUNICI_343), Baño_compartido =sum(Baño_compartido, na.rm =TRUE), Baño_privado =sum(Baño_privado, na.rm =TRUE), Sin_baño =sum(Sin_baño, na.rm =TRUE), n_missing_baños =sum(is.na(n_missing_baños)), # Counts the NAs found in the Localityn_observations =n() # Count the number of rows in each group or total )
Agregación Municipal de la Pregunta 10:
Code
merged_M343_P10_tib <- merged_L_P10_tib %>%group_by(Codigo_343) %>%summarise(Nombre_Municipio =first(MUNICI_343),Conexion_Alcantarillado =sum(Conexion_Alcantarillado, na.rm =TRUE),Pozo_Ciego =sum(Pozo_Ciego, na.rm =TRUE),A_Calle =sum(A_Calle, na.rm =TRUE),A_Rio =sum(A_Rio, na.rm =TRUE),A_Camara_Septica =sum(A_Camara_Septica, na.rm =TRUE),A_lago_laguna_curichi =sum(A_lago_laguna_curichi, na.rm =TRUE),n_missing_sanitation =sum(is.na(n_missing_sanitation)), # Counts the NAs found in the Localityn_observations =n() # Count the number of rows in each group or total )
Generación de Mapas con los datos extraídos
Importación de librerías para la generación de mapas:
Code
library(sf)
Linking to GEOS 3.13.1, GDAL 3.10.2, PROJ 9.5.1; sf_use_s2() is TRUE
Selección de campos relevantes y omisión de campos duplicados:
Code
## Selección de Campos a ser mantenidosfields_selected <-c("DEPARTAMEN", "PROVINCIA", "MUNICIPIO", "CAPITAL","COD","POB_2012","POB_2024","AREA")## Filtrado de Campos Requeridosmunicipios_gpkg <- municipios_gpkg[, fields_selected]## Cambio de Nombres de Variables para Concordancia con el Dataset INEmunicipios_gpkg <- municipios_gpkg %>%rename(Departamento = DEPARTAMEN,Provincia = PROVINCIA,Municipio = MUNICIPIO,Capital = CAPITAL,COD_M_343 = COD,Poblacion_2012 = POB_2012,Poblacion_2024 = POB_2024) %>%mutate(COD_M_343 =as.character(COD_M_343))
Unión de datos agregados con el geopackage/shapefile:
Code
# La columna 'COD_M_343' en municipios_gpkg es el código único de municipio.# La columna 'Codigo_343' en los tibbles municipales es el código único de municipio.# Asegurar consistencia de tipos para la unión.# Si 'COD_M_343' es numérico y 'Codigo_343' es character (o viceversa), la unión fallará, de ahí que es necesario la conversión de ambos a 'character' para la unión.# Unión entre el Tibble de datos municipales de la P07 y el geopackagemerged_M343_P07_tib <- merged_M343_P07_tib %>%mutate(Codigo_343 =as.character(Codigo_343))# Unión entre el Tibble de datos municipales de la P08 y el geopackagemerged_M343_P08_tib <- merged_M343_P08_tib %>%mutate(Codigo_343 =as.character(Codigo_343))# Unión entre el Tibble de datos municipales de la P09 y el geopackagemerged_M343_P09_tib <- merged_M343_P09_tib %>%mutate(Codigo_343 =as.character(Codigo_343))# Unión entre el Tibble de datos municipales de la P10 y el geopackagemerged_M343_P10_tib <- merged_M343_P10_tib %>%mutate(Codigo_343 =as.character(Codigo_343))
Fusión de bases de datos:
Code
# Guardar los dataframes fusionados como nuevos GeoPackages## Fusión para P07M343_geodata_P07 <-left_join(municipios_gpkg, merged_M343_P07_tib, by =c("COD_M_343"="Codigo_343"))## Fusión para P08M343_geodata_P08 <-left_join(municipios_gpkg, merged_M343_P08_tib, by =c("COD_M_343"="Codigo_343"))## Fusión para P09M343_geodata_P09 <-left_join(municipios_gpkg, merged_M343_P09_tib, by =c("COD_M_343"="Codigo_343"))## Fusión para P10M343_geodata_P10 <-left_join(municipios_gpkg, merged_M343_P10_tib, by =c("COD_M_343"="Codigo_343"))
Una vez realizada la unión, opcionalmente se pueden remover las variables utilizadas para evitar redundancia:
Code
# Opcional: remover las columnas de unión _join si no se necesitan más# M343_geodata_P07 <- M343_geodata_P07 %>% select(-any_of("Codigo_343"))# M343_geodata_P08 <- M343_geodata_P08 %>% select(-any_of("Codigo_343"))# M343_geodata_P09 <- M343_geodata_P09 %>% select(-any_of("Codigo_343"))# M343_geodata_P10 <- M343_geodata_P10 %>% select(-any_of("Codigo_343"))
Indicadores de los ODS para el Atlas Municipal
En este ejemplo se calcularán los indicadores del ODS 6.
Meta 6.1
La meta 6.1 se monitorea a través del indicador 6.1.1 (Indicator 6.1.1: Proportion of population using safely managed drinking water services) cuyos metadatos se encuentran en: https://unstats.un.org/sdgs/metadata/files/Metadata-06-01-01.pdf. Sin embargo, los datos del censo no contemplan datos de calidad de agua, ni de duración de la provision del servicio ni de distancia al punto de acopio desde la vivienda, por lo que, no se podría estimar directamente el valor del indicador 6.1.1 solo de la condición de “Agua Segura” requerida para el cálculo del ODS.
Con esto la ecuación de la proporción de “Agua Segura” sería:
\(UW: \text{Agua No Segura}\)\(PCB: \text{Pozo o Noria Con Bomba}\)\(LVRA: \text{Laguna, Vertiente, Río o Acequia}\)\(SSNR: \text{No se sabe o no responde}\)
Se elaboró un mapa en tmap v4 para las proporciones de agua segura:
Code
tmap_mode("plot")
ℹ tmap mode set to "plot".
Code
tm_map_agua_mejorada <-tm_shape(municip_343_Agua_Mejorada) +tm_polygons("Porc_Agua_Mejorada", # variable to plottitle ="Porcentaje de Fuentes de Agua\nMejorada (%)", # legend titlepalette ="Blues", # brewer Blues palettestyle ="quantile", # classificationn =5, # number of classesborder.col ="grey40", # polygon bordersalpha =1, # border transparencytextNA ="Sin datos"# NA label ) +tm_layout(main.title ="Acceso a Fuentes de Agua Mejorada por Municipio\n(Según lo Requerido por el ODS 6.1.1)",main.title.size =1.1,legend.outside =TRUE,legend.title.size =0.9,legend.text.size =0.7,frame =FALSE ) +tm_compass(type ="arrow", position =c("right", "top")) +tm_scale_bar(position =c("right", "bottom"))
── tmap v3 code detected ───────────────────────────────────────────────────────
[v3->v4] `tm_polygons()`: instead of `style = "quantile"`, use fill.scale =
`tm_scale_intervals()`.
ℹ Migrate the argument(s) 'style', 'n', 'palette' (rename to 'values'),
'textNA' (rename to 'label.na') to 'tm_scale_intervals(<HERE>)'
For small multiples, specify a 'tm_scale_' for each multiple, and put them in a
list: 'fill'.scale = list(<scale1>, <scale2>, ...)'[v3->v4] `tm_polygons()`: use 'fill' for the fill color of polygons/symbols
(instead of 'col'), and 'col' for the outlines (instead of 'border.col').[v3->v4] `tm_polygons()`: use `fill_alpha` instead of `alpha`.[v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'[v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(main.title = )`! `tm_scale_bar()` is deprecated. Please use `tm_scalebar()` instead.
Code
tm_map_agua_mejorada
[cols4all] color palettes: use palettes from the R package cols4all. Run
`cols4all::c4a_gui()` to explore them. The old palette name "Blues" is named
"brewer.blues"
Multiple palettes called "blues" found: "brewer.blues", "matplotlib.blues". The first one, "brewer.blues", is returned.
[plot mode] fit legend/component: Some legend items or map compoments do not
fit well, and are therefore rescaled.
ℹ Set the tmap option `component.autoscale = FALSE` to disable rescaling.
TMAP v4 Mapa Embedido
Code
tmap_mode("view")
ℹ tmap mode set to "view".
Code
tm_map_agua_mejorada <-tm_shape(municip_343_Agua_Mejorada) +tm_polygons("Porc_Agua_Mejorada", # variable to plottitle ="Porcentaje de Fuentes de Agua\nMejorada (%)", # legend titlepalette ="Blues", # brewer Blues palettestyle ="quantile", # classificationn =5, # number of classesborder.col ="grey40", # polygon bordersalpha =1, # border transparencytextNA ="Sin datos"# NA label ) +tm_layout(main.title ="Acceso a Fuentes de Agua Mejorada por Municipio\n(Según lo Requerido por el ODS 6.1.1)",main.title.size =1.1,legend.outside =TRUE,legend.title.size =0.9,legend.text.size =0.7,frame =FALSE ) +tm_scale_bar(position =c("left", "bottom"))
[v3->v4] `tm_polygons()`: instead of `style = "quantile"`, use fill.scale =
`tm_scale_intervals()`.
ℹ Migrate the argument(s) 'style', 'n', 'palette' (rename to 'values'),
'textNA' (rename to 'label.na') to 'tm_scale_intervals(<HERE>)'
For small multiples, specify a 'tm_scale_' for each multiple, and put them in a
list: 'fill'.scale = list(<scale1>, <scale2>, ...)'
[v3->v4] `tm_polygons()`: use `fill_alpha` instead of `alpha`.
[v3->v4] `tm_polygons()`: migrate the argument(s) related to the legend of the
visual variable `fill` namely 'title' to 'fill.legend = tm_legend(<HERE>)'
[v3->v4] `tm_layout()`: use `tm_title()` instead of `tm_layout(main.title = )`
! `tm_scale_bar()` is deprecated. Please use `tm_scalebar()` instead.
Code
tm_map_agua_mejorada
[cols4all] color palettes: use palettes from the R package cols4all. Run
`cols4all::c4a_gui()` to explore them. The old palette name "Blues" is named
"brewer.blues"
Multiple palettes called "blues" found: "brewer.blues", "matplotlib.blues". The first one, "brewer.blues", is returned.