Datos sobre Italia

Veterinarios
Morgues
Prisiones
Autor/a
Afiliación

Adrián Pascual Utiel

Universidad de Valencia

Fecha de publicación

29 de marzo de 2025

Input

Se ha obtenido un conjunto de datos sobre los veterinarios, prisiones y morgues para Italia, la región de Lacio, Roma y Municipio I, con las coordenadas de cada establecimiento para cada territorio. La fuente de estos datos es OpenStreetMap, accedidos a través de la librería osmdata en R.

Enlace a la fuente:

Descripción

Al representar gráficamente los conjuntos de datos originales, se identificaron dos problemas principales:

  1. Puntos fuera del área seleccionada: Algunos establecimientos se encuentran geolocalizados fuera del territorio de interés.

  2. Agrupación excesiva de puntos: Varios puntos representan el área de un mismo establecimiento, generando redundancia.

Tratamiento

Para mejorar la calidad del conjunto de datos, se aplicaron las siguientes metodologías en R:

  • Eliminación de puntos fuera del área seleccionada

  • Se obtuvo la geometría de cada territorio con la librería rnaturalearth. Sin embargo, para el caso de Municipio I no funcionaba debido a que es una zona mucho más pequeña que el resto. Por lo tanto, para ese caso usaremos OpenStreetMaps.

  • Para obtener el contorno de cada lugar como conjunto, usaremos la función st_union de la librería sf.

  • Posteriormente, aseguramos que coincidan los sistemas de coordenadas (CRS) mediante st_transform .

  • Finalmente, se filtraron los puntos dentro del territorio seleccionado utilizando st_intersects().

# PAÍS: ITALIA

# Obtener la geometría de Italia desde Natural Earth
italia <- ne_countries(country = "Italy", scale = "medium", returnclass = "sf")


# Combinar todas las geometrías de Italia en una sola usando st_union
italia <- st_union(italia)

# Asegurar que los puntos y el polígono tienen el mismo CRS
mort_italia_points <- st_transform(mort_italia_points, crs = st_crs(italia))
vet_italia_points <- st_transform(vet_italia_points, crs = st_crs(italia))
prison_italia_points <- st_transform(prison_italia_points, crs = st_crs(italia))

# Filtrar solo los puntos dentro de Italia
mort_italia_points <- mort_italia_points[st_intersects(mort_italia_points, italia, sparse = FALSE), ]
vet_italia_points <- vet_italia_points[st_intersects(vet_italia_points, italia, sparse = FALSE), ]
prison_italia_points <- prison_italia_points[st_intersects(prison_italia_points, italia, sparse = FALSE), ]



# REGIÓN: LACIO


italy_regions <- ne_states(country = "Italy", returnclass = "sf")


lazio <- italy_regions %>%
  filter(region == "Lazio")


lazio <- st_union(lazio)


mort_lacio_points <- st_transform(mort_lacio_points, crs = st_crs(lazio))
vet_lacio_points <- st_transform(vet_lacio_points, crs = st_crs(lazio))
prison_lacio_points <- st_transform(prison_lacio_points, crs = st_crs(lazio))


mort_lacio_points <- mort_lacio_points[st_intersects(mort_lacio_points, lazio, sparse = FALSE), ]
vet_lacio_points <- vet_lacio_points[st_intersects(vet_lacio_points, lazio, sparse = FALSE), ]
prison_lacio_points <- prison_lacio_points[st_intersects(prison_lacio_points, lazio, sparse = FALSE), ]



# PROVINCIA: ROMA

roma <- italy_regions %>%
  filter(gn_name == "Provincia di Roma")

roma <- st_union(roma)

mort_roma_points <- st_transform(mort_roma_points, crs = st_crs(roma))
vet_roma_points <- st_transform(vet_roma_points, crs = st_crs(roma))
prison_roma_points <- st_transform(prison_roma_points, crs = st_crs(roma))


mort_roma_points <- mort_roma_points[st_intersects(mort_roma_points, roma, sparse = FALSE), ]
vet_roma_points <- vet_roma_points[st_intersects(vet_roma_points, roma, sparse = FALSE), ]
prison_roma_points <- prison_roma_points[st_intersects(prison_roma_points, roma, sparse = FALSE), ]


# MUNICIPIO: MUNICIPIO I

# Definir el municipio de interés
municipio_nombre <- "Municipio Roma I"

# Obtener el polígono del municipio desde OpenStreetMap
municipio <- opq("Rome, Italy") %>%
  add_osm_feature(key = "name", value = municipio_nombre) %>%
  osmdata_sf()


# Extraer la geometría del municipio
municipio_sf <- municipio$osm_multipolygons


# Filtrar puntos dentro del municipio
mort_municipio <- mort_m1_points[st_intersects(mort_m1_points, municipio_sf, sparse = FALSE), ]
vet_municipio <- vet_m1_points[st_intersects(vet_m1_points, municipio_sf, sparse = FALSE), ]
prison_municipio <- prison_m1_points[st_intersects(prison_m1_points, municipio_sf, sparse = FALSE), ]
  • Reducción de redundancia en la geolocalización

Se utilizó la librería dbscan para identificar agrupaciones espaciales en los datos.

  1. Aplicación de DBSCAN: Se ejecutó el algoritmo con un radio de vecindad (eps = 0.001) y un mínimo de un punto por clúster (minPts = 1), lo que permitió detectar agrupaciones densas de establecimientos.

  2. Extracción de puntos representativos: Una vez identificados los clústeres, se seleccionó un único punto representativo por agrupación, reduciendo la redundancia y mejorando la visualización de los datos.

  3. Automatización del proceso: Se diseñó una función para aplicar estos pasos a cada conjunto de datos, optimizando el flujo de trabajo y garantizando coherencia en el tratamiento de todas las regiones analizadas.

# PROCESO PARA OBTENER SOLO LOS PUNTOS REPRESENTATIVOS

# Lista de dataframes
list_dataframes <- list(mort_italia_points, vet_italia_points, prison_italia_points,
                        mort_lacio_points, vet_lacio_points, prison_lacio_points,
                        mort_roma_points, vet_roma_points, prison_roma_points,
                        mort_m1_points, vet_m1_points, prison_m1_points)

# Función para aplicar DBSCAN y obtener puntos representativos
procesar_dataframe <- function(sf_points) {
  sf_points <- aplicar_dbscan_sf(sf_points, eps = 0.001, minPts = 1)
  sf_points <- obtener_punto_representativo(sf_points)
  return(sf_points)
}

# Aplicar la función a cada dataframe
resultados <- lapply(list_dataframes, procesar_dataframe)

# Asignar los resultados a las variables originales
mort_italia_points <- resultados[[1]]
vet_italia_points <- resultados[[2]]
prison_italia_points <- resultados[[3]]
mort_lacio_points <- resultados[[4]]
vet_lacio_points <- resultados[[5]]
prison_lacio_points <- resultados[[6]]
mort_roma_points <- resultados[[7]]
vet_roma_points <- resultados[[8]]
prison_roma_points <- resultados[[9]]
mort_m1_points <- resultados[[10]]
vet_m1_points <- resultados[[11]]
prison_m1_points <- resultados[[12]]

Output

Como resultado, se han obtenido cuatro archivos GeoPackage (.gpkg) con los datos limpios y optimizados para los cuatro territorios de estudio.

Los ficheros generados con estos procedimientos se puede descargar aquí.



Proyectos de Innovación Educativa Emergente PIEE-2737007 y PIEE-3325394