El presente archivo R Markdown detalla el proceso de limpieza y visualización de los datos obtenidos de la Encuesta Nacional de Hogares (ENAHO) 2024. El objetivo es transformar los datos crudos en información útil para análisis posteriores, específicamente aquellas variables vinculadas al agua y saneamiento.
Es por ello que la data se estructura en las siguientes secciones:
ubigeo: Ubicación geográfica
estrato: Estrato geográfico (Rango: 1-8)
P110 [fuente_agua]: El agua que utilizan en el hogar procede principalmente de: (Rango 1-8)
P110A1 [agua_potable]: ¿El agua es potable? (Rango 1-2)
P110A [cloro_residual]: Nivel de cloro residual del agua (Rango 1-3)
P110C [agua_todos_dias]: ¿El hogar tiene acceso al servicio de agua todos los días de la semana (Rango 1-2)
P110C1 [horas_dia_diario]: ¿Cuántas horas al dia? (Rango 1-24)
P110C2 [dias_semana]: ¿Cuántos días a la semana tiene este servicio? (Rango 1-7)
P110C3 [horas_dia_no_diario]: ¿Cuántas horas al día? (Rango 1-24)
P110F [paga_servicio]: ¿Pagan por el servicio de agua? (Rango 1-2)
P110G [entidad_pago]: ¿A qué empresa o entidad se paga por el servicio de agua? (Rango 1-5)
P1172$01 [gasto_agua_pagado]: El último gasto mensual por consumo de: Agua, ¿pagado por algún miembro de este hogar?
P1173$01 [gasto_agua_donado]: El último gasto mensual por consumo de: Agua. ¿donado o regalado por algún miembro de otro hogar?
P1174$01 [gasto_agua_autoconsumo]: El último gasto mensual por consumo de: Agua, ¿autoconsumo o autosuministro?
D1172$01 [gasto_agua_hogar]: El último gasto mensual de: Agua, pagado por mimebro de este hogar
T110 [abastecimiento_recod]: (Recodificado) El abastecimiento de agua en su hogar procede de: (Rango: 1-9)
enaho_agua = import("enaho_agua.csv")
ubigeo_cat <- read_excel("geodir-ubigeo-inei.xlsx", sheet = "ubigeo_inei") %>%
mutate(
ubigeo = str_pad(as.character(Ubigeo), width = 6, side = "left", pad = "0"),
cod_dpto = str_sub(ubigeo, 1, 2),
cod_prov = str_sub(ubigeo, 3, 4),
cod_dist = str_sub(ubigeo, 5, 6)
)
# Configuración inicial
pal_si_no <- c("No" = "#D73027", "Sí" = "#1F78B4") # Rojo para No, Azul para Sí
# Helper para aplicar paleta Sí/No con etiquetas de % en ejes
scale_fill_si_no <- function(...) {
scale_fill_manual(values = pal_si_no, ...)
}
# Tema general
tema_apoyo <- function(base_size = 11) {
theme_minimal(base_size = base_size) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
plot.subtitle = element_text(hjust = 0.5),
plot.caption = element_text(hjust = 1),
plot.caption.position = "plot",
legend.position = "bottom",
panel.grid.minor = element_blank()
)
}
# Preparación de datos
enaho_agua_f <- enaho_agua %>%
# Renombrar variables
rename(
ubigeo = ubigeo,
estrato = estrato,
fuente_agua = p110,
agua_potable = p110a1,
cloro_residual = p110a,
agua_todos_dias = p110c,
horas_dia_diario = p110c1,
dias_semana = p110c2,
horas_dia_no_diario = p110c3,
paga_servicio = p110f,
entidad_pago = p110g,
gasto_agua_pagado = `p1172_01`,
gasto_agua_donado = `p1173_01`,
gasto_agua_autoconsumo = `p1174_01`,
gasto_agua_hogar = `d1172_01`,
abastecimiento_recod = t110
) %>%
# Construir región, provincia y distrito a partir del UBIGEO
mutate(
ubigeo = str_pad(as.character(ubigeo), width = 6, side = "left", pad = "0"),
cod_dpto = substr(ubigeo, 1, 2),
cod_prov = substr(ubigeo, 3, 4),
cod_dist = substr(ubigeo, 5, 6),
# Estrato, fuente, etc.
estrato = factor(estrato, levels = 1:8, labels = c(
"≥500k hab","100k–499,999","50k–99,999","20k–49,999",
"2k–19,999","500–1,999","AER Compuesto","AER Simple"
)),
fuente_agua = factor(fuente_agua, levels = 1:8, labels = c(
"Red dentro de la vivienda",
"Red fuera (dentro del edificio)",
"Pilón/pileta pública",
"Camión-cisterna u otro",
"Pozo (subterránea)",
"Manantial/puquio",
"Otra",
"Río/acequia/lago/laguna"
)),
agua_potable = factor(agua_potable, levels = 1:2, labels = c("Sí","No")),
cloro_residual = na_if(cloro_residual, 9) %>%
factor(levels = 1:3, labels = c("Seguro","Dosificación inadecuada","Sin cloro")),
agua_todos_dias = na_if(agua_todos_dias, 9) %>%
factor(levels = 1:2, labels = c("Sí","No")),
paga_servicio = factor(paga_servicio, levels = 1:2, labels = c("Sí","No")),
entidad_pago = factor(entidad_pago, levels = 1:5, labels = c(
"EPS/SEDA/EMAPA","Municipalidad","Organización comunal","Camión cisterna","Otro"
)),
abastecimiento_recod = factor(abastecimiento_recod, levels = 1:9, labels = c(
"Red dentro de la vivienda",
"Red fuera (dentro del edificio)",
"Pilón/pileta pública",
"Camión-cisterna u otro",
"Pozo (subterránea)",
"Manantial/puquio",
"Otra",
"Río/acequia/lago/laguna",
"Agua potable del vecino"
)),
horas_dia_diario = ifelse(horas_dia_diario %in% 1:24, horas_dia_diario, NA),
dias_semana = ifelse(dias_semana %in% 1:7, dias_semana, NA),
horas_dia_no_diario = ifelse(horas_dia_no_diario %in% 1:24, horas_dia_no_diario, NA),
gasto_agua_total = rowSums(across(c(gasto_agua_pagado, gasto_agua_donado, gasto_agua_autoconsumo)), na.rm = TRUE)
)
# Creación de variables: departamento, provincia y distrito
enaho_agua_f <- enaho_agua_f %>%
left_join(
ubigeo_cat %>%
select(ubigeo, Departamento, Provincia, Distrito),
by = "ubigeo"
)
## [1] "ubigeo" "estrato" "fuente_agua"
## [4] "agua_potable" "cloro_residual" "agua_todos_dias"
## [7] "horas_dia_diario" "dias_semana" "horas_dia_no_diario"
## [10] "paga_servicio" "entidad_pago" "gasto_agua_pagado"
## [13] "gasto_agua_donado" "gasto_agua_autoconsumo" "gasto_agua_hogar"
## [16] "abastecimiento_recod" "cod_dpto" "cod_prov"
## [19] "cod_dist" "gasto_agua_total" "Departamento"
## [22] "Provincia" "Distrito"
Este gráfico muestra el porcentaje de hogares con y sin acceso a agua potable en cada departamento del país. Permite identificar las regiones con mayores brechas de cobertura de agua segura.
orden_dep <- enaho_agua_f %>%
filter(!is.na(Departamento), !is.na(agua_potable)) %>%
group_by(Departamento) %>%
summarise(pct_si = mean(agua_potable == "Sí"), .groups = "drop") %>%
arrange(pct_si) %>% pull(Departamento)
enaho_agua_f %>%
mutate(Departamento = factor(Departamento, levels = orden_dep),
agua_potable = fct_relevel(agua_potable, "No", "Sí")) %>%
filter(!is.na(Departamento), !is.na(agua_potable)) %>%
ggplot(aes(x = Departamento, fill = agua_potable)) +
geom_bar(position = "fill") +
coord_flip() +
scale_y_continuous(labels = percent) +
scale_fill_manual(values = pal_si_no, name = "¿Agua potable?") +
labs(
title = "Acceso a agua potable por Departamento",
subtitle= "% de hogares dentro de cada departamento",
x = "Departamento", y = "Participación (%)",
caption = "Fuente: ENAHO 2024"
) +
tema_apoyo()
Se observa a qué tipo de entidad pagan los hogares por el servicio de agua (EPS, municipalidades, organizaciones comunales, camiones cisterna u otras). Refleja la estructura institucional del suministro de agua a nivel nacional.
enaho_agua_f %>%
filter(paga_servicio == "Sí", !is.na(entidad_pago)) %>%
count(entidad_pago) %>%
mutate(pct = n / sum(n)) %>%
ggplot(aes(x = fct_reorder(entidad_pago, pct), y = pct)) +
geom_col() +
coord_flip() +
scale_y_continuous(labels = percent) +
labs(
title = "Entidad a la que se paga por el servicio de agua",
subtitle= "Distribución nacional (%)",
x = "Entidad", y = "Porcentaje de hogares",
caption = "Fuente: ENAHO 2024"
) +
tema_apoyo()
Presenta cómo varía, dentro de cada departamento, la entidad a la que se paga por el servicio de agua. Evidencia diferencias territoriales en la provisión y gestión del servicio.
orden_dep <- enaho_agua_f %>%
filter(paga_servicio == "Sí", !is.na(Departamento)) %>%
count(Departamento) %>% arrange(n) %>% pull(Departamento)
enaho_agua_f %>%
filter(paga_servicio == "Sí", !is.na(entidad_pago), !is.na(Departamento)) %>%
mutate(Departamento = factor(Departamento, levels = orden_dep)) %>%
ggplot(aes(x = Departamento, fill = entidad_pago)) +
geom_bar(position = "fill") +
coord_flip() +
scale_y_continuous(labels = percent) +
labs(
title = "Entidad de pago del servicio de agua por Departamento",
subtitle= "% dentro de los hogares que pagan",
x = "Departamento", y = "Participación (%)",
fill = "Entidad",
caption = "Fuente: ENAHO 2024"
) +
tema_apoyo()
Muestra la fuente principal de abastecimiento de agua a nivel nacional (red pública, pozo, río, cisterna, etc.). Permite dimensionar la dependencia de infraestructuras seguras frente a fuentes más vulnerables.
enaho_agua_f %>%
filter(!is.na(fuente_agua)) %>%
count(fuente_agua) %>%
mutate(pct = n / sum(n)) %>%
ggplot(aes(x = fct_reorder(fuente_agua, pct), y = pct)) +
geom_col() +
coord_flip() +
scale_y_continuous(labels = percent) +
labs(
title = "Fuente principal de abastecimiento de agua",
subtitle= "Distribución nacional (%)",
x = "Fuente de agua", y = "Porcentaje de hogares",
caption = "Fuente: ENAHO 2024"
) +
tema_apoyo()
Indica, dentro de cada departamento, qué fuentes de agua son más utilizadas por los hogares. Sirve para identificar regiones que dependen de fuentes más precarias o inseguras.
orden_dep <- enaho_agua_f %>%
filter(!is.na(Departamento)) %>% count(Departamento) %>% arrange(n) %>% pull(Departamento)
enaho_agua_f %>%
filter(!is.na(Departamento), !is.na(fuente_agua)) %>%
mutate(Departamento = factor(Departamento, levels = orden_dep)) %>%
ggplot(aes(x = Departamento, fill = fuente_agua)) +
geom_bar(position = "fill") +
coord_flip() +
scale_y_continuous(labels = percent) +
labs(
title = "Fuente principal de agua por Departamento",
subtitle= "Participación dentro de cada departamento",
x = "Departamento", y = "Participación (%)",
fill = "Fuente",
caption = "Fuente: ENAHO 2024"
) +
tema_apoyo()
Expone los niveles de cloro residual en el agua consumida por los hogares (seguro, dosificación inadecuada, sin cloro). Es un indicador directo de la calidad microbiológica del agua.
enaho_agua_f %>%
filter(!is.na(cloro_residual)) %>%
count(cloro_residual) %>%
mutate(pct = n / sum(n)) %>%
ggplot(aes(x = fct_reorder(cloro_residual, pct), y = pct)) +
geom_col() +
coord_flip() +
scale_y_continuous(labels = percent) +
labs(
title = "Nivel de cloro residual en el agua",
subtitle= "Distribución nacional (%)",
x = "Nivel de cloro", y = "Porcentaje de hogares",
caption = "Fuente: ENAHO 2024"
) +
tema_apoyo()
Enfocado solo en los hogares con cloro residual “dosificación inadecuada”. Muestra qué departamentos presentan mayores problemas de control en la calidad del agua distribuida.
enaho_agua_f %>%
filter(!is.na(cloro_residual), !is.na(Departamento)) %>%
count(Departamento, cloro_residual) %>%
group_by(Departamento) %>%
mutate(pct = n / sum(n)) %>%
ungroup() %>%
filter(cloro_residual == "Dosificación inadecuada") %>%
ggplot(aes(y = fct_reorder(Departamento, pct), x = pct)) +
geom_col() +
scale_x_continuous(labels = percent_format(accuracy = 1)) +
labs(
title = "Dosificación inadecuada del cloro por Departamento",
subtitle = "% de hogares dentro de cada departamento",
x = "Porcentaje de hogares", y = "Departamento",
caption = "Fuente: ENAHO 2024"
) +
tema_apoyo()
Indica qué porcentaje de hogares recibe agua todos los días de la semana. Es un indicador de la continuidad y confiabilidad del servicio.
orden_dep <- enaho_agua_f %>%
filter(!is.na(Departamento), !is.na(agua_todos_dias)) %>%
group_by(Departamento) %>%
summarise(pct_si = mean(agua_todos_dias == "Sí"), .groups = "drop") %>%
arrange(pct_si) %>% pull(Departamento)
enaho_agua_f %>%
mutate(Departamento = factor(Departamento, levels = orden_dep),
agua_todos_dias = fct_relevel(agua_todos_dias, "No", "Sí")) %>%
filter(!is.na(Departamento), !is.na(agua_todos_dias)) %>%
ggplot(aes(x = Departamento, fill = agua_todos_dias)) +
geom_bar(position = "fill") +
coord_flip() +
scale_y_continuous(labels = percent) +
scale_fill_manual(values = pal_si_no, name = "¿Todos los días?") +
labs(
title = "Acceso al servicio de agua todos los días",
subtitle= "% de hogares dentro de cada departamento",
x = "Departamento", y = "Participación (%)",
caption = "Fuente: ENAHO 2024"
) +
tema_apoyo()
Caja de distribución de las horas diarias de servicio reportadas por los hogares, por departamento. Permite identificar desigualdades en la cantidad de horas que llega el agua en distintas regiones.
orden_dep <- enaho_agua_f %>%
filter(!is.na(Departamento), !is.na(horas_dia_diario)) %>%
group_by(Departamento) %>%
summarise(med = median(horas_dia_diario, na.rm = TRUE), .groups = "drop") %>%
arrange(med) %>% pull(Departamento)
enaho_agua_f %>%
filter(!is.na(Departamento), !is.na(horas_dia_diario)) %>%
mutate(Departamento = factor(Departamento, levels = orden_dep)) %>%
ggplot(aes(x = Departamento, y = horas_dia_diario)) +
geom_boxplot(outlier.alpha = 0.25) +
coord_flip() +
labs(
title = "Horas de servicio de agua al día",
subtitle= "Distribución por departamento (entre quienes reportan)",
x = "Departamento", y = "Horas por día",
caption = "Fuente: ENAHO 2024"
) +
tema_apoyo()
Muestra el porcentaje de hogares que pagan (o no) por el servicio de agua en cada departamento. Esto da información sobre la sostenibilidad financiera del servicio y la formalidad del acceso.
orden_dep <- enaho_agua_f %>%
filter(!is.na(Departamento), !is.na(paga_servicio)) %>%
group_by(Departamento) %>%
summarise(pct_paga = mean(paga_servicio == "Sí"), .groups = "drop") %>%
arrange(pct_paga) %>% pull(Departamento)
enaho_agua_f %>%
mutate(Departamento = factor(Departamento, levels = orden_dep),
paga_servicio = fct_relevel(paga_servicio, "No", "Sí")) %>%
filter(!is.na(Departamento), !is.na(paga_servicio)) %>%
ggplot(aes(x = Departamento, fill = paga_servicio)) +
geom_bar(position = "fill") +
coord_flip() +
scale_y_continuous(labels = percent) +
scale_fill_manual(values = pal_si_no, name = "¿Paga?") +
labs(
title = "Hogares que pagan por el servicio de agua",
subtitle= "% de hogares dentro de cada departamento",
x = "Departamento", y = "Participación (%)",
caption = "Fuente: ENAHO 2024"
) +
tema_apoyo()
Distribución del gasto mensual en agua reportado por los hogares. Ayuda a dimensionar el esfuerzo económico que hacen las familias, tanto a nivel de capacidad de pago como de inequidades.
enaho_agua_f %>%
filter(!is.na(gasto_agua_total), gasto_agua_total >= 0) %>%
ggplot(aes(x = gasto_agua_total)) +
geom_histogram(bins = 40) +
scale_x_continuous(labels = label_number(big.mark = ",")) +
labs(
title = "Distribución del gasto mensual en agua",
subtitle= "Hogares a nivel nacional",
x = "Gasto mensual (moneda local)", y = "Número de hogares",
caption = "Fuente: ENAHO 2024"
) +
tema_apoyo()
Clasifica los hogares en tres grupos: sin agua potable, con agua insegura (cloro insuficiente o ausente) y agua segura. Resume el tamaño del mercado potencial que podría beneficiarse de tecnologías de filtrado como Sawyer.
enaho_agua_f %>%
mutate(
riesgo = case_when(
agua_potable == "No" ~ "Sin agua potable",
cloro_residual %in% c("Dosificación inadecuada","Sin cloro") ~ "Con agua insegura",
TRUE ~ "Segura"
)
) %>%
count(riesgo) %>%
mutate(pct = n / sum(n)) %>%
ggplot(aes(x = fct_reorder(riesgo, pct), y = pct, fill = riesgo)) +
geom_col() +
coord_flip() +
scale_y_continuous(labels = percent) +
scale_fill_manual(values = c("Sin agua potable" = "#D73027",
"Con agua insegura" = "#FC8D59",
"Segura" = "#1F78B4")) +
labs(
title = "Condición de seguridad del agua en los hogares",
subtitle= "Segmento de mercado potencial para filtros Sawyer",
x = "", y = "Porcentaje de hogares",
fill = "Condición",
caption = "Fuente: ENAHO 2024"
) +
tema_apoyo()
Ranking de departamentos según el porcentaje de hogares en riesgo (sin agua potable o con cloro inadecuado/sin cloro). Permite priorizar territorios para intervenciones o mercado objetivo.
riesgo_dep <- enaho_agua_f %>%
filter(!is.na(Departamento)) %>%
mutate(riesgo = agua_potable == "No" | cloro_residual %in% c("Dosificación inadecuada","Sin cloro")) %>%
group_by(Departamento) %>%
summarise(pct_riesgo = mean(riesgo, na.rm = TRUE), .groups = "drop") %>%
arrange(desc(pct_riesgo))
riesgo_dep %>%
ggplot(aes(x = pct_riesgo, y = fct_reorder(Departamento, pct_riesgo))) +
geom_col(fill = "#D73027") +
scale_x_continuous(labels = percent) +
labs(
title = "Departamentos con mayor exposición a agua insegura",
subtitle= "% de hogares sin agua potable o con cloro inadecuado",
x = "Porcentaje de hogares en riesgo", y = "Departamento",
caption = "Fuente: ENAHO 2024"
) +
tema_apoyo()
Compara la condición del agua (segura vs. en riesgo) entre ámbitos urbano y rural. Destaca la mayor vulnerabilidad de la población rural, donde suelen concentrarse los mayores problemas de acceso.
enaho_agua_f <- enaho_agua_f %>%
mutate(
# si estrato es factor con etiquetas, intento convertir a número
estrato_num = suppressWarnings(as.integer(as.character(estrato))),
ambito = case_when(
# Caso 1: tengo número 1–8
!is.na(estrato_num) & estrato_num %in% 1:6 ~ "Urbano",
!is.na(estrato_num) & estrato_num %in% 7:8 ~ "Rural",
# Caso 2: estrato con etiquetas tipo "AER Compuesto"/"AER Simple"
is.na(estrato_num) & !is.na(estrato) & str_detect(as.character(estrato), "AER") ~ "Rural",
is.na(estrato_num) & !is.na(estrato) ~ "Urbano",
TRUE ~ NA_character_
),
ambito = factor(ambito, levels = c("Urbano","Rural"))
)
enaho_agua_f %>%
mutate(riesgo = agua_potable == "No" | cloro_residual %in% c("Dosificación inadecuada","Sin cloro")) %>%
count(ambito, riesgo) %>%
group_by(ambito) %>%
mutate(pct = n/sum(n)) %>%
ungroup() %>%
ggplot(aes(x = ambito, y = pct, fill = riesgo)) +
geom_col(position = "fill") +
scale_y_continuous(labels = percent) +
scale_fill_manual(values = c("TRUE" = "#D73027", "FALSE" = "#1F78B4"),
labels = c("TRUE"="En riesgo","FALSE"="Agua segura")) +
labs(
title = "Condición del agua por ámbito",
subtitle= "Mayor vulnerabilidad en zonas rurales",
x = "Ámbito", y = "Participación (%)",
fill = "Condición",
caption = "Fuente: ENAHO 2024"
) +
tema_apoyo()
Muestra el gasto mensual en agua de los hogares, diferenciado entre los que cuentan con agua segura y los que están en riesgo. Evidencia que muchas familias invierten dinero pero no acceden a agua de calidad.
enaho_agua_f %>%
mutate(riesgo = agua_potable == "No" | cloro_residual %in% c("Dosificación inadecuada","Sin cloro")) %>%
filter(!is.na(gasto_agua_total), gasto_agua_total >= 0) %>%
mutate(riesgo = ifelse(riesgo, "En riesgo", "Seguro")) %>%
ggplot(aes(x = gasto_agua_total, fill = riesgo)) +
geom_histogram(bins = 40, position = "identity", alpha = 0.6) +
scale_x_continuous(labels = label_number(big.mark = ",")) +
scale_fill_manual(values = c("En riesgo"="#D73027","Seguro"="#1F78B4")) +
labs(
title = "Gasto mensual en agua por condición de riesgo",
subtitle= "Muchos hogares invierten pero siguen sin agua segura",
x = "Gasto mensual en agua (moneda local)", y = "Número de hogares",
fill = "Condición",
caption = "Fuente: ENAHO 2024"
) +
tema_apoyo()
Ranking de provincias con mayor porcentaje de hogares en riesgo (sin agua potable o con cloro inadecuado/sin cloro). Útil para focalizar intervenciones o estrategias comerciales a nivel subnacional.
top_prov <- enaho_agua_f %>%
filter(!is.na(Provincia)) %>%
mutate(riesgo = agua_potable == "No" | cloro_residual %in% c("Dosificación inadecuada","Sin cloro")) %>%
group_by(Provincia) %>%
summarise(pct_riesgo = mean(riesgo, na.rm = TRUE), .groups = "drop") %>%
arrange(desc(pct_riesgo)) %>%
slice_head(n = 10)
ggplot(top_prov, aes(x = pct_riesgo, y = fct_reorder(Provincia, pct_riesgo))) +
geom_col(fill = "#D73027") +
scale_x_continuous(labels = percent) +
labs(
title = "Top 10 provincias con mayor exposición a agua insegura",
subtitle= "% de hogares en riesgo (sin agua potable o con cloro inadecuado)",
x = "Porcentaje de hogares en riesgo", y = "Provincia",
caption = "Fuente: ENAHO 2024"
) +
tema_apoyo()