Acceso al agua potable pública frente a la sequía en Sicilia

Agua
Sicilia
Crisis Climática
Autor/a
Afiliación

Dario Marotta

Universitat de Valencia

Fecha de publicación

1 de abril de 2026

Input

Se ha obtenido un conjunto de datos espaciales correspondiente a los puntos de agua potable ubicados en la región de Sicilia, Italia. La fuente primaria de estos datos es OpenStreetMap (OSM), extraídos mediante la API de Overpass utilizando el paquete osmdata de R.

Descripción

La elección de esta temática responde a una problemática actual y severa: la emergencia hídrica y la sequía endémica que sufre el sur de Italia, especialmente Sicilia. En este contexto de crisis climática, el acceso público y gratuito al agua potable es un recurso vital tanto para la población residente como para el sector turístico.

Al realizar la descarga en bruto desde OpenStreetMap, se detecta que el conjunto de datos espaciales presenta deficiencias significativas que limitan su utilidad para la gestión pública o la respuesta a emergencias:

  1. Exceso de ruido: Cientos de atributos (columnas) autogenerados que están completamente vacíos (NA) o son irrelevantes para el usuario final.

  2. Falta de estandarización: Muchos puntos carecen de la etiqueta de “nombre”, lo que dificulta su identificación en un visor cartográfico.

  3. Falsos positivos de accesibilidad: Existen puntos catalogados como “agua potable” que en realidad tienen un acceso restringido (ej. access = private o access = customers), lo cual es inútil para un ciudadano que busca una fuente pública en la calle.

Tratamiento

Para mejorar el conjunto de datos y convertirlo en una herramienta fiable, se ha diseñado un script de limpieza en R utilizando el ecosistema tidyverse y sf.

El procedimiento metodológico ha consistido en:

  1. Filtrado de accesibilidad: Eliminar cualquier punto de agua que sea privado o de acceso exclusivo para clientes.

  2. Limpieza de atributos: Seleccionar únicamente las variables útiles (ID, nombre, accesibilidad y municipio) y descartar los metadatos de OSM.

  3. Estandarización (Imputación de datos): Rellenar los valores nulos (NA) en el campo “nombre” con la etiqueta estandarizada “Fuente Pública”.

    # Cargamos las librerías necesarias
    library(tidyverse)
    library(sf)
    library(osmdata)
    library(mapview)
    
    # 1. Definir el área de interés y rutas relativas para los archivos
    bbox_sicilia <- getbb("Sicily, Italy")
    archivo_bruto <- "fuentes_sicilia_bruto.gpkg"
    archivo_salida <- "fuentes_publicas_sicilia_mejorado.gpkg"
    
    # Usamos servidor espejo para evitar caídas de Overpass
    set_overpass_url("https://lz4.overpass-api.de/api/interpreter")
    
    # 2. Lógica de descarga y mejora de datos
    if(!file.exists(archivo_salida) | !file.exists(archivo_bruto)) {
    
      # A. DESCARGA EN BRUTO (Input)
      query <- opq(bbox_sicilia, timeout = 300) %>%
        add_osm_feature(key = "amenity", value = "drinking_water")
    
      datos_brutos <- osmdata_sf(query)
      puntos_agua <- datos_brutos$osm_points
    
      # Guardamos temporalmente el dataset bruto para la comparativa visual
      st_write(puntos_agua, archivo_bruto, delete_dsn = TRUE, quiet = TRUE)
    
      # B. MEJORA DE DATOS (Data Enhancement)
      agua_mejorada <- puntos_agua %>%
        # Nos quedamos solo con variables de interés
        select(osm_id, name, access) %>%
        # FILTRO CRÍTICO: Excluir fuentes privadas o exclusivas para clientes
        filter(is.na(access) | !access %in% c("private", "customers", "no")) %>%
        # ESTANDARIZACIÓN: Si no tiene nombre, le asignamos uno genérico en lugar de NA
        mutate(
          name = ifelse(is.na(name), "Fuente Pública", name),
          estado_acceso = "Público/Libre"
        ) %>%
        # Limpiar columna original de access para simplificar
        select(-access)
    
      # C. EXPORTACIÓN (Output persistente)
      st_write(agua_mejorada, archivo_salida, delete_dsn = TRUE, quiet = TRUE)
    
    } else {
      # Carga local para asegurar reproducibilidad rápida y mostrar comparativa
      puntos_agua <- st_read(archivo_bruto, quiet = TRUE)
      agua_mejorada <- st_read(archivo_salida, quiet = TRUE)
    }
    
    # 3. Cuantificación del impacto de la mejora
    n_brutos <- nrow(puntos_agua)
    cols_brutas <- ncol(puntos_agua)
    
    n_mejorados <- nrow(agua_mejorada)
    cols_limpias <- ncol(agua_mejorada)
    
    eliminados <- n_brutos - n_mejorados
    # Calculamos cuántos NA había en el campo 'name' original
    nombres_nulos <- sum(is.na(puntos_agua$name))
    
    cat("RESULTADOS DEL DATA ENHANCEMENT:\n")
    RESULTADOS DEL DATA ENHANCEMENT:
    cat("================================\n")
    ================================
    cat("1. Limpieza Estructural (Reducción de ruido): Se eliminaron", cols_brutas - cols_limpias, "columnas inútiles/vacías (De", cols_brutas, "a", cols_limpias, "variables).\n")
    1. Limpieza Estructural (Reducción de ruido): Se eliminaron 65 columnas inútiles/vacías (De 69 a 4 variables).
    cat("2. Estandarización de Nomenclatura:", nombres_nulos, "puntos sin nombre (NA) fueron corregidos e imputados como 'Fuente Pública'.\n")
    2. Estandarización de Nomenclatura: 2461 puntos sin nombre (NA) fueron corregidos e imputados como 'Fuente Pública'.
    cat("3. Filtrado Espacial: Se excluyeron", eliminados, "puntos de acceso restringido o privado.\n")
    3. Filtrado Espacial: Se excluyeron 6 puntos de acceso restringido o privado.
    cat("4. Dataset final optimizado:", n_mejorados, "fuentes públicas válidas y estandarizadas listas para análisis.\n")
    4. Dataset final optimizado: 2607 fuentes públicas válidas y estandarizadas listas para análisis.
    # 4. Representación visual Comparativa (Bruto vs Mejorado)
    mapview(puntos_agua, 
            col.regions = "red", 
            cex = 3,
            layer.name = "1. Datos Brutos (Todos)",
            legend = TRUE) +
    mapview(agua_mejorada, 
            col.regions = "dodgerblue", 
            cex = 3,
            layer.name = "2. Datos Mejorados (Públicos)",
            zcol = "name",
            legend = FALSE)

Output

El resultado de este script es una capa vectorial de puntos altamente optimizada y estandarizada. Este nuevo dataset ha sido purgado de fuentes inaccesibles y condensado en una estructura de datos eficiente.

A continuación, se detalla el impacto técnico de las mejoras aplicadas:

  1. Reducción de Dimensionalidad (Limpieza Estructural): Los datos brutos extraídos de OSM contenían 69 columnas. La inmensa mayoría consistían en etiquetas técnicas colaborativas irrelevantes para el análisis geográfico (ej. fixme, source, check_date, created_by). El script ha eliminado 65 variables de ruido, reduciendo la tabla exclusivamente a un “Diccionario de Datos” de 4 campos críticos:

    • osm_id: Identificador único de OpenStreetMap (Clave Primaria).

    • name: Nombre descriptivo para las etiquetas cartográficas.

    • estado_acceso: Etiqueta generada que garantiza la disponibilidad pública.

    • geom: Geometría puntual espacial.

  2. Imputación de Valores Faltantes (Estandarización): Originalmente, el dataset presentaba un déficit informativo grave. El algoritmo detectó 2461 registros nulos (NA) en el campo nombre y les imputó la etiqueta estándar “Fuente Pública”. Esto evita errores de visualización en software GIS y garantiza una lectura homogénea.

  3. Filtrado Lógico de Accesibilidad: Se identificaron y excluyeron 6 puntos etiquetados con restricciones explícitas (private, customers). En un contexto de olas de calor, proporcionar la ubicación de una fuente inaccesible al ciudadano supone un riesgo funcional. El dataset final garantiza que el 100% de los 2607 puntos representados son de acceso libre y real.

En el mapa interactivo superior se puede apreciar claramente la comparativa: los puntos rojos representan el volumen original (datos brutos), que ha sido filtrado exitosamente para dar paso a la capa final de fuentes públicas mejoradas (puntos azules).

El fichero generado con este procedimento se puede descargar directamente de aquí.

Limitaciones y Futuras Mejoras

Aunque el proceso de Data Enhancement ha mejorado sustancialmente la calidad del dataset original, desde una perspectiva crítica y académica se identifican tres áreas de mejora para futuras iteraciones del proyecto:

  1. Estado operativo real: El filtrado actual se basa en la accesibilidad teórica (access), pero no evalúa etiquetas secundarias como operational_status=broken o seasonal. Un filtrado más exhaustivo permitiría descartar fuentes que, aun siendo públicas, se encuentran actualmente averiadas o sin suministro.

  2. Pérdida de geometrías complejas: La extracción se ha limitado estrictamente a entidades puntuales (osm_points). Al omitir geometrías lineales (osm_lines) o poligonales (osm_polygons), se asume la pérdida de un porcentaje marginal (1-2%) de fuentes o manantiales cartografiados con mayor detalle geométrico.

  3. Enriquecimiento espacial (Spatial Join): Una futura línea de trabajo consistiría en cruzar espacialmente estos puntos con los límites administrativos oficiales de los municipios sicilianos (ej. datos ISTAT). Esto permitiría asignar automáticamente el municipio a cada fuente, facilitando el cálculo de ratios de accesibilidad al agua por habitante para politics publicas.