Datos sobre las paradas de la EMT en Valencia

MOVILIDAD
VALENCIA
TRANSPORTE PÚBLICO
Autor/a
Afiliación

Lucía Lorenzo López

Universidad de Valencia

Fecha de publicación

29 de marzo de 2025

Input

El Portal de Datos Abiertos del Ayuntamiento de Valencia es una plataforma en línea donde el Ayuntamiento comparte información en formatos accesibles, facilitando su uso y reutilización por parte de la ciudadanía. Su propósito es promover la transparencia, fomentar la participación ciudadana y permitir el desarrollo de iniciativas basadas en datos abiertos.

Dentro del apartado de Transporte, se encuentra disponible información geográfica sobre las paradas de la Empresa Municipal de Transportes de Valencia (EMT). Este conjunto de datos proporciona detalles clave como la ubicación geográfica, los códigos de vía y portal, la denominación de la parada, las líneas de autobús que la operan y un enlace a los tiempos estimados de llegada.

Los datos se pueden descargar en formato CSV, lo que permite analizarlos y procesarlos con facilidad para realizar estudios de movilidad urbana y optimización del transporte público.

Identificador de conjunto de datos: emt
Descargas: 3.944
Temas: Transporte, Urbanismo e Infraestructuras
Palabras clave: Redes de transporte
Licencia: https://creativecommons.org/licenses/by/4.0/
Modificado: 27 de febrero de 2025 0:01
Publicador: Ayuntamiento de València
Frecuencia de actualización: Continuo

Descripción

A continuación, leemos el conjunto de datos:

library(readr)
emt <- read_delim("data/emt.csv", delim = ";", 
    escape_double = FALSE, trim_ws = TRUE)

head(emt)
# A tibble: 6 × 9
  `Id. Parada` `Cod. Via / Cod. Vía` `Num. Portal` Suprimida
         <dbl>                 <dbl> <chr>             <dbl>
1          397                    NA 59                    0
2          948                    NA 62                    0
3          475                 12180 3                     0
4          484                 18390 108                   0
5          495                 18390 85                    0
6          512                 73950 82                    0
# ℹ 5 more variables: `Denominació / Denominación` <chr>,
#   `Línies / Líneas` <chr>, `Pròximes Arribades / Proximas Llegadas` <chr>,
#   geo_shape <chr>, geo_point_2d <chr>
class(emt)
[1] "spec_tbl_df" "tbl_df"      "tbl"         "data.frame" 
dim(emt)
[1] 1126    9

Se trata de un dataframe con 1126 observaciones y 9 variables.

Tratamiento

Este dataframe nos muestra bastante información, pero la información geográfica no viene dada de la mejor manera posible, lo que nos puede causar problemas en futuros estudios. Contamos con dos columnas: geo_point_2d y geo_shape. La primera contiene coordenadas en una única celda separadas por comas, mientras que la segunda almacena información en formato JSON. Para facilitar el análisis, realizamos las siguientes mejoras:

En primer lugar extraemos la latitud y la longitud de geo_point_2d en dos columnas separadas para facilitar su uso.

library(tidyr)

# Separar la columna geo_point_2d en Latitud y Longitud
emt <- separate(emt, geo_point_2d, into = c("Latitud", "Longitud"), sep = ", ", convert = TRUE)

La columna geo_shape contiene datos en formato JSON, lo cual no es práctico. Extraemos solo las coordenadas.

Warning: package 'jsonlite' was built under R version 4.4.3
library(dplyr)

# Extraer solo las coordenadas de geo_shape
emt <- emt %>%
  mutate(geo_shape = gsub('.*\\[|\\].*', '', geo_shape)) %>%  
  separate(geo_shape, into = c("Longitud_geo", "Latitud_geo"), sep = ", ", convert = TRUE)

Vamos a comprobar que todas las coordenadas separadas son idénticas:

identical(emt$Latitud, emt$Latitud_geo) 
[1] TRUE
identical(emt$Longitud, emt$Longitud_geo) 
[1] TRUE

Como son iguales, podemos eliminar las columnas Longitud_geo y Latitud_geo para limpar el dataset.

emt <- emt %>% select(-Longitud_geo,-Latitud_geo)

Convertimos la columna Línies / Líneas en listas con strsplit() porque originalmente almacena todas las líneas en un solo string separado por comas, lo que dificulta su manipulación en R. Al transformarla en listas, cada parada tiene un conjunto de valores individuales, permitiendo filtrar paradas por línea, contar cuántas líneas pasan por cada una y asignar colores adecuados en un mapa.

# Convertir las líneas de autobús en listas
emt$`Línies / Líneas` <- strsplit(emt$`Línies / Líneas`, ",")

La columna Suprimida indica si una parada ha sido eliminada (1 = suprimida, 0 = activa). Vamos a filtrar solo las paradas activas. Así, evitamos incluir en el análisis y en el mapa aquellas paradas que ya no están en funcionamiento, lo que mejora la precisión de los resultados y la utilidad del dataset

# Filtrar solo las paradas activas
emt <- emt[emt$Suprimida == 0, ]

Con este dataset ya podríamos hacer estudios sobre la movilidad en transporte público en la ciudad de Valencia y elaborar mapas como el siguiente.

library(leaflet)
library(leaflet.extras)

# Definir coordenadas centrales de Valencia
lat_centro <- 39.4699
lng_centro <- -0.3763
zoom_nivel <- 13  

# Crear el mapa base con zoom centrado en Valencia
mapa_calor <- leaflet(emt) %>%
  setView(lng = lng_centro, lat = lat_centro, zoom = zoom_nivel) %>%  # Centrado en Valencia
  addProviderTiles(providers$CartoDB.Positron, group = "Mapa base claro") %>%
  addProviderTiles(providers$OpenStreetMap, group = "OSM Clásico") %>%
  addProviderTiles(providers$Esri.WorldImagery, group = "Satélite") %>%

  # Agregar mapa de calor basado en la densidad de paradas
  addHeatmap(
    lng = ~Longitud, 
    lat = ~Latitud, 
    intensity = ~sapply(emt$`Línies / Líneas`, length),  
    blur = 30, max = 0.1, radius = 20, gradient = c("blue", "yellow", "red"),
    group = "Mapa de Calor"
  ) %>%

  # Añadir puntos de paradas para referencia
  addCircleMarkers(
    lng = ~Longitud, lat = ~Latitud,
    radius = 2, color = "black", fillColor = "white",
    fillOpacity = 0.5, stroke = TRUE, group = "Puntos de Paradas"
  ) %>%

  # Agregar control de capas
  addLayersControl(
    baseGroups = c("Mapa base claro", "OSM Clásico", "Satélite"),
    overlayGroups = c("Mapa de Calor", "Puntos de Paradas"),
    options = layersControlOptions(collapsed = FALSE)
  ) %>%

  # Agregar leyenda del heatmap
  addLegend(
    position = "bottomright",
    colors = c("blue", "yellow", "red"),
    labels = c("Baja densidad", "Media densidad", "Alta densidad"),
    title = "Densidad de Paradas",
    opacity = 1
  )

# Mostrar el mapa
mapa_calor

Este mapa de calor de las paradas de la EMT en Valencia representa la densidad de paradas de autobús en la ciudad, permitiendo identificar las zonas con mayor y menor cobertura del transporte público. Los colores indican la concentración de paradas: las áreas en rojo tienen una alta densidad, lo que sugiere una fuerte accesibilidad al transporte público, mientras que las zonas en amarillo presentan una densidad media. Por otro lado, las áreas en azul o sin color indican menor presencia de paradas, lo que podría representar una menor conectividad.

Este análisis es útil para optimizar la red de transporte, ya que permite detectar zonas con poca cobertura donde podrían añadirse nuevas paradas o mejorar las rutas existentes. Además, puede aplicarse en urbanismo y planificación, comparando la distribución del transporte con datos de población, empleo o desarrollo urbano para garantizar un acceso equitativo.

Otro uso clave es en la accesibilidad y sostenibilidad, ya que un transporte público bien distribuido fomenta su uso y reduce la dependencia del coche privado, contribuyendo a la movilidad sostenible en la ciudad. Gracias a esta visualización, es posible tomar decisiones informadas para mejorar la eficiencia y equidad del transporte en Valencia.

Output

El dataset obtenido ya contiene todas las coordenadas en columnas separadas y el resto de cambios necesarios, por lo que ya podríamos trabajar con él sin problemas. Vamos a exportarlo a Excel ahora que está modificado para poder trabajar con él en el futuro sin tener que repetir los pasos anteriores.

Vamos a volver a convertir las listas de la columna Línies / Líneas para evitar problemas en el guardado. Para ciertos análisis convendría volver a transformarlas en listas con el código anterior.

library(writexl)

# Convertir listas en strings para que se guarden correctamente
emt$`Línies / Líneas` <- sapply(emt$`Línies / Líneas`, function(x) paste(x, collapse = ", "))
# Guardar en Excel 
write_xlsx(emt, "emt_final.xlsx")

El archivo generado se puede descargar directamente desde aqui.



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