Datos de universidades en Reino Unido

Universidades
Geoespacial
OpenStreetMap
Autor/a
Afiliación

Melanie Sánchez Taylor

Universidad de Valencia

Fecha de publicación

30 de marzo de 2025

Input

En este proyecto, se ha recopilado un conjunto de datos sobre universidades en Reino Unido, con el objetivo de obtener información geoespacial detallada a partir de OpenStreetMap (OSM). Esta fuente se caracteriza por su fácil acceso y por tener mucha información sobre diferentes lugares, como las universidades, con datos sobre su ubicación exacta, nombre y otros atributos que son útiles para el análisis.

Comencé el proceso con la extracción de datos utilizando la librería osmdata en R. Esto permitió obtener información específica de universidades en Inglaterra, Escocia,Irlanda del Norte y Gales, asegurando que la cobertura fuera correcta y representativa de Reino Unido. Para ello, se hizo una consulta en OSM, filtrando todas las entidades que estuvieran etiquetadas como “university” (universidad), y limitando los resultados a la región de Gran Bretaña, excluyendo otras zonas fuera de lo que quería estudiar.

Descripción

Ahora pasaré a cargar las librerias necesarias para realizar esta práctica.

# enfocada en la manipulación, exploración, y visualización de datos:
 library(tidyverse) 
Warning: package 'purrr' was built under R version 4.4.3
# para trabajar con datos espaciales:
  library(sf)                 
# para importar datos de OpenStreetMaps:
  library(osmdata)      
# extensión de ggplot, facilita la representación de datos geoespaciales:
  library(ggspatial)           
# mejora la presentación de mapas base:
  library(prettymapr)
# agrupa puntos cercanos en función de su densidad:
  library(dbscan)  
Warning: package 'dbscan' was built under R version 4.4.3
# lo usaremos para la representación de gráficos:
  library(ggplot2)            
# permite acceder y utilizar datos geográficos de mapas de la Tierra Natural para crear mapas:         
  library(rnaturalearth)  
Warning: package 'rnaturalearth' was built under R version 4.4.3
#se utiliza para crear mapas interactivos y visualizaciones geoespaciales en la web
  library(leaflet)
# Esto siguiente lo hacemos para usar la red eduoram:
  internet_disponible <- curl::has_internet()
  assign("has_internet_via_proxy", TRUE, environment(curl::has_internet))
# para ver si estás conectado a eduroam:
  osm_features <- osmdata::available_features()

A continuación, utilizaremos el siguiente código para obtener información geoespacial de diferentes tipos de lugares en Gran Bretaña utilizando OpenStreetMap (OSM).

# Definir el área geográfica de Gran Bretaña, getbb() para crear un cuadro delimitador en la zona 
bbox_gb <- osmdata::getbb("United Kingdom")

# Obtener los datos de OpenStreetMap para las universidades en Gran Bretaña
q_gb_university <- bbox_gb %>%
  osmdata::opq() %>%
  osmdata::add_osm_feature(key = "amenity", value = "university")

# Obtener los datos, la función osmdata envía la consulta al servidor y devuelve un feature, formato espacial o XML
osm_gb_university <- osmdata::osmdata_sf(q_gb_university)

# Extraer los puntos de las universidades
osm_gb_university_points <- osm_gb_university$osm_points
dim(osm_gb_university_points)

Primero, se define un cuadro delimitador (bbox) para Gran Bretaña usando la función getbb(), lo que permite establecer los límites geográficos para la consulta.

Seguidamente, se realizan varias consultas a OSM para obtener datos específicos sobre universidades, Para cada tipo de lugar, creando después una consulta que filtra los datos de OpenStreetMap según la etiqueta correspondiente (“university” para universidades). Estas consultas se envían al servidor de OSM usando la función opq().

Una vez obtenidos los datos para universidades, se usa la función osmdata_sf() para convertirlos en un formato espacial adecuado para su análisis en R, específicamente en formato de objeto sf (simple features). Esto permite trabajar con los datos de manera más eficiente.

Finalmente, se extraen solo los puntos geoespaciales correspondientes a universidades, que son los datos relevantes para el análisis posterior. Estos puntos contienen información sobre la ubicación exacta de cada lugar en Gran Bretaña.

En resumen, lo que hace este código es convertir los datos de OSM en un formato útil para análisis espacial, centrándose solo en los puntos de interés y asegurando que solo se trabaje con la información relevante para el estudio.

En el momento de realización de este proyecto nos encontramos con 242 variables y 49837 observaciones. Debo añadir que esto es susceptible a cambios ya que OSM está compuesta por voluntarios que contribuyen a actualizar los mapas y, debido a este carácter colaborativo, los datos están constantemente actualizados.

Tratamiento

El análisis del dataframe de puntos muestra que hay una alta concentración de universidades en ciertas áreas de Gran Bretaña, lo que hace difícil distinguirlas entre sí. Esta densidad provoca que, en lugar de ver puntos individuales de universidades, se generen polígonos que representan zonas más grandes.

Para solucionar este problema, voy a usar la librería DBSCAN (Density-Based Spatial Clustering of Applications with Noise), que ayuda a identificar grupos de puntos según su densidad. Esto hará que sea más fácil separar las universidades que están muy cerca unas de otras. DBSCAN tiene la ventaja de poder detectar áreas con alta concentración de puntos y separar aquellas zonas que no tienen tanta densidad, eliminando el ruido y agrupando los puntos cercanos de manera eficiente.

Además, voy a representar cada grupo de universidades por su centroide, que es el punto central de cada clúster. Esto mejora la visualización y hace que la representación espacial de los datos sea más precisa. Usar los centroides en lugar de mostrar todos los puntos individuales hace que el análisis sea más claro y sencillo de interpretar, facilitando la comprensión de cómo están distribuidas las universidades en Gran Bretaña.

Para ello, utilizaré el siguiente código:

# Función para aplicar DBSCAN y obtener puntos representativos
procesar_dataframe <- function(sf_points, eps = 0.001, minPts = 1) {
  # Aplicar DBSCAN
  coords <- st_coordinates(sf_points)
  clustering <- dbscan(coords, eps = eps, minPts = minPts)
  
  # Agregar los clusters al dataframe
  sf_points$cluster <- clustering$cluster
  
  # Filtrar solo los puntos que están en clusters (descartar outliers)
  sf_points <- sf_points[sf_points$cluster > 0, ]
  
  # Obtener un punto representativo por cluster (centroide)
  sf_clusters <- sf_points %>%
    group_by(cluster) %>%
    summarise(geometry = st_centroid(st_combine(geometry)), .groups = "drop")
  
  return(sf_clusters)
}

# Aplicar la función al dataframe de Gran Bretaña
osm_gb_university_points <- procesar_dataframe(osm_gb_university$osm_points)
dim(osm_gb_university_points)

Como podemos observar, con esta función los 49837 puntos originales han sido reducidos a 2050 puntos representativos de las universidades en Gran Bretaña. Sin embargo, al contrastar esta información con datos de fuentes oficiales, encontramos que en Gran Bretaña existen aproximadamente 140 universidades en total. Esta discrepancia entre el número de puntos y el número real de universidades no significa que nuestros datos estén incorrectos, ya que es posible que se estén incluyendo también los “colleges”. En el sistema educativo británico, los “colleges” son instituciones que, aunque no son universidades en el sentido tradicional, ofrecen programas de grado superior que pueden considerarse equivalentes a universidades en algunos casos.

A continuación, adjunto la página de donde he obtenido información oficial sobre las universidades del Reino Unido:

  • Universities UK (organización representativa de las universidades en Inglaterra, Escocia y Gales): Universities UK

Output

Para finalizar la práctica, pasaré a realizar la representación gráfica de los puntos representativos de las universidades en Gran Bretaña.

# Obtener la geometría de Gran Bretaña desde Natural Earth
uk <- ne_countries(country = "United Kingdom", scale = "medium", returnclass = "sf")
# para no ejecutar al compilar

# Asegurar que los puntos y el polígono tienen el mismo CRS
osm_gb_university_points <- st_transform(osm_gb_university_points, crs = st_crs(uk))

# Filtrar solo los puntos dentro de Gran Bretaña
osm_gb_university_points <- osm_gb_university_points[st_intersects(osm_gb_university_points, uk, sparse = FALSE), ]

# Crear un dataset con las universidades
gb1 <- osm_gb_university_points %>%
  mutate(nombre = "university") %>%
  select(nombre)

Guardamos y leemos los datos de Gran Bretaña en GeoPackage

st_write(gb1, "granbretana_universities.gpkg")
gb1 <- st_read("data/granbretana_universities.gpkg", quiet = T)
# Contar cuántos puntos hay en cada categoría
conteo_puntos <- gb1 %>%
  count(nombre) %>%
  mutate(etiqueta = paste0(nombre, " (", n, ")")) 
# Graficar nuevamente con leyenda incluyendo conteos
ggplot() +
  ggspatial::annotation_map_tile(type = "cartolight") +
  geom_sf(data = gb1, aes(color = nombre), alpha = .5) +  # Usar 'aes(color = nombre)' para la leyenda
  guides(color = guide_legend(override.aes = list(shape = 16, size = 5))) +
  scale_color_manual(values = c("university" = "blue"), 
                     labels = conteo_puntos$etiqueta) +  # Añadir etiquetas con conteos
  theme_minimal() +
  theme(legend.position = "bottom",
        legend.direction = "horizontal",
        legend.title = element_blank())

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



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