libs <- c("tidyverse", "sf", "mapSpain", "osmdata", "ggspatial", "prettymapr", "spatstat", "splancs")
installed_libs <- libs %in% rownames(installed.packages())
if (any(!installed_libs)) {
install.packages(libs[!installed_libs])
}
invisible(lapply(libs, library, character.only = TRUE))
library(leaflet)
library(leaflet.extras)
library(sp)
library(ggplot2)
Base de datos sobre estacionamientos de bicicletas en Valencia
Input
La base de datos seleccionada es sobre los estacionamientos de bicicletas en la ciudad de Valencia utilizando para ello OpenStreetMap (OSM)
Tema: Transporte
Cobertura geográfica: Valencia
Fecha de lanzamiento: 2004
Frequencia de actualización: regular
Fuente de los datos: Recopilados por Openstreetmap
Acceso a los datos: acceso libre, plataforma abierta donde los datos se pueden actualizar regularmente por los contribuyentes de la comunidad.
Formato: XML
Descripción
Preparación de los datos
Para comenzar el análisis de la base de datos cargamos los paquetes necesarios
Descargamos los datos sobre los estacionamientos de Valencia desde Openstreetmap y realizamos las funciones de preprocesamiento para convertirlo en objeto sf
Valencia <- osmdata::getbb("Valencia, Spain")
bicival <- Valencia %>%
osmdata::opq() %>%
osmdata::add_osm_feature(key = "amenity", value = "bicycle_parking")
bicipark_valencia <- osmdata::osmdata_sf(bicival)
bici_fff <- bicipark_valencia$osm_points
guardar_datos <- function(bici_fff, nombre_archivo) {
st_write(bici_fff, paste0(nombre_archivo, ".gpkg"), driver = "GPKG", delete_layer = TRUE)
}
guardar_datos(bici_fff, "bicicletas")
Descripción de la base de datos
Ahora con la función glimpse exploramos los datos obtenidos para entender su estructura y características.
glimpse(bici_fff)
Rows: 361
Columns: 27
$ osm_id <chr> "1030609085", "1133659081", "1133659091", "13056…
$ name <chr> NA, NA, NA, NA, NA, "Dr Gil i Morte", NA, NA, "M…
$ access <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ `addr:street` <chr> NA, "Plaza del Colegio del Patriarca", "Avenida …
$ amenity <chr> "bicycle_parking", "bicycle_parking", "bicycle_p…
$ barrier <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ bicycle_parking <chr> NA, "stands", NA, "stands", NA, "wall_loops", NA…
$ bicycle_parking_1 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ capacity <chr> "6", "10", NA, NA, NA, "8", "8", "30", "10", "10…
$ `capacity:cargo_bike` <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ capacity_1 <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ cargo_bike <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ check_date <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ `check_date:capacity` <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ covered <chr> NA, "no", NA, "no", NA, "no", "no", "no", "no", …
$ fee <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ fixme <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ image <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ indoor <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ lit <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ mapillary <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ `name:ca` <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ operator <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ `operator:type` <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ `survey:date` <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ website <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
$ geometry <POINT [°]> POINT (-0.327838 39.55677), POINT (-0.3733…
La base de datos consta de 361 filas y 27 columnas. Es una gran cantidad de datos que trataremos Vemos la visualización de datos de distribución de los estacionaminetos en Valencia:
coords <- st_coordinates(bici_fff)
mapa <- leaflet() %>%
addTiles() %>% # Agrega un fondo de mapa predeterminado
addCircleMarkers(lng = coords[, 1], lat = coords[, 2], popup = "Estacionamiento de bicicletas") # Agrega marcadores circulares para cada estacionamiento de bicicletas
mapa
Podemos ver que los círculos azules muestran los lugares donde podemos encontrar parkings de bicicletas.. Podemos ver que hay una gran concentración en la ciudad de Valencia pero también tenemos datos que no corresponden a la Ciudad de Valencia sino a datos de pueblos próximos como Moncada, Massamagrell o Catarroja.
Por tanto podemos ver que la mayor concentración de las 361 ubicaciones con parkings para bicicletas si se encuentran en la comunidad pero puede que alguna no y por tanto habrá que depurar los datos.
También pueden haber datos que estén duplicados o que no tengan información suficiente.
Tratamiento
Para realizar el tratamineto de datos para eliminar imperfecciones hay que seguir una serie de pasos: eliminación de datos duplicados, comprobar que esten en la comunidad valenciana, seleccionar datos improtantes, eliminar parkings que no estén en la ciudad de Valencia:
- Eliminación de datos duplicados
Para no tener datos repetidos utilizamos el siguiente código con la función distinct. Podemos ver que seguimos ocn 361 observaciones y 27 variables y por tanto no hay daot sque esten duplicado y no eliminamos datos.
bici_fffduplicado <- bici_fff %>%
distinct(.keep_all = TRUE)
- Se encuentra en la comunidad valenciana
Podemos comprobar que 361 observaciones se encuentran dentro de la Comunidad valenciana pero solo 331 se encuentran en la ciudad de Valencia, 30 se encuentran fuera y por tanto habrá que eliminar
valencia <- mapSpain::esp_get_munic() %>%
filter(name == "Valencia")
options(scipen=999)
bici_fff_transformed <- st_transform(bici_fff, crs = st_crs(valencia))
suppressWarnings({
pts_in <- sf::st_intersection(bici_fff_transformed, valencia)
})
suppressWarnings({
pts_out <- sf::st_difference(bici_fff_transformed, valencia)
})
Por tanto, ahora trabajamos con 331 observaciones, es decir con la base de datos pts_in. Las otras 30 observaciones de datos sobrantes han quedado eliminados.
- columnas importantes
Podemos ver que las columnas más importantes son las del codigo de la estación de bicis, el nombre de la estación, la capacidad de bicis y donde se encuentra
bicis_fffimport <- bici_fff %>%
select(osm_id,name,capacity,geometry)
bicis_fffimport
Simple feature collection with 361 features and 3 fields
Geometry type: POINT
Dimension: XY
Bounding box: xmin: -0.430036 ymin: 39.28446 xmax: -0.2828833 ymax: 39.56488
Geodetic CRS: WGS 84
First 10 features:
osm_id name capacity
1030609085 1030609085 <NA> 6
1133659081 1133659081 <NA> 10
1133659091 1133659091 <NA> <NA>
1305697553 1305697553 <NA> <NA>
1569469284 1569469284 <NA> <NA>
1606999860 1606999860 Dr Gil i Morte 8
1607001135 1607001135 <NA> 8
1607002646 1607002646 <NA> 30
1607002648 1607002648 Marqués de Sotelo - Convent de Santa Clara 10
1622820321 1622820321 <NA> 10
geometry
1030609085 POINT (-0.327838 39.55677)
1133659081 POINT (-0.3733143 39.47224)
1133659091 POINT (-0.3506379 39.4741)
1305697553 POINT (-0.3464487 39.47515)
1569469284 POINT (-0.3384339 39.48069)
1606999860 POINT (-0.3806178 39.46233)
1607001135 POINT (-0.3845204 39.46266)
1607002646 POINT (-0.3777237 39.46711)
1607002648 POINT (-0.3767319 39.46827)
1622820321 POINT (-0.3711506 39.47147)
Output
Después de tratar de hacer una limpieza podemos llegar a la conclusión que al ser una base de datos con no demasiadas observaciones podemos llegar a la conclusión de que no era necesaria una limpieza muy extensa.
Comparando el viendo todos los datos o viendo solo los datos que se situan en la capital podemos ver las diferencias, aunque no son muchas. Podemos ver aquí el gráfico antes:
leaflet() %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addPolygons(data = valencia, color = "green", weight = 1, fillOpacity = 0.5) %>%
addCircleMarkers(data = bici_fff_transformed, radius = 0.3, color = "orange", fillOpacity = 1) %>%
setView(lng = -0.3, lat = 39.45, zoom = 10)
leaflet() %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addPolygons(data = valencia, color = "green", weight = 1, fillOpacity = 0.5) %>%
addCircleMarkers(data = pts_in, radius = 0.3, color = "orange", fillOpacity = 1) %>%
setView(lng = -0.3, lat = 39.45, zoom = 10)
En este gráfico podemos ver las estaciones de bicicleta que no estan en la ciudad:
leaflet() %>%
addProviderTiles(providers$CartoDB.Positron) %>%
addPolygons(data = valencia, color = "green", weight = 1, fillOpacity = 0.5) %>%
addCircleMarkers(data = pts_out, radius = 0.3, color = "orange", fillOpacity = 1) %>%
setView(lng = -0.3, lat = 39.45, zoom = 10)
Conclusiones
Podemos determinar por tanto que no hay una gran variación entre la base de datos original y la limpiada. Sólo se han eliminado un total de 30 observaciones que no pertenecian a la ciudad de Valencia sino a sus proximidades.
Para concluir, los datos obtenidos se han guardado en formato gpkg para facilitar su acceso y uso.
sf::st_write(pts_in, "biciestacionamiento.gpkg")
Proyecto de Innovación Educativa Emergente (PIEE-2737007)