Ejemplos: Datos Censales

Esta sección muestra cómo explorar y analizar los microdatos del Censo 2018 sin necesidad de mapas. Para combinar datos censales con visualizaciones geográficas, consulte Censo + Mapas.


Explorar variables disponibles

Antes de analizar, use las funciones describe_* para conocer qué variables están disponibles y qué valores toman.

import geoquetzal as gq

# Listar todas las variables del dataset de hogares
gq.describe_hogares()

# Detalle de una variable específica
gq.describe_hogares("PCH4")
# Retorna etiqueta, tipo y valores codificados

# Variables de personas
gq.describe_personas("PCP12")
# Autoidentificación étnica: Maya, Garífuna, Xinka, Ladino...
library(geoquetzal)

# Listar todas las variables del dataset de hogares
describe_hogares()

# Detalle de una variable específica
describe_hogares("PCH4")
# Retorna etiqueta, tipo y valores codificados

# Variables de personas
describe_personas("PCP12")
# Autoidentificación étnica: Maya, Garífuna, Xinka, Ladino...

Acceso a servicios básicos por departamento

¿Qué porcentaje de hogares tiene acceso a electricidad de red en cada departamento?

import geoquetzal as gq

# Descargar hogares de todo Guatemala (~38 MB)
df = gq.hogares()

# PCH8 = tipo de alumbrado; 1 = Red de energía eléctrica
electricidad = (
    df.groupby("departamento")["PCH8"]
    .apply(lambda x: (x == 1).mean() * 100)
    .round(1)
    .reset_index(name="pct_electricidad")
    .sort_values("pct_electricidad", ascending=False)
)
print(electricidad.to_string(index=False))
library(geoquetzal)
library(dplyr)

# Descargar hogares de todo Guatemala (~38 MB)
df <- hogares()

# PCH8 = tipo de alumbrado; 1 = Red de energía eléctrica
electricidad <- df |>
  group_by(departamento) |>
  summarise(pct_electricidad = round(mean(PCH8 == 1, na.rm = TRUE) * 100, 1)) |>
  arrange(desc(pct_electricidad))

print(electricidad)

Autoidentificación étnica en Sacatepéquez

import geoquetzal as gq

df = gq.personas(departamento="Sacatepequez")

# PCP12: autoidentificación étnica
# 1=Maya, 2=Garífuna, 3=Xinka, 4=Afrodescendiente, 5=Ladino, 6=Extranjero
etnicidad = (
    df["PCP12"]
    .value_counts(normalize=True)
    .mul(100)
    .round(1)
    .rename({1: "Maya", 2: "Garífuna", 3: "Xinka",
             4: "Afrodescendiente", 5: "Ladino", 6: "Extranjero"})
)
print(etnicidad)
library(geoquetzal)
library(dplyr)

df <- personas(departamento = "Sacatepequez")

# PCP12: autoidentificación étnica
# 1=Maya, 2=Garífuna, 3=Xinka, 4=Afrodescendiente, 5=Ladino, 6=Extranjero
etnicidad <- df |>
  count(PCP12) |>
  mutate(
    pct = round(n / sum(n) * 100, 1),
    etnia = recode(as.character(PCP12),
      "1" = "Maya", "2" = "Garífuna", "3" = "Xinka",
      "4" = "Afrodescendiente", "5" = "Ladino", "6" = "Extranjero")
  ) |>
  select(etnia, pct) |>
  arrange(desc(pct))

print(etnicidad)

Lengua materna más hablada por municipio

import geoquetzal as gq

df = gq.personas(departamento="Huehuetenango")

idioma_dominante = (
    df.groupby("MUNICIPIO")["PCP15"]
    .agg(lambda x: int(x.dropna().mode()[0]) if not x.dropna().empty else None)
    .reset_index(name="idioma_dominante")
)

valores = gq.describe_personas("PCP15")["valores"]
idioma_dominante["idioma_dominante"] = idioma_dominante["idioma_dominante"].map(valores)
print(idioma_dominante.to_string(index=False))
library(geoquetzal)
library(dplyr)

df <- personas(departamento = "Huehuetenango")

# PCP15: idioma en que aprendió a hablar
# Mode por municipio = idioma más frecuente
idioma_dominante <- df |>
  group_by(MUNICIPIO) |>
  summarise(idioma_dominante = as.integer(names(which.max(table(PCP15))))) |>
  left_join(
    data.frame(
      idioma_dominante = as.integer(names(describe_personas("PCP15")$valores)),
      etiqueta = unlist(describe_personas("PCP15")$valores)
    ),
    by = "idioma_dominante"
  )

print(idioma_dominante)

Años de estudio promedio por municipio

import geoquetzal as gq
import pandas as pd

df = gq.personas(departamento="Sacatepequez")

# ANEDUCA is stored as VARCHAR, cast before aggregating
df["ANEDUCA"] = pd.to_numeric(df["ANEDUCA"], errors="coerce")

aneduca = (
    df.groupby("MUNICIPIO")["ANEDUCA"]
    .mean()
    .round(1)
    .reset_index(name="aneduca_promedio")
    .sort_values("aneduca_promedio", ascending=False)
)
print(aneduca.to_string(index=False))
library(geoquetzal)
library(dplyr)

df <- personas(departamento = "Sacatepequez")

# ANEDUCA: años de estudio (variable derivada, numérica)
# Se almacena como character en los datos — convertir antes de calcular
aneduca <- df |>
  mutate(ANEDUCA = as.numeric(ANEDUCA)) |>
  group_by(MUNICIPIO) |>
  summarise(aneduca_promedio = round(mean(ANEDUCA, na.rm = TRUE), 1)) |>
  arrange(desc(aneduca_promedio))

print(aneduca)

Acceso a tecnología — brecha digital

¿Cuántos hogares tienen computadora e internet en Quiché?

import geoquetzal as gq
import pandas as pd

df = gq.hogares(departamento="Quiche")

# PCH9_H=computadora, PCH9_I=internet, PCH9_M=carro (1=Sí, 2=No)
tecnologia = pd.DataFrame({
    "Indicador": ["Computadora", "Internet", "Carro"],
    "% hogares": [
        (df["PCH9_H"] == 1).mean() * 100,
        (df["PCH9_I"] == 1).mean() * 100,
        (df["PCH9_M"] == 1).mean() * 100,
    ]
}).round(1)
print(tecnologia.to_string(index=False))
library(geoquetzal)

df <- hogares(departamento = "Quiche")

# PCH9_H=computadora, PCH9_I=internet, PCH9_M=carro (1=Sí, 2=No)
tecnologia <- data.frame(
  Indicador   = c("Computadora", "Internet", "Carro"),
  pct_hogares = round(c(
    mean(df$PCH9_H == 1, na.rm = TRUE) * 100,
    mean(df$PCH9_I == 1, na.rm = TRUE) * 100,
    mean(df$PCH9_M == 1, na.rm = TRUE) * 100
  ), 1)
)
print(tecnologia)

Datos de lugares poblados

Los datos pre-agregados de lugares poblados permiten análisis sub-municipales sin necesidad de procesar los microdatos.

import geoquetzal as gq

# Cargar indicadores de Antigua Guatemala
lp = gq.lugares_poblados(municipio="Antigua Guatemala")

# Ver columnas disponibles
print(lp.columns.tolist())

# Calcular % de hogares con internet por lugar poblado
lp["pct_internet"] = (
    lp["pch9_i_si"] / (lp["pch9_i_si"] + lp["pch9_i_no"]) * 100
).round(1)

# Top 5 lugares con más acceso a internet
print(
    lp[["nombre", "poblacion_total", "pct_internet"]]
    .sort_values("pct_internet", ascending=False)
    .head(5)
    .to_string(index=False)
)

# Consultar qué significa una columna
gq.describe_lugares_poblados("pch9_i_si")
# {'variable': 'pch9_i_si',
#  'etiqueta': 'Conteo: tiene internet',
#  'tipo': 'equipamiento',
#  'fuente': 'hogar'}
library(geoquetzal)
library(dplyr)

# Cargar indicadores de Antigua Guatemala
lp <- lugares_poblados(municipio = "Antigua Guatemala")

# Ver columnas disponibles
names(lp)

# Calcular % de hogares con internet por lugar poblado
lp$pct_internet <- round(
  lp$pch9_i_si / (lp$pch9_i_si + lp$pch9_i_no) * 100,
  1
)

# Top 5 lugares con más acceso a internet
lp |>
  select(nombre, poblacion_total, pct_internet) |>
  arrange(desc(pct_internet)) |>
  head(5)

# Consultar qué significa una columna
describe_lugares_poblados("pch9_i_si")
# $variable: "pch9_i_si"
# $etiqueta: "Conteo: tiene internet"
# $tipo: "equipamiento"
# $fuente: "hogar"