Análisis y Mejora de los Centros Docentes de Valencia

Autor/a
Afiliación

Carla Estrela Martínez

Universidad de Valencia

Fecha de publicación

1 de abril de 2026

Input

El conjunto de datos de partida es un fichero GeoJSON con información de centros educativos de Valencia, recogida de la web oficial de datos abiertos del ayuntamiento de Valencia, https://valencia.opendatasoft.com/explore/dataset/centros-educativos-en-valencia/export/.

library(tidyverse)
library(sf)
library(stringr)
library(osmdata)
library(readr)

centros_raw <- st_read(
  "../data/2526020015/centros-educativos-en-valencia.geojson",
  quiet = TRUE
)

glimpse(centros_raw)
Rows: 534
Columns: 14
$ geo_point_2d <chr> "{ \"lon\": -0.37343300000000063, \"lat\": 39.48834399907…
$ codcen       <chr> "46010620", "46010723", "46010826", "46012306", "46012604…
$ dlibre       <chr> "CENTRE PRIVAT LUZ CASANOVA", "CENTRE PRIVAT NUESTRA SEÑO…
$ dgenerica    <chr> "CENTRE PRIVAT D'EDUCACIÓ INFANTIL, PRIMÀRIA I SECUNDÀRIA…
$ despecific   <chr> "LUZ CASANOVA", "NUESTRA SEÑORA DEL CARMEN-SAN VICENTE PA…
$ regimen      <chr> "CONCERTADO", "CONCERTADO", "CONCERTADO", "PÚBLICO", "PÚB…
$ direccion    <chr> "CL. LUZ CASANOVA, 8", "AV. BURJASSOT, 150", "CL. DOCTOR …
$ codpos       <chr> "46009", "46025", "46009", "46007", "46011", "46008", "46…
$ municipio    <chr> "València", "València", "València", "València", "València…
$ provincia    <chr> "València", "València", "València", "València", "València…
$ telef        <chr> "963657568", "963491210", "963473715", "962566270", "9625…
$ fax          <chr> "963653054", "963400848", "963488157", "962566271", "9625…
$ mail         <chr> "direccion@luzcasanova.org", "nscsvp@elcarmenbenicalap.co…
$ geometry     <POINT [°]> POINT (-0.373433 39.48834), POINT (-0.39157 39.4907…

Descripción

El recurso original contiene información de centros educativos e incorpora geometría puntual en coordenadas geográficas. Entre sus variables principales se encuentran: código del centro, denominación, denominación genérica, dirección, municipio y provincia, teléfono, fax, correo electrónico y geometría puntual.

Se trata, por tanto, de un recurso ya utilizable en cartografía, pero aún presenta varias oportunidades de mejora:

  • Algunos campos de texto pueden aparecer con espaciado irregular o formato poco homogéneo;
  • Los teléfonos y faxes requieren depuración para facilitar su reutilización;
  • No existe una variable territorial más detallada que permita saber en qué distrito administrativo de València se sitúa cada centro;

Por ello, la mejora propuesta consiste en limpiar y normalizar atributos y añadir una variable de distrito mediante cruce espacial con datos de OpenStreetMap.

Tratamiento

En primer lugar, se seleccionan y renombran las variables más relevantes para facilitar su interpretación y posterior reutilización. Se elimina la variable geopoint ya que existe la variable geometry.

centros_sf <- centros_raw %>%
  select(codigo_centro = codcen, denominacion = dlibre, denominacion_generica = dgenerica, denominacion_especifica = despecific,regimen,direccion, codigo_postal = codpos, municipio, provincia, telefono = telef, fax, correo = mail, geometry
  ) %>%
  st_make_valid()

Se normalizan algunos campos de texto y se limpian los campos telefónicos para conservar únicamente dígitos. También se homogeneiza el correo electrónico en minúsculas.

centros_sf <- centros_sf %>%
  mutate(
    denominacion = str_squish(denominacion), #no se normaliza para no quitar las siglas IES y CEIP
    denominacion_generica = str_squish(str_to_title(denominacion_generica)),
    denominacion_especifica = str_squish(str_to_title(denominacion_especifica)),
    direccion = str_squish(str_to_title(direccion)),
    municipio = str_squish(str_to_title(municipio)),
    provincia = str_squish(str_to_title(provincia)),
    regimen = str_squish(str_to_title(regimen)),

    telefono = str_replace_all(as.character(telefono), "[^0-9]", ""),
    telefono = na_if(telefono, ""),

    fax = str_replace_all(as.character(fax), "[^0-9]", ""),
    fax = na_if(fax, ""),

    correo = str_to_lower(str_squish(as.character(correo))),
    correo = na_if(correo, "")
  )

La mejora principal consiste en incorporar una nueva variable denominada distrito. Para ello se descargan desde OpenStreetMap los límites administrativos de nivel 9 correspondientes a la ciudad de València y se realiza una unión espacial.

València está organizada en distritos administrativos, y el Ayuntamiento publica la división en 19 distritos.

#bb_valencia <- getbb("València, Spain")

#distritos_osm <- opq(bbox = bb_valencia, timeout = 120) %>%
#  add_osm_feature(key = "boundary", value = "administrative") %>%
#  add_osm_feature(key = "admin_level", value = "9") %>%
#  osmdata_sf()
#saveRDS(distritos_osm, "data/distritos_osm.rds")
distritos_osm <- readRDS("../data/2526020015/distritos_osm.rds")

#Extraer la capa poligonal principal
distritos_sf <- distritos_osm$osm_multipolygons

#Preparar capa de distritos
distritos_sf <- distritos_sf %>%
  select(name, geometry) %>%
  filter(!is.na(name)) %>%
  distinct(name, .keep_all = TRUE) %>%
  st_make_valid()

distritos_sf <- st_transform(distritos_sf, st_crs(centros_sf)) # mismo CRS

#Asignar distrito a cada centro
centros_sf <- st_join(
  centros_sf,
  distritos_sf,
  join = st_intersects,
  left = TRUE
) %>%
  rename(distrito = name)

#Los distritos que hemos añadido
centros_sf %>%
  st_drop_geometry() %>%
  count(distrito, sort = TRUE)
           distrito   n
1              <NA> 116
2   Quatre Carreres  39
3    Camins al Grau  38
4  Poblats Marítims  38
5          Campanar  37
6        l'Eixample  36
7          Rascanya  31
8         la Saïdia  31
9             Jesús  28
10          Algirós  25
11  el Pla del Real  23
12       Benimaclet  21
13        Benicalap  20
14     Ciutat Vella  19
15   Pobles del Sud  17
16 Pobles de l'Oest  11
17  Pobles del Nord   4

Se realiza una representación sencilla para comprobar la distribución espacial de los centros y su relación con los distritos obtenidos.

ggplot() +
  geom_sf(data = distritos_sf, fill = NA) +
  geom_sf(data = centros_sf, aes(color = distrito), size = 1, alpha = 0.8) +
  labs(
    title = "Centros educativos y distritos de València",
    color = "Distrito"
  ) +
  theme_minimal() +
  theme(
    legend.position = "bottom"
  )

Output

Como resultado del proceso se generan varios ficheros en la carpeta output:

  • centros_educativos_valencia_mejorado.gpkg
  • centros_educativos_valencia_mejorado.geojson
  • centros_educativos_valencia_mejorado.csv

Los tres contienen el dataset final mejorado.

dir.create("output", showWarnings = FALSE)

#Exportación del dataset mejorado
st_write(
  centros_sf,
  "output/centros_educativos_valencia_mejorado.gpkg",
  delete_dsn = TRUE,
  quiet = TRUE
)

st_write(
  centros_sf,
  "output/centros_educativos_valencia_mejorado.geojson",
  delete_dsn = TRUE,
  quiet = TRUE
)

write_csv(
  st_drop_geometry(centros_sf),
  "output/centros_educativos_valencia_mejorado.csv"
)

#Mostrar los ficheros creados
list.files("output")
#El dataset mejorado quedaria así
glimpse(centros_sf)

El/los fichero(s) generados con este procedimiento/técnica/metodología se puede(n) descargar de aquí.



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