Los cambios de esta sección están en GitHub pero todavía no en CRAN, que recibe una
actualización agrupada cada uno o dos meses. Para tenerlos:
remotes::install_github("lab-tecnosocial/censosbo").
universo_ine(): el recorte que hace falta para que las cifras cuadren con el
INE. Los cuadros publicados no se calculan sobre todos los microdatos. Llevan la
edad mínima que anuncia su título —4 años para idioma materno, 6 para idioma de mayor
uso e idiomas hablados, 5 para discapacidad, 14 para empleo— y una nota al pie que es
fácil pasar por alto: «No incluye personas que residen habitualmente en el
exterior». Esa segunda exclusión no está en ninguna variable derivada y hay que
aplicarla sobre la pregunta de residencia habitual, que se llama distinto en cada
censo (p36_lugres en 2024, P33A en 2012 y 2001).
Sin ella sobran 98.649 personas en el universo de 4 años o más del CPV-2024, y el
exceso no se ve: es alrededor del 1%, repartido por los 343 municipios y por todos los
grupos de edad. Con universo_ine(), los conteos de idioma materno, idioma de mayor
uso, idiomas hablados y multilingüismo por municipio, área y lengua coinciden
exactamente con los cuadros del INE, celda a celda. Los tests de reconciliación lo
fijan.
get_personas_2024(variables = c("p26_edad", "p36_lugres", "idioma_mat")) |>
universo_ine(2024, edad_min = 4) |>
count(idioma_mat) |>
collect()
De paso cierra un cabo suelto que el paquete tenía anotado: la tasa de alfabetismo reconstruida se quedaba a 0,0003 pp de la oficial y no se sabía por qué. Era esto; con el universo aplicado da 95,8633% exacto.
Los catálogos geográficos de los censos históricos ya se pueden pedir. depto,
provin y munic estaban en los releases de 1992, 2001 y 2012 desde el principio,
pero no figuraban entre las tablas válidas, así que get_censo(2012, "munic")
respondía «tabla no disponible».
No son un detalle de catálogo: la numeración municipal cambió entre censos. En los
microdatos de 2012, 071104 es San Julián; en 2001 y 2024, San Antonio de Lomerío. Sin
el catálogo del año, cruzar los microdatos históricos con la geografía actual coloca
los datos en el municipio equivocado y no da ningún error —el código existe en los dos
censos, solo que nombra a otro sitio—. Son 21 municipios afectados en 2012.
get_censo(2012, "munic") |> collect() # 339 municipios, con su REDCODEN de 2012
Tres correcciones salidas de probar el paquete como lo estrena alguien nuevo: instalado desde GitHub, con el caché vacío. Ninguna cambia resultados; las tres quitan fricción donde el paquete parecía no tener el dato que sí tenía.
Los nombres y las búsquedas ya no dependen de las tildes. municipio = "Zudanez"
abortaba con «no encontrado en el catálogo» y buscar = "instruccion" devolvía cero
filas, en los dos casos sin pista de que lo único que faltaba era un acento. Ahora
departamento, provincia y municipio aceptan los nombres con o sin acentos —55 de
los 343 municipios llevan tilde o eñe, y "Potosi" ya vale por "Potosí"— y buscar
encuentra "Nivel más alto de instrucción" escribiendo instruccion.
No se pierde precisión: los nueve nombres de municipio que colisionan al ignorar los
acentos (Entre Ríos, San Pedro, Totora…) son los nueve que ya estaban repetidos
entre departamentos, así que siguen pidiendo departamento para desambiguar, como
antes.
Pedir un tema que no se preguntó en ese censo ahora lo dice.
codebook(tema = "religion", anio = 2024) devolvía cero filas en silencio; religion
está en la taxonomía pero solo se preguntó en 1992. Ahora aborta indicando en qué
censos sí está. Como efecto colateral se corrige el mensaje de tema no reconocido, que
prometía «21 temas disponibles» mientras censo_temas() mostraba 20: contaba la
taxonomía completa en vez de los temas del censo consultado.
README: dos ejemplos de la sección de censos históricos no funcionaban
(codebook_1992(buscar = "sexo") no encuentra nada porque en 1992 la etiqueta es «Es
hombre o mujer»). Corregidos, y el bloque pasa a evaluarse al construir el README para
que no vuelva a pasar. Se documenta también que install_github() no trae las viñetas
a menos que se pida build_vignettes = TRUE, con enlace a la versión online.
Y tres más salidas de la revisión del consumidor censos-explorer:
Las funciones de un censo avisan del universo de las variables que pides. El
universo estaba publicado en codebook() desde hace versiones, pero solo se avisaba
en get_temporal(), y ahí únicamente cuando difería entre censos. Faltaba justo el
caso de riesgo: pedir nivel_edu de un solo año y dividir por el total de filas, que
es un error de doce puntos porcentuales. Ahora get_personas_2024(), get_censo() y
las demás informan una vez por llamada:
ℹ No toda la población respondió esta variable:
nivel_edu: personas de 19 años o más
ℹ Un porcentaje sobre el total de filas usaría un denominador mayor que ese universo.
Solo cuando pides variables explícitamente (con variables = NULL serían decenas de
avisos) y solo con verbose = TRUE, así que los consumidores headless no lo ven. Es un
mensaje informativo, no un warning.
Limitación heredada del INE: el DDI de 2012 solo declara todas_personas y
todas_viviendas, así que para ese censo el aviso no salta. Queda documentado en
?codebook_meta.
La viñeta de manzanos y comunidades explicaba mal un desfase que ya no existe. Afirmaba que el INE cuenta las viviendas distinto en el geoportal y en los microdatos. No era así: la diferencia eran los 10.287 registros de calle y tránsito, y desde la 1.7.0 las dos fuentes cuadran en los 343 municipios. Reescrita como lo que es —una validación cruzada— y el artículo ahora comprueba esa igualdad al construirse, en vez de afirmarla.
CI: las seis pruebas de reconciliación contra las cifras oficiales del INE no se
ejecutaban nunca de forma automática. Nuevo workflow mensual (y a demanda) que descarga
los microdatos y las corre, y que falla si acaban en skipped en vez de dar un verde
que no comprobó nada.
El caché vuelve a crearse sin pedir confirmación. La 2.0.0 preguntaba la primera vez, en sesión interactiva, siguiendo una lectura conservadora de la política de CRAN. Instalando desde GitHub eso es fricción por un requisito que todavía no aplica, así que se retira: descargar implica cachear, como siempre.
Nada más cambia. censosbo_cache_dir(), censosbo_cache_info() y
censosbo_cache_clear() funcionan igual, y las opciones censosbo.cache_dir y
censosbo.consent se siguen reconociendo.
La política de CRAN tiene además una vía que no exige consentimiento: guardar el
caché en tools::R_user_dir() declarando R >= 4.0, siempre que el contenido se
gestione activamente. Cuando lleguen los comentarios de la revisión se decidirá por
cuál ir. El estado exacto que se envió a CRAN está preservado en la rama
cran-2.0.0.
Esta versión prepara el paquete para CRAN. El cambio de mayor a 2.0.0 es por
la retirada de update_censosbo(); el resto es infraestructura que no altera
ningún resultado.
update_censosbo() se retira. Una función que reinstala el propio paquete
desde GitHub no puede convivir con la distribución por CRAN: evita el canal
oficial y modifica la instalación del usuario sin pasar por él.
Para actualizar, ahora: install.packages("censosbo") (o
remotes::install_github("lab-tecnosocial/censosbo") para la versión en
desarrollo). Y si la nueva versión corrige datos y no solo código, borrar el
caché para que se vuelvan a descargar:
censosbo_cache_clear()
Nada de esto cambia lo que devuelven las funciones. Se documenta porque explica por qué se movieron archivos que parecían estar bien donde estaban.
Las tablas internas con texto en español pasan a R/sysdata.rda
(etiquetas de los códigos armonizados, textos de universo, nombres de
departamento). CRAN exige que el código de R sea ASCII puro, y escribir
"Sin instrucción" como "Sin instrucci\u00f3n" habría vuelto ilegible un dato
que hay que poder leer y editar. Ahora se editan en data-raw/build_sysdata.R,
con un test que compara byte a byte contra una referencia para que ninguna
máquina con otra codificación pueda corromper las tildes en silencio.
Los mensajes de error y aviso se escriben con escapes \uXXXX en el código.
El texto que ve el usuario es idéntico.
El primer uso del caché pide confirmación en sesión interactiva, como pide
la política de CRAN para escribir fuera del directorio temporal. En scripts,
CI o contenedores —cualquier sesión no interactiva— no pregunta y descarga
igual. Para autorizarlo de antemano: options(censosbo.consent = TRUE).
Siete viñetas pasan a ser artículos solo-web: siguen publicadas en https://lab-tecnosocial.github.io/censosbo/ y no cambian de contenido, pero no viajan dentro del paquete. Las tres que sí lo hacen (Introducción, Diccionario, Temas) vienen precompiladas, así que instalar el paquete ya no descarga nada.
duckdb y DBI pasan de dependencias obligatorias a opcionales: solo hacen
falta para as = "duckdb", y el paquete avisa de cómo instalarlos si se pide
ese backend sin tenerlos. Quien no use SQL se ahorra compilarlos. sf sigue
siendo obligatorio, porque las capas geo_* que trae el paquete son objetos
sf y sin él no se podrían ni imprimir.
Title y Description pasan a inglés, como pide CRAN. La documentación, las
viñetas y los mensajes siguen íntegramente en español.
El requisito de versión de R pasa a >= 4.2, que es el mínimo real: lo impone
arrow. El >= 4.1.0 que se declaraba antes era una promesa falsa — con R 4.1 la
instalación falla al resolver esa dependencia.
⚠️ Esta versión cambia el número de filas que devuelven las funciones
get_viviendas_*(), así que rompe cualquier código que dependiera del conteo anterior. Si necesitas el comportamiento de la 1.6.0, pasauniverso = "todos". Los consumidores que leenvivienda.parquetdirectamente (sin pasar por las funciones de R) no heredan la corrección y hay que arreglarlos aparte:censos-exploreryq-censosboestán en ese caso.
Cambio de comportamiento. get_viviendas_2024() devolvía 4.490.488 filas y las
llamaba viviendas. 10.287 de ellas no lo son: son personas censadas fuera de una
vivienda, marcadas en v01_tipoviv como persona que vive en la calle (código 15,
3.311 registros) o en tránsito: terminal, aeropuerto, puerto u otro (código 16,
6.976). El INE no las cuenta como viviendas en ningún tabulado.
Ahora el defecto es el universo oficial: 4.480.201 viviendas, la cifra de los tabulados del CPV-2024. También cuadra por área (2.898.140 urbanas, 1.582.061 rurales) y, agregando por municipio, coincide al registro con las viviendas del geoportal en los 343 municipios —con la entidad cruda solo coincidían 20.
Argumento universo nuevo en get_viviendas_2024(), get_censo(anio, "vivienda")
y los atajos get_viviendas_1976()/_1992()/_2001()/_2012():
| universo | 2024 | Qué es |
|------------------|----------:|---------------------------------------------------|
| "viviendas" | 4.480.201 | El universo oficial del INE (defecto) |
| "particulares" | 4.463.773 | Casas, departamentos, chozas, cuartos sueltos… |
| "colectivas" | 16.428 | Hoteles, hospitales, cuarteles, penitenciarías… |
| "todos" | 4.490.488 | La entidad cruda de REDATAM, como antes |
Si necesitas el comportamiento anterior, usa universo = "todos".
Los censos anteriores tienen el mismo problema y el mismo arreglo. Cada uno nombra la categoría a su manera: 1992 Ambulante (4.939 registros), 2001 Transeúntes (9.392), 2012 En tránsito y Persona que vive en la calle (12.971). Los totales por defecto pasan a 1.701.168, 2.281.022 y 3.159.350. El censo 1976 no preguntó por calle ni tránsito: ahí no cambia nada.
tipos_vivienda(), función nueva: los códigos de tipo de vivienda de un
censo con su etiqueta, su grupo (particular, colectiva, no_vivienda,
sin_clasificar) y si entran en el universo oficial. Sirve para auditar qué
descarta cada valor de universo en vez de tener que confiar en la documentación.
Los códigos que aparecen en los microdatos pero no en el diccionario del censo
(el 88 de 1976, el 0 de 1992) se conservan en "viviendas": no consta que
sean calle ni tránsito, así que descartarlos sería una decisión sin respaldo.
tipos_vivienda() los muestra como sin_clasificar en vez de esconderlos.
get_unidades_2024() decía algo falso. Afirmaba que la diferencia del 0,23%
entre las viviendas del geoportal y las de los microdatos «procede del propio
INE, que cuenta las viviendas de forma distinta en el geoportal y en los
microdatos», y recomendaba get_viviendas_2024() para el total de un territorio
—justo la cifra inflada. No eran dos formas de contar: eran los registros de
calle y tránsito. Con el universo oficial las dos fuentes cuadran exactamente.
Lo mismo estaba escrito en dev-docs/fuentes-ine-geoportal.md.
El universo todas_viviendas del diccionario induce a error y ahora se
describe como lo que es: todos los registros de la entidad vivienda, incluidas
las personas en la calle o en tránsito.
Una tasa oficial no es dividir una categoría entre todas las filas. La viñeta
de análisis demográfico calculaba el alfabetismo de 15+ años sobre toda la
población de esa edad y daba 94,94%; el tabulado oficial publica 95,8633%. La
diferencia son los 80.297 registros con p40_lee = 9 (Sin especificar), que el
INE deja fuera del denominador: excluirlos da 95,8630% y explica la brecha salvo
0,0003 puntos. La viñeta ahora enseña la receta y por qué hace falta.
tests/testthat/test-reconciliacion-oficial.R, suite nueva. Que la suite pasara
demostraba consistencia interna, no que las cifras coincidieran con lo publicado
—que es lo que se cita. Ahora quedan fijadas: población total y por sexo, los
cuatro universos de vivienda, viviendas por área, el cuadre municipio a municipio
con el geoportal, los totales de los censos históricos y el denominador del
alfabetismo.
Necesita los microdatos completos en caché (~1 GB), así que se salta por defecto:
CENSOSBO_TEST_RECONCILIACION=true Rscript -e 'devtools::test(filter = "reconciliacion")'
geo_municipios pasa a los 343 municipios del CPV-2024, sobre límites nuevos
de SDSN Bolivia cruzados con los códigos y nombres del INE. Antes eran 339
polígonos de cartografía electoral. La procedencia de cada columna está en la
viñeta Mapas coropléticos.
Los cuatro GAIOC creados desde 2016 ya se dibujan: TIOC-Raqaypampa (Cochabamba), San Pedro de Macha y TIOC-Jatun Ayllu Yura (Potosí), y TIOC-Territorio Indígena Multiétnico (Beni). No eran huecos en el mapa: su territorio aparecía dentro del municipio madre —Mizque, Colquechaca, Tomave, San Ignacio y Santa Ana—, así que sus datos salían mal atribuidos sin que se notara. Son 7.599 km² que estaban asignados al municipio equivocado.
Desaparecen las franjas blancas entre municipios. La capa anterior se
simplificó sin preservar la topología y quedaban 1.126 huecos espurios
(461 km²) entre vecinos, visibles en cualquier zoom. La nueva se simplifica con
rmapshaper::ms_simplify(), que respeta los arcos compartidos: los únicos
huecos que quedan son reales (Salar de Uyuni, lagos Poopó y Uru Uru).
Dos columnas nuevas: capital (capital municipal) y superficie_km2, con
la que se calculan densidades sin recalcular áreas.
geo_departamentos ahora se deriva por disolución de geo_municipios, de modo
que los bordes departamentales caen exactamente sobre los municipales.
Los códigos idep/iprov/imun de cada polígono no se leen de la fuente
cartográfica, que los trae desalineados en 7 municipios de Omasuyos (La Paz) y
Ñuflo de Chávez (Santa Cruz). Se deducen por voto espacial mayoritario contra
los ~21.000 puntos de comunidades del CPV-2024, que llevan el código usado en
los microdatos. Con eso, la población municipal de la fuente coincide exacta en los
343 municipios con el conteo de los microdatos, y el 97,3% de los puntos del
CPV-2024 cae en su municipio (antes, 95,9%).
mapa_mun() ya no avisa de «municipios sin cobertura cartográfica»: la
advertencia queda solo para códigos que no existen en la división actual, lo
típico al mapear censos anteriores a 2012.
get_temporal() daba un consejo que no se podía seguir. Decía
«Filtra edad >= 6», pero la función solo devuelve las variables pedidas, así que sin
"edad" entre ellas el filtro fallaba con object 'edad' not found. Ahora, cuando la
columna no está, el aviso dice cómo conseguirla: «Añade "edad" a variables y filtra
edad >= 6». Los grupos predefinidos (grupo = "educacion") ya la incluían, así que
esto solo afectaba a quien pedía variables sueltas.@format de
codebook_meta y codebook_historico_meta describían cinco columnas de las quince,
y los roxygen de censo_temas_meta, codebook_docs_meta, censo_temas(),
vars_tema() y codebook_docs() seguían diciendo 20 temas y tres censos, junto con
las viñetas diccionario y censos-historicos.Los cinco censos tienen 809 variables entre todos, y el diccionario solo decía nombre, etiqueta, tabla y tipo. No había forma de preguntar «¿qué variables hay de educación?» ni —lo que más importa— a quién se le preguntó cada cosa. Esta versión añade las dos cosas, a partir de dos fuentes oficiales del INE: los cuestionarios censales y los diccionarios DDI del catálogo ANDA (estudios 132, 8, 10, 47 y 46, es decir los cinco censos).
codebook() devuelve diez columnas más. Van al final, después de las cinco
originales, cuyo nombre y orden se conservan:
tema — uno de 21 temas. Diecisiete son los que el propio INE declara en su
catálogo; los otros cuatro los añade el paquete (ubicacion_geografica,
identificacion, materiales_construccion y religion, esta última porque solo
el censo de 1992 preguntó por pertenencia religiosa).universo — a quién se aplicó la pregunta: personas_5_mas, mujeres_12_mas,
viviendas_presentes… Es la columna que evita el error más frecuente en
análisis censal: calcular un porcentaje sobre el denominador equivocado. Por
ejemplo, nivel_edu está construida sobre personas de 19 años o más, no sobre
toda la población.capitulo — los siete capítulos (A–G) del cuestionario del CPV-2024.pregunta y pregunta_num — el número de pregunta del formulario, para recorrer
el censo en el mismo orden en que se aplicó.origen — distingue una pregunta directa (cuestionario) de una variable que el
INE o REDATAM construyeron (derivada), de las claves geográficas y los
identificadores.grupo_ine — la agrupación oficial de cada censo anterior, que 2024 no trae.bloque y denominador — para los 194 indicadores de manzano y comunidad.valores_fuente — si las etiquetas de valor vienen de REDATAM o del DDI.Los 21 temas se aplican a los cinco censos, así que
codebook(tema = "educacion", anio = ...) es comparable entre ellos. Los capítulos
son solo de 2024: los cuestionarios anteriores tienen otra estructura y varios
numeran las secciones de vivienda y de persona en paralelo.
censo_temas() — el catálogo de temas con el número de variables de cada uno,
contado en vivo y filtrable por tabla y año.
vars_tema() — los nombres de las variables de un tema, en el orden del
cuestionario, listos para pasar a variables:
get_personas_2024(
departamento = "Cochabamba",
variables = vars_tema("educacion", tabla = "persona")
)
codebook_docs() — la documentación conceptual oficial del INE: qué mide la
variable, la pregunta tal como se leyó en campo, las instrucciones al censista y,
para las derivadas, la regla con que se calcularon. Cubre 445 variables de los
cinco censos.
codebook() acepta tema, capitulo y origen, añadidos después de anio
para no romper las llamadas posicionales.
get_temporal() avisa cuando el universo cambia entre censosArmonizar los códigos no iguala la población a la que se preguntó, y el INE movió el filtro de edad de varias preguntas entre censos. Ahora el paquete lo detecta y avisa:
! `sabe_leer` no se preguntó a la misma población en todos los censos:
1992: personas de 6 años o más
2001: personas de 4 años o más
2024: personas de 5 años o más
i Añade "edad" a `variables` y filtra `edad >= 6` antes de comparar.
Siete variables armonizadas están afectadas. nivel_edu es la más extrema: 6 años
en 1992, 4 en 2001 y 19 en 2024. Antes esto estaba escrito en la documentación
para dos variables; ahora salta en el punto de uso para todas, con el dato del
propio INE.
get_temporal(grupo = ) también acepta ya los slugs de censo_temas(), para no
tener que recordar cuál de los dos vocabularios usa cada función. Los seis grupos
originales siguen siendo válidos.
censo_temas_meta (21 temas), censo_bloques_meta (los 15 bloques de las fichas) y
codebook_docs_meta (445 filas de documentación conceptual, con la procedencia de
los cinco DDI en el atributo "ddi"). variable_temporal_map gana una columna
tema que conecta los nombres armonizados con la taxonomía.
Con quince columnas, imprimir el codebook en consola se había vuelto ilegible.
Ahora print() oculta las columnas que no aplican al subconjunto consultado —y
dice cuáles son— y resume valores_codigos por su número de categorías en vez de
volcar todas. El objeto sigue siendo un data.frame con todas las columnas.
etiquetar_valores() elegía la tabla equivocada. Cuando una variable existe
en varias tablas y solo algunas traen las categorías —idep en el censo 2001 las
tiene en persona y no en vivienda—, se cogía la primera fila del diccionario
y la columna se quedaba sin etiquetar. Ahora se usa la primera que sí las tiene.
i00 ya está documentada. El número de vivienda dentro del predio se
devolvía en todas las consultas pero no estaba en el diccionario, así que
etiquetar_variables() no la etiquetaba.
Cuando se piden columnas que no existen en la tabla consultada pero sí en otra,
el aviso ahora lo dice: "v07_aguapro existe en la tabla vivienda; usa get_viviendas_2024()".
Dos gráficos de las viñetas declaraban un universo que no era el que mostraban. El de nivel educativo decía «15+ años» cuando en realidad era 19+, y el mapa de alfabetismo no aclaraba su umbral; ahora usa 15+, el de las tasas oficiales.
codebook(buscar = ) ahora busca también en el tema, así que
codebook(buscar = "salud") devuelve el tema completo y puede dar más filas que
antes.etiquetar_valores() devolverá un factor donde
antes devolvía el código: puede afectar a gráficos o tablas ya hechos.Los DDI de los cuatro censos anteriores traen categorías que el diccionario de
microdatos no tiene, y se usaron para rellenar los huecos. No se sobrescribió
nada preexistente, y con razón: el contraste reveló que el DDI del INE tiene
errores puntuales — en el CPV-2012, la variable de estado civil viene con las
categorías de otra pregunta. Las discrepancias quedan registradas para revisión en
data-raw/ddi/reporte_valores.md, clasificadas por severidad.
Las columnas nuevas también viajan a los diccionario_variables.parquet publicados
en los GitHub Releases. Los consumidores que cacheen ese archivo por nombre —el
plugin de QGIS lo hace— tienen que vaciar la caché una vez para verlas. Ver
dev-docs/consumidores-taxonomia.md.
.download_parquet(),
.download_ficha() y .download_censo()) comparten un solo helper en vez de
repetir la misma lógica de descarga atómica.get_censo() se presentaba como la API genérica por año, pero rechazaba
anio = 2024 — y la propia documentación de get_personas_2024() ofrecía
get_censo(2024, "persona", ...) como equivalente, un ejemplo que no funcionaba.
Ahora acepta los cinco censos: con anio = 2024 delega en get_personas_2024(),
get_viviendas_2024(), get_emigracion_2024() o get_mortalidad_2024() según
tabla, con resultado idéntico al de esas funciones.
get_censo(2024, "persona", departamento = "07") # = get_personas_2024()
sf estaba en Imports: del
DESCRIPTION pero nada lo importaba en NAMESPACE, así que library(censosbo)
no cargaba su namespace ni registraba sus métodos S3. Sin ellos, filtrar un
objeto sf caía en [.data.frame, que degrada la columna de geometría a una
lista corriente, y mapa_mun(..., departamento = ...) abortaba con
attr(obj, "sf_column") does not point to a geometry column. Afectaba también
a geo_municipios y geo_departamentos manipulados por el usuario.etiquetar_variables() dejaba columnas sin nombre. Las 11 variables
derivadas del censo 1976 que no traen descripción en el diccionario del INE
(nivela, pea, pet, anioes1, …) se renombraban a "". Ahora conservan su
nombre original.mapa_dep() y mapa_mun() ignoraban los códigos geográficos numéricos. Un
idep entero (1, 2, …) no emparejaba con "01", "02", … del catálogo y el
mapa salía entero en gris, sin ningún aviso. Ahora se normalizan a 2 dígitos,
igual que en etiquetar_geografia().get_temporal() perdía nivel_edu en 1992 en las filas donde P11 era
NA: la condición del ifelse() propagaba el NA al resultado.censosbo_cache_clear() ya limpia también el subdirectorio fichas/ cuando
queda vacío (antes solo lo hacía con historico/).mapa_dep(mostrar_nombres = TRUE) y mapa_mun(mostrar_nombres = TRUE) ya no
emiten los avisos de sf sobre centroides en coordenadas geográficas, que eran
irrelevantes para posicionar una etiqueta.citation("censosbo") reportaba siempre la versión 1.0.0; ahora lee la versión y
el año del paquete instalado.Se revisaron todas las cifras de la documentación contra los datos publicados y se corrigieron las que no cuadraban:
geo_municipios tiene 339 municipios, no 336, y los que faltan son 4, no 7
(los TIOC Raqaypampa, Jatun Ayllu Yura y Territorio Indígena Multiétnico, más
San Pedro de Macha).get_personas_2024() completo ocupa ~5,6 GB al hacer collect(), no ~490 MB.
El número de columnas de los censos históricos tampoco incluía las columnas
geográficas denormalizadas.p02 como sexo y p03
como edad, cuando p02 es parentesco, p03 sexo y p04 edad.servicio_sanitario no está disponible
en 2012 (sí lo está, es P09) y usaba el código "05" para Santa Cruz (es
"07"; "05" es Potosí). La de censos históricos daba 344 municipios para 2024
(son 343) y afirmaba que sin departamento no se añaden las columnas
geográficas, cuando se añaden siempre.haven/readr + arrow).nivel_edu y
estado_civil cambian de población de referencia entre censos, así que sus
distribuciones no son comparables sin filtrar por edad. Queda documentado en
variables_armonizadas()$notas, en ?get_temporal y en la viñeta, que ahora
aplica el filtro correcto en el gráfico de nivel educativo.eval = FALSE y salidas
escritas a mano. Ahora se ejecutan al construir la documentación (con
departamentos pequeños, para que la descarga sea liviana), así que las salidas
que se ven son reales.unidad y ficha (los 194
indicadores por manzano y comunidad), que faltaban.El paquete llegaba hasta el municipio: 343 unidades. Ahora también da acceso al nivel más fino que publica el INE, 268.604 unidades censales —manzanos urbanos y comunidades rurales— con 194 indicadores cada una.
get_unidades_2024(): universo completo de unidades con su población,
viviendas y si tienen ficha disponible. Filtra por departamento, provincia,
municipio y area.get_fichas_2024(): los 194 indicadores de la ficha resumen del INE —
población por edad y sexo, educación, salud, migración, empleo, actividad
económica, vivienda, servicios básicos, TIC, materiales de construcción,
hacinamiento y tipo de hogar.get_geo_manzanos() y get_geo_comunidades(): geometrías en sf
(EPSG:4326). Los manzanos están partidos por departamento; las comunidades
rurales son en su mayoría puntos, no polígonos.mapa_man(): mapas de un municipio a nivel de manzano y comunidad.Notas sobre estos datos:
ficha de get_unidades_2024() marca cuáles la
tienen.salud_lugar_* y tic_* son de respuesta múltiple: sus
categorías suman más que el total. Cada bloque incluye su propio total, que es
el denominador correcto.area reutiliza el dominio de los microdatos (1 = Urbana, 2 = Rural), así que
etiquetar_valores() se comporta igual en ambas fuentes. Las funciones aceptan
además "urbano" y "rural" por legibilidad.data-fichas-v1.0.0) y se cachean bajo
fichas/, separados de los microdatos.codebook(tabla = "unidad") y codebook(tabla = "ficha") documentan las
variables nuevas.
Una advertencia sobre los totales: la población agregada por municipio coincide
exactamente con get_personas_2024() en los 343 municipios, pero las
viviendas dan un 0,23% menos que get_viviendas_2024(). El déficit es
sistemático (323 municipios por debajo, ninguno por encima) y viene del propio
INE, que cuenta las viviendas de forma distinta en el geoportal y en los
microdatos. Para el total de viviendas de un territorio, usa
get_viviendas_2024().
get_temporal(variables = "grupo_edad"): los grupos de edad quinquenales
ahora se calculan desde la edad individual en todos los censos y son
comparables entre años. Antes, 1976 y 1992 tomaban variables ya agrupadas
(edad5/GEDAD), cuyos códigos no eran quinquenios: 1992 producía bins sin
sentido y 1976 devolvía códigos crudos. (grupo_edad está en el grupo
demografico, así que afectaba al análisis por defecto.)municipio con código sin provincia: el código de municipio
se repite entre provincias, por lo que municipio = "01" emparejaba un
municipio por provincia (p.ej. 16 en Cochabamba) en silencio. Ahora se emite un
error pidiendo indicar provincia para desambiguar (igual que ya ocurría
con nombres repetidos entre departamentos). La comprobación de ambigüedad ahora
cubre también los códigos, no solo los nombres.get_censo(): la advertencia de filtro geográfico sin
filas y el retorno NULL ahora ocurren con cualquier as ("arrow",
"duckdb", "tibble"); antes solo con "tibble", contradiciendo la
documentación..part
y solo se renombran al completar. Una interrupción ya no deja un archivo
truncado en caché que se reutilizaría indefinidamente.censosbo_cache_clear() borra únicamente los archivos .parquet (y el
subdirectorio historico/ si queda vacío), en lugar de eliminar todo el
directorio de caché. Evita perder otros archivos cuando el caché se redirige a
una carpeta del proyecto con options(censosbo.cache_dir = ...).codebook() y variables_armonizadas() validan el argumento tabla y
abortan con la lista de tablas disponibles ante un valor no reconocido (antes
devolvían 0 filas en silencio).codebook_valores() avisa cuando la variable existe en varias tablas e indica
de cuál muestra los valores.DBI::dbDisconnect(con, shutdown = TRUE) para liberar la instancia.mapa_mun() usaba una variable
inexistente (v10_agua → v07_aguapro); tamaños de descarga de
get_personas_2024() sincronizados con el README; get_mortalidad_2024()
añadida a la tabla de censos del README; NEWS.md se incluye ahora en el
paquete instalado.provincia y municipio ahora aceptan nombres además de códigos en
get_personas_2024(), get_viviendas_2024(), get_emigracion_2024(),
get_mortalidad_2024() y en los censos históricos 1992/2001/2012 vía
get_censo(). Ejemplo: get_personas_2024(departamento = "Cochabamba", municipio = "Cochabamba"). (El censo 1976 mantiene solo códigos: usó cantones.)"Totora", "Cercado") pide indicar departamento para desambiguar.provincia/municipio sin departamento, este se infiere
del catálogo, de modo que get_personas_2024(municipio = "Cochabamba") solo
descarga el departamento correspondiente en vez de todo el país.(idep, iprov, imun), corrigiendo
un sobre-emparejamiento latente (el código de municipio se repite entre
provincias y hay nombres de municipio repetidos entre departamentos).etiquetar_geografia(): agrega nombre_dep, nombre_prov y
nombre_mun a un data frame de microdatos a partir de sus códigos geográficos,
eliminando el left_join manual con municipios(). Es el equivalente
geográfico de etiquetar_valores().etiquetar_valores() etiqueta area (Urbana/Rural de la tabla persona) de
forma determinista. Antes dependía de qué otras columnas acompañaran a area
(la variable solo figuraba en el diccionario de 1976), por lo que a veces la
dejaba como entero sin aviso.etiquetar_valores() ahora avisa cuando la detección automática del censo
parece equivocada: si los valores de una columna reconocida no coinciden con
los códigos del censo detectado, la deja cruda y sugiere usar anio = (en vez
de devolver una columna toda-NA en silencio).codebook() / codebook_valores() documentan la variable derivada area
(persona) con sus valores 1 = Urbana, 2 = Rural, equivalente a urbrur
(vivienda).departamentos(), provincias() y municipios() devuelven tibble
(antes data.frame), por lo que print(x, n = ) y la exploración funcionan
como en el resto del tidyverse.persona, vivienda, mortalidad,
emigracion, discapacidad) ahora incluyen las columnas geográficas
idep, iprov e imun pre-unidas, idénticas en formato al CPV-2024
(string de 2 dígitos, "01"–"09"). El censo 1976 (poblacion, vivienda)
expone idep e iprov (no imun: usó cantones, no municipios comparables).get_censo() filtra ahora por geografía directamente sobre estas columnas,
sin reconstruir la jerarquía REDATAM (persona → vivienda → municipio). Esto
elimina el join estrella vía DuckDB y la descarga de depto/provin/munic,
y hace que los Parquet sean usables tal cual desde otras herramientas
(QGIS, Python, DuckDB) sin joins.codebook() documenta idep/iprov/imun (tipo categorica) en todos los censos.Actualización de datos: esta versión cambia los Parquet publicados. Si ya tenías datos en caché, ejecuta
update_censosbo()(ocensosbo_cache_clear()) para descargar la versión con las columnas geográficas.
get_censo() ahora muestra un mensaje claro al recibir un año no válido
(antes fallaba con un error interno de cli por nombres de variable con punto).
Mismo arreglo en los mensajes de error de descarga.etiquetar_valores() ahora usa las etiquetas armonizadas correctas con los
datos de get_temporal()/get_temporal_vivienda() (antes aplicaba por error el
diccionario del CPV-2024, produciendo etiquetas incorrectas en nivel_edu y otras).departamentos(), provincias() y municipios() reinician los nombres de
fila (1:n) en lugar de arrastrar los del filtrado interno.estado_civil ahora se armoniza a 4 categorías comparables entre censos
(1=Soltero/a, 2=Casado/a o conviviente, 3=Separado/a o divorciado/a, 4=Viudo/a),
limitadas por la granularidad del censo 1992.pea y pet corregidas: el mapeo apuntaba a columnas equivocadas del
CPV-2024 (fft_19/ft_19). Ahora usan pea_13 (1=Ocupado, 2=Cesante,
3=Aspirante) y pet_13 (1=Sí, 2=No), consistentes con los censos previos.variable_temporal_map y variables_armonizadas() incluyen una nueva columna
armonizada que indica si los códigos son comparables entre censos.get_temporal() advierte cuando se solicita una variable no armonizada
(parentesco), cuyos códigos crudos no son comparables entre años.Primera versión de lanzamiento. censosbo proporciona acceso programático a
los microdatos de los cinco censos de Bolivia (1976, 1992, 2001, 2012 y
CPV-2024) y herramientas integradas para análisis demográfico, temporal
y visualización geográfica.
get_personas_2024(), get_viviendas_2024(), get_emigracion_2024(),
get_mortalidad_2024(): acceso al CPV-2024 (11.4 M personas, 4.5 M
viviendas). Los datos del CPV-2024 se descargan por departamento en
archivos Parquet particionados (~4–77 MB cada uno).get_censo(anio, tabla, ...): API unificada para censos históricos
(1976, 1992, 2001, 2012). Atajos por año: get_poblacion_1976(),
get_personas_1992(), get_personas_2001(), get_personas_2012(), y
demás funciones por tabla y año.dplyr, Apache Arrow (carga diferida) y DuckDB
(consultas SQL). El formato de retorno se controla con
as = c("arrow", "tibble", "duckdb").get_temporal(): datos comparables entre todos los censos (1976–2024)
para 11 variables armonizadas: sexo, edad, grupo_edad, parentesco,
estado_civil, sabe_leer, nivel_edu, pea, pet, area,
departamento.get_temporal_vivienda(): equivalente para la tabla de vivienda.variables_armonizadas() y grupos_variables(): exploración del mapa de
armonización y los grupos temáticos predefinidos (demografico, educacion,
economia, cultural, migracion, fertilidad).codebook(), codebook_valores(): búsqueda en el diccionario de las 168
variables del CPV-2024.codebook_1976(), codebook_1992(), codebook_2001(), codebook_2012(),
codebook_2024(): atajos por año para censos históricos.etiquetar_valores(), etiquetar_variables(): convierte códigos numéricos
a etiquetas legibles y renombra columnas con las descripciones del INE.mapa_dep(): mapa coroplético a nivel departamental. Geometrías de los 9
departamentos incluidas en el paquete (geo_departamentos).mapa_mun(): mapa coroplético a nivel municipal. Geometrías de 336 de los
343 municipios incluidas en el paquete (geo_municipios).ggplot modificables con capas y
temas adicionales de ggplot2.departamentos(), provincias(), municipios(): navegación de la división
político-administrativa de Bolivia.geo_bolivia (343 municipios con nombres y códigos),
geo_departamentos (9 objetos sf), geo_municipios (336 objetos sf).censosbo_cache_dir(), censosbo_cache_info(), censosbo_cache_clear():
los archivos Parquet se descargan una sola vez y se almacenan en caché
local (~/Library/Caches/org.R-project.R/R/censosbo/ por defecto).censosbo.cache_dir para redirigir el caché al directorio del
proyecto.