Supermercados Consum en el Municipio de Valencia
Input
Se ha extraído un conjunto de datos espaciales correspondientes a los supermercados de Consum, una de las principales cooperativas de distribución comercial de España. Posee una gran densidad de red en la Comunidad Valenciana. Los datos brutos se han obtenido consultando la API Overpass de OpenStreetMap(OSM).
Dado que OpenStreetMap (OSM) es una plataforma alimentada por voluntarios, la precisión y estructura de sus datos puede ser irregular. Al utilizar esta fuente, es estadísticamente previsible encontrar errores topológicos y una alta duplicidad de datos (por ejemplo, múltiples puntos mapeados para la entrada, el parking y el muelle de carga de un mismo supermercado), anomalías que se evidenciarán en el análisis.
Para garantizar la máxima reproducibilidad y precisión espacial, el área de extracción se ha delimitado de forma automatizada mediante un Bounding Box (caja envolvente). Este perímetro es calculado directamente por el algoritmo utilizando los límites administrativos oficiales del municipio de Valencia, provistos por el Instituto Geográfico Nacional (accesibles a través del paquete mapSpain).
Primeramente cargamos las librerías:
# Definición de Valencia Capital (INE: 46250)
vlc_muni <- esp_get_munic(munic = "València") %>%
filter(cpro == "46") %>%
st_transform(4326)
# Bounding Box de la descarga
bbox_cv <- st_bbox(vlc_muni)
# Descarga de datos brutos (con caché local para evitar consultas repetidas a la API)
file_consum_raw <- "../data/2526020038/consum_puntos_raw.gpkg"
if (file.exists(file_consum_raw)) {
consum_puntos <- st_read(file_consum_raw, quiet = TRUE)
st_geometry(consum_puntos) <- "geometry"
} else {
consum_puntos <- opq(bbox = bbox_cv, timeout = 1000) %>%
add_osm_feature(key = "shop", value = "supermarket") %>%
add_osm_feature(key = "name", value = "Consum") %>%
osmdata_sf() %>%
.$osm_points
dir.create("data_output", showWarnings = FALSE)
st_write(consum_puntos, file_consum_raw, delete_dsn = TRUE, quiet = TRUE)
}Descripción
Se detecta que los datos brutos presentan dos anomalías:
Ruido de Bounding Box: La consulta captura inevitablemente establecimientos en municipios limítrofes (ej. Alboraya, Mislata, Alfafar).
Redundancia geométrica: OpenStreetMap a menudo registra múltiples nodos para un solo establecimiento (puerta principal, muelle de carga, parking).
Anomalía territorial detectada: Hay 97 ejemplares 'en sucio' fuera del municipio oficial.
# Mapa de Análisis
leaflet(consum_audit) %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addPolygons(data = vlc_muni, color = "black", weight = 4, fill = FALSE) %>%
addCircleMarkers(
fillColor = ~ifelse(dentro, "#F8951D", "red"),
radius = 5,
stroke = FALSE,
fillOpacity = 1,
popup = ~paste0("<b>", name, "</b><br>Estado: ", ifelse(dentro, "En Valencia", "Fuera de Valencia"))
) %>%
addLegend(position = "bottomright", colors = c("#F8951D", "red"), labels = c("Dato Correcto", "Dato Sucio"), title = "DataEnhance UV")El mapa clasifica los registros según su validez geográfica: en naranja se validan los supermercados situados estrictamente dentro del término municipal de Valencia, aislando en rojo aquellos establecimientos de municipios limítrofes que el área de búsqueda inicial capturó por error.
Tratamiento
Se ha hecho una doble limpieza para alcanzar una representación real:
Filtro espacial: Eliminación de cualquier registro que no pertenezca a la capital.
Deduplicación por proximidad (Clústering): Aplicación del algoritmo DBSCAN con un radio de 150 metros proyectado en coordenadas métricas (UTM 30N) para colapsar nodos redundantes de una misma tienda.
# Eliminación de datos
consum_vlc_limpio <- consum_audit %>% filter(dentro == TRUE)
# Eliminación de duplicaciones (150 metros)
consum_vlc_metrico <- st_transform(consum_vlc_limpio, 25830)
coords <- st_coordinates(consum_vlc_metrico)
res_db <- dbscan::dbscan(coords, eps = 150, minPts = 1)
consum_vlc_final <- consum_vlc_limpio %>%
mutate(cluster = res_db$cluster) %>%
group_by(cluster) %>%
summarise(name = "Consum") %>%
st_centroid() %>%
st_as_sf()Output
Se ha obtenido un dataset íntegro y validado con representaciones por establecimiento dentro de la ciudad de Valencia.
Resumen:
- Puntos en Valencia antes de deduplicar: 111
- Puntos fusionados por redundancia: 50
- Establecimientos únicos: 61
# Mapa Final Maestro
leaflet(consum_vlc_final) %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addPolygons(data = vlc_muni, color = "black", weight = 5, fillOpacity = 0.05) %>%
addCircleMarkers(
fillColor = "#F8951D",
radius = 6,
stroke = FALSE,
fillOpacity = 1,
popup = ~paste0("<b>Establecimiento Verificado</b><br>ID Cluster: ", cluster)
)# Guardar resultado final
dir.create("output", showWarnings = FALSE)
st_write(consum_vlc_final, "output/consum_valencia_limpio.gpkg", delete_dsn = TRUE, quiet = TRUE)Como se observa en el gráfico, se ha obtenido un dataset íntegro y validado con representaciones por establecimiento dentro de la ciudad de Valencia.
Las estadísticas muestran la necesidad del tratamiento aplicado, demostrando que prácticamente el 45% de la muestra original constituía “ruido” estructural (accesos secundarios, parkings o duplicidades de mapeo por parte de los voluntarios en OSM).
| Métrica | Cantidad |
|---|---|
| Registros brutos iniciales (intersección Valencia) | 111 |
| Geometrías redundantes fusionadas (DBSCAN 150m) | - 50 |
| Establecimientos únicos (Dataset Final) | 61 |
El dataset final aísla 61 supermercados físicos únicos, una cifra ajustada a la realidad de la red comercial propia de la marca en la capital según fuentes corporativas y recuentos publicados sobre la distribución comercial en Valencia.
El fichero generado con este procedimiento/técnica/metodología se puede descargar de aquí.

Proyecto de Innovación Educativa Emergente (PIEE-3898312)