# Instalación de paquetes
#install.packages("haven")
#install.packages("rio)
#install.packages("dplyr")
#install.packages("stringr")
#install.packages("tidyr")
#install.packages("forcats")
#install.packages("scales")
#install.packages("ggplot2")
#install.packages("readxl")

# Carga de librerías
library(haven)
library(rio)
library(dplyr)
library(stringr)
library(tidyr)
library(forcats)
library(scales)
library(ggplot2)
library(readxl)
library(rlang)
# Paleta y tema 
pal_si_no <- c("No" = "#D73027", "Sí" = "#1F78B4")
scale_fill_si_no <- function(...) scale_fill_manual(values = pal_si_no, ...)
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()
    )
}

El presente archivo pretende analizar aquellas variables relacionadas al agua a nivel hogar entre los años 2020 y 2024. Toda la información forma parte de la Encuesta Nacional de Hogares (ENAHO), la cual se realiza anualmente en el Perú.

1 ENAHO 2020

enaho2020 <- import("enaho2020.csv")

1.1 Agua potable por departamento (2020)

orden_dep <- enaho2020 %>%
  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)

enaho2020 %>%
  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 (ENAHO 2020)",
       x="Departamento", y="Participación (%)",
       caption="Fuente: ENAHO 2020") +
  tema_apoyo()

1.2 Entidad de pago (nacional, 2020)

enaho2020 %>%
  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 (%) – ENAHO 2020",
       x="Entidad", y="Porcentaje de hogares",
       caption="Fuente: ENAHO 2020") +
  tema_apoyo()

1.3 Entidad de pago por departamento (2020)

orden_dep <- enaho2020 %>%
  filter(paga_servicio == "Sí", !is.na(departamento)) %>%
  count(departamento) %>% arrange(n) %>% pull(departamento)

enaho2020 %>%
  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 por departamento",
       subtitle="% dentro de hogares que pagan – ENAHO 2020",
       x="Departamento", y="Participación (%)",
       fill="Entidad", caption="Fuente: ENAHO 2020") +
  tema_apoyo()

1.4 Fuente principal de agua (2020)

enaho2020 %>%
  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 (%) – ENAHO 2020",
       x="Fuente de agua", y="Porcentaje de hogares",
       caption="Fuente: ENAHO 2020") +
  tema_apoyo()

1.5 Fuente principal de agua por departamento (2020)

orden_dep <- enaho2020 %>%
  filter(!is.na(departamento)) %>% count(departamento) %>% arrange(n) %>% pull(departamento)

enaho2020 %>%
  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 – ENAHO 2020",
       x="Departamento", y="Participación (%)",
       fill="Fuente", caption="Fuente: ENAHO 2020") +
  tema_apoyo()

1.6 Acceso al servicio todos los días por departamento (2020)

orden_dep <- enaho2020 %>%
  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)

enaho2020 %>%
  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 – ENAHO 2020",
       x="Departamento", y="Participación (%)",
       caption="Fuente: ENAHO 2020") +
  tema_apoyo()

1.7 Horas de servicio al día (boxplot, 2020)

orden_dep <- enaho2020 %>%
  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)

enaho2020 %>%
  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) – ENAHO 2020",
       x="Departamento", y="Horas por día",
       caption="Fuente: ENAHO 2020") +
  tema_apoyo()

1.8 Pago por el servicio (Sí/No) por departamento (2020)

orden_dep <- enaho2020 %>%
  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)

enaho2020 %>%
  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 – ENAHO 2020",
       x="Departamento", y="Participación (%)",
       caption="Fuente: ENAHO 2020") +
  tema_apoyo()

1.9 Gasto mensual en agua (histograma, 2020)

enaho2020 %>%
  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 – ENAHO 2020",
       x="Gasto mensual (S/)", y="Número de hogares",
       caption="Fuente: ENAHO 2020") +
  tema_apoyo()

1.10 Riesgo SIN cloro_residual: solo “sin agua potable” (nacional, 2020)

enaho2020 %>%
  mutate(riesgo = ifelse(agua_potable == "No", "En riesgo (sin potable)", "Seguro")) %>%
  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("En riesgo (sin potable)" = "#D73027",
                               "Seguro" = "#1F78B4")) +
  labs(title="Condición del agua en los hogares (definida por potabilidad)",
       subtitle="ENAHO 2020",
       x="", y="Porcentaje de hogares",
       fill="Condición", caption="Fuente: ENAHO 2020") +
  tema_apoyo()

1.11 Mapa de calor de riesgo por departamento (sin potable, 2020)

riesgo_dep <- enaho2020 %>%
  filter(!is.na(departamento), !is.na(agua_potable)) %>%
  mutate(riesgo = agua_potable == "No") %>%
  group_by(departamento) %>%
  summarise(pct_riesgo = mean(riesgo), .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 proporción de hogares sin agua potable",
       subtitle="% de hogares en riesgo – ENAHO 2020",
       x="Porcentaje de hogares sin potable", y="Departamento",
       caption="Fuente: ENAHO 2020") +
  tema_apoyo()

1.12 Capacidad de pago vs riesgo (sin potable, 2020)

enaho2020 %>%
  mutate(riesgo = ifelse(agua_potable == "No", "En riesgo (sin potable)", "Seguro")) %>%
  filter(!is.na(gasto_agua_total), gasto_agua_total >= 0) %>%
  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 (sin potable)"="#D73027","Seguro"="#1F78B4")) +
  labs(title="Gasto mensual en agua por condición de potabilidad",
       subtitle="ENAHO 2020",
       x="Gasto mensual en agua (S/)", y="Número de hogares",
       fill="Condición", caption="Fuente: ENAHO 2020") +
  tema_apoyo()

1.13 Top 10 provincias con mayor riesgo (sin potable, 2020)

top_prov <- enaho2020 %>%
  filter(!is.na(provincia), !is.na(agua_potable)) %>%
  group_by(provincia) %>%
  summarise(pct_riesgo = mean(agua_potable == "No"), .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 (sin agua potable)",
       subtitle="% de hogares – ENAHO 2020",
       x="Porcentaje de hogares sin agua potable", y="Provincia",
       caption="Fuente: ENAHO 2020") +
  tema_apoyo()

2 ENAHO 2021

enaho2021 <- import("enaho2021.csv")

2.1 Agua potable por departamento (2021)

orden_dep <- enaho2021 %>%
  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)

enaho2021 %>%
  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_si_no(name = "¿Agua potable?") +
  labs(title="Acceso a agua potable por departamento",
       subtitle="% de hogares (ENAHO 2021)",
       x="Departamento", y="Participación (%)",
       caption="Fuente: ENAHO 2021") +
  tema_apoyo()

2.2 Entidad de pago (nacional, 2021)

enaho2021 %>%
  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 (%) – ENAHO 2021",
       x="Entidad", y="Porcentaje de hogares",
       caption="Fuente: ENAHO 2021") +
  tema_apoyo()

2.3 Entidad de pago por departamento (2021)

orden_dep <- enaho2021 %>%
  filter(paga_servicio == "Sí", !is.na(departamento)) %>%
  count(departamento) %>%
  arrange(n) %>% pull(departamento)

enaho2021 %>%
  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 por departamento",
       subtitle="% dentro de hogares que pagan – ENAHO 2021",
       x="Departamento", y="Participación (%)",
       fill="Entidad", caption="Fuente: ENAHO 2021") +
  tema_apoyo()

2.4 Fuente principal de agua (nacional, 2021)

enaho2021 %>%
  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 (%) – ENAHO 2021",
       x="Fuente de agua", y="Porcentaje de hogares",
       caption="Fuente: ENAHO 2021") +
  tema_apoyo()

2.5 Fuente principal de agua por departamento (2021)

orden_dep <- enaho2021 %>%
  filter(!is.na(departamento)) %>%
  count(departamento) %>% arrange(n) %>% pull(departamento)

enaho2021 %>%
  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 – ENAHO 2021",
       x="Departamento", y="Participación (%)",
       fill="Fuente", caption="Fuente: ENAHO 2021") +
  tema_apoyo()

2.6 Cloro residual (nacional, 2021)

enaho2021 %>%
  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 (%) – ENAHO 2021",
       x="Nivel de cloro", y="Porcentaje de hogares",
       caption="Fuente: ENAHO 2021") +
  tema_apoyo()

2.7 Dosificación inadecuada por departamento (2021)

enaho2021 %>%
  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 – ENAHO 2021",
       x="Porcentaje de hogares", y="Departamento",
       caption="Fuente: ENAHO 2021") +
  tema_apoyo()

2.8 Acceso al servicio todos los días por departamento (2021)

orden_dep <- enaho2021 %>%
  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)

enaho2021 %>%
  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_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 – ENAHO 2021",
       x="Departamento", y="Participación (%)",
       caption="Fuente: ENAHO 2021") +
  tema_apoyo()

2.9 Horas de servicio al día (boxplot, 2021)

orden_dep <- enaho2021 %>%
  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)

enaho2021 %>%
  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) – ENAHO 2021",
       x="Departamento", y="Horas por día",
       caption="Fuente: ENAHO 2021") +
  tema_apoyo()

2.10 Pago por el servicio (Sí/No) por departamento (2021)

orden_dep <- enaho2021 %>%
  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)

enaho2021 %>%
  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_si_no(name = "¿Paga?") +
  labs(title="Hogares que pagan por el servicio de agua",
       subtitle="% de hogares dentro de cada departamento – ENAHO 2021",
       x="Departamento", y="Participación (%)",
       caption="Fuente: ENAHO 2021") +
  tema_apoyo()

2.11 Gasto Mensual en agua (histograma, 2021)

enaho2021 %>%
  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 – ENAHO 2021",
       x="Gasto mensual (S/)", y="Número de hogares",
       caption="Fuente: ENAHO 2021") +
  tema_apoyo()

2.12 Riesgo (potabilidad o cloro) – nacional (2021)

enaho2021 %>%
  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="No potable OR cloro inadecuado/sin cloro – ENAHO 2021",
       x="", y="Porcentaje de hogares",
       fill="Condición", caption="Fuente: ENAHO 2021") +
  tema_apoyo()

2.13 Mapa de calor de riesgo por departamento (2021)

riesgo_dep <- enaho2021 %>%
  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 potable o con cloro inadecuado/sin cloro – ENAHO 2021",
       x="Porcentaje de hogares en riesgo", y="Departamento",
       caption="Fuente: ENAHO 2021") +
  tema_apoyo()

2.14 Top 10 provincias con mayor riesgo (2021)

top_prov <- enaho2021 %>%
  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 – ENAHO 2021",
       x="Porcentaje de hogares en riesgo", y="Provincia",
       caption="Fuente: ENAHO 2021") +
  tema_apoyo()

3 ENAHO 2022

enaho2022 <- import("enaho2022.csv")

3.1 Agua potable por departamento (2022)

orden_dep <- enaho2022 %>%
  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)

enaho2022 %>%
  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_si_no(name = "¿Agua potable?") +
  labs(title="Acceso a agua potable por departamento",
       subtitle="% de hogares (ENAHO 2022)",
       x="Departamento", y="Participación (%)",
       caption="Fuente: ENAHO 2022") +
  tema_apoyo()

3.2 Entidad de pago (nacional, 2022)

enaho2022 %>%
  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 (%) – ENAHO 2022",
       x="Entidad", y="Porcentaje de hogares",
       caption="Fuente: ENAHO 2022") +
  tema_apoyo()

3.3 Entidad de pago por departamento (2022)

orden_dep <- enaho2022 %>%
  filter(paga_servicio == "Sí", !is.na(departamento)) %>%
  count(departamento) %>% arrange(n) %>% pull(departamento)

enaho2022 %>%
  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 por departamento",
       subtitle="% dentro de hogares que pagan – ENAHO 2022",
       x="Departamento", y="Participación (%)",
       fill="Entidad", caption="Fuente: ENAHO 2022") +
  tema_apoyo()

3.4 Fuente principal de agua (nacional, 2022)

enaho2022 %>%
  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 (%) – ENAHO 2022",
       x="Fuente de agua", y="Porcentaje de hogares",
       caption="Fuente: ENAHO 2022") +
  tema_apoyo()

3.5 Fuente principal de agua por departamento (2022)

orden_dep <- enaho2022 %>%
  filter(!is.na(departamento)) %>% count(departamento) %>% arrange(n) %>% pull(departamento)

enaho2022 %>%
  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 – ENAHO 2022",
       x="Departamento", y="Participación (%)",
       fill="Fuente", caption="Fuente: ENAHO 2022") +
  tema_apoyo()

3.6 Cloro residual (nacional, 2022)

enaho2022 %>%
  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 (%) – ENAHO 2022",
       x="Nivel de cloro", y="Porcentaje de hogares",
       caption="Fuente: ENAHO 2022") +
  tema_apoyo()

3.7 Dosificación inadecuada por departamento (2022)

enaho2022 %>%
  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 – ENAHO 2022",
       x="Porcentaje de hogares", y="Departamento",
       caption="Fuente: ENAHO 2022") +
  tema_apoyo()

3.8 Acceso al servicio todos los días por departamento (2022)

orden_dep <- enaho2022 %>%
  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)

enaho2022 %>%
  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_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 – ENAHO 2022",
       x="Departamento", y="Participación (%)",
       caption="Fuente: ENAHO 2022") +
  tema_apoyo()

3.9 Horas de servicio al día (boxplot, 2022)

orden_dep <- enaho2022 %>%
  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)

enaho2022 %>%
  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) – ENAHO 2022",
       x="Departamento", y="Horas por día",
       caption="Fuente: ENAHO 2022") +
  tema_apoyo()

3.10 Pago por el servicio (Sí/No) por departamento (2022)

orden_dep <- enaho2022 %>%
  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)

enaho2022 %>%
  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_si_no(name = "¿Paga?") +
  labs(title="Hogares que pagan por el servicio de agua",
       subtitle="% de hogares dentro de cada departamento – ENAHO 2022",
       x="Departamento", y="Participación (%)",
       caption="Fuente: ENAHO 2022") +
  tema_apoyo()

3.11 Gasto mensual en agua (histograma, 2022)

enaho2022 %>%
  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 – ENAHO 2022",
       x="Gasto mensual (S/)", y="Número de hogares",
       caption="Fuente: ENAHO 2022") +
  tema_apoyo()

3.12 Riesgo (potabilidad o cloro) – nacional (2022)

enaho2022 %>%
  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="No potable o cloro inadecuado/sin cloro – ENAHO 2022",
       x="", y="Porcentaje de hogares",
       fill="Condición", caption="Fuente: ENAHO 2022") +
  tema_apoyo()

3.13 Mapa de calor de riesgo por departamento (2022)

riesgo_dep <- enaho2022 %>%
  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 potable o con cloro inadecuado/sin cloro – ENAHO 2022",
       x="Porcentaje de hogares en riesgo", y="Departamento",
       caption="Fuente: ENAHO 2022") +
  tema_apoyo()

3.14 Top 10 provincias con mayor riesgo (2022)

top_prov <- enaho2022 %>%
  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 – ENAHO 2022",
       x="Porcentaje de hogares en riesgo", y="Provincia",
       caption="Fuente: ENAHO 2022") +
  tema_apoyo()

4 ENAHO 2023

enaho2023 <- import("enaho2023.csv")

4.1 Agua potable por departamento (2023)

orden_dep <- enaho2023 %>%
  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)

enaho2023 %>%
  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_si_no(name = "¿Agua potable?") +
  labs(title="Acceso a agua potable por departamento",
       subtitle="% de hogares (ENAHO 2023)",
       x="Departamento", y="Participación (%)",
       caption="Fuente: ENAHO 2023") +
  tema_apoyo()

4.2 Entidad de pago (nacional, 2023)

enaho2023 %>%
  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 (%) – ENAHO 2023",
       x="Entidad", y="Porcentaje de hogares",
       caption="Fuente: ENAHO 2023") +
  tema_apoyo()

4.3 Entidad de pago por departamento (2023)

orden_dep <- enaho2023 %>%
  filter(paga_servicio == "Sí", !is.na(departamento)) %>%
  count(departamento) %>% arrange(n) %>% pull(departamento)

enaho2023 %>%
  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 por departamento",
       subtitle="% dentro de hogares que pagan – ENAHO 2023",
       x="Departamento", y="Participación (%)",
       fill="Entidad", caption="Fuente: ENAHO 2023") +
  tema_apoyo()

4.4 Fuente principal de agua (nacional, 2023)

enaho2023 %>%
  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 (%) – ENAHO 2023",
       x="Fuente de agua", y="Porcentaje de hogares",
       caption="Fuente: ENAHO 2023") +
  tema_apoyo()

4.5 Fuente principal de agua por departamento (2023)

orden_dep <- enaho2023 %>%
  filter(!is.na(departamento)) %>% count(departamento) %>% arrange(n) %>% pull(departamento)

enaho2023 %>%
  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 – ENAHO 2023",
       x="Departamento", y="Participación (%)",
       fill="Fuente", caption="Fuente: ENAHO 2023") +
  tema_apoyo()

4.6 Cloro residual (nacional, 2023)

enaho2023 %>%
  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 (%) – ENAHO 2023",
       x="Nivel de cloro", y="Porcentaje de hogares",
       caption="Fuente: ENAHO 2023") +
  tema_apoyo()

4.7 Dosificación inadecuada por departamento (2023)

enaho2023 %>%
  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 – ENAHO 2023",
       x="Porcentaje de hogares", y="Departamento",
       caption="Fuente: ENAHO 2023") +
  tema_apoyo()

4.8 Acceso al servicio todos los días por departamento (2023)

orden_dep <- enaho2023 %>%
  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)

enaho2023 %>%
  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_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 – ENAHO 2023",
       x="Departamento", y="Participación (%)",
       caption="Fuente: ENAHO 2023") +
  tema_apoyo()

4.9 Horas de servicio al día (boxplot, 2023)

orden_dep <- enaho2023 %>%
  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)

enaho2023 %>%
  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) – ENAHO 2023",
       x="Departamento", y="Horas por día",
       caption="Fuente: ENAHO 2023") +
  tema_apoyo()

4.10 Pago por el servicio (Sí/No) por departamento (2023)

orden_dep <- enaho2023 %>%
  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)

enaho2023 %>%
  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_si_no(name = "¿Paga?") +
  labs(title="Hogares que pagan por el servicio de agua",
       subtitle="% de hogares dentro de cada departamento – ENAHO 2023",
       x="Departamento", y="Participación (%)",
       caption="Fuente: ENAHO 2023") +
  tema_apoyo()

4.11 Gasto mensual en agua (histograma, 2023)

enaho2023 %>%
  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 – ENAHO 2023",
       x="Gasto mensual (S/)", y="Número de hogares",
       caption="Fuente: ENAHO 2023") +
  tema_apoyo()

4.12 Riesgo (potabilidad o cloro) – nacional (2023)

enaho2023 %>%
  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="No potable OR cloro inadecuado/sin cloro – ENAHO 2023",
       x="", y="Porcentaje de hogares",
       fill="Condición", caption="Fuente: ENAHO 2023") +
  tema_apoyo()

4.13 Mapa de calor de riesgo por departamento (2023)

riesgo_dep <- enaho2023 %>%
  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 potable o con cloro inadecuado/sin cloro – ENAHO 2023",
       x="Porcentaje de hogares en riesgo", y="Departamento",
       caption="Fuente: ENAHO 2023") +
  tema_apoyo()

4.14 Top 10 provincias con mayor riesgo (2023)

top_prov <- enaho2023 %>%
  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 – ENAHO 2023",
       x="Porcentaje de hogares en riesgo", y="Provincia",
       caption="Fuente: ENAHO 2023") +
  tema_apoyo()

5 ENAHO 2024

enaho2024 <- import("enaho2024.csv")

5.1 Agua potable por departamento (2024)

orden_dep <- enaho2024 %>%
  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)

aguapotdep <- enaho2024 %>%
  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_si_no(name = "¿Agua potable?") +
  labs(title="Acceso a agua potable por departamento",
       subtitle="% de hogares (ENAHO 2024)",
       x="Departamento", y="Participación (%)",
       caption="Fuente: ENAHO 2024") +
  tema_apoyo()

aguapotdep

5.2 Entidad de pago (nacional, 2024)

enaho2024 %>%
  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 (%) – ENAHO 2024",
       x="Entidad", y="Porcentaje de hogares",
       caption="Fuente: ENAHO 2024") +
  tema_apoyo()

5.3 Entidad de pago por departamento (2024)

orden_dep <- enaho2024 %>%
  filter(paga_servicio == "Sí", !is.na(departamento)) %>%
  count(departamento) %>% arrange(n) %>% pull(departamento)

enaho2024 %>%
  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 por departamento",
       subtitle="% dentro de hogares que pagan – ENAHO 2024",
       x="Departamento", y="Participación (%)",
       fill="Entidad", caption="Fuente: ENAHO 2024") +
  tema_apoyo()

5.4 Fuente principal de agua (nacional, 2024)

enaho2024 %>%
  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 (%) – ENAHO 2024",
       x="Fuente de agua", y="Porcentaje de hogares",
       caption="Fuente: ENAHO 2024") +
  tema_apoyo()

5.5 Fuente principal de agua por departamento (2024)

orden_dep <- enaho2024 %>%
  filter(!is.na(departamento)) %>%
  count(departamento) %>% arrange(n) %>% pull(departamento)

fuentedep <- enaho2024 %>%
  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()

fuentedep

5.6 Cloro residual (nacional, 2024) — si existe

enaho2024 %>%
    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()

5.7 Dosificación inadecuada por departamento (2024)

enaho2024 %>%
    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()

5.8 Acceso al servicio todos los días por departamento (2024)

orden_dep <- enaho2024 %>%
  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)

accesodep <- enaho2024 %>%
  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_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()

accesodep

5.9 Horas de servicio al día (boxplot, 2024)

orden_dep <- enaho2024 %>%
  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)

enaho2024 %>%
  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) – ENAHO 2024",
       x="Departamento", y="Horas por día",
       caption="Fuente: ENAHO 2024") +
  tema_apoyo()

5.10 Pago por el servicio (Sí/No) por departamento (2024)

orden_dep <- enaho2024 %>%
  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)

enaho2024 %>%
  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_si_no(name = "¿Paga?") +
  labs(title="Hogares que pagan por el servicio de agua",
       subtitle="% de hogares dentro de cada departamento – ENAHO 2024",
       x="Departamento", y="Participación (%)",
       caption="Fuente: ENAHO 2024") +
  tema_apoyo()

5.11 Gasto mensual en agua (histograma, 2024)

enaho2024 %>%
  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 – ENAHO 2024",
       x="Gasto mensual (S/)", y="Número de hogares",
       caption="Fuente: ENAHO 2024") +
  tema_apoyo()

5.12 Riesgo (potabilidad o cloro si existe) – nacional (2024)

condicion <- enaho2024 %>%
  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="Agua no potable o cloro inadecuado/sin cloro",
       x="", y="Porcentaje de hogares",
       fill="Condición", caption="Fuente: ENAHO 2024") +
  tema_apoyo()

condicion

5.13 Mapa de calor de riesgo por departamento (2024)

riesgo_dep <- enaho2024 %>%
  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))

depmaxexpo <- 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/sin cloro",
       x="Porcentaje de hogares en riesgo", y="Departamento",
       caption="Fuente: ENAHO 2024") +
  tema_apoyo()

depmaxexpo

5.14 Top 10 provincias con mayor riesgo (2024)

top_prov <- enaho2024 %>%
  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)

topriesgoprov <- 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",
       x="Porcentaje de hogares en riesgo", y="Provincia",
       caption="Fuente: ENAHO 2024") +
  tema_apoyo()

topriesgoprov

6 Análisis progresivo

# ---- Librerías ----
library(dplyr)
library(tidyr)
library(ggplot2)
library(forcats)
library(scales)
library(stringr)
library(rlang)

# ---- Paleta Sí/No y tema ----
pal_si_no <- c("No" = "#D73027", "Sí" = "#1F78B4")
scale_fill_si_no <- function(...) scale_fill_manual(values = pal_si_no, ...)

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 = "right",
      panel.grid.minor = element_blank()
    )
}
# Función para tipar y añadir año
prep_anio <- function(df, anio) {
  nm <- names(df)
  df %>%
    mutate(
      anio = as.integer(anio),
      # asegurar tipos
      agua_potable     = if ("agua_potable"     %in% nm) as.character(agua_potable) else NA_character_,
      agua_todos_dias  = if ("agua_todos_dias"  %in% nm) as.character(agua_todos_dias) else NA_character_,
      paga_servicio    = if ("paga_servicio"    %in% nm) as.character(paga_servicio) else NA_character_,
      cloro_residual   = if ("cloro_residual"   %in% nm) as.character(cloro_residual) else NA_character_,
      departamento     = if ("departamento"     %in% nm) as.character(departamento) else NA_character_,
      provincia        = if ("provincia"        %in% nm) as.character(provincia) else NA_character_,
      distrito         = if ("distrito"         %in% nm) as.character(distrito) else NA_character_,
      horas_dia_diario = if ("horas_dia_diario" %in% nm)
                           ifelse(horas_dia_diario %in% 1:24, horas_dia_diario, NA_integer_)
                         else NA_integer_,
      gasto_agua_total = if ("gasto_agua_total" %in% nm) as.numeric(gasto_agua_total) else NA_real_
    )
}

# Une todas las bases
enaho_all <- bind_rows(
  prep_anio(enaho2020, 2020),
  prep_anio(enaho2021, 2021),
  prep_anio(enaho2022, 2022),
  prep_anio(enaho2023, 2023),
  prep_anio(enaho2024, 2024)
)

# Define "riesgo":
# 2020: solo No potable
# 2021+: No potable OR cloro inadecuado/sin cloro
enaho_all <- enaho_all %>%
  mutate(
    riesgo = case_when(
      anio == 2020 ~ agua_potable == "No",
      anio >= 2021 ~ (agua_potable == "No") | (cloro_residual %in% c("Dosificación inadecuada","Sin cloro")),
      TRUE ~ NA
    )
  )
# geo: "departamento" | "provincia" | "distrito"
indicadores_por_geo <- function(df, geo = c("departamento","provincia","distrito")) {
  geo <- match.arg(geo)
  stopifnot(geo %in% names(df))

  out <- df %>%
    group_by(anio, .data[[geo]]) %>%
    summarise(
      n               = n(),
      pct_potable     = mean(agua_potable == "Sí", na.rm = TRUE),
      pct_todos_dias  = mean(agua_todos_dias == "Sí", na.rm = TRUE),
      pct_paga        = mean(paga_servicio == "Sí", na.rm = TRUE),
      pct_riesgo      = mean(riesgo, na.rm = TRUE),
      med_horas_dia   = median(horas_dia_diario, na.rm = TRUE),
      med_gasto_total = median(gasto_agua_total, na.rm = TRUE),
      .groups = "drop"
    ) %>%
    mutate(across(where(is.numeric), ~ ifelse(is.finite(.x), .x, NA_real_))) %>%
    rename(geo = !!geo) %>%
    mutate(geo = as.character(geo), anio = as.integer(anio))

  out
}

# Tablas por departamento y provincia (agrega distrito si lo necesitas)
ind_depto <- indicadores_por_geo(enaho_all, "departamento")
ind_prov  <- indicadores_por_geo(enaho_all, "provincia")
# ind_dist   <- indicadores_por_geo(enaho_all, "distrito")
plot_linea_departamentos <- function(ind_df,
  indicador = c("pct_potable","pct_riesgo","pct_todos_dias","pct_paga",
                "med_horas_dia","med_gasto_total"),
  top_n = 8, ordenar_por = c("ultimo","prom"), formato_pct = TRUE) {

  indicador   <- match.arg(indicador)
  ordenar_por <- match.arg(ordenar_por)

  # Ranking para elegir destacados
  rank_df <- ind_df %>%
    group_by(geo) %>%
    arrange(anio, .by_group = TRUE) %>%
    summarise(
      val_ultimo = dplyr::last(!!sym(indicador)),
      val_prom   = mean(!!sym(indicador), na.rm = TRUE),
      .groups = "drop"
    ) %>%
    mutate(orden = ifelse(ordenar_por == "prom", val_prom, val_ultimo)) %>%
    arrange(desc(orden))

  sel_geos <- head(rank_df$geo, top_n)

  # Promedio nacional por año
  prom_nac <- ind_df %>%
    group_by(anio) %>%
    summarise(val = mean(!!sym(indicador), na.rm = TRUE), .groups = "drop")

  # Base con todos + flag destacados
  base <- ind_df %>%
    mutate(destacado = geo %in% sel_geos,
           geo = fct_reorder(geo, rank_df$orden[match(geo, rank_df$geo)]))

  ggplot() +
    # todas las líneas en gris
    geom_line(
      data = dplyr::filter(base, !destacado),
      aes(x = anio, y = !!sym(indicador), group = geo),
      linewidth = 0.6, color = "grey80"
    ) +
    # top_n en color
    geom_line(
      data = dplyr::filter(base, destacado),
      aes(x = anio, y = !!sym(indicador), color = geo),
      linewidth = 1
    ) +
    geom_point(
      data = dplyr::filter(base, destacado),
      aes(x = anio, y = !!sym(indicador), color = geo),
      size = 2
    ) +
    # promedio nacional
    geom_line(
      data = prom_nac,
      aes(x = anio, y = val),
      color = "black", linewidth = 0.9, linetype = 3
    ) +
    scale_x_continuous(breaks = sort(unique(ind_df$anio))) +
    { if (formato_pct) scale_y_continuous(labels = percent) else scale_y_continuous() } +
    labs(
      title = paste0("Evolución de ", switch(indicador,
        pct_potable    = "% de hogares con agua potable",
        pct_riesgo     = "% de hogares en riesgo (2020=No potable; 2021+ añade cloro)",
        pct_todos_dias = "% con servicio todos los días",
        pct_paga       = "% que pagan por el servicio",
        med_horas_dia  = "Mediana de horas de servicio al día",
        med_gasto_total= "Mediana del gasto mensual en agua (S/)")),
      subtitle = paste0("Todos los departamentos (gris) • Top ", top_n,
                        " destacados (color) • Línea punteada: promedio nacional"),
      x = NULL, y = ifelse(formato_pct, "Porcentaje", NULL), color = NULL,
      caption = "Fuente: ENAHO 2020–2024"
    ) +
    tema_apoyo()
}
plot_linea_departamentos_facetas <- function(ind_df,
  indicador = c("pct_potable","pct_riesgo","pct_todos_dias","pct_paga",
                "med_horas_dia","med_gasto_total"),
  ncol = 5, formato_pct = TRUE) {

  indicador <- match.arg(indicador)

  ggplot(ind_df, aes(x = anio, y = !!sym(indicador), group = geo)) +
    geom_line(linewidth = 0.8, color = "steelblue") +
    geom_point(size = 1.5, color = "steelblue") +
    facet_wrap(~ geo, ncol = ncol) +
    scale_x_continuous(breaks = sort(unique(ind_df$anio))) +
    { if (formato_pct) scale_y_continuous(labels = percent) else scale_y_continuous() } +
    labs(
      title = paste0("Evolución por departamento: ", switch(indicador,
        pct_potable    = "% con agua potable",
        pct_riesgo     = "% en riesgo",
        pct_todos_dias = "% con servicio todos los días",
        pct_paga       = "% que pagan por el servicio",
        med_horas_dia  = "Mediana horas/día",
        med_gasto_total= "Mediana gasto mensual (S/)")),
      x = NULL, y = ifelse(formato_pct, "Porcentaje", NULL),
      caption = "Fuente: ENAHO 2020–2024"
    ) +
    tema_apoyo() +
    theme(legend.position = "none")
}
plot_heatmap_delta_2020 <- function(ind_df,
  indicador = c("pct_potable","pct_riesgo","pct_todos_dias","pct_paga"),
  top_n = Inf) {

  indicador <- match.arg(indicador)

  base <- ind_df %>%
    group_by(geo) %>%
    mutate(base2020 = (!!sym(indicador))[anio == 2020][1],
           delta = (!!sym(indicador)) - base2020) %>%
    ungroup()

  # ordenar por mejora 2020→último año
  ultimo <- max(ind_df$anio, na.rm = TRUE)
  orden <- base %>%
    filter(anio == ultimo) %>%
    arrange(desc(delta)) %>%
    slice_head(n = top_n) %>%
    pull(geo)

  dfp <- base %>%
    filter(geo %in% orden) %>%
    mutate(geo = factor(geo, levels = rev(orden)),
           anio = factor(anio, levels = sort(unique(ind_df$anio))))

  ggplot(dfp, aes(x = anio, y = geo, fill = delta)) +
    geom_tile(color = "white", linewidth = 0.3) +
    scale_fill_gradient2(low = "#D73027", mid = "white", high = "#1F78B4",
                         midpoint = 0, labels = percent) +
    labs(
      title = paste0("Cambio vs 2020: ", switch(indicador,
        pct_potable    = "% con agua potable",
        pct_riesgo     = "% en riesgo (↓ mejor si negativo)",
        pct_todos_dias = "% con servicio todos los días",
        pct_paga       = "% que pagan por el servicio")),
      subtitle = "Positivo: mejora respecto a 2020 | Negativo: deterioro respecto a 2020",
      x = "Año", y = NULL, fill = "Δ vs 2020", caption = "Fuente: ENAHO 2020–2024"
    ) +
    tema_apoyo() +
    theme(panel.grid = element_blank())
}
# Línea estándar: % con agua potable (Top 10 por último año)
plot_linea_departamentos(ind_depto, indicador = "pct_potable",
                         top_n = 10, ordenar_por = "ultimo", formato_pct = TRUE)

# Línea estándar: % en riesgo (Top 10 por promedio 2020–24)
plot_linea_departamentos(ind_depto, indicador = "pct_riesgo",
                         top_n = 10, ordenar_por = "prom", formato_pct = TRUE)

# Facetas: % con servicio todos los días (todos los departamentos)
plot_linea_departamentos_facetas(ind_depto, indicador = "pct_todos_dias", ncol = 5)
## `geom_line()`: Each group consists of only one observation.
## ℹ Do you need to adjust the group aesthetic?

# Heatmap cambio vs 2020: % con agua potable (todos)
plot_heatmap_delta_2020(ind_depto, indicador = "pct_potable", top_n = Inf)

ggsave("aguapotdep.png",
       plot = aguapotdep, width = 12, height = 8, units = "cm",
       dpi = 300, bg = "white")

ggsave("fuentedep.png",
       plot = fuentedep, width = 12, height = 8, units = "cm",
       dpi = 300, bg = "white")

ggsave("accesodep.png",
       plot = accesodep, width = 12, height = 8, units = "cm",
       dpi = 300, bg = "white")

ggsave("condicion.png",
       plot = condicion, width = 12, height = 8, units = "cm",
       dpi = 300, bg = "white")

ggsave("topriesgoprov.png",
       plot = topriesgoprov, width = 12, height = 8, units = "cm",
       dpi = 300, bg = "white")

ggsave("depmaxexpo.png",
       plot = depmaxexpo, width = 12, height = 8, units = "cm",
       dpi = 300, bg = "white")