En este trabajo intentamos responder de donde salen y hacia donde llegan la mayoria de las personas de las diferentes comunas de la ciudad de Cali, lo haremos de una manera grafica y sencilla con la ayuda de los shapefiles y mapas y nos enfocaremos en los tipos de vehiculos (bicicleta, moto y automóvil).
Lo haremos ilustrando los siguientes mapas:
| # | Mapa |
|---|---|
| 1 | Origen - todos los viajes |
| 2 | Destino - todos los viajes |
| 3 | Origen - Bicicleta |
| 4 | Origen - Moto |
| 5 | Origen - Automóvil |
| 6 | Destino - Bicicleta |
| 7 | Destino - Moto |
| 8 | Destino - Automóvil |
Igual que en el ejemplo de clase, cargamos el shapefile de las
comunas de Cali con la función shapefile de la librería
raster.
require(raster)
require(sp)
require(readxl)
require(leaflet)
comunas = shapefile("Casos/Casos/cali/Comunas.shp")
comunas
## class : SpatialPolygonsDataFrame
## features : 22
## extent : 1053868, 1068492, 860190.2, 879441.5 (xmin, xmax, ymin, ymax)
## crs : +proj=tmerc +lat_0=3.441883333 +lon_0=-76.5205625 +k=1 +x_0=1061900.18 +y_0=872364.63 +a=6379137 +rf=298.257222101 +units=m +no_defs
## variables : 4
## names : OBJECTID, gid, comuna, nombre
## min values : 1, 89, 1, Comuna 1
## max values : 22, 110, 22, Comuna 9
plot(comunas)
El shapefile tiene 22 polígonos (una por comuna) y está en el sistema
de coordenadas MAGNA Cali (en metros). por razones de visibilidad y
detalles le aposté a la libreria leaflet pero esta solo
trabaja con coordenadas geográficas, entonces lo transformamos con
spTransform:
comunas2 = spTransform(comunas, CRS("+proj=longlat +ellps=WGS84 +datum=WGS84"))
head(comunas2@data)
## OBJECTID gid comuna nombre
## 1 1 107 2 Comuna 2
## 2 2 108 1 Comuna 1
## 3 3 109 3 Comuna 3
## 4 4 110 19 Comuna 19
## 5 5 103 15 Comuna 15
## 6 6 104 17 Comuna 17
En el archivo solo nos interesan las columnas, tipo y comuna de origen y destino. Además necesitamos la tabla dimensional del archivo convenciones.
encuesta = read_excel("Casos/Casos/EncuestaOrigenDestino.xlsx", sheet = 1, col_types = "text")
dim(encuesta)
## [1] 35054 28
datos = data.frame(
vehiculo = suppressWarnings(as.numeric(encuesta[[23]])),
origen = suppressWarnings(as.numeric(encuesta[[26]])),
destino = suppressWarnings(as.numeric(encuesta[[27]]))
)
datos$tipo = factor(datos$vehiculo, levels = c(1, 2, 3),
labels = c("Bicicleta", "Moto", "Automovil"))
head(datos)
## vehiculo origen destino tipo
## 1 2 2 22 Moto
## 2 3 NA 19 Automovil
## 3 2 NA 3 Moto
## 4 2 NA 9 Moto
## 5 2 NA 2 Moto
## 6 3 NA 2 Automovil
Algunos viajes vienen de (o van hacia) fuera de Cali o tienen comuna 0. Como esos registros no caen dentro del mapa de comunas, se excluyen al momento de contar:
# Registros que no caen dentro de las 22 comunas
sum(!(datos$origen %in% 1:22))
## [1] 6978
sum(!(datos$destino %in% 1:22))
## [1] 7188
Para no repetir código creamos dos funciones: una que cuenta
los viajes por comuna y la agrega al shapefile, y otra que
dibuja el mapa de coropletas con
leaflet.
# Cuenta los viajes por comuna (solo comunas 1 a 22)
contar_comuna = function(x) {
x = x[x %in% 1:22]
conteo = table(factor(x, levels = 1:22))
as.numeric(conteo[as.character(comunas2$comuna)])
}
# Dibuja el mapa de coropletas
mapa_comunas = function(valores, titulo, paleta = "YlOrRd") {
pal = colorNumeric(palette = paleta, domain = valores)
etiquetas = lapply(sprintf("<b>%s</b><br/>Viajes: %s<br/>Participación: %.1f%%",
comunas2$nombre,
format(valores, big.mark = ".", decimal.mark = ",", trim = TRUE),
100 * valores / sum(valores)),
htmltools::HTML)
leaflet(comunas2) %>%
addTiles() %>%
addPolygons(fillColor = ~pal(valores), fillOpacity = 0.75,
color = "white", weight = 1.5,
label = etiquetas,
highlightOptions = highlightOptions(weight = 3, color = "#444",
bringToFront = TRUE)) %>%
addLabelOnlyMarkers(lng = coordinates(comunas2)[, 1],
lat = coordinates(comunas2)[, 2],
label = as.character(comunas2$comuna),
labelOptions = labelOptions(noHide = TRUE, textOnly = TRUE,
style = list("font-weight" = "bold"))) %>%
addLegend(pal = pal, values = valores, title = titulo, position = "bottomright")
}
# Tabla con las 5 comunas con más viajes
top5 = function(valores) {
tabla = data.frame(Comuna = comunas2$nombre, Viajes = valores,
Porcentaje = round(100 * valores / sum(valores), 1))
head(tabla[order(-tabla$Viajes), ], 5)
}
Ahora calculamos todos los conteos y los guardamos como nuevas columnas en la tabla de atributos del shapefile:
bici = datos$tipo %in% "Bicicleta"
moto = datos$tipo %in% "Moto"
auto = datos$tipo %in% "Automovil"
comunas2$origen = contar_comuna(datos$origen)
comunas2$destino = contar_comuna(datos$destino)
comunas2$origen_bici = contar_comuna(datos$origen[bici])
comunas2$origen_moto = contar_comuna(datos$origen[moto])
comunas2$origen_auto = contar_comuna(datos$origen[auto])
comunas2$destino_bici = contar_comuna(datos$destino[bici])
comunas2$destino_moto = contar_comuna(datos$destino[moto])
comunas2$destino_auto = contar_comuna(datos$destino[auto])
head(comunas2@data)
## OBJECTID gid comuna nombre origen destino origen_bici origen_moto
## 1 1 107 2 Comuna 2 2968 4810 159 1414
## 2 2 108 1 Comuna 1 794 230 36 375
## 3 3 109 3 Comuna 3 2121 3859 99 970
## 4 4 110 19 Comuna 19 2850 3158 141 1280
## 5 5 103 15 Comuna 15 1171 579 70 536
## 6 6 104 17 Comuna 17 2377 2164 141 1136
## origen_auto destino_bici destino_moto destino_auto
## 1 1121 218 2177 2006
## 2 301 12 112 86
## 3 854 189 1734 1557
## 4 1165 147 1421 1302
## 5 456 20 271 245
## 6 899 115 927 959
mapa_comunas(comunas2$origen, "Viajes que salen", "YlOrRd")
knitr::kable(top5(comunas2$origen), row.names = FALSE)
| Comuna | Viajes | Porcentaje |
|---|---|---|
| Comuna 2 | 2968 | 10.6 |
| Comuna 19 | 2850 | 10.2 |
| Comuna 17 | 2377 | 8.5 |
| Comuna 3 | 2121 | 7.6 |
| Comuna 18 | 1536 | 5.5 |
Resumen La mayoría de las personas salen de la Comuna 2 y la Comuna 19, seguidas de la 17 y la 3. Entre esas cuatro concentran más de la tercera parte de los viajes que se originan dentro de Cali. Las comunas con menos salidas son la 12, la 5 y la 14.
mapa_comunas(comunas2$destino, "Viajes que llegan", "Blues")
knitr::kable(top5(comunas2$destino), row.names = FALSE)
| Comuna | Viajes | Porcentaje |
|---|---|---|
| Comuna 2 | 4810 | 17.3 |
| Comuna 3 | 3859 | 13.8 |
| Comuna 19 | 3158 | 11.3 |
| Comuna 17 | 2164 | 7.8 |
| Comuna 22 | 1860 | 6.7 |
Resumen Los destinos están mucho más concentrados que los orígenes: la Comuna 2 recibe la mayor cantidad de viajes, seguida de la Comuna 3 (el centro de la ciudad) y la Comuna 19. Esto tiene sentido porque allí se ubican muchas oficinas, comercio y servicios. Las comunas que menos viajes reciben son la 1, la 12 y la 20, que son principalmente residenciales.
mapa_comunas(comunas2$origen_bici, "Salidas en bicicleta", "Greens")
knitr::kable(top5(comunas2$origen_bici), row.names = FALSE)
| Comuna | Viajes | Porcentaje |
|---|---|---|
| Comuna 2 | 159 | 10.4 |
| Comuna 19 | 141 | 9.2 |
| Comuna 17 | 141 | 9.2 |
| Comuna 18 | 111 | 7.2 |
| Comuna 3 | 99 | 6.5 |
Resumen Los ciclistas salen principalmente de las comunas 2, 17 y 19, y también de la 18. La bicicleta es el modo con menos registros en la encuesta, así que los números son más pequeños, pero se nota una presencia importante en el sur de la ciudad.
mapa_comunas(comunas2$origen_moto, "Salidas en moto", "Oranges")
knitr::kable(top5(comunas2$origen_moto), row.names = FALSE)
| Comuna | Viajes | Porcentaje |
|---|---|---|
| Comuna 2 | 1414 | 10.8 |
| Comuna 19 | 1280 | 9.8 |
| Comuna 17 | 1136 | 8.7 |
| Comuna 3 | 970 | 7.4 |
| Comuna 18 | 746 | 5.7 |
Resumen del mapa La moto es el vehículo con más viajes registrados. Sus salidas siguen el mismo patrón general: Comuna 2, 19 y 17 a la cabeza. Se distribuyen de forma bastante amplia por toda la ciudad, lo que muestra que la moto es usada en casi todas las comunas.
mapa_comunas(comunas2$origen_auto, "Salidas en automóvil", "Purples")
knitr::kable(top5(comunas2$origen_auto), row.names = FALSE)
| Comuna | Viajes | Porcentaje |
|---|---|---|
| Comuna 19 | 1165 | 10.7 |
| Comuna 2 | 1121 | 10.3 |
| Comuna 17 | 899 | 8.3 |
| Comuna 3 | 854 | 7.9 |
| Comuna 18 | 559 | 5.1 |
Resumen del mapa En el automóvil hay un cambio interesante: la Comuna 19 pasa al primer lugar, por encima de la 2, y la 17 también aparece con fuerza. Son comunas del sur y del norte con estratos más altos, donde es más común tener carro particular.
mapa_comunas(comunas2$destino_bici, "Llegadas en bicicleta", "Greens")
knitr::kable(top5(comunas2$destino_bici), row.names = FALSE)
| Comuna | Viajes | Porcentaje |
|---|---|---|
| Comuna 2 | 218 | 15.8 |
| Comuna 3 | 189 | 13.7 |
| Comuna 19 | 147 | 10.7 |
| Comuna 17 | 115 | 8.3 |
| Comuna 22 | 100 | 7.2 |
Resumen del mapa Los ciclistas llegan sobre todo a la Comuna 2 y la Comuna 3, seguidas de la 19. Es decir, muchas personas usan la bicicleta para ir hacia el centro y el norte, donde están sus lugares de trabajo o estudio.
mapa_comunas(comunas2$destino_moto, "Llegadas en moto", "Oranges")
knitr::kable(top5(comunas2$destino_moto), row.names = FALSE)
| Comuna | Viajes | Porcentaje |
|---|---|---|
| Comuna 2 | 2177 | 17.1 |
| Comuna 3 | 1734 | 13.6 |
| Comuna 19 | 1421 | 11.2 |
| Comuna 17 | 927 | 7.3 |
| Comuna 22 | 911 | 7.2 |
Resumen del mapa Las motos llegan principalmente a la Comuna 2, la 3 y la 19. Igual que con el total de viajes, los destinos se concentran en el eje centro - norte de la ciudad.
mapa_comunas(comunas2$destino_auto, "Llegadas en automóvil", "Purples")
knitr::kable(top5(comunas2$destino_auto), row.names = FALSE)
| Comuna | Viajes | Porcentaje |
|---|---|---|
| Comuna 2 | 2006 | 17.8 |
| Comuna 3 | 1557 | 13.8 |
| Comuna 19 | 1302 | 11.5 |
| Comuna 17 | 959 | 8.5 |
| Comuna 4 | 757 | 6.7 |
Resumen del mapa Los carros también llegan mayormente a la Comuna 2 y la 3, luego a la 19 y la 17. Aparece además la Comuna 4 dentro de los cinco primeros destinos, algo que no pasa con los otros vehículos.