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 requeridas

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")

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")

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")

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=origen3
# 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        122
## 2         2 108      1  Comuna 1     626         234              32         32
## 3         3 109      3  Comuna 3    1610         679              84         84
## 4         4 110     19 Comuna 19    2241         923             113        113
## 5         5 103     15 Comuna 15     974         377              55         55
## 6         6 104     17 Comuna 17    1762         662             103        103
## 7         7 105     18 Comuna 18    1208         433              85         85
## 8         8 106     22 Comuna 22     985         424              52         52
## 9         9  89      6  Comuna 6     797         314              29         29
## 10       10  90      4  Comuna 4    1193         443              58         58
## 11       11  91      5  Comuna 5     521         185              28         28
## 12       12  92      7  Comuna 7     583         229              30         30
## 13       13  93      8  Comuna 8     862         319              46         46
## 14       14  94      9  Comuna 9     737         295              36         36
## 15       15  95     21 Comuna 21     693         272              35         35
## 16       16  96     13 Comuna 13    1031         412              62         62
## 17       17  97     12 Comuna 12     257          88              10         10
## 18       18  98     14 Comuna 14     575         236              32         32
## 19       19  99     11 Comuna 11     717         268              42         42
## 20       20 100     10 Comuna 10    1094         404              71         71
## 21       21 101     20 Comuna 20     599         228              33         33
## 22       22 102     16 Comuna 16     836         320              65         65

Ahora se realiza el mapa.

spplot(mapacomunas,"origenmoto", main = "Comunas Origen para viajes en moto")

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        122
## 2         2 108      1  Comuna 1     626         234              32         32
## 3         3 109      3  Comuna 3    1610         679              84         84
## 4         4 110     19 Comuna 19    2241         923             113        113
## 5         5 103     15 Comuna 15     974         377              55         55
## 6         6 104     17 Comuna 17    1762         662             103        103
## 7         7 105     18 Comuna 18    1208         433              85         85
## 8         8 106     22 Comuna 22     985         424              52         52
## 9         9  89      6  Comuna 6     797         314              29         29
## 10       10  90      4  Comuna 4    1193         443              58         58
## 11       11  91      5  Comuna 5     521         185              28         28
## 12       12  92      7  Comuna 7     583         229              30         30
## 13       13  93      8  Comuna 8     862         319              46         46
## 14       14  94      9  Comuna 9     737         295              36         36
## 15       15  95     21 Comuna 21     693         272              35         35
## 16       16  96     13 Comuna 13    1031         412              62         62
## 17       17  97     12 Comuna 12     257          88              10         10
## 18       18  98     14 Comuna 14     575         236              32         32
## 19       19  99     11 Comuna 11     717         268              42         42
## 20       20 100     10 Comuna 10    1094         404              71         71
## 21       21 101     20 Comuna 20     599         228              33         33
## 22       22 102     16 Comuna 16     836         320              65         65
##    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")

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_origen)

# 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        122
## 2         2 108      1  Comuna 1     626         234              32         32
## 3         3 109      3  Comuna 3    1610         679              84         84
## 4         4 110     19 Comuna 19    2241         923             113        113
## 5         5 103     15 Comuna 15     974         377              55         55
## 6         6 104     17 Comuna 17    1762         662             103        103
## 7         7 105     18 Comuna 18    1208         433              85         85
## 8         8 106     22 Comuna 22     985         424              52         52
## 9         9  89      6  Comuna 6     797         314              29         29
## 10       10  90      4  Comuna 4    1193         443              58         58
## 11       11  91      5  Comuna 5     521         185              28         28
## 12       12  92      7  Comuna 7     583         229              30         30
## 13       13  93      8  Comuna 8     862         319              46         46
## 14       14  94      9  Comuna 9     737         295              36         36
## 15       15  95     21 Comuna 21     693         272              35         35
## 16       16  96     13 Comuna 13    1031         412              62         62
## 17       17  97     12 Comuna 12     257          88              10         10
## 18       18  98     14 Comuna 14     575         236              32         32
## 19       19  99     11 Comuna 11     717         268              42         42
## 20       20 100     10 Comuna 10    1094         404              71         71
## 21       21 101     20 Comuna 20     599         228              33         33
## 22       22 102     16 Comuna 16     836         320              65         65
##    destino1 destinocarro
## 1      3773          860
## 2       187          234
## 3      2887          679
## 4      2441          923
## 5       481          377
## 6      1616          662
## 7       526          433
## 8      1561          424
## 9       570          314
## 10     1497          443
## 11      440          185
## 12      598          229
## 13      830          319
## 14     1055          295
## 15      434          272
## 16      560          412
## 17      207           88
## 18      316          236
## 19      483          268
## 20      741          404
## 21      303          228
## 22      645          320

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")

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_origen)

# 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        122
## 2         2 108      1  Comuna 1     626         234              32         32
## 3         3 109      3  Comuna 3    1610         679              84         84
## 4         4 110     19 Comuna 19    2241         923             113        113
## 5         5 103     15 Comuna 15     974         377              55         55
## 6         6 104     17 Comuna 17    1762         662             103        103
## 7         7 105     18 Comuna 18    1208         433              85         85
## 8         8 106     22 Comuna 22     985         424              52         52
## 9         9  89      6  Comuna 6     797         314              29         29
## 10       10  90      4  Comuna 4    1193         443              58         58
## 11       11  91      5  Comuna 5     521         185              28         28
## 12       12  92      7  Comuna 7     583         229              30         30
## 13       13  93      8  Comuna 8     862         319              46         46
## 14       14  94      9  Comuna 9     737         295              36         36
## 15       15  95     21 Comuna 21     693         272              35         35
## 16       16  96     13 Comuna 13    1031         412              62         62
## 17       17  97     12 Comuna 12     257          88              10         10
## 18       18  98     14 Comuna 14     575         236              32         32
## 19       19  99     11 Comuna 11     717         268              42         42
## 20       20 100     10 Comuna 10    1094         404              71         71
## 21       21 101     20 Comuna 20     599         228              33         33
## 22       22 102     16 Comuna 16     836         320              65         65
##    destino1 destinocarro destinomoto
## 1      3773          860        1063
## 2       187          234         296
## 3      2887          679         702
## 4      2441          923         995
## 5       481          377         455
## 6      1616          662         853
## 7       526          433         593
## 8      1561          424         430
## 9       570          314         377
## 10     1497          443         571
## 11      440          185         260
## 12      598          229         272
## 13      830          319         421
## 14     1055          295         317
## 15      434          272         323
## 16      560          412         453
## 17      207           88         133
## 18      316          236         258
## 19      483          268         339
## 20      741          404         535
## 21      303          228         278
## 22      645          320         383

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")

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_origen)

# 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        122
## 2         2 108      1  Comuna 1     626         234              32         32
## 3         3 109      3  Comuna 3    1610         679              84         84
## 4         4 110     19 Comuna 19    2241         923             113        113
## 5         5 103     15 Comuna 15     974         377              55         55
## 6         6 104     17 Comuna 17    1762         662             103        103
## 7         7 105     18 Comuna 18    1208         433              85         85
## 8         8 106     22 Comuna 22     985         424              52         52
## 9         9  89      6  Comuna 6     797         314              29         29
## 10       10  90      4  Comuna 4    1193         443              58         58
## 11       11  91      5  Comuna 5     521         185              28         28
## 12       12  92      7  Comuna 7     583         229              30         30
## 13       13  93      8  Comuna 8     862         319              46         46
## 14       14  94      9  Comuna 9     737         295              36         36
## 15       15  95     21 Comuna 21     693         272              35         35
## 16       16  96     13 Comuna 13    1031         412              62         62
## 17       17  97     12 Comuna 12     257          88              10         10
## 18       18  98     14 Comuna 14     575         236              32         32
## 19       19  99     11 Comuna 11     717         268              42         42
## 20       20 100     10 Comuna 10    1094         404              71         71
## 21       21 101     20 Comuna 20     599         228              33         33
## 22       22 102     16 Comuna 16     836         320              65         65
##    destino1 destinocarro destinomoto destinobicicleta
## 1      3773          860        1063              122
## 2       187          234         296               32
## 3      2887          679         702               84
## 4      2441          923         995              113
## 5       481          377         455               55
## 6      1616          662         853              103
## 7       526          433         593               85
## 8      1561          424         430               52
## 9       570          314         377               29
## 10     1497          443         571               58
## 11      440          185         260               28
## 12      598          229         272               30
## 13      830          319         421               46
## 14     1055          295         317               36
## 15      434          272         323               35
## 16      560          412         453               62
## 17      207           88         133               10
## 18      316          236         258               32
## 19      483          268         339               42
## 20      741          404         535               71
## 21      303          228         278               33
## 22      645          320         383               65

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")