Análisis de información geográfica y espacial

Módulo 1-Unidad 1: Caso de la encuesta origen-destino

Á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:

  1. Pasos previos (carga de librerías y archivos)
  2. Preparación y limpieza de los datos
  3. Mapas de origen
  4. Mapas de destino

Pasos previos

El primer paso será cargar las librerías y archivos con los cuales se construirá el caso.

Carga de librerías

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)

Carga del archivo del shape y de datos

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.

Shape de comunas de Cali

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)

Datos

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>, …

Preparación y limpieza de datos

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.

Mapas de origen

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, ...

Origen: Carro, moto y bicicleta

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

Origen: Carros

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.

Origen: 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.

Origen: Moto

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.

Mapas de 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, ...

Destino: carros, motos y bicicletas

#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.

Destino: Carros

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.

Destino: moto

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.

Destino: bicicleta

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.