En este último trabajo se analizarán los flujos de viajes del sistema EcoBici de Ciudad de México para el año 2019. Los datos abiertos se encuentran disponibles en la web del sistema (https://www.ecobici.cdmx.gob.mx/es/informacion-del-servicio/open-data), así como el acceso a la API para visualizar en tiempo real la información del sistema. Se puede acceder a los datasets de historial de uso del sistema mensual.
La info está disponible mensualizada desde 2010. Trabajaré con 2019 ya que sino implicaría descargar 232 datasets (de enero 2010 a abril 2020), y debería ponerme a estudiar más en detalle la historia del sistema EcoBici de CDMX, para entender las dinámicas de esa serie histórica de una década.
#Cargamos los datsets y hacemos las transformaciones y normalizaciones necesarias en las inconsistencias entre varios, para poder unirlos en un gran dataset de 2019. Todos tienen el mismo formato (salvo el de Marzo 2019).
ecobici_1 <- read.csv("/Users/martinsingla/Documents/UTDT - MEU/Ciencia de Datos para Ciudades II/ECOBICI CDMX/2019-01.csv",
encoding = "UTF-08")
ecobici_2 <- read.csv("/Users/martinsingla/Documents/UTDT - MEU/Ciencia de Datos para Ciudades II/ECOBICI CDMX/2019-02.csv",
encoding = "UTF-08")
ecobici_3 <- read.csv("/Users/martinsingla/Documents/UTDT - MEU/Ciencia de Datos para Ciudades II/ECOBICI CDMX/2019-03.csv",
encoding = "UTF-08")
ecobici_3$X <- NULL
ecobici_4 <- read.csv("/Users/martinsingla/Documents/UTDT - MEU/Ciencia de Datos para Ciudades II/ECOBICI CDMX/2019-04.csv",
encoding = "UTF-08")
ecobici_5 <- read.csv("/Users/martinsingla/Documents/UTDT - MEU/Ciencia de Datos para Ciudades II/ECOBICI CDMX/2019-05.csv",
encoding = "UTF-08")
ecobici_6 <- read.csv("/Users/martinsingla/Documents/UTDT - MEU/Ciencia de Datos para Ciudades II/ECOBICI CDMX/2019-06.csv",
encoding = "UTF-08")
ecobici_7 <- read.csv("/Users/martinsingla/Documents/UTDT - MEU/Ciencia de Datos para Ciudades II/ECOBICI CDMX/2019-07.csv",
encoding = "UTF-08")
ecobici_8 <- read.csv("/Users/martinsingla/Documents/UTDT - MEU/Ciencia de Datos para Ciudades II/ECOBICI CDMX/2019-08.csv",
encoding = "UTF-08")
ecobici_9 <- read.csv("/Users/martinsingla/Documents/UTDT - MEU/Ciencia de Datos para Ciudades II/ECOBICI CDMX/2019-09.csv",
encoding = "UTF-08")
ecobici_10 <- read.csv("/Users/martinsingla/Documents/UTDT - MEU/Ciencia de Datos para Ciudades II/ECOBICI CDMX/2019-10.csv",
encoding = "UTF-08")
ecobici_11 <- read.csv("/Users/martinsingla/Documents/UTDT - MEU/Ciencia de Datos para Ciudades II/ECOBICI CDMX/2019-11.csv",
encoding = "UTF-08")
ecobici_12 <- read.csv("/Users/martinsingla/Documents/UTDT - MEU/Ciencia de Datos para Ciudades II/ECOBICI CDMX/2019-12.csv",
encoding = "UTF-08")
#Unir los datasets en un único dataset anual:
CDMX_ecobici2019 <- do.call("rbind", list(ecobici_1, ecobici_2, ecobici_3, ecobici_4, ecobici_5, ecobici_6, ecobici_7, ecobici_8, ecobici_9, ecobici_10, ecobici_11, ecobici_12))
## Warning in `[<-.factor`(`*tmp*`, ri, value = c(2388L, 8272L, 4058L, 7716L, :
## invalid factor level, NA generated
## Warning in `[<-.factor`(`*tmp*`, ri, value = c(2388L, 8272L, 4058L, 7716L, :
## invalid factor level, NA generated
## Warning in `[<-.factor`(`*tmp*`, ri, value = c(2388L, 8272L, 4058L, 7716L, :
## invalid factor level, NA generated
## Warning in `[<-.factor`(`*tmp*`, ri, value = c(2388L, 8272L, 4058L, 7716L, :
## invalid factor level, NA generated
## Warning in `[<-.factor`(`*tmp*`, ri, value = c(2388L, 8272L, 4058L, 7716L, :
## invalid factor level, NA generated
## Warning in `[<-.factor`(`*tmp*`, ri, value = c(2388L, 8272L, 4058L, 7716L, :
## invalid factor level, NA generated
Cada archivo tiene información de cada viaje, unos 650,000 a 750,000 viajes mensuales. Nos queda un dataset de más de 8,400,000 entradas. El mismo posee información sobre la estación de origen (ID), la estación destino (ID), el horario de inicio de viaje y el horario de finalización de viaje. Así mismo posee un ID de la bicicleta (¡fundamental, podemos hacer un seguimiento de la bicicleta durante todo el día!), y data sobre el género y edad del usuario que realizó el viaje (pero no hay un ID de usuario, con lo cual esa información no la podemos individualizar).
#Transformaciones necesarias en el dataset
CDMX_ecobici2019$Fecha_hora_retiro <- as_datetime(paste(dmy(CDMX_ecobici2019$Fecha_Retiro),
CDMX_ecobici2019$Hora_Retiro, sep = " "))
## Warning: 1 failed to parse.
CDMX_ecobici2019$Fecha_hora_arribo <- as_datetime(paste(dmy(CDMX_ecobici2019$Fecha_Arribo),
CDMX_ecobici2019$Hora_Arribo, sep = " "))
## Warning: 1 failed to parse.
## Warning: 1 failed to parse.
CDMX_ecobici2019$Fecha_Arribo <- NULL
CDMX_ecobici2019$Fecha_Retiro <- NULL
CDMX_ecobici2019$Hora_Arribo <- NULL
CDMX_ecobici2019$Hora_Retiro <- NULL
CDMX_ecobici2019$tiempo_viaje <- difftime(CDMX_ecobici2019$Fecha_hora_arribo, CDMX_ecobici2019$Fecha_hora_retiro, units = "mins")
#Inspección del dataset en términos de tiempos de viajes y horarios para identificar errores o puntos a limpiar.
#Se retiraron los casos que duraron más de 120 minutos el viaje y los que duraron menos de 3 minuto el viaje (posibles robos de bicicletas o fallas mecánicas). Se trata de unos 28,600 registros que se filtran del dataset.
CDMX_ecobici2019 <- CDMX_ecobici2019 %>%
filter(tiempo_viaje > 4, tiempo_viaje < 120)
media <- round(mean(as.numeric(CDMX_ecobici2019$tiempo_viaje), na.rm = TRUE),2)
mediana <- round(median(as.numeric(CDMX_ecobici2019$tiempo_viaje), na.rm = TRUE), 2)
ggplot() +
geom_histogram(data= CDMX_ecobici2019,
aes(x= as.numeric(tiempo_viaje)), bins = 45, color = "black", fill= "chartreuse3") +
labs(title = "CDMX: Sistema Ecobici",
subtitle = "Histograma de frecuencia de tiempo de uso (2019)",
caption = "Fuente: Elaboración propia a partir de ecobici.cdmx.gob.mx",
x= "Tiempo de uso en minutos",
y= "") +
geom_text(aes(x= 75, y= 1000000),
label= paste("Viaje medio:", media, "minutos", sep = " "), size= 4) +
geom_text(aes(x= 75, y= 900000), label= paste("Mediana:", mediana, "minutos", sep = " "), size= 4)
CDMX_ecobici2019_diario <- CDMX_ecobici2019 %>%
count(Genero_Usuario, dia_base = date(Fecha_hora_retiro))
ggplot(CDMX_ecobici2019_diario) +
geom_line(data = CDMX_ecobici2019_diario %>%
filter(Genero_Usuario == "M"), aes(x= dia_base, y= n), colour = "deepskyblue2") +
geom_line(data = CDMX_ecobici2019_diario %>%
filter(Genero_Usuario == "F"), aes(x= dia_base, y= n), colour = "salmon") +
labs(title = "CDMX: Sistema Ecobici",
subtitle = "Cantidad de viajes diarios, por género de usuario (2019)",
caption = "Fuente: Elaboración propia a partir de ecobici.cdmx.gob.mx",
x= "Fecha",
y= "")
CDMX_ecobici2019_hora <- CDMX_ecobici2019 %>%
group_by(date(Fecha_hora_retiro), hora_base = hour(Fecha_hora_retiro)) %>%
summarise(viajes = n()) %>%
group_by(hora_base) %>%
summarise(mediana = median(viajes),
media = mean(viajes))
ggplot() +
geom_line(data= CDMX_ecobici2019_hora, aes(x= hora_base, y= media, color= "Media horaria")) +
geom_line(data= CDMX_ecobici2019_hora, aes(x= hora_base, y= mediana, color= "Mediana horaria")) +
labs(title = "CDMX: Sistema Ecobici",
subtitle = "Media y mediana de cantidad de viajes por rango horario diario (2019)",
caption = "Fuente: Elaboración propia a partir de ecobici.cdmx.gob.mx",
x= "Rango horario",
y= "Cantidad de viajes")
CDMX_estaciones <- read_sf("/Users/martinsingla/Documents/UTDT - MEU/Ciencia de Datos para Ciudades II/ECOBICI CDMX/estaciones-de-ecobici/estaciones-de-ecobici.shp")
CDMX_alcaldias <- read_sf("/Users/martinsingla/Documents/UTDT - MEU/Ciencia de Datos para Ciudades II/INFO SELECCIONADA/CDMX_Alcaldias/alcaldias.shp")
#El sistema de Ecobici de CDMX está concentrado casi exclusivamente en tres alcaldías: Benito Juárez, Cuauhtémoc y Miguél Hidalgo. Para visualizar mejor en el mapa las 480 estaciones habrá que quedarnos solo con esas 3 alcaldías.
ggplot() +
geom_sf(data= CDMX_alcaldias, fill = NA) +
geom_sf(data= CDMX_estaciones, colour= "chartreuse3", size= 0.00000001) +
labs(title = "CDMX: Sistema Ecobici",
subtitle = "Distribución espacial de las estaciones de Ecobici (2019)",
caption = "Fuente: Elaboración propia a partir de ecobici.cdmx.gob.mx") +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank())
CDMX_alcaldias_select <- CDMX_alcaldias %>%
filter(nomgeo == "Cuauhtémoc" | nomgeo == "Benito Juárez" | nomgeo == "Miguel Hidalgo")
ggplot() +
geom_sf(data= CDMX_alcaldias_select, fill = NA) +
geom_sf(data= CDMX_estaciones, colour= "chartreuse3", size= 0.5) +
labs(title = "CDMX: Sistema Ecobici",
subtitle = "Ubicación de estaciones de Ecobici. Alcaldías Cuauhtémoc,
Benito Juárez y Miguel Hidalgo (2019)",
caption = "Fuente: Elaboración propia a partir de ecobici.cdmx.gob.mx") +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank())
CDMX_estacionesb <- CDMX_estaciones %>%
mutate(lat = unlist(map(CDMX_estaciones$geometry, 1)),
lon = unlist(map(CDMX_estaciones$geometry, 2)))
bbox <- make_bbox(CDMX_estacionesb$lat, CDMX_estacionesb$lon)
rm(CDMX_estacionesb)
CDMX <- get_stamenmap(bbox, zoom = 14, maptype = "toner-lite")
## Source : http://tile.stamen.com/toner-lite/14/3676/7289.png
## Source : http://tile.stamen.com/toner-lite/14/3677/7289.png
## Source : http://tile.stamen.com/toner-lite/14/3678/7289.png
## Source : http://tile.stamen.com/toner-lite/14/3679/7289.png
## Source : http://tile.stamen.com/toner-lite/14/3680/7289.png
## Source : http://tile.stamen.com/toner-lite/14/3676/7290.png
## Source : http://tile.stamen.com/toner-lite/14/3677/7290.png
## Source : http://tile.stamen.com/toner-lite/14/3678/7290.png
## Source : http://tile.stamen.com/toner-lite/14/3679/7290.png
## Source : http://tile.stamen.com/toner-lite/14/3680/7290.png
## Source : http://tile.stamen.com/toner-lite/14/3676/7291.png
## Source : http://tile.stamen.com/toner-lite/14/3677/7291.png
## Source : http://tile.stamen.com/toner-lite/14/3678/7291.png
## Source : http://tile.stamen.com/toner-lite/14/3679/7291.png
## Source : http://tile.stamen.com/toner-lite/14/3680/7291.png
## Source : http://tile.stamen.com/toner-lite/14/3676/7292.png
## Source : http://tile.stamen.com/toner-lite/14/3677/7292.png
## Source : http://tile.stamen.com/toner-lite/14/3678/7292.png
## Source : http://tile.stamen.com/toner-lite/14/3679/7292.png
## Source : http://tile.stamen.com/toner-lite/14/3680/7292.png
## Source : http://tile.stamen.com/toner-lite/14/3676/7293.png
## Source : http://tile.stamen.com/toner-lite/14/3677/7293.png
## Source : http://tile.stamen.com/toner-lite/14/3678/7293.png
## Source : http://tile.stamen.com/toner-lite/14/3679/7293.png
## Source : http://tile.stamen.com/toner-lite/14/3680/7293.png
ggmap(CDMX) +
geom_sf(data= CDMX_estaciones, inherit.aes = FALSE, color = "chartreuse3", size = 1) +
labs(title = "CDMX: Sistema Ecobici",
caption= "Fuente: elaboración propia a partir de datos ecobici.cdmx.gob.mx") +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank())
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.
#Creación de matriz origen-destino y adjudicación de geometría espacial a cada nodo.
CDMX_estaciones <- CDMX_estaciones %>%
select(id, name, geometry)
CDMX_ecobici2019$tiempo_viaje <- as.numeric(CDMX_ecobici2019$tiempo_viaje)
matriz_viajes <- CDMX_ecobici2019 %>%
group_by(Ciclo_Estacion_Retiro, Ciclo_Estacion_Arribo) %>%
summarise(total = n(),
media_tiempo = mean(tiempo_viaje),
mediana_tiempo =median(tiempo_viaje)) %>%
arrange(Ciclo_Estacion_Retiro)
matriz_viajes <- left_join(matriz_viajes, CDMX_estaciones, by = c("Ciclo_Estacion_Retiro" = "id"))
matriz_viajes$Estacion_retiro_id <- matriz_viajes$Ciclo_Estacion_Retiro
matriz_viajes$Estacion_retiro_nombre <- matriz_viajes$name
matriz_viajes$Estacion_retiro_geometry <- matriz_viajes$geometry
matriz_viajes$name <- NULL
matriz_viajes$geometry <- NULL
matriz_viajes$Ciclo_Estacion_Retiro <- NULL
matriz_viajes$Ciclo_Estacion_Arribo <- as.numeric(matriz_viajes$Ciclo_Estacion_Arribo)
matriz_viajes <- left_join(matriz_viajes, CDMX_estaciones, by = c("Ciclo_Estacion_Arribo" = "id"))
matriz_viajes$Estacion_arribo_id <- matriz_viajes$Ciclo_Estacion_Arribo
matriz_viajes$Estacion_arribo_nombre <- matriz_viajes$name
matriz_viajes$Estacion_arribo_geometry <- matriz_viajes$geometry
matriz_viajes$name <- NULL
matriz_viajes$geometry <- NULL
matriz_viajes$Ciclo_Estacion_Arribo <- NULL
matriz_viajes <- matriz_viajes %>%
filter(!is.na(Estacion_retiro_nombre))
matriz_viajes <- matriz_viajes %>%
filter(!is.na(Estacion_arribo_nombre))
#Creación de mapa de calor entre pares de nodos.
ggplot() +
geom_tile(data = matriz_viajes, aes(x = as.factor(Estacion_retiro_id), y = as.factor(Estacion_arribo_id), fill = total)) +
scale_fill_distiller(palette = "Spectral") +
labs(title= "CDMX: Sistema Ecobici",
subtitle = "Mapa de calor de la matriz origen-destino (todas las rutas, 2019)",
x= "Estación de inicio de viaje",
y= "Estación de finalización de viaje")
#Identificación de los recorridos más realizados. Los viajes circulares por motivos de fallas técnicas ya habrías sido mayoritariamente depurados ya que hemos filtrado del dataset todos los viajes con duraciones menores a 3 minutos. Se oberva que en la mayoría de los pares origen-destino, la media y mediana de tiempo de viaje es similar o superior inclusive que la media general.
top75 <- matriz_viajes %>%
ungroup() %>%
top_n(75, total) %>%
arrange(desc(total))
ggplot() +
geom_tile(data = top75, aes(x = as.factor(Estacion_retiro_id), y = as.factor(Estacion_arribo_id), fill = total)) +
scale_fill_distiller(palette = "Spectral") +
labs(title= "CDMX: Sistema Ecobici",
subtitle = "Mapa de calor de la matriz origen-destino (top 75 rutas, 2019)",
x= "Estación de inicio de viaje",
y= "Estación de finalización de viaje")
options(digits = 3)
top75 <- top75 %>%
mutate(Estacion_retiro_X = unlist(map(Estacion_retiro_geometry, 1)),
Estacion_retiro_Y = unlist(map(Estacion_retiro_geometry, 2)),
Estacion_arribo_X = unlist(map(Estacion_arribo_geometry, 1)),
Estacion_arribo_Y = unlist(map(Estacion_arribo_geometry, 2)))
#Probamos un ruteo antes de automatizar el proceso:
Est18 <- c(top75[1, 5], top75[1, 10], top75[1,11])
Est1 <- c(top75[1, 8], top75[1,12], top75[1,13])
Est18_a_Est1 <- osrmRoute(src = Est18,
dst = Est1,
returnclass = "sf",
overview = "full")
ggmap(CDMX) +
geom_sf(data= CDMX_estaciones, inherit.aes = FALSE, colour = "chartreuse3", size = 0.5) +
geom_sf(data= Est18_a_Est1, inherit.aes = FALSE, colour = "red", size = 0.8) +
labs(title = "CDMX: Sistema Ecobici - Viaje más frecuente (2019)",
caption= "Fuente: elaboración propia a partir de datos ecobici.cdmx.gob.mx") +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank())
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.
#Generación de función para ruteo automático:
ruteo_entre_estaciones <- function(o_nombre, o_x, o_y, d_nombre, d_x, d_y) {
ruta <- osrmRoute(src = c(o_nombre, o_x, o_y),
dst = c(d_nombre, d_x, d_y),
returnclass = "sf",
overview = "full")
cbind(ORIGEN = o_nombre, DESTINO = d_nombre, ruta)
}
ruteo_cdmx <- list(top75$Estacion_retiro_nombre, top75$Estacion_retiro_X, top75$Estacion_retiro_Y,
top75$Estacion_arribo_nombre, top75$Estacion_arribo_X, top75$Estacion_arribo_Y)
ruteo_top75 <- pmap(ruteo_cdmx, ruteo_entre_estaciones) %>%
reduce(rbind)
ruteo_top75 <- cbind(ruteo_top75, Total_viajes = top75$total, Media_tiempo = top75$media_tiempo, Mediana_tiempo = top75$mediana_tiempo)
ggmap(CDMX) +
geom_sf(data = CDMX_estaciones, inherit.aes = FALSE, color = "chartreuse3", size = 0.5) +
geom_sf(data = ruteo_top75, inherit.aes = FALSE, aes(size = Total_viajes, color = Media_tiempo), alpha =0.8) +
scale_colour_viridis_c() +
labs(title = "CDMX: Sistema Ecobici",
subtitle = "Top 75 rutas más frecuentes (2019)",
caption= "Fuente: elaboración propia a partir de datos ecobici.cdmx.gob.mx") +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank())
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.
#Las tres estaciones que más viajes reciben en todo el transcurso de un año:
matriz_viajes %>%
group_by(Estacion_arribo_id) %>%
summarise(total = sum(total)) %>%
top_n(10) %>%
arrange(desc(total))
## Selecting by total
## # A tibble: 10 x 2
## Estacion_arribo_id total
## <dbl> <int>
## 1 266 89555
## 2 27 74794
## 3 1 72674
## 4 271 63449
## 5 267 58219
## 6 43 56025
## 7 64 55572
## 8 182 55140
## 9 36 53190
## 10 18 51037
LAS 3 ESTACIONES QUE RECIBEN MÁS DE 70,000 VIAJES EN UN AÑO Y EL ORIGEN MAYORITARIO DE ESOS VIAJES.
#La PRIMERA estación que más viajes recibe en un año (id: 266), ni siquiera genera viajes con las 480 estaciones del sistema, solo con 434.
Matriz_arribos_266 <- matriz_viajes %>%
ungroup() %>%
filter(Estacion_arribo_id == 266) %>%
top_n(100, total) %>%
arrange(desc(total))
#Ruteo de los orígenes de los viajes que se dirigen a la "estación 266":
Matriz_arribos_266 <- Matriz_arribos_266 %>%
mutate(Estacion_retiro_X = unlist(map(Estacion_retiro_geometry, 1)),
Estacion_retiro_Y = unlist(map(Estacion_retiro_geometry, 2)),
Estacion_arribo_X = unlist(map(Estacion_arribo_geometry, 1)),
Estacion_arribo_Y = unlist(map(Estacion_arribo_geometry, 2)))
ruteo_matriz_266 <- list(Matriz_arribos_266$Estacion_retiro_nombre, Matriz_arribos_266$Estacion_retiro_X, Matriz_arribos_266$Estacion_retiro_Y,
Matriz_arribos_266$Estacion_arribo_nombre, Matriz_arribos_266$Estacion_arribo_X, Matriz_arribos_266$Estacion_arribo_Y)
ruteo_266 <- pmap(ruteo_matriz_266, ruteo_entre_estaciones) %>%
reduce(rbind)
ruteo_266 <- cbind(ruteo_266, Total_viajes = Matriz_arribos_266$total, Media_tiempo = Matriz_arribos_266$media_tiempo, Mediana_tiempo = Matriz_arribos_266$mediana_tiempo)
#Mapeo del la "estación 266", y top-100 origen de los viajes que recibe:
ggmap(CDMX) +
geom_sf(data = CDMX_estaciones, inherit.aes = FALSE, color = "chartreuse3", size = 0.5) +
geom_sf(data = ruteo_266, inherit.aes = FALSE, aes(size = Total_viajes, color = Media_tiempo), alpha =0.8) +
scale_colour_viridis_c() +
geom_sf(data= CDMX_estaciones %>%
filter(id == "266"), inherit.aes = FALSE, color = "Red") +
labs(title = "CDMX: Sistema Ecobici",
subtitle = "Top-100 origen de viajes finalizados en la estación ID#266 (2019)",
caption= "Fuente: elaboración propia a partir de datos ecobici.cdmx.gob.mx") +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank())
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.
#La SEGUNDA estación que más viajes recibe en un año (id: 27), en todo el año recibe viajes de 438 estaciones (sobre 480).
Matriz_arribos_27 <- matriz_viajes %>%
ungroup() %>%
filter(Estacion_arribo_id == 27) %>%
top_n(100, total) %>%
arrange(desc(total))
#Ruteo de los orígenes de los viajes que se dirigen a la "estación 27":
Matriz_arribos_27 <- Matriz_arribos_27 %>%
mutate(Estacion_retiro_X = unlist(map(Estacion_retiro_geometry, 1)),
Estacion_retiro_Y = unlist(map(Estacion_retiro_geometry, 2)),
Estacion_arribo_X = unlist(map(Estacion_arribo_geometry, 1)),
Estacion_arribo_Y = unlist(map(Estacion_arribo_geometry, 2)))
ruteo_matriz_27 <- list(Matriz_arribos_27$Estacion_retiro_nombre, Matriz_arribos_27$Estacion_retiro_X, Matriz_arribos_27$Estacion_retiro_Y,
Matriz_arribos_27$Estacion_arribo_nombre, Matriz_arribos_27$Estacion_arribo_X, Matriz_arribos_27$Estacion_arribo_Y)
ruteo_27 <- pmap(ruteo_matriz_27, ruteo_entre_estaciones) %>%
reduce(rbind)
ruteo_27 <- cbind(ruteo_27, Total_viajes = Matriz_arribos_27$total, Media_tiempo = Matriz_arribos_27$media_tiempo, Mediana_tiempo = Matriz_arribos_27$mediana_tiempo)
#Mapeo del la "estación 27", y top-100 origen de los viajes que recibe:
ggmap(CDMX) +
geom_sf(data = CDMX_estaciones, inherit.aes = FALSE, color = "chartreuse3", size = 0.5) +
geom_sf(data = ruteo_27, inherit.aes = FALSE, aes(size = Total_viajes, color = Media_tiempo), alpha =0.8) +
scale_colour_viridis_c() +
geom_sf(data= CDMX_estaciones %>%
filter(id == "27"), inherit.aes = FALSE, color = "Red") +
labs(title = "CDMX: Sistema Ecobici",
subtitle = "Top-100 origen de viajes finalizados en la estación ID#27 (2019)",
caption= "Fuente: elaboración propia a partir de datos ecobici.cdmx.gob.mx") +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank())
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.
#La SEGUNDA estación que más viajes recibe en un año (id: #1), en todo el año recibe viajes de 430 estaciones (sobre 480).
Matriz_arribos_1 <- matriz_viajes %>%
ungroup() %>%
filter(Estacion_arribo_id == 1) %>%
top_n(100, total) %>%
arrange(desc(total))
#Ruteo de los orígenes de los viajes que se dirigen a la "estación #1":
Matriz_arribos_1 <- Matriz_arribos_1 %>%
mutate(Estacion_retiro_X = unlist(map(Estacion_retiro_geometry, 1)),
Estacion_retiro_Y = unlist(map(Estacion_retiro_geometry, 2)),
Estacion_arribo_X = unlist(map(Estacion_arribo_geometry, 1)),
Estacion_arribo_Y = unlist(map(Estacion_arribo_geometry, 2)))
ruteo_matriz_1 <- list(Matriz_arribos_1$Estacion_retiro_nombre, Matriz_arribos_1$Estacion_retiro_X, Matriz_arribos_1$Estacion_retiro_Y,
Matriz_arribos_1$Estacion_arribo_nombre, Matriz_arribos_1$Estacion_arribo_X, Matriz_arribos_1$Estacion_arribo_Y)
ruteo_1 <- pmap(ruteo_matriz_1, ruteo_entre_estaciones) %>%
reduce(rbind)
ruteo_1 <- cbind(ruteo_1, Total_viajes = Matriz_arribos_1$total, Media_tiempo = Matriz_arribos_1$media_tiempo, Mediana_tiempo = Matriz_arribos_1$mediana_tiempo)
#Mapeo del la "estación ID#1", y top-100 origen de los viajes que recibe:
ggmap(CDMX) +
geom_sf(data = CDMX_estaciones, inherit.aes = FALSE, color = "chartreuse3", size = 0.5) +
geom_sf(data = ruteo_1, inherit.aes = FALSE, aes(size = Total_viajes, color = Media_tiempo), alpha =0.8) +
scale_colour_viridis_c() +
geom_sf(data= CDMX_estaciones %>%
filter(id == "1"), inherit.aes = FALSE, color = "Red") +
labs(title = "CDMX: Sistema Ecobici",
subtitle = "Top-100 origen de viajes finalizados en la estación ID#1 (2019)",
caption= "Fuente: elaboración propia a partir de datos ecobici.cdmx.gob.mx") +
theme(axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
axis.title = element_blank())
## Coordinate system already present. Adding new coordinate system, which will replace the existing one.