libs <- c("tidyverse", "sf", "leaflet", "rio", "rnaturalearth", "rnaturalearthdata")
installed_libs <- libs %in% rownames(installed.packages())
if (any(installed_libs == F)) {install.packages(libs[!installed_libs])}
invisible(lapply(libs, library, character.only = T))
rm(libs, installed_libs)
Datos de Estaciones de tren de Europa
Input
Kaggle es una plataforma de competencia de ciencia de datos que proporciona acceso a una amplia variedad de conjuntos de datos para análisis y modelado. El conjunto de datos que analizaremos incluye información sobre más de 36,000 estaciones de tren en Europa y regiones adyacentes, derivada de los datos proporcionados por el sitio web de venta de billetes Trainline EU. Este conjunto fue publicado en GitHub y ha sido cuidadosamente seleccionado para incluir nombres de estaciones, coordenadas y propiedades básicas. Aunque la base de datos es bastante completa, contiene una pequeña cantidad de estaciones fuera de Europa, específicamente en partes europeas de Rusia, Turquía y algunas en Marruecos. Además, algunas columnas presentan un porcentaje significativo de valores NA, lo que puede requerir atención durante el análisis.
Este conjunto de datos se distribuye bajo la licencia Open Database License (ODbL), que requiere que cualquier modificación a los datos sea también publicada, asegurando así la transparencia y la accesibilidad. Este recurso es valioso para estudios geográficos, planificación de transporte y proyectos de investigación en movilidad y conectividad regional.
Descripción
Empezamos cargando las librerías necesarias:
Leemos el conjunto de datos:
estaciones <- import("data/train_stations_europe.csv")
Se trata de un objeto de 64037 observaciones y 14 variables.
names(estaciones)
[1] "id" "name" "name_norm"
[4] "uic" "latitude" "longitude"
[7] "parent_station_id" "country" "time_zone"
[10] "is_city" "is_main_station" "is_airport"
[13] "entur_id" "entur_is_enabled"
Hay demasiadas columnas, muchas de ellas son NA, por lo que vamos a seleccionar únicamente las de interés.
estaciones <- select(estaciones, name_norm, latitude, longitude, country)
Tenemos NA en las columnas de latitud y longitud, por lo que los eliminamos y obtenemos el objeto sf
con el crs 4326.
Realizamos una primera observación del mapa. Usamos leaflet para previsualizar los datos a pesar de tener un gran volumen de los mismos y sacrificar usabilidad, ya que así podemos ver rápidamente que hay varias estaciones fuera de Europa.
leaflet(estaciones_sf) %>%
addTiles() %>%
addCircleMarkers(
radius = 0.5,
fillOpacity = 1.0,
color = "blue",
stroke = FALSE
)
Tratamiento
Puesto que queremos eliminar estas estaciones, necesitamos la cartografía de Europa para poder identificar qué estaciones eliminar. Para ello usaremos el paquete rnaturalearth
junto a sus datos rnaturalearthdata
.
world <- ne_countries(scale = "medium", returnclass = "sf")
# Filtrar por el continente Europeo
europe <- world[world$continent == "Europe", ]
# Como tiene muchísimas columnas, seleccionamos las que nos interesan.
europe <- select(europe, name, geometry)
# Comprobamos si usan el crs 4326
st_crs(europe)
Coordinate Reference System:
User input: WGS 84
wkt:
GEOGCRS["WGS 84",
DATUM["World Geodetic System 1984",
ELLIPSOID["WGS 84",6378137,298.257223563,
LENGTHUNIT["metre",1]]],
PRIMEM["Greenwich",0,
ANGLEUNIT["degree",0.0174532925199433]],
CS[ellipsoidal,2],
AXIS["latitude",north,
ORDER[1],
ANGLEUNIT["degree",0.0174532925199433]],
AXIS["longitude",east,
ORDER[2],
ANGLEUNIT["degree",0.0174532925199433]],
ID["EPSG",4326]]
Efectivamente, usan 4326, por lo que concuerda con nuestros datos de las estaciones. Finalmente, solo queda cruzar datos y seleccionar los que nos interesan. Vemos también de qué países son los que hemos eliminado.
estaciones_europa <- st_intersection(estaciones_sf, europe)
eliminadas <- sf::st_difference(estaciones_sf,europe)
eliminadas %>%
pull(country) %>%
unique()
[1] "FR" "CH" "IT" "AD" "ES" "GB" "BE" "NL" "DE" "AT" "LU" "PT" "PL" "RU" "BY"
[16] "HU" "CZ" "SK" "HR" "DK" "SE" "SI" "MA" "IE" "BG" "GR" "LT" "LV" "MK" "NO"
[31] "RO" "UA" "TR" "RS" "ME" "BA" "FI" "LI" "AL" "MT" "MD" "EE" "CY"
Proyectamos el mapa junto con los límites de los países europeos.
leaflet() %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addPolygons(
data = europe,
fillColor = NA,
color = "#000000",
weight = 1,
smoothFactor = 0.5,
opacity = 1,
fillOpacity = 0
) %>%
addCircleMarkers(
data = estaciones_europa,
radius = 0.5,
color = "#0078A8",
stroke = FALSE,
fillOpacity = 0.8
) %>%
setView(lng = 10, lat = 50, zoom = 2)
Output
Hemos obtenido las estaciones de tren que pertenecen a Europa.
sf::st_write(estaciones_europa, "estaciones_europeas.gpkg")
El fichero generado con el procedimiento descrito anteriormente se puede descargar, en formato GeoPackage (gpkg), de aquí.
Proyecto de Innovación Educativa Emergente (PIEE-2737007)