Datos de accesibilidad hospital–farmacia en Valencia

Análisis Espacial
R
OpenStreetMap
Valencia
Autor/a
Afiliación

Miguel Hidalgo Soriano

Universidad de València

Fecha de publicación

1 de abril de 2026

Input

El siguiente análisis se centra en la relación espacial y la accesibilidad entre los hospitales de la ciudad de Valencia y la red de farmacias de su entorno urbano. Los datos geográficos de los establecimientos farmacéuticos han sido extraídos de OpenStreetMap, un proyecto colaborativo global que ofrece información geográfica abierta y actualizada. Por otro lado, la ubicación y caracterización de los centros hospitalarios provienen del Portal de datos abiertos del Ayuntamiento de Valencia.

La intención es realizar un cruce de datos geoespaciales para evaluar la calidad del servicio sanitario desde una perspectiva de proximidad. Mientras que el dataset municipal aporta la ubicación de los hospitales, la integración con OpenStreetMap permite calcular de forma precisa la disponibilidad de oficinas de farmacia en un radio de 500 metros (distancia coherente ya que pacientes hospitalarios pueden tener dificultades con distancias mayores).

Descripción

En primer lugar, cargamos las librerías necesrias:

Leemos el conjunto de datos de hospitales de la ciudad de Valencia y lo convertimos en un datamframe:

hospitales_vlc <- read_csv2("../data/2526020024/hospitales.csv")
hospitales_vlc <- as.data.frame(hospitales_vlc)

dim(hospitales_vlc)
[1] 62 14

Se obtiene un dataframe con 62 observaciones, es decir, 62 centros médicos.

Aunque el dataset original ya dispone de coordenadas geográficas, estas se encuentran en un formato alfanumérico que impide realizar cálculos espaciales directos. Por tanto, posteriormente será necesario transformar el dataframe en un objeto de clase sf, procesando dichas columnas para que R las reconozca como puntos geométricos reales.

Ahora, definimos el marco geográfico del estudio (ciudad de Valencia) y se realiza una consulta a OSM para obtener las farmacias de dicha población:

munic_spain <- esp_get_munic()

valencia <- munic_spain[munic_spain$cpro == "46" & munic_spain$cmun == "250", ]
valencia <- st_transform(valencia, crs = 4326)
bbox_valencia <- st_bbox(valencia)

farmacias_vlc <- opq(bbox = bbox_valencia, timeout = 1500) %>%
  add_osm_feature(key = "amenity", value = "pharmacy") %>%
  osmdata_sf()

Extraemos los puntos que representan cada una de estas farmacias y los almacenamos:

puntos_farmacias <- farmacias_vlc$osm_points

Representamos las farmacias usando la librería leaflet.

puntos_farmacias %>%
  leaflet() %>%
  addTiles() %>%
  addCircles()

Al representar los datos, se ve que hay algunos puntos que quedan fuera del municipio de Valencia. Para que el análisis tenga sentido, se va a aplicar un filtrado espacial que elimina esos casos y deja solo las farmacias que están realmente dentro del término municipal.

Tratamiento

Una vez filtrados los hospitales, separamos la columna de coordenadas para obtener la latitud y la longitud por separado como variables numéricas.

hospitales_sf <- hospitales_vlc %>%
  separate(geo_point_2d, into = c("lat", "lon"), sep = ", ") %>%
  mutate(lat = as.numeric(lat), lon = as.numeric(lon)) 

El siguiente paso es usarla función st_as_sf para convertir la tabla de hospitales en un objeto geográfico real, usando el sistema de referencia WGS84 (EPSG:4326). Después, comprobamos que ya no es una tabla normal, sino una capa lista para trabajar en análisis espacial.

hospitales_sf<- st_as_sf(hospitales_sf, coords = c("lon", "lat"), crs = 4326)

class(hospitales_sf)
[1] "sf"         "data.frame"

Ahora volvemos a las farmacias y debido a la detección previa de registros fuera de los límites municipales, procedemos a homogeneizar el sistema de coordenadas de ambas capas. Esta alineación es el paso previo necesario para ejecutar un recorte que permite conservar únicamente las situadas dentro del término de Valencia.

puntos_farmacias <- st_transform(puntos_farmacias, crs = 4326)
valencia <- st_transform(valencia, crs = 4326)

puntos_farmacias_valencia <- puntos_farmacias[valencia, ]

Nos quedamos con las variables que contienen información útil para nuestro análisis:

puntos_farmacias_valencia <- puntos_farmacias_valencia %>%
  select(osm_id, name, amenity) 

Una vez tenemos los datos limpios y centrados en Valencia, realizamos el tratamiento definitivo para medir la accesibilidad sanitaria.

# Calculamos la matriz de distancias 
dist_matrix <- st_distance(hospitales_sf, puntos_farmacias_valencia)

# Contamos cuántas farmacias están a menos de 500m para cada hospital
hospitales_sf$farmacias_500m <- apply(dist_matrix, 1, function(x) {
  sum(as.numeric(x) <= 500)
})

# Creamos la variable dicotómica de éxito/fracaso
hospitales_sf$acceso_exito <- ifelse(hospitales_sf$farmacias_500m > 0, 1, 0)

Con este tratamiento, el resultado final es un objeto espacial enriquecido que conserva toda la información original de los hospitales, pero añade dos datos clave para el análisis. Por un lado, incorporamos la columna dicotómica de éxito o fracaso, que nos permite clasificar de forma binaria si el hospital tiene cobertura farmacéutica en ese radio de 500 metros o no. Por otro lado, una columna con el número total de farmacias que cumplen el requisito de cercanía para cada centro.

Output

Se ha obtenido un dataset más completo, que mantiene la información original de los hospitales y añade el número de farmacias cercanas a cada uno. Además, se incorpora una variable sencilla que indica si cada hospital cumple o no con el criterio de accesibilidad de 500 metros. Con todo esto, es fácil identificar rápidamente qué zonas de la red sanitaria en Valencia presentan mayores carencias.

Para una correcta visualización, representamos los datos:

# Preparamos el dato: transformamos 0/1 en texto descriptivo
hospitales_sf$Resultado <- factor(hospitales_sf$acceso_exito, 
                                  levels = c(0, 1), 
                                  labels = c("No cumple", "Cumple"))
# Definimos la paleta asociada a ese nuevo texto
pal <- colorFactor(palette = c("red", "green"), domain = hospitales_sf$Resultado)

# Mapa con leyenda automática y bordes municipales
leaflet(hospitales_sf) %>%
  addTiles() %>%
  # Añadimos el borde de Valencia ciudad
  addPolygons(data = valencia, 
              color = "black",   # Color del borde
              weight = 2,        # Grosor de la línea
              fillOpacity = 0) %>% # Transparente por dentro para ver el mapa base
  addCircleMarkers(color = ~pal(Resultado), 
    fillOpacity = 0.8,
    radius = 8,
    popup = ~Nombre) %>%
  addLegend(pal = pal, 
    values = ~Resultado, 
    title = "Accesibilidad (500m)",
    position = "bottomright"
  )

La visualización cartográfica confirma que la mayoría de los centros hospitalarios de Valencia gozan de una excelente cobertura farmacéutica, aunque el mapa revela puntos específicos donde esta relación de proximidad se debilita. Gracias a la integración de datos abiertos y herramientas de análisis espacial, hemos transformado coordenadas aisladas en un indicador real de servicio al ciudadano. Este modelo no solo identifica el estado actual de la red sanitaria, sino que sirve como base para futuras decisiones de planificación urbana y apertura de nuevos establecimientos en las zonas marcadas con menor accesibilidad.

El fichero generado con este procedimiento se puede descargar aquí.



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