A caption
En este documento me internaré en el mundo de las geo-estadísticas y datos de geo-localización para explorar patrones y agregar al estudio inicial componentes mapa que facilitan la visualización de variables relacionadas con los países de destino y las regiones de origen.
En la data inicial no había información geo-referencial respecto a estas unidades de estudio pero dado que estaba el nombre del país y de la región con cierta exactitud (ambos con errores que dificultaron el proceso de cruce de bases de datos), procedí en ese entonces a interactuar con mapas vectoriales e información de geo-localización, extrayendo la información de latititudes y longitudes de estas variables.
Para ello fue necesario traducir los nombres de los países al ingles.En el intento descubí que practicamente no existen alternativas gratuitas de API para traducir directamente al inglés, por tanto fue necesario buscar una base de datos que, con el mayor rigor posible, tenga el par idioma ingles-idioma español para la mayor cantidad de países posibles. Esto resultó en la traducción de 159 de los 218 países (aunque algunos no lo son, hay varios nombres de referencia y algunos con la categoría “Otros”).
Una vez traducido el nombre de los países al ingles, el resto es sencillo, simplemente hacer un join con los datos de latitud y longitud de fuentes externas que contengan el trío ingles-lat-long. Inicialmente lo realicé con algunos documentos de arcgis, pero el resultado no fue muy satisfactorio, y en cambio procedí luego a interactuar con el paquete de r rnaturalearth que contiene esta y otra información bastante interesante para los países, además de los mapas del mundo, que permiten visualizar las relaciones.
Para los puntos de latitud y longitud de las regiones, procedí a utilizar los datos del INE, almacenados vía arcgis.
library(tidyverse)
library(data.table)
library(sf)
library(rnaturalearth)
library(geosphere)
library(stringdist)
library(zeallot)
library(scales)
library(wesanderson)
library(viridis)#Latitud y Longitud de Regiones
Descarga de la data de region y procesamiento de los datos
# Lectura de la data
set.seed(1)
archivo <- tempfile()
archivo2 <- tempfile()
download.file("https://opendata.arcgis.com/datasets/fe8486f7695543e590ebe4ce9b45d665_0.zip", archivo)
unzip(zipfile = archivo, exdir = archivo2)
shpfile <- list.files(archivo2, pattern = ".shp$",full.names=TRUE)
archi <- st_read(shpfile)## Reading layer `41b0b5cc-7cf2-42cb-847a-2e32646d10772020330-1-egsigr.tmgwi' from data source `C:\Users\YO\AppData\Local\Temp\RtmpWodRpL\file17d87201560c\41b0b5cc-7cf2-42cb-847a-2e32646d10772020330-1-egsigr.tmgwi.shp' using driver `ESRI Shapefile'
## Simple feature collection with 16 features and 20 fields
## geometry type: MULTIPOLYGON
## dimension: XY
## bbox: xmin: -109.4549 ymin: -89 xmax: -54.96938 ymax: -17.49778
## epsg (SRID): 4326
## proj4string: +proj=longlat +datum=WGS84 +no_defs
tabla <- data.table(archi)
archi_geom <- st_geometry(archi)
# Procesamiento de los datos
centroides <- st_centroid(archi_geom)
mat_cent <- sapply(1:length(centroides), function(x) as.numeric(centroides[x][[1]]))
tabla_regiones <- data.frame(regiones = archi[[3]] ,lon_region = t(mat_cent)[,1], lat_region = t(mat_cent)[,2])
head(tabla_regiones)## regiones lon_region lat_region
## 1 REGIÓN DE ANTOFAGASTA -69.11914 -23.53599
## 2 REGIÓN DE ARICA Y PARINACOTA -69.62854 -18.49693
## 3 REGIÓN DE ATACAMA -69.91014 -27.39528
## 4 REGIÓN DE AYSÉN DEL GENERAL CARLOS IBÁÑEZ DEL CAMPO -73.25708 -46.41652
## 5 REGIÓN DE COQUIMBO -70.86069 -30.61903
## 6 REGIÓN DE LA ARAUCANÍA -72.27425 -38.64915
Mismo proceso se realiza para países (donde es vital que se realice este proceso, particularmente en países europeos que son más pequeños e importante consumidores de mercadería chilena)
vectort1 <- st_geometry(world_map)
centroides2 <- st_centroid(vectort1)
mat_cent2 <- sapply(1:length(centroides2), function(x) as.numeric(centroides2[x][[1]]))
tabla_paises <- data.frame(regiones = world_map[,'geounit'][[1]] ,lon = t(mat_cent2)[,1], lat = t(mat_cent2)[,2])
head(tabla_paises)## regiones lon lat
## 1 Afghanistan 66.08669 33.85640
## 2 Angola 17.47057 -12.24587
## 3 Albania 20.03243 41.14135
## 4 United Arab Emirates 54.20671 23.86863
## 5 Argentina -65.17536 -35.44682
## 6 Armenia 45.00029 40.21661
datos <- fread("archivo1_.csv")
datos <- na.omit(datos)
datos <- datos[!glosa_regionorigen=="MERCANCÍAS EXTRANJERAS NACIONALIZADAS",]Lamentablamente, de la data original, es necesario borrar mas de 360 mil registros, dado que pertenecen a la categoría “Mercadería Extranjera Nacionalizada”, que no tiene obviamente punto geo-referencial válido (sin saber su procedencia).
Un análisis mas minucioso de imputación de valores implicaría estudiar cuales son los origenes mas sensatos de asignar a cada mercadería nacionalizada (a partir de donde, con mayor probabilidad, ocurrió la nacionalización del producto por ejemplo).
Tal véz modelos probabilísticos, o regresiones o algoritmos de clasificación para el proceso de imputación de valor. La clasificación podría ser: - Separar los datos entre grupos de entrenamiento (toda la data menos la nacionalizada) y “testeo” (la nacionalizada) - Entrenar el modelo con todas las variables menos la de región de origen. - “Testear” el modelo con la data nacionalizada, y según donde clasifica a la data, generar la asignación.
Tal véz realice este trabajo más adelante…
tabla_resumen <- unique(datos[, 'ingles'])
a <- tabla_resumen[[1]] %in% tabla_paises[,1]
intento <- sapply(tabla_resumen, "[", !a)
distancias <- sapply(intento, function(x) sapply(tabla_paises[,1], function(y) stringdist(x, y)))
rownames(distancias) <- tabla_paises[,1]
vector_prov <- c()
vector_prov <- sapply(1:ncol(distancias), function(x) rownames(distancias)[which(distancias[,x] == min(distancias[,x]))])
matriz <- cbind(intento, candidato = vector_prov)De los 121 países traducidos al ingles (que quedaron de los 158 luego de que se borraran los datos de mercadería nacionalizada), hay 14 (contenidos en el vector “intento”) que no tienen igualdad en la tabla de paises con sus respectivos centroides trabajada previamente.
Por tanto, se genera una función que calcula las “distancias de palabra(character)” entre cada uno de estos 14 países y los 177 países contenidos en la tabla de paises. Esta distancia quiere decir a cuantas letras se encuentra una palabra de otra. Por ejemplo “arbol” se encuentra a 5 letras de “boltis” o lo que es lo mismo, hay 5 letras que estan en solo una de las palabras (la letra “a” esta solo en “arbol” y no en “boltis”).
## ingles candidato
## [1,] "Argentine" "Argentina"
## [2,] "United States" "United Kingdom"
## [3,] "Singapore" "Hungary"
## [4,] "Viet Nam" "Vietnam"
## [5,] "Barbados" Character,10
## [6,] "Antigua and Barbuda" "Trinidad and Tobago"
## [7,] "Dominica" "Romania"
## [8,] "Grenada" "Canada"
## [9,] "Seychelles" Character,5
## [10,] "Mauritius" "Mauritania"
## [11,] "Malta" "Mali"
## [12,] "Bahrain" Character,8
## [13,] "Maldives" Character,2
De los 14, se identifica que solo existen 3 en la tabla paises, y se procede a corregir manual (USA esta como “United States of America”, que esta a gran distancia de letras de “United States”).
Por ser poco satisfactorios los resultados, se procede a utilizar una segunda fuente de información para realizar los respectivos cruces.
temp <- tempfile()
temp2 <- tempfile()
download.file("https://opendata.arcgis.com/datasets/a21fdb46d23e4ef896f31475217cbb08_1.zip",temp)
unzip(zipfile = temp, exdir = temp2)
shpfile2 <- list.files(temp2, pattern = ".shp$",full.names=TRUE)
archi2 <- st_read(shpfile2)## Reading layer `99bfd9e7-bb42-4728-87b5-07f8c8ac631c2020328-1-1vef4ev.lu5nk' from data source `C:\Users\YO\AppData\Local\Temp\RtmpWodRpL\file17d82cc1ab7\99bfd9e7-bb42-4728-87b5-07f8c8ac631c2020328-1-1vef4ev.lu5nk.shp' using driver `ESRI Shapefile'
## Simple feature collection with 251 features and 2 fields
## geometry type: MULTIPOLYGON
## dimension: XY
## bbox: xmin: -180 ymin: -90 xmax: 180 ymax: 83.6236
## epsg (SRID): 4326
## proj4string: +proj=longlat +datum=WGS84 +no_defs
tabla2 <- data.table(archi2)
archi_geom2 <- st_geometry(archi2)
centroides2. <- st_centroid(archi_geom2)
mat_cent2. <- sapply(1:length(centroides2.), function(x) as.numeric(centroides2.[x][[1]]))
tabla_paises. <- data.frame(regiones = tabla2[,2][[1]] ,lon_pais = t(mat_cent2.)[,1], lat_pais = t(mat_cent2.)[,2])a. <- tabla_resumen[[1]] %in% tabla_paises.[,1]
intento. <- sapply(tabla_resumen, "[", !a.)
intento.## ingles
## [1,] "Argentine"
## [2,] "Viet Nam"
En este caso, solo 2 países quedan fuera del cruce, que son correcciones necesarias por error de traducción. Se corrige manual
datos[datos$ingles == 'Argentine', 'ingles'] <- 'Argentina'
datos[datos$ingles == 'Viet Nam','ingles'] <- 'Vietnam'Para los primeros mapas se
#La data dividida en si es de aereopuerto o marítimo o terrestre. Se comenzará estudiando vía transporte aereopuerto
tipo_puerto <- split(datos, datos$tipo_puerto_embarque)
contenedor <- list()
#Valor promedio, peso promedio y numero de exportaciones para cada par región de origen-país de destino
for (i in 1:length(tipo_puerto)){
contenedor[[i]] <- tipo_puerto[[i]][,.(valor_x = mean(as.numeric(valor)),
peso_x = mean(as.numeric(peso)), .N),
by =.(ingles, glosa_regionorigen)]
}
#Hacer los match entre region de origen como esta en la bbdd y como aparece en la data externa descargada (hay importantes diferencias)
regiones_datos <- unique(datos$glosa_regionorigen)
datos1.1 <- as.character(tabla_regiones[,1])
intento2.1 <- ifelse(nchar(datos1.1 > 21),
paste0(substring(datos1.1, 1, 21)),
datos1.1)
regiones_d <- ifelse(nchar(regiones_datos > 21),
paste0(substring(regiones_datos, 1, 21)),
regiones_datos)
equi <- data.frame(regiones_datos,
sapply(data.frame(intento2.1),"[",
amatch(regiones_d, intento2.1, maxDist = 5))) %>%
na.omit()
equi <- left_join(equi, data.frame(intento2.1, datos1.1),
by = c('intento2.1' = 'intento2.1'))[,c(1,3)] %>%
rbind(., c(regiones_datos[2], datos1.1[4]),
c(regiones_datos[8], datos1.1[12]),
c(regiones_datos[11], datos1.1[13]))
n_agrupado <- left_join(equi,
tabla_regiones,
by = c("datos1.1" = "regiones"))
# Joins para agregar todos los valores de latitud y longitud para las exportaciones vía aereopuerto
a_aereopuerto <- left_join(contenedor[[1]], tabla_paises., by = c("ingles" = "regiones"))
a_aereopuerto <- left_join(a_aereopuerto, n_agrupado, by = c("glosa_regionorigen" = "regiones_datos"))
a_aereopuerto$datos1.1 <- c()
head(a_aereopuerto)## ingles glosa_regionorigen valor_x peso_x N lon_pais lat_pais
## 1: Peru REGIÓN DE LOS LAGOS 32395.18 4160.509 823 -74.37549 -9.16382
## 2: Argentina REGIÓN DE LOS LAGOS 20772.15 1965.780 129 -65.16768 -35.37618
## 3: Uruguay REGIÓN DE LOS LAGOS 32422.62 3681.742 710 -56.01240 -32.79965
## 4: Brazil REGIÓN DE LOS LAGOS 80375.05 14309.816 1027 -53.09009 -10.77302
## 5: China REGIÓN DE LOS LAGOS 524821.15 97726.873 974 103.83420 36.56310
## 6: South Korea REGIÓN DE LOS LAGOS 28153.89 1449.003 231 127.83479 36.37508
## lon_region lat_region
## 1: -72.89418 -42.04281
## 2: -72.89418 -42.04281
## 3: -72.89418 -42.04281
## 4: -72.89418 -42.04281
## 5: -72.89418 -42.04281
## 6: -72.89418 -42.04281
El resto del trabajo se basa en el muy buen trabajo desarrollado por el usuario Juan Mayorga en el siguiente blog: Acá
Este trabajo es de lo poco que encontré buscando ideas para generar mapas que muestren conexiones origen-destino, en mapas que enseñen información -en lugar de solo buscar impresionar con elementos visuales.
sf1 <- a_aereopuerto %>%
dplyr::select(lon_region ,lat_region, lon_pais, lat_pais) %>%
purrr::transpose() %>%
purrr::map(~ matrix(flatten_dbl(.), nrow = 2, byrow = TRUE)) %>%
purrr::map(st_linestring) %>%
st_sfc(crs = 4326) %>%
st_sf(geometry = .)%>%
bind_cols(a_aereopuerto) %>%
dplyr::select(everything(), geometry)sf1 <- sf1 %>%
st_segmentize(units::set_units(100, km))
sf1 <- sf1 %>%
st_wrap_dateline(options = c("WRAPDATELINE=YES", "DATELINEOFFSET=180"), quiet = TRUE) %>%
sf::st_sf(crs = 4326)
c(sf1$line_id, sf1$coords) %<-% (
st_coordinates(st_cast(sf1,"MULTILINESTRING")$geometry) %>%
as.data.frame() %>%
rename(subline_id = L1) %>%
nest(-L2)
)
paths <- sf1 %>%
sf::st_set_geometry(NULL) %>%
unnest() %>%
mutate_at(vars(X,Y), round,2)estimate_distance_traveled <- function(start_lon, start_lat, current_lon, current_lat){
start_coords <- c(start_lon, start_lat)
current_coords <- c(current_lon, current_lat)
geosphere::distHaversine(current_coords,start_coords)
}La idea de los mapas es mostrar la relación país de destino-región de origen, de un modo visual que permite estudiar cientos de relaciones país-región para un grupo de variables en un solo elemento visual (cosa muy dificil con otro tipo de gráfico).
Construí estos mapas de tal manera que se puede estudiar las siguientes variables para cada par país-región:
El mapa en sí tiene cumple un propósito bastante útil: Uno puede observar el esfuerzo que lleva el tranporte de cargas a cada destino. Como ejemplo, supóngase que se observa el siguiente escenario en cierto mapa:
La interpretación de esto es que se esta utilizando un gran esfuerzo para llevar la carga a este destino, y como resultado de esto un bajo monto monetario. Esto es, la rentabilidad es muy pequeña, dado que se están usando muchos recursos en llevar esta pesada carga a este lejano destino(rojo de la línea), y el ingreso monetario asociado a este esfuerzo es bajo (reflejado en el círculo de poco grosor). Y este esfuerzo se esta llevando a cabo con mucha frecuencia (reflejado en el círclo de gran perímetro), por tanto es poco eficiente, y probablemente el costo oportunidad de este esfuerzo muy alto.
Notar que no se deben comparar estas variables entre los gráficos. Si las exportaciones desde cierta región de origen tienen cierta característica como por ejemplo un círculo de cierto tamaño asociado a cierto destino, y otra región hacia ese mismo destino tiene un círculo del mismo tamaño, esto no quiere decir que el número de exportaciones hacia ese destino sea el mismo desde ambas regiones.
Es decir, cada dimension(por ejemplo el grosor del círculo) debe ser observada en cada mapa tomando en referencia solo lo que se exportó desde la región a la que hace referencia el mapa. (cada mapa representa una región señalada en el títutlo)
Es observable que:
Naturalmente, por vía terrestre la mayoría de las exportaciones van dirigidas a destinos de América del Sur. También hay poco movimiento, pero de alto valor medio, hacia USA. (Exportaciones por vía terrestre hacia destinos imposible de llegar por este vía es recurrente. Probablemente se deba a que llegan a cierto punto y luego por una segunda vía llegan a destino).
Los destinos mas atractivos son Brasil y Argentina, y se observa mucho movimiento hacia Bolivia y Perú.
Como en la grán mayoría (sino la totalidad) de las regiones, es por vía marítima por la cual hay mayor movimiento. Los destinos mas atractivos por esta vía son los países Europeos, donde se observa alto valor medio en Italia, España, Austria, Dinamarca, un poco menos Inglaterra, y tanto Bélgica como Holanda y Alemania se solapan, por tanto resulta un poco complejo distinguirlos. (Que es algo común en estos mapas, y la mayor debilidad de ellos. Al trabajar sobre centroides, y habiendo países muy pequeños, se dificulta la capacidad de distinguir con precisión a que país corresponde cada centroide. Pero, por otra parte, tampoco es la idea central del mapa el distinguir con exactitud cada punto, sino observar la distribución de las exportaciones desde un punto de vista geo-especial, a partir de un grupo de variables de interés).
El mayor esfuerzo de transporte se lleva a cabo cuando el destino es China y en segunda instancia Japón. Hacia China también hay alto valor medio. Además de América y Europa, también se puede observar bastante movimiento en Sudáfrica y Australia.
A caption
Se observa que:
El país mas atractivo es Canada. con valor medio significativamente superior al resto (recordar que cada variable se construye a partir del peso relativo que tiene cada destino en cierta dimensón. En este caso, en la dimensión valor (visible a partir del grosor del círculo), (y a excepción de en cierto grado el destino Puerto Rico) todos los destinos salvo Canadá tienen un valor relativamente bajo, y Canadá bastante alto -y bastante rentable, considerando el ratio valorUS$/peso(kg).
Se logra observar mayoría de movimiento en Europa, y bastante movimiento hacia China, USA y Francia, además de España. El mayor esfuerzo (peso-distancia) es hacia USA, luego China, Japón y Hong kong, y finalmente a distintos destinos europeos.
A caption
A caption
Se observa que:
A caption
A caption
Es observable que:
A caption
A caption
La mecancía orginada en la región metropolitana viaja principalmente por vía marítima, y llega a una gran cantidad de países a lo largo de los 5 continentes. Mayoría de valor hacia Europa y Asia (donde destaca China, la India y luego Bangladesh). También bastante valor a Brasil y poco se alcanza a distinguir pero también Argentina.
En cantidad de movimiento principalmente hacia los 3 subcontinentes americanos, Europa y Asia del Este.
A caption
A caption
A caption
A caption