Áreas de la estadística Espacial y conceptos de cartografía
Presentado por: Juan Sebastián Henao Aguirre
A continuación, se presenta el ejercicio de análisis de la encuesta origen destino en Cali. El objetivo de este es construir una serie de mapas sobre origen y destino de las personas en su movimientos en la ciudad. Pero antes de entrar en el caso, se deben preparar y organizar los datos. Por lo que este taller se divide en:
El primer paso será cargar las librerías y archivos con los cuales se construirá el caso.
Estas son las librerías requeridas para hacer el ejercicio:
library(raster)
## Loading required package: sp
library(rgdal)
## Please note that rgdal will be retired during 2023,
## plan transition to sf/stars/terra functions using GDAL and PROJ
## at your earliest convenience.
## See https://r-spatial.org/r/2022/04/12/evolution.html and https://github.com/r-spatial/evolution
## rgdal: version: 1.6-5, (SVN revision 1199)
## Geospatial Data Abstraction Library extensions to R successfully loaded
## Loaded GDAL runtime: GDAL 3.4.2, released 2022/03/08
## Path to GDAL shared files: /Users/juansebastianhenaoaguirre/Library/R/x86_64/4.2/library/rgdal/gdal
## GDAL binary built with GEOS: FALSE
## Loaded PROJ runtime: Rel. 8.2.1, January 1st, 2022, [PJ_VERSION: 821]
## Path to PROJ shared files: /Users/juansebastianhenaoaguirre/Library/R/x86_64/4.2/library/rgdal/proj
## PROJ CDN enabled: FALSE
## Linking to sp version:1.6-0
## To mute warnings of possible GDAL/OSR exportToProj4() degradation,
## use options("rgdal_show_exportToProj4_warnings"="none") before loading sp or rgdal.
library(sp)
library(readxl)
library(ggmap)
## Loading required package: ggplot2
## ℹ Google's Terms of Service: <https://mapsplatform.google.com>
## ℹ Please cite ggmap if you use it! Use `citation("ggmap")` for details.
library(RColorBrewer)
Para el desarrollo de este caso, se requiere de un archivo que contiene la cartografía en archivo .shp y otro que está en .xlsx. Se procede a cargar cada uno de los archivos.
mapacomunas=shapefile("~/Desktop/Casos/cali/Comunas.shp")
mapacomunas
## 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
Se procede a visualizar que se haya cargado correctamente el archivo.
plot(mapacomunas)
Ahora se procede a cargar la base de datos de la encuesta sobre la cual se analizarán los viajes de los habitantes de la ciudad.
require(readxl)
datosod = read_excel("~/Desktop/Casos/EncuestaOrigenDestino.xlsx")
## New names:
## • `MUNICIPIO` -> `MUNICIPIO...7`
## • `DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO /
## DIRECCIÓN` -> `DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA
## / HITO / DIRECCIÓN...8`
## • `MUNICIPIO` -> `MUNICIPIO...11`
## • `DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO /
## DIRECCIÓN` -> `DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA
## / HITO / DIRECCIÓN...12`
## • `OTRO ¿CUÁL?` -> `OTRO ¿CUÁL?...17`
## • `OTRO ¿CUÁL?` -> `OTRO ¿CUÁL?...24`
head(datosod)
## # A tibble: 6 × 28
## FECHA `ID ESTACIÓN` ESTACIÓN ACCESO MOVIMIENTO
## <dttm> <dbl> <chr> <chr> <chr>
## 1 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 2 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 3 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 4 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 5 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 6 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## # ℹ 23 more variables: `Hora de Encuesta` <dttm>, MUNICIPIO...7 <chr>,
## # `DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO / DIRECCIÓN...8` <chr>,
## # `Codigo Origen_SDG` <chr>, `¿QUE ESTABA HACIENDO EN ESE LUGAR?` <dbl>,
## # MUNICIPIO...11 <chr>,
## # `DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO / DIRECCIÓN...12` <chr>,
## # `Codigo Destino_SDG` <chr>, `¿QUE VA HACER A ESE LUGAR?` <dbl>,
## # `ESTRATO EN SU VIVIENDA` <dbl>, …
Para poder obtener los datos para hacer el análisis, es necesario hacer una limpieza de los datos de la encuesta. Para esto se hará una limpieza que incluye la transformación de las comunas a datos numéricos, la limpieza de datos vacíos, la asignación de coordenadas a los datos de la encuesta y filtrar los datos para que se incluyan solo aquellos que son solo dentro de Cali. Este es el primer paso que se realizará.
El primer paso será filtrar los datos para que sean solo los viajes al interior de Cali.
fueracali = which(datosod$`comuna origen`!="Fuera de Cali" & datosod$`comuna destino`!="Fuera de Cali" & datosod$`comuna origen`!="0" & datosod$`comuna destino`!="0")
datoscali=datosod[fueracali,]
head(datoscali)
## # A tibble: 6 × 28
## FECHA `ID ESTACIÓN` ESTACIÓN ACCESO MOVIMIENTO
## <dttm> <dbl> <chr> <chr> <chr>
## 1 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 2 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 3 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 4 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 5 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 6 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## # ℹ 23 more variables: `Hora de Encuesta` <dttm>, MUNICIPIO...7 <chr>,
## # `DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO / DIRECCIÓN...8` <chr>,
## # `Codigo Origen_SDG` <chr>, `¿QUE ESTABA HACIENDO EN ESE LUGAR?` <dbl>,
## # MUNICIPIO...11 <chr>,
## # `DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO / DIRECCIÓN...12` <chr>,
## # `Codigo Destino_SDG` <chr>, `¿QUE VA HACER A ESE LUGAR?` <dbl>,
## # `ESTRATO EN SU VIVIENDA` <dbl>, …
Luego, se procederá a hacer la transformación de los valores de comunas a valores numéricos para poder hacer la función que le asigne las coordenadas.
datoscali$comuna_origen <- as.numeric(datoscali$`comuna origen`)
datoscali$comuna_destino <- as.numeric(datoscali$`comuna destino`)
head(datoscali)
## # A tibble: 6 × 30
## FECHA `ID ESTACIÓN` ESTACIÓN ACCESO MOVIMIENTO
## <dttm> <dbl> <chr> <chr> <chr>
## 1 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 2 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 3 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 4 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 5 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 6 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## # ℹ 25 more variables: `Hora de Encuesta` <dttm>, MUNICIPIO...7 <chr>,
## # `DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO / DIRECCIÓN...8` <chr>,
## # `Codigo Origen_SDG` <chr>, `¿QUE ESTABA HACIENDO EN ESE LUGAR?` <dbl>,
## # MUNICIPIO...11 <chr>,
## # `DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO / DIRECCIÓN...12` <chr>,
## # `Codigo Destino_SDG` <chr>, `¿QUE VA HACER A ESE LUGAR?` <dbl>,
## # `ESTRATO EN SU VIVIENDA` <dbl>, …
Para realizar el cálculo con los datos provenientes de Excel, que no poseen coordenadas y solo se identifican comunas, se asigna la coordenada de la comuna desde el shape file con una pequeña función. Esto se hace para la comuna origen, como para la comuna destino
datoscali$latitud_comuna_origen = as.numeric(apply(datoscali["comuna_origen"], 1, function(x)
{
return(coordinates(mapacomunas)[x,2][1])
}))
datoscali$longitud_comuna_origen = as.numeric(apply(datoscali["comuna_origen"], 1, function(x)
{
return(coordinates(mapacomunas)[x,1][1])
}))
datoscali$latitud_comuna_destino = as.numeric(apply(datoscali["comuna_destino"], 1, function(x)
{
return(coordinates(mapacomunas)[x,2][1])
}))
datoscali$longitud_comuna_destino = as.numeric(apply(datoscali["comuna_destino"], 1, function(x)
{
return(coordinates(mapacomunas)[x,1][1])
}))
head(datoscali)
## # A tibble: 6 × 34
## FECHA `ID ESTACIÓN` ESTACIÓN ACCESO MOVIMIENTO
## <dttm> <dbl> <chr> <chr> <chr>
## 1 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 2 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 3 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 4 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 5 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## 6 2015-06-01 00:00:00 1 Avenida 6N X Calle 70N NORTE MOV 1
## # ℹ 29 more variables: `Hora de Encuesta` <dttm>, MUNICIPIO...7 <chr>,
## # `DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO / DIRECCIÓN...8` <chr>,
## # `Codigo Origen_SDG` <chr>, `¿QUE ESTABA HACIENDO EN ESE LUGAR?` <dbl>,
## # MUNICIPIO...11 <chr>,
## # `DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO / DIRECCIÓN...12` <chr>,
## # `Codigo Destino_SDG` <chr>, `¿QUE VA HACER A ESE LUGAR?` <dbl>,
## # `ESTRATO EN SU VIVIENDA` <dbl>, …
Antes de proceder con los mapas, se hace una verificación de que no tengamos datos nulos en las coordenadas. Para esto se cuenta en cada una de las variables el número de valores nulos.
# Contar los nulos para las 4 variables
nulos_latitud_origen <- sum(is.na(datoscali$latitud_comuna_origen))
nulos_longitud_origen <- sum(is.na(datoscali$longitud_comuna_origen))
nulos_latitud_destino <- sum(is.na(datoscali$latitud_comuna_destino))
nulos_longitud_destino <- sum(is.na(datoscali$longitud_comuna_destino))
# Mostrar los resultados
print("Cantidad de valores nulos en latitud_comuna_origen:")
## [1] "Cantidad de valores nulos en latitud_comuna_origen:"
print(nulos_latitud_origen)
## [1] 0
print("Cantidad de valores nulos en longitud_comuna_origen:")
## [1] "Cantidad de valores nulos en longitud_comuna_origen:"
print(nulos_longitud_origen)
## [1] 0
print("Cantidad de valores nulos en latitud_comuna_destino:")
## [1] "Cantidad de valores nulos en latitud_comuna_destino:"
print(nulos_latitud_destino)
## [1] 0
print("Cantidad de valores nulos en longitud_comuna_destino:")
## [1] "Cantidad de valores nulos en longitud_comuna_destino:"
print(nulos_longitud_destino)
## [1] 0
Con todo correcto, se procede a hacer los filtros para hacer las cartografías.
El primer ejercicio que se hará, es mostrar el mapa por el origen de comuna para quienes realizan viajes en carro, motos y bicicleta. Luego se hará uno para cada medio de transporte:
origentotal=SpatialPointsDataFrame(coords = datoscali[,31:32],
data = datoscali,
proj4string = crs(mapacomunas)
)
origentotal
## class : SpatialPointsDataFrame
## features : 22151
## extent : 862283.3, 877232, 1056762, 1067421 (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 : 34
## names : FECHA, ID ESTACIÓN, ESTACIÓN, ACCESO, MOVIMIENTO, Hora de Encuesta, MUNICIPIO...7, DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO / DIRECCIÓN...8, Codigo Origen_SDG, ¿QUE ESTABA HACIENDO EN ESE LUGAR?, MUNICIPIO...11, DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO / DIRECCIÓN...12, Codigo Destino_SDG, ¿QUE VA HACER A ESE LUGAR?, ESTRATO EN SU VIVIENDA, ...
## min values : 1430697600, 1, Autopista Cali-Jamundí, NORTE, MOV 1, -2209053600, CALI, 1 DE MAYO, 1001, 1, CALI, 1 A N GRANADA, 1001, 1, 1, ...
## max values : 1433808000, 30, Diagonal 15 X Av. Ciudad de Cali, SUR, MOV 4, -2209030260, POPAYAN, ZUPIANO LLOREDA, 914, 77, POPAYAN, ZOOLOGICO OESTE, 914, 77, 6, ...
Sobre estos datos, se realiza la primera intersección a partir de la importancia de la comuna de origen:
#copia del dataframe de origen
origen1=origentotal
# Establecer el CRS de origen1 como el mismo que tiene mapacomunas
crs(origen1) <- crs(mapacomunas)
# Realizar el conteo de registros por comuna
conteo_por_comuna <- table(origen1$comuna_origen)
# nueva variable en mapacomunas y asignar los resultados del conteo
mapacomunas$origen1 <- conteo_por_comuna[match(mapacomunas$comuna, names(conteo_por_comuna))]
mapacomunas$origen1 <- as.numeric(mapacomunas$origen1)
# Mostrar el resultado
head(mapacomunas@data, 25)
## OBJECTID gid comuna nombre origen1
## 1 1 107 2 Comuna 2 2250
## 2 2 108 1 Comuna 1 626
## 3 3 109 3 Comuna 3 1610
## 4 4 110 19 Comuna 19 2241
## 5 5 103 15 Comuna 15 974
## 6 6 104 17 Comuna 17 1762
## 7 7 105 18 Comuna 18 1208
## 8 8 106 22 Comuna 22 985
## 9 9 89 6 Comuna 6 797
## 10 10 90 4 Comuna 4 1193
## 11 11 91 5 Comuna 5 521
## 12 12 92 7 Comuna 7 583
## 13 13 93 8 Comuna 8 862
## 14 14 94 9 Comuna 9 737
## 15 15 95 21 Comuna 21 693
## 16 16 96 13 Comuna 13 1031
## 17 17 97 12 Comuna 12 257
## 18 18 98 14 Comuna 14 575
## 19 19 99 11 Comuna 11 717
## 20 20 100 10 Comuna 10 1094
## 21 21 101 20 Comuna 20 599
## 22 22 102 16 Comuna 16 836
Ahora se procede a hacer el mapa.
# Generamos el mapa utilizando spplot
spplot(mapacomunas,"origen1", cuts = 6, main = "Comunas Origen para viajes en Carro, moto y bicicleta")
Lo que nos muestra este mapa, es que las comunas en donde más se registran el inicio del viaje en moto, carro y bicicleta, están en la comuna 2 (2250 viajes), 19 (2241), 17 (1762), 3 (1610) y 18 (1208). Mostrando una concentración importante en estas comunas. Ahora veamos si este comportamiento se mantiene en los mapas por tipo de vehículo
Ahora sobre estos, se realiza el filtro para carros y se procede al mapa.
carros=which(origentotal@data$`TIPO DE VEHÍCULO`==3)
origen2=origentotal[carros,]
Se realiza la intersección para realizar el mapa
origencarro=origen2
# Establecer el CRS de origen1 como el mismo que tiene mapacomunas
crs(origencarro) <- crs(mapacomunas)
# Realizar el conteo de registros por comuna
conteo_por_comuna2 <- table(origencarro$comuna_origen)
# nueva variable en mapacomunas y asignar los resultados del conteo
mapacomunas$origencarro <- conteo_por_comuna2[match(mapacomunas$comuna, names(conteo_por_comuna2))]
mapacomunas$origencarro <- as.numeric(mapacomunas$origencarro)
# Mostrar el resultado
head(mapacomunas@data, 25)
## OBJECTID gid comuna nombre origen1 origencarro
## 1 1 107 2 Comuna 2 2250 860
## 2 2 108 1 Comuna 1 626 234
## 3 3 109 3 Comuna 3 1610 679
## 4 4 110 19 Comuna 19 2241 923
## 5 5 103 15 Comuna 15 974 377
## 6 6 104 17 Comuna 17 1762 662
## 7 7 105 18 Comuna 18 1208 433
## 8 8 106 22 Comuna 22 985 424
## 9 9 89 6 Comuna 6 797 314
## 10 10 90 4 Comuna 4 1193 443
## 11 11 91 5 Comuna 5 521 185
## 12 12 92 7 Comuna 7 583 229
## 13 13 93 8 Comuna 8 862 319
## 14 14 94 9 Comuna 9 737 295
## 15 15 95 21 Comuna 21 693 272
## 16 16 96 13 Comuna 13 1031 412
## 17 17 97 12 Comuna 12 257 88
## 18 18 98 14 Comuna 14 575 236
## 19 19 99 11 Comuna 11 717 268
## 20 20 100 10 Comuna 10 1094 404
## 21 21 101 20 Comuna 20 599 228
## 22 22 102 16 Comuna 16 836 320
Con esto en mente, se realiza el mapa
spplot(mapacomunas,"origencarro", cuts = 6, main = "Comunas Origen para viajes en Carro")
En este caso, lo que muestra es que las comunas más importantes en viajes de carro son la 19, 2, 3, 17 y 4. Lo cual muestra una coherencia frente al total de viajes, sin embargo, aparece la comuna 4, que no salía en el total. Ahora veremos el caso de la bicicleta.
Ahora , se realiza el filtro para bicicleta .
bicicleta=which(origentotal@data$`TIPO DE VEHÍCULO`==1)
origen3=origentotal[bicicleta,]
Se realiza la intersección
origenbicicleta=origen3
# Establecer el CRS de origen1 como el mismo que tiene mapacomunas
crs(origenbicicleta) <- crs(mapacomunas)
# Realizar el conteo de registros por comuna
conteo_por_comuna3 <- table(origenbicicleta$comuna_origen)
# nueva variable en mapacomunas y asignar los resultados del conteo
mapacomunas$origenbicicleta <- conteo_por_comuna3[match(mapacomunas$comuna, names(conteo_por_comuna3))]
mapacomunas$origenbicicleta <- as.numeric(mapacomunas$origenbicicleta)
# Mostrar el resultado
head(mapacomunas@data, 25)
## OBJECTID gid comuna nombre origen1 origencarro origenbicicleta
## 1 1 107 2 Comuna 2 2250 860 122
## 2 2 108 1 Comuna 1 626 234 32
## 3 3 109 3 Comuna 3 1610 679 84
## 4 4 110 19 Comuna 19 2241 923 113
## 5 5 103 15 Comuna 15 974 377 55
## 6 6 104 17 Comuna 17 1762 662 103
## 7 7 105 18 Comuna 18 1208 433 85
## 8 8 106 22 Comuna 22 985 424 52
## 9 9 89 6 Comuna 6 797 314 29
## 10 10 90 4 Comuna 4 1193 443 58
## 11 11 91 5 Comuna 5 521 185 28
## 12 12 92 7 Comuna 7 583 229 30
## 13 13 93 8 Comuna 8 862 319 46
## 14 14 94 9 Comuna 9 737 295 36
## 15 15 95 21 Comuna 21 693 272 35
## 16 16 96 13 Comuna 13 1031 412 62
## 17 17 97 12 Comuna 12 257 88 10
## 18 18 98 14 Comuna 14 575 236 32
## 19 19 99 11 Comuna 11 717 268 42
## 20 20 100 10 Comuna 10 1094 404 71
## 21 21 101 20 Comuna 20 599 228 33
## 22 22 102 16 Comuna 16 836 320 65
Ahora se crea el mapa
spplot(mapacomunas, "origenbicicleta", main = "Comunas Origen para viajes en bicicleta")
En este caso, las comunas más importantes son la 2, 19, 17, 18 y 3. Como se puede observar, en este caso se ve que son las mismas comunas, pero se evidencia una disminución sustancial en el número de viajes que se realiza con este vehículo versus el carro. Ahora miremos el comportamiento de las motos.
Ahora , se realiza el filtro para moto .
moto=which(origentotal@data$`TIPO DE VEHÍCULO`==2)
origen4=origentotal[moto,]
Se mira ahora para la frecuncia de los viajes:
origenmoto=origen4
# Establecer el CRS de origen1 como el mismo que tiene mapacomunas
crs(origenmoto) <- crs(mapacomunas)
# Realizar el conteo de registros por comuna
conteo_por_comuna4 <- table(origenmoto$comuna_origen)
# nueva variable en mapacomunas y asignar los resultados del conteo
mapacomunas$origenmoto <- conteo_por_comuna4[match(mapacomunas$comuna, names(conteo_por_comuna4))]
mapacomunas$origenmoto <- as.numeric(mapacomunas$origenmoto)
# Mostrar el resultado
head(mapacomunas@data, 25)
## OBJECTID gid comuna nombre origen1 origencarro origenbicicleta origenmoto
## 1 1 107 2 Comuna 2 2250 860 122 1063
## 2 2 108 1 Comuna 1 626 234 32 296
## 3 3 109 3 Comuna 3 1610 679 84 702
## 4 4 110 19 Comuna 19 2241 923 113 995
## 5 5 103 15 Comuna 15 974 377 55 455
## 6 6 104 17 Comuna 17 1762 662 103 853
## 7 7 105 18 Comuna 18 1208 433 85 593
## 8 8 106 22 Comuna 22 985 424 52 430
## 9 9 89 6 Comuna 6 797 314 29 377
## 10 10 90 4 Comuna 4 1193 443 58 571
## 11 11 91 5 Comuna 5 521 185 28 260
## 12 12 92 7 Comuna 7 583 229 30 272
## 13 13 93 8 Comuna 8 862 319 46 421
## 14 14 94 9 Comuna 9 737 295 36 317
## 15 15 95 21 Comuna 21 693 272 35 323
## 16 16 96 13 Comuna 13 1031 412 62 453
## 17 17 97 12 Comuna 12 257 88 10 133
## 18 18 98 14 Comuna 14 575 236 32 258
## 19 19 99 11 Comuna 11 717 268 42 339
## 20 20 100 10 Comuna 10 1094 404 71 535
## 21 21 101 20 Comuna 20 599 228 33 278
## 22 22 102 16 Comuna 16 836 320 65 383
Ahora se realiza el mapa.
spplot(mapacomunas,"origenmoto", main = "Comunas Origen para viajes en moto")
En este caso, se evidencia un aumento en el número de viajes en moto versus los de bicicleta. Incluso, por las escalas y los valores totales, se evidencia que de estos tres medios de transporte, la moto es el más importante. Siendo la comuna 2 (1063), 19 (995), 17 (853), 3 (702) y 18 (593) las que más viajes reportan. Ahora vamos a ver cómo se comportan los datos por el destino.
Para finalizar se realizan los mapas de las comunas de destino dentro. Ya se presentaron los datos por comuna de origen, ahora es por destino y la estructura que se seguirá es igual a la anterior.
destinototal=SpatialPointsDataFrame(coords = datoscali[,33:34],
data = datoscali,
proj4string = crs(mapacomunas)
)
destinototal
## class : SpatialPointsDataFrame
## features : 22151
## extent : 862283.3, 877232, 1056762, 1067421 (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 : 34
## names : FECHA, ID ESTACIÓN, ESTACIÓN, ACCESO, MOVIMIENTO, Hora de Encuesta, MUNICIPIO...7, DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO / DIRECCIÓN...8, Codigo Origen_SDG, ¿QUE ESTABA HACIENDO EN ESE LUGAR?, MUNICIPIO...11, DEPARTAMENTO / LOCALIDAD / COMUNA / DISTRITO / BARRIO / VEREDA / HITO / DIRECCIÓN...12, Codigo Destino_SDG, ¿QUE VA HACER A ESE LUGAR?, ESTRATO EN SU VIVIENDA, ...
## min values : 1430697600, 1, Autopista Cali-Jamundí, NORTE, MOV 1, -2209053600, CALI, 1 DE MAYO, 1001, 1, CALI, 1 A N GRANADA, 1001, 1, 1, ...
## max values : 1433808000, 30, Diagonal 15 X Av. Ciudad de Cali, SUR, MOV 4, -2209030260, POPAYAN, ZUPIANO LLOREDA, 914, 77, POPAYAN, ZOOLOGICO OESTE, 914, 77, 6, ...
#copia del dataframe de origen
destino1=destinototal
# Establecer el CRS de origen1 como el mismo que tiene mapacomunas
crs(destino1) <- crs(mapacomunas)
# Realizar el conteo de registros por comuna
conteo_por_comuna5 <- table(destino1$comuna_destino)
# nueva variable en mapacomunas y asignar los resultados del conteo
mapacomunas$destino1 <- conteo_por_comuna5[match(mapacomunas$comuna, names(conteo_por_comuna5))]
mapacomunas$destino1 <- as.numeric(mapacomunas$destino1)
# Mostrar el resultado
head(mapacomunas@data, 25)
## OBJECTID gid comuna nombre origen1 origencarro origenbicicleta origenmoto
## 1 1 107 2 Comuna 2 2250 860 122 1063
## 2 2 108 1 Comuna 1 626 234 32 296
## 3 3 109 3 Comuna 3 1610 679 84 702
## 4 4 110 19 Comuna 19 2241 923 113 995
## 5 5 103 15 Comuna 15 974 377 55 455
## 6 6 104 17 Comuna 17 1762 662 103 853
## 7 7 105 18 Comuna 18 1208 433 85 593
## 8 8 106 22 Comuna 22 985 424 52 430
## 9 9 89 6 Comuna 6 797 314 29 377
## 10 10 90 4 Comuna 4 1193 443 58 571
## 11 11 91 5 Comuna 5 521 185 28 260
## 12 12 92 7 Comuna 7 583 229 30 272
## 13 13 93 8 Comuna 8 862 319 46 421
## 14 14 94 9 Comuna 9 737 295 36 317
## 15 15 95 21 Comuna 21 693 272 35 323
## 16 16 96 13 Comuna 13 1031 412 62 453
## 17 17 97 12 Comuna 12 257 88 10 133
## 18 18 98 14 Comuna 14 575 236 32 258
## 19 19 99 11 Comuna 11 717 268 42 339
## 20 20 100 10 Comuna 10 1094 404 71 535
## 21 21 101 20 Comuna 20 599 228 33 278
## 22 22 102 16 Comuna 16 836 320 65 383
## destino1
## 1 3773
## 2 187
## 3 2887
## 4 2441
## 5 481
## 6 1616
## 7 526
## 8 1561
## 9 570
## 10 1497
## 11 440
## 12 598
## 13 830
## 14 1055
## 15 434
## 16 560
## 17 207
## 18 316
## 19 483
## 20 741
## 21 303
## 22 645
Para finalizar, se realiza la visualización de un mapa de coropletas
num_colors <- 9
color_paleta <- brewer.pal(num_colors, "OrRd")
# Generamos el mapa utilizando spplot
spplot(mapacomunas,"destino1", col.regions = color_paleta, cuts = 6, main = "Comunas destino para viajes en Carro, moto y bicicleta")
Lo que muestran estos datos, es que las comunas de destino principales para estos tres tipos de vehículos son la comuna 2 (3773), 3 (2887), 19 (2441), 17 (1616) y 22 (1561). Lo cual muestra una coherencia casi exacta entre las principales comunas de origen y destino. Ahora miremos los resultados por tipo de vehículo.
Ahora sobre estos, se realiza el filtro para carros y se procede al mapa.
carros2=which(destinototal@data$'TIPO DE VEHÍCULO'==3)
destino2=destinototal[carros2,]
Se realiza la intersección para realizar el mapa
destinocarro=destino2
# Establecer el CRS de origen1 como el mismo que tiene mapacomunas
crs(destinocarro) <- crs(mapacomunas)
# Realizar el conteo de registros por comuna
conteo_por_comuna6 <- table(destinocarro$comuna_destino)
# nueva variable en mapacomunas y asignar los resultados del conteo
mapacomunas$destinocarro <- conteo_por_comuna6[match(mapacomunas$comuna, names(conteo_por_comuna6))]
mapacomunas$destinocarro <- as.numeric(mapacomunas$destinocarro)
# Mostrar el resultado
head(mapacomunas@data, 25)
## OBJECTID gid comuna nombre origen1 origencarro origenbicicleta origenmoto
## 1 1 107 2 Comuna 2 2250 860 122 1063
## 2 2 108 1 Comuna 1 626 234 32 296
## 3 3 109 3 Comuna 3 1610 679 84 702
## 4 4 110 19 Comuna 19 2241 923 113 995
## 5 5 103 15 Comuna 15 974 377 55 455
## 6 6 104 17 Comuna 17 1762 662 103 853
## 7 7 105 18 Comuna 18 1208 433 85 593
## 8 8 106 22 Comuna 22 985 424 52 430
## 9 9 89 6 Comuna 6 797 314 29 377
## 10 10 90 4 Comuna 4 1193 443 58 571
## 11 11 91 5 Comuna 5 521 185 28 260
## 12 12 92 7 Comuna 7 583 229 30 272
## 13 13 93 8 Comuna 8 862 319 46 421
## 14 14 94 9 Comuna 9 737 295 36 317
## 15 15 95 21 Comuna 21 693 272 35 323
## 16 16 96 13 Comuna 13 1031 412 62 453
## 17 17 97 12 Comuna 12 257 88 10 133
## 18 18 98 14 Comuna 14 575 236 32 258
## 19 19 99 11 Comuna 11 717 268 42 339
## 20 20 100 10 Comuna 10 1094 404 71 535
## 21 21 101 20 Comuna 20 599 228 33 278
## 22 22 102 16 Comuna 16 836 320 65 383
## destino1 destinocarro
## 1 3773 1518
## 2 187 73
## 3 2887 1098
## 4 2441 926
## 5 481 199
## 6 1616 650
## 7 526 216
## 8 1561 564
## 9 570 208
## 10 1497 596
## 11 440 181
## 12 598 224
## 13 830 325
## 14 1055 382
## 15 434 164
## 16 560 189
## 17 207 71
## 18 316 120
## 19 483 204
## 20 741 291
## 21 303 131
## 22 645 275
Con esto, se procede a crear el mapa
# Generamos el mapa utilizando spplot
spplot(mapacomunas,"destinocarro", col.regions = color_paleta, cuts = 6, main = "Comunas destino para viajes en Carro")
Con relación a los destinos de los viajes en carro, se muestra que las comunas con mayor afluencia de viajes de destino siguen siendo las mismas: 2, 3, 19, 17 y 4. Aunque en diferente orden de prioridad. Lo cual muestra una concentración en los viajes hacia y desde estas comunas.
Ahora sobre estos, se realiza el filtro para carros y se procede al mapa.
moto2=which(destinototal@data$'TIPO DE VEHÍCULO'==2)
destino3=destinototal[moto2,]
Se realiza la intersección para realizar el mapa
destinomoto=destino3
# Establecer el CRS de origen1 como el mismo que tiene mapacomunas
crs(destinomoto) <- crs(mapacomunas)
# Realizar el conteo de registros por comuna
conteo_por_comuna7 <- table(destinomoto$comuna_destino)
# nueva variable en mapacomunas y asignar los resultados del conteo
mapacomunas$destinomoto <- conteo_por_comuna7[match(mapacomunas$comuna, names(conteo_por_comuna7))]
mapacomunas$destinomoto <- as.numeric(mapacomunas$destinomoto)
# Mostrar el resultado
head(mapacomunas@data, 25)
## OBJECTID gid comuna nombre origen1 origencarro origenbicicleta origenmoto
## 1 1 107 2 Comuna 2 2250 860 122 1063
## 2 2 108 1 Comuna 1 626 234 32 296
## 3 3 109 3 Comuna 3 1610 679 84 702
## 4 4 110 19 Comuna 19 2241 923 113 995
## 5 5 103 15 Comuna 15 974 377 55 455
## 6 6 104 17 Comuna 17 1762 662 103 853
## 7 7 105 18 Comuna 18 1208 433 85 593
## 8 8 106 22 Comuna 22 985 424 52 430
## 9 9 89 6 Comuna 6 797 314 29 377
## 10 10 90 4 Comuna 4 1193 443 58 571
## 11 11 91 5 Comuna 5 521 185 28 260
## 12 12 92 7 Comuna 7 583 229 30 272
## 13 13 93 8 Comuna 8 862 319 46 421
## 14 14 94 9 Comuna 9 737 295 36 317
## 15 15 95 21 Comuna 21 693 272 35 323
## 16 16 96 13 Comuna 13 1031 412 62 453
## 17 17 97 12 Comuna 12 257 88 10 133
## 18 18 98 14 Comuna 14 575 236 32 258
## 19 19 99 11 Comuna 11 717 268 42 339
## 20 20 100 10 Comuna 10 1094 404 71 535
## 21 21 101 20 Comuna 20 599 228 33 278
## 22 22 102 16 Comuna 16 836 320 65 383
## destino1 destinocarro destinomoto
## 1 3773 1518 1734
## 2 187 73 90
## 3 2887 1098 1333
## 4 2441 926 1152
## 5 481 199 232
## 6 1616 650 744
## 7 526 216 240
## 8 1561 564 766
## 9 570 208 255
## 10 1497 596 678
## 11 440 181 183
## 12 598 224 279
## 13 830 325 382
## 14 1055 382 512
## 15 434 164 202
## 16 560 189 285
## 17 207 71 106
## 18 316 120 150
## 19 483 204 217
## 20 741 291 353
## 21 303 131 124
## 22 645 275 290
Con esto, se crea el mapa
# Generamos el mapa utilizando spplot
spplot(mapacomunas,"destinomoto", col.regions = color_paleta, cuts = 6, main = "Comunas destino para viajes en moto")
Para el caso de las motos, las comunas donde se presentan más viajes de destino son la 2, 3, 19, 22 y 17. Casi las mismas que en los viajes en carro con la excepción de la comuna 22 que aparece en este medio de transporte.
Ahora sobre estos, se realiza el filtro para carros y se procede al mapa.
bicicleta2=which(destinototal@data$'TIPO DE VEHÍCULO'==1)
destino4=destinototal[bicicleta2,]
Se realiza la intersección para realizar el mapa
destinobicicleta=destino4
# Establecer el CRS de origen1 como el mismo que tiene mapacomunas
crs(destinobicicleta) <- crs(mapacomunas)
# Realizar el conteo de registros por comuna
conteo_por_comuna8 <- table(destinobicicleta$comuna_destino)
# nueva variable en mapacomunas y asignar los resultados del conteo
mapacomunas$destinobicicleta <- conteo_por_comuna8[match(mapacomunas$comuna, names(conteo_por_comuna8))]
mapacomunas$destinobicicleta <- as.numeric(mapacomunas$destinobicicleta)
# Mostrar el resultado
head(mapacomunas@data, 25)
## OBJECTID gid comuna nombre origen1 origencarro origenbicicleta origenmoto
## 1 1 107 2 Comuna 2 2250 860 122 1063
## 2 2 108 1 Comuna 1 626 234 32 296
## 3 3 109 3 Comuna 3 1610 679 84 702
## 4 4 110 19 Comuna 19 2241 923 113 995
## 5 5 103 15 Comuna 15 974 377 55 455
## 6 6 104 17 Comuna 17 1762 662 103 853
## 7 7 105 18 Comuna 18 1208 433 85 593
## 8 8 106 22 Comuna 22 985 424 52 430
## 9 9 89 6 Comuna 6 797 314 29 377
## 10 10 90 4 Comuna 4 1193 443 58 571
## 11 11 91 5 Comuna 5 521 185 28 260
## 12 12 92 7 Comuna 7 583 229 30 272
## 13 13 93 8 Comuna 8 862 319 46 421
## 14 14 94 9 Comuna 9 737 295 36 317
## 15 15 95 21 Comuna 21 693 272 35 323
## 16 16 96 13 Comuna 13 1031 412 62 453
## 17 17 97 12 Comuna 12 257 88 10 133
## 18 18 98 14 Comuna 14 575 236 32 258
## 19 19 99 11 Comuna 11 717 268 42 339
## 20 20 100 10 Comuna 10 1094 404 71 535
## 21 21 101 20 Comuna 20 599 228 33 278
## 22 22 102 16 Comuna 16 836 320 65 383
## destino1 destinocarro destinomoto destinobicicleta
## 1 3773 1518 1734 194
## 2 187 73 90 9
## 3 2887 1098 1333 169
## 4 2441 926 1152 131
## 5 481 199 232 17
## 6 1616 650 744 95
## 7 526 216 240 28
## 8 1561 564 766 95
## 9 570 208 255 31
## 10 1497 596 678 80
## 11 440 181 183 38
## 12 598 224 279 36
## 13 830 325 382 46
## 14 1055 382 512 56
## 15 434 164 202 24
## 16 560 189 285 28
## 17 207 71 106 13
## 18 316 120 150 20
## 19 483 204 217 26
## 20 741 291 353 34
## 21 303 131 124 22
## 22 645 275 290 31
Con esto, se crea el mapa
# Generamos el mapa utilizando spplot
spplot(mapacomunas,"destinobicicleta", col.regions = color_paleta, cuts = 6, main = "Comunas destino para viajes en bicicleta")
Para el caso de las bicicletas, las comunas más importantes son la 2, 3, 19, 17 y 22. Mostrando un comportamiento muy similar al de las motos.