En redes de distribución de agua potable digitalizadas en SIG (QGIS/PostGIS), la apariencia cartográfica no garantiza conectividad topológica adecuada para análisis cuantitativos. Este estudio piloto convierte redes por DMA a una representación como grafo y evalúa cuantitativamente su estructura para establecer una validación previa al análisis principal. Se analizaron cinco DMAs (CRS EPSG:32719), transformando nudos y válvulas en nodos y tuberías en aristas. Se compararon dos estados: A (red SIG convertida directamente a grafo) y B (grafo validado/corregido mediante depuración topológica en el dominio de grafos, incluyendo selección de componente principal). Se calcularon métricas estructurales: número de nodos, aristas, densidad, número de componentes conexas, porcentaje de nodos de grado 1 y longitud total. Se reportó estadística descriptiva (mediana e IQR) y se aplicó Wilcoxon pareado (α=0.05) como verificación piloto. En los DMAs con mayor inconsistencia, el procedimiento redujo componentes y estabilizó la conectividad, mostrando el valor del enfoque QGIS/PostGIS→Grafo como protocolo reproducible para validación cuantitativa por DMA y como base confiable para la etapa principal del estudio.
Palabras clave: grafos; QGIS; PostGIS; DMA; conectividad; calidad topológica; Wilcoxon.
Los SIG permiten representar redes como capas georreferenciadas (líneas y puntos), pero pequeñas incongruencias geométricas (micro-separaciones, extremos no coincidentes, segmentos espurios) pueden afectar la conectividad analítica sin ser evidentes visualmente. La teoría de grafos formaliza la conectividad y permite cuantificar propiedades estructurales comparables por DMA. En consecuencia, es pertinente incorporar una validación cuantitativa previa basada en grafos antes de avanzar a modelación avanzada.
Objetivo general: Validar cuantitativamente la calidad topológica de redes por DMA mediante su conversión desde QGIS/PostGIS a grafos y el cálculo de métricas, incluyendo estadística descriptiva y verificación piloto con Wilcoxon pareado.
Se trabajó con cinco DMAs exportados desde QGIS/PostGIS. Para cada DMA se construyó un grafo no dirigido:
Se consideraron dos estados:
Métricas analizadas: número de nodos, número de aristas, densidad, componentes conexas, porcentaje de nodos de grado 1 y longitud total.
Análisis estadístico: estadística descriptiva (mediana e IQR) por estado y Wilcoxon pareado (α=0.05) para comparar A vs B (piloto con n=5 DMAs).
library(readr)
library(dplyr)
library(tidyr)
library(knitr)
metrics_all <- read_csv("data/metricas_5DMA_AB.csv", show_col_types = FALSE)
wide <- read_csv("data/tabla_5DMA_AB_delta.csv", show_col_types = FALSE)
diagnostico <- read_csv("data/diagnostico_5DMA.csv", show_col_types = FALSE)
resumen_csv <- read_csv("data/resumen_estados_5DMA.csv", show_col_types = FALSE)
metrics_all
## # A tibble: 10 × 8
## dma estado n_nodos n_aristas densidad n_componentes pct_grado1
## <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 DMA01 A 543 651 0.00442 2 20.6
## 2 DMA01 B 535 628 0.00440 1 21.3
## 3 DMA02 A 92 100 0.0239 5 31.5
## 4 DMA02 B 88 96 0.0251 1 35.2
## 5 DMA03 A 151 176 0.0155 1 25.2
## 6 DMA03 B 151 174 0.0154 1 26.5
## 7 DMA04 A 118 125 0.0181 1 39.0
## 8 DMA04 B 118 124 0.0180 1 39.8
## 9 DMA05 A 45 47 0.0475 1 42.2
## 10 DMA05 B 45 47 0.0475 1 42.2
## # ℹ 1 more variable: longitud_total_m <dbl>
kable(metrics_all, digits = 4,
caption = "Métricas topológicas por DMA en los estados A (original) y B (validado/corregido).")
| dma | estado | n_nodos | n_aristas | densidad | n_componentes | pct_grado1 | longitud_total_m |
|---|---|---|---|---|---|---|---|
| DMA01 | A | 543 | 651 | 0.0044 | 2 | 20.6262 | 32109.184 |
| DMA01 | B | 535 | 628 | 0.0044 | 1 | 21.3084 | 32079.499 |
| DMA02 | A | 92 | 100 | 0.0239 | 5 | 31.5217 | 5772.750 |
| DMA02 | B | 88 | 96 | 0.0251 | 1 | 35.2273 | 5765.743 |
| DMA03 | A | 151 | 176 | 0.0155 | 1 | 25.1656 | 9473.718 |
| DMA03 | B | 151 | 174 | 0.0154 | 1 | 26.4901 | 9470.653 |
| DMA04 | A | 118 | 125 | 0.0181 | 1 | 38.9831 | 6578.788 |
| DMA04 | B | 118 | 124 | 0.0180 | 1 | 39.8305 | 6577.888 |
| DMA05 | A | 45 | 47 | 0.0475 | 1 | 42.2222 | 2748.221 |
| DMA05 | B | 45 | 47 | 0.0475 | 1 | 42.2222 | 2748.221 |
kable(wide, digits = 4,
caption = "Tabla pareada por DMA con métricas A, B y deltas (B − A).")
| dma | n_nodos_A | n_nodos_B | n_aristas_A | n_aristas_B | densidad_A | densidad_B | n_componentes_A | n_componentes_B | pct_grado1_A | pct_grado1_B | longitud_total_m_A | longitud_total_m_B | d_n_componentes | d_pct_grado1 | d_densidad | d_longitud_m |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| DMA01 | 543 | 535 | 651 | 628 | 0.0044 | 0.0044 | 2 | 1 | 20.6262 | 21.3084 | 32109.184 | 32079.499 | -1 | 0.6823 | 0.0000 | -29.6849 |
| DMA02 | 92 | 88 | 100 | 96 | 0.0239 | 0.0251 | 5 | 1 | 31.5217 | 35.2273 | 5772.750 | 5765.743 | -4 | 3.7055 | 0.0012 | -7.0071 |
| DMA03 | 151 | 151 | 176 | 174 | 0.0155 | 0.0154 | 1 | 1 | 25.1656 | 26.4901 | 9473.718 | 9470.653 | 0 | 1.3245 | -0.0002 | -3.0651 |
| DMA04 | 118 | 118 | 125 | 124 | 0.0181 | 0.0180 | 1 | 1 | 38.9831 | 39.8305 | 6578.788 | 6577.888 | 0 | 0.8475 | -0.0001 | -0.9000 |
| DMA05 | 45 | 45 | 47 | 47 | 0.0475 | 0.0475 | 1 | 1 | 42.2222 | 42.2222 | 2748.221 | 2748.221 | 0 | 0.0000 | 0.0000 | 0.0000 |
resumen <- metrics_all %>%
group_by(estado) %>%
summarise(
n_dma = n_distinct(dma),
med_componentes = median(n_componentes),
iqr_componentes = IQR(n_componentes),
med_pct_grado1 = median(pct_grado1),
iqr_pct_grado1 = IQR(pct_grado1),
med_longitud_m = median(longitud_total_m),
iqr_longitud_m = IQR(longitud_total_m),
.groups = "drop"
)
kable(resumen, digits = 3, caption = "Estadística descriptiva por estado (mediana e IQR).")
| estado | n_dma | med_componentes | iqr_componentes | med_pct_grado1 | iqr_pct_grado1 | med_longitud_m | iqr_longitud_m |
|---|---|---|---|---|---|---|---|
| A | 5 | 1 | 1 | 31.522 | 13.817 | 6578.788 | 3700.967 |
| B | 5 | 1 | 0 | 35.227 | 13.340 | 6577.888 | 3704.909 |
w_comp <- wilcox.test(wide$n_componentes_B, wide$n_componentes_A, paired = TRUE, exact = FALSE)
w_g1 <- wilcox.test(wide$pct_grado1_B, wide$pct_grado1_A, paired = TRUE, exact = FALSE)
w_len <- wilcox.test(wide$longitud_total_m_B, wide$longitud_total_m_A, paired = TRUE, exact = FALSE)
pvals <- data.frame(
metrica = c("n_componentes", "pct_grado1", "longitud_total_m"),
p_value = c(w_comp$p.value, w_g1$p.value, w_len$p.value)
)
pvals
## metrica p_value
## 1 n_componentes 0.3710934
## 2 pct_grado1 0.1003482
## 3 longitud_total_m 0.1003482
kable(pvals, digits = 4,
caption = "P-values Wilcoxon pareado (A vs B) para métricas seleccionadas.")
| metrica | p_value |
|---|---|
| n_componentes | 0.3711 |
| pct_grado1 | 0.1003 |
| longitud_total_m | 0.1003 |
plot(wide$n_componentes_A, wide$n_componentes_B,
xlab = "A: n_componentes", ylab = "B: n_componentes",
main = "Cambio pareado por DMA (A→B)")
abline(0, 1)
text(wide$n_componentes_A, wide$n_componentes_B, labels = wide$dma, pos = 3)
A nivel descriptivo, el número de componentes conexas evidenció mejoras especialmente en los DMAs con fragmentación inicial. En general, el estado B presentó menor dispersión de componentes respecto al estado A, consistente con una conectividad más estable tras la validación. El porcentaje de nodos con grado 1 mostró variaciones por DMA, lo cual puede reflejar depuración de artefactos y cambios en la estructura local de ramificación. La longitud total mostró cambios pequeños, coherentes con correcciones localizadas y/o eliminación de segmentos espurios de baja longitud cuando aplica.
En la verificación piloto con Wilcoxon pareado (n=5), los p-values no alcanzaron significancia estadística a α=0.05, lo cual es esperable por el tamaño muestral reducido y el carácter exploratorio del piloto. Sin embargo, el procedimiento demuestra utilidad como protocolo cuantitativo reproducible por DMA previo a la etapa principal.
El enfoque QGIS/PostGIS→Grafo permite transformar una representación cartográfica en un objeto analítico formal (grafo), donde la conectividad puede medirse y compararse entre DMAs. El estado A refleja la red “tal como está” en SIG, mientras que el estado B incorpora una validación/corrección orientada a conectividad y componente principal, requisito común para análisis posteriores basados en grafos. Este piloto confirma que el marco metodológico es implementable en R de forma reproducible y que genera indicadores cuantitativos trazables.
Este trabajo es un piloto con n=5 DMAs. Para robustecer inferencias se recomienda ampliar el número de DMAs y complementar con métricas adicionales (p. ej., distribución de grados, centralidades). También se puede integrar información hidráulica cuando esté disponible para análisis más avanzados.