library(tidyverse)
library(data.table)
library(ggthemes)
library(stringr)
library(DT)
library(circlize)
library(arules)
library(arulesViz)
library(scales)
library(networkD3)Otra variable interesante de explorar es la del puerto de embarque. Sin embargo, por tener una cardinalidad muy alta, es muy dificil lograr apreciar las relaciones con esta herramienta visual. Lo que se puede hacer es buscar los 10 puertos aleatorios o ordenados por algún atributo (los mas recurrentes), o también los 10 primeros según aparecen en la BBDD o ordenados por alfabeto, etc.
Para esta caso, eligiré simplemente el primer puerto de embarque que aparezca para cada región de origen, y filtrare para evitar repetidos.
datos <- fread('archivo_c.csv')
datos$V1 <- c()
names(datos)[12] <- "tipo_puerto_embarque"
#d2[, .(.N), .(regiones, nombre_aduana)][order(-N)][!duplicated(regiones)] Cual aduana procesa la mayor cantidad de exportaciones en cada región.
#d2[d2$regiones == "Magallanes", regiones := "Araucania"]
#d2[d2$regiones == "Y", regiones := "Magallanes"]
#datos[, .(.N), .(regiones, nombre_aduana)][order(-N)][!duplicated(regiones)] #Para corroborar si regiones es correcto
datos$puerto_desembarque <- ifelse(grepl("NO ESPECIFICADOS", as.character(datos$nombre_puerto_desembarque)),
str_remove(datos$nombre_puerto_desembarque, "NO ESPECIFICADOS") %>%
str_remove(., "OTROS PUERTOS") %>%
str_remove(., " DE") %>%
trimws() %>%
paste0(.,"_"), as.character(datos$nombre_puerto_desembarque)) %>%
str_to_title(.)
datos$glosa_regionorigen <- str_to_title(datos$glosa_regionorigen)
datos$nombre_puerto_embarque <- str_to_title(datos$nombre_puerto_embarque)
var_int <- c('codigo_carga', 'ingles', 'nombre_aduana', 'glosa_regionorigen', 'tipo_puerto_embarque')
estudio_ <- data.table(data.frame(unclass(datos[,..var_int])))
rules <- apriori(estudio_)## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.8 0.1 1 none FALSE TRUE 5 0.1 1
## maxlen target ext
## 10 rules TRUE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 255418
##
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[164 item(s), 2554182 transaction(s)] done [0.77s].
## sorting and recoding items ... [15 item(s)] done [0.06s].
## creating transaction tree ... done [1.09s].
## checking subsets of size 1 2 3 4 done [0.04s].
## writing ... [24 rule(s)] done [0.00s].
## creating S4 object ... done [0.15s].
funcion_arules <- function(regla, tipo = 'support', elementos = 8) {
require(arules)
require(stringr)
require(DT)
top.confidence<- sort(regla, decreasing = TRUE, na.last = NA, by = tipo)
out <-cbind(labels = labels(top.confidence), quality(top.confidence))
corregidos <- gsub("[{]", "", as.character(out$labels)) %>%
gsub("[}]", "", .) %>%
str_split_fixed(., "=>", 2) %>%
cbind(., out[, c(2:6)]) %>%
as.data.table(.)
tabla <- str_split_fixed(corregidos$"1", ",", 4) %>%
as.data.table(.) %>%
lapply(., function(x) str_split_fixed(x, "=", 2)) %>%
do.call(cbind, .) %>%
.[,seq(2,8, by = 2)] %>%
data.table(., corregidos[, -1])
tabla$'2' <- tabla[, 5] %>%
lapply(., function(x) str_split_fixed(x, "=", 2)) %>%
as.data.table() %>%
.[,2]
names(tabla)[5] <- "Lado Izquierdo (lhs)"
DT::datatable(tabla[, c(1:5, 7, 10, 6,8)],
selection = count,
options = list(pageLength = elementos)) %>%
formatPercentage(c('support', 'confidence', 'coverage')) %>%
formatStyle('Lado Izquierdo (lhs)',
backgroundColor = '#bbc9e5') %>%
formatStyle('confidence',
background = styleColorBar(range(tabla$confidence),
'#ff9896'),
backgroundSize = '10% 10%%',
backgroundPosition = 'center') %>%
formatStyle('count',
background = styleColorBar(range(tabla$count),
'#ffbb78'),
backgroundSize = '10% 10%%',
backgroundPosition = 'center') %>%
formatStyle('support',
background = styleColorBar(range(tabla$support),
"#98df8a"),
backgroundSize = '10% 10%%',
backgroundPosition = 'center') %>%
formatStyle('coverage',
background = styleColorBar(range(tabla$coverage),
'#cdcc5d'),
backgroundSize = '10% 10%%',
backgroundPosition = 'center')
}Soporte de un 10%, lo que implica, que la asociación debe haber ocurrido a lo menos 265 mil veces. Esto es 265 mil exportaciones entre 2010 y 2020 en las cuales haya ocurrido cierto tipo de asociación.
Confianza de un 85%. Este es menos exigente pero declara que la regla de asociación tiene que haber ocurrido en un 85% de las veces respecto a la totalidad que comprenden las variables del “Lado Derecho” (rhs). Por ejemplo, en el caso 1, hay un 100% de confianza debido a que el 100% de las exportaciones que salieron por la aduana de Valparaíso embarcaron por puerto marítimo.
plot(rules,"graph",
alpha = 1,
measure = 'support',
shading = "confidence",
control = list(cex = .72))Explorar asociaciones relacionadas a la región de origen. Región de origen como lado derecho (“de tal combinación de categorías, el”x“% se origina en la región”y").
var_int.2.3 <- c('rangoval', 'zona_desembarque', 'glosa_regionorigen', 'tipo_puerto_embarque', 'nombre_pais', 'nombre_puerto_embarque', 'codigo_carga', 'item', 'nombre_aduana', 'puerto_desembarque')
estudio_3.5 <- data.table(data.frame(unclass(datos[,..var_int.2.3])))
rules4.5 <- apriori(estudio_3.5,
parameter = list(support = 0.0001,
confidence = 0.95),
appearance = list(rhs=paste0("glosa_regionorigen=", unique(datos$glosa_regionorigen)),
default="lhs"))## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.95 0.1 1 none FALSE TRUE 5 1e-04 1
## maxlen target ext
## 10 rules TRUE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 255
##
## set item appearances ...[17 item(s)] done [0.00s].
## set transactions ...[463 item(s), 2554182 transaction(s)] done [1.58s].
## sorting and recoding items ... [348 item(s)] done [0.18s].
## creating transaction tree ... done [3.27s].
## checking subsets of size 1 2 3 4 5 6 7 8 9 10 done [2.10s].
## writing ... [8211 rule(s)] done [0.08s].
## creating S4 object ... done [0.34s].
top.confidence.2<- sort(rules4.5, decreasing = TRUE, na.last = NA, by = "confidence")
plot(top.confidence.2[1:20], "graph", alpha = 1,
measure = 'support',
shading = "confidence",
control = list(cex = .72))## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.9 0.1 1 none FALSE TRUE 5 1e-04 1
## maxlen target ext
## 10 rules TRUE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 255
##
## set item appearances ...[17 item(s)] done [0.00s].
## set transactions ...[8207 item(s), 2554182 transaction(s)] done [3.51s].
## sorting and recoding items ... [1787 item(s)] done [0.15s].
## creating transaction tree ... done [3.87s].
## checking subsets of size 1 2 3 4 5 6 7 8 done [1.58s].
## writing ... [8215 rule(s)] done [0.04s].
## creating S4 object ... done [0.57s].
Sirve como técnica para un esfuerzo de decodificar el significado del número del item. Se logra apreciar relación entre números de item y regiones de origen. Como por ejemplo, el 96% de las exportaciones del item 16055300 se originaron en la región de los lagos, que equivale a poco más de 10.000 exportaciones. Además, este item se exporta vía marítima (93.7%) y tiene un código de carga F (94.3%) (Estos últimos % son relativos al total de exportaciones de este item que fueron originados en la región de los lagos).
De modo similar, (en página 2) se puede ver que el item 44091022 esta relacionado con la región del bío bío, desembarque en américa del norte, por vía marítima y código de carga R y destino USA (con % superiores al 90% en combinaciones de estas cateogorías).
Por último, otro ejemplo (página 3) es el item 48109210, que se origina en la región del Maule, código R, por puerto marítimo.
Pero el número de asociaciones es demasiado extenso como para estudiarlos de modo individual (son más de 8000 reglas para grados de confianza superiores al 90%!).
Excluyendo la variable item:
var_int.2.1 <- c('rangoval', 'zona_desembarque', 'glosa_regionorigen', 'tipo_puerto_embarque', 'nombre_pais', 'codigo_carga', 'puerto_desembarque')
estudio_3.2 <- data.table(data.frame(unclass(datos[,..var_int.2.1])))
rules4.2 <- apriori(estudio_3.2,
parameter = list(support = 0.0001,
confidence = 0.65),
appearance = list(rhs=paste0("glosa_regionorigen=", unique(datos$glosa_regionorigen)),
default="lhs"))## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.65 0.1 1 none FALSE TRUE 5 1e-04 1
## maxlen target ext
## 10 rules TRUE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 255
##
## set item appearances ...[17 item(s)] done [0.00s].
## set transactions ...[382 item(s), 2554182 transaction(s)] done [1.09s].
## sorting and recoding items ... [292 item(s)] done [0.10s].
## creating transaction tree ... done [2.77s].
## checking subsets of size 1 2 3 4 5 6 7 done [0.10s].
## writing ... [1958 rule(s)] done [0.01s].
## creating S4 object ... done [0.28s].
plot(top.confidence.1[1:24], "graph", alpha = 1,
measure = 'support',
shading = "confidence",
control = list(cex = .72))plot(top.confidence.1[25:50], "graph", alpha = 1,
measure = 'support',
shading = "confidence",
control = list(cex = .72))Esto obliga a relaciones 1 a 1, del tipo “el x% de lo que se origina en la región y cumple esta condición”
## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.35 0.1 1 none FALSE TRUE 5 1e-04 1
## maxlen target ext
## 10 rules TRUE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 255
##
## set item appearances ...[17 item(s)] done [0.00s].
## set transactions ...[8207 item(s), 2554182 transaction(s)] done [3.38s].
## sorting and recoding items ... [1787 item(s)] done [0.14s].
## creating transaction tree ... done [3.80s].
## checking subsets of size 1 2 done [0.12s].
## writing ... [57 rule(s)] done [0.00s].
## creating S4 object ... done [0.50s].
var_int.2. <- c('rangoval','glosa_regionorigen', 'tipo_puerto_embarque', 'nombre_pais', 'codigo_carga', 'nombre_aduana', 'nombre_puerto_embarque')
estudio_3. <- data.table(data.frame(unclass(datos[,..var_int.2.])))
rules4.32 <- apriori(estudio_3.,
parameter = list(support = 0.0001,
confidence = 0.35),
appearance = list(rhs=paste0("nombre_pais=", unique(datos$nombre_pais)),
default="lhs"))## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.35 0.1 1 none FALSE TRUE 5 1e-04 1
## maxlen target ext
## 10 rules TRUE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 255
##
## set item appearances ...[122 item(s)] done [0.00s].
## set transactions ...[235 item(s), 2554182 transaction(s)] done [0.99s].
## sorting and recoding items ... [186 item(s)] done [0.09s].
## creating transaction tree ... done [2.47s].
## checking subsets of size 1 2 3 4 5 6 7 done [0.08s].
## writing ... [5105 rule(s)] done [0.00s].
## creating S4 object ... done [0.26s].
top.confidence.<- sort(rules4.32, decreasing = TRUE, na.last = NA, by = "confidence")
funcion_arules(rules4.32, tipo = "confidence", elementos = 10)rules4.321 <- apriori(estudio_3.,
parameter = list(support = 0.0001,
confidence = 0.35),
appearance = list(lhs=paste0("nombre_pais=", unique(datos$nombre_pais)),
default="rhs"))## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.35 0.1 1 none FALSE TRUE 5 1e-04 1
## maxlen target ext
## 10 rules TRUE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 255
##
## set item appearances ...[122 item(s)] done [0.00s].
## set transactions ...[235 item(s), 2554182 transaction(s)] done [0.97s].
## sorting and recoding items ... [186 item(s)] done [0.10s].
## creating transaction tree ... done [2.34s].
## checking subsets of size 1 2 done [0.01s].
## writing ... [527 rule(s)] done [0.00s].
## creating S4 object ... done [0.25s].
Se encuentra la asociación del tipo; país-código carga o país-via transporte, principalmente R y puerto marítimo. En países pequeños, hay varios casos donde la totalidad de las exportaciones son de carga R, de via marítima, o ambas.
Destaca en la segunda página Bolivia con el 99% de las exportaciones del tipo R y Dinamarca, Perú, Paraguay, Bélgica y Corea del Sur en las 6 primeras páginas, con porcentajes superiores al 94% de exportaciones que caen en algunas de estas categorías.
var_int.2.31 <- c('rangoval', 'zona_desembarque', 'glosa_regionorigen', 'tipo_puerto_embarque', 'ingles')
estudio_3.6 <- data.table(data.frame(unclass(datos[,..var_int.2.31])))
rules4.6 <- apriori(estudio_3.6,
parameter = list(support = 0.0001,
confidence = 0.45),
appearance = list(rhs=paste0("rangoval=", unique(datos$rangoval)),
default="lhs"))## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.45 0.1 1 none FALSE TRUE 5 1e-04 1
## maxlen target ext
## 10 rules TRUE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 255
##
## set item appearances ...[9 item(s)] done [0.00s].
## set transactions ...[158 item(s), 2554182 transaction(s)] done [0.74s].
## sorting and recoding items ... [136 item(s)] done [0.06s].
## creating transaction tree ... done [2.07s].
## checking subsets of size 1 2 3 4 5 done [0.02s].
## writing ... [1146 rule(s)] done [0.00s].
## creating S4 object ... done [0.22s].
20 reglas con mayor grado de confianza
plot(top.confidence.4[1:20], "graph", alpha = 1,
measure = 'support',
shading = "confidence",
control = list(cex = .72))El desafío es convertir el verboso retorno de arules en una data table legible que permita un procesamiento simple de los datos y el uso apropiado de visualizaciones.
plot(top.confidence.4[1:20], "graph", alpha = 1,
measure = 'support',
shading = "confidence",
control = list(cex = .72))rules4.61 <- apriori(estudio_3.6,
parameter = list(support = 0.0001,
confidence = 0.45),
appearance = list(lhs=paste0("rangoval=", unique(datos$rangoval)),
default="rhs"))## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.45 0.1 1 none FALSE TRUE 5 1e-04 1
## maxlen target ext
## 10 rules TRUE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 255
##
## set item appearances ...[9 item(s)] done [0.00s].
## set transactions ...[158 item(s), 2554182 transaction(s)] done [0.73s].
## sorting and recoding items ... [136 item(s)] done [0.06s].
## creating transaction tree ... done [2.20s].
## checking subsets of size 1 2 done [0.00s].
## writing ... [16 rule(s)] done [0.00s].
## creating S4 object ... done [0.23s].
rules4.61 <- apriori(estudio_3.6,
parameter = list(support = 0.0001,
confidence = 0.2),
appearance = list(lhs=paste0("rangoval=", unique(datos$rangoval)),
default="rhs"))## Apriori
##
## Parameter specification:
## confidence minval smax arem aval originalSupport maxtime support minlen
## 0.2 0.1 1 none FALSE TRUE 5 1e-04 1
## maxlen target ext
## 10 rules TRUE
##
## Algorithmic control:
## filter tree heap memopt load sort verbose
## 0.1 TRUE TRUE FALSE TRUE 2 TRUE
##
## Absolute minimum support count: 255
##
## set item appearances ...[9 item(s)] done [0.00s].
## set transactions ...[158 item(s), 2554182 transaction(s)] done [0.86s].
## sorting and recoding items ... [136 item(s)] done [0.10s].
## creating transaction tree ... done [2.28s].
## checking subsets of size 1 2 done [0.00s].
## writing ... [53 rule(s)] done [0.00s].
## creating S4 object ... done [0.21s].
top.confidence<- sort(rules4.61, decreasing = TRUE, na.last = NA, by = 'confidence')
out <-cbind(labels = labels(top.confidence), quality(top.confidence))
corregidos <- gsub("[{]", "", as.character(out$labels)) %>%
gsub("[}]", "", .) %>%
str_split_fixed(., "=>", 2) %>%
cbind(., out[, c(2:6)]) %>%
as.data.table(.)
tabla <- str_split_fixed(corregidos$"1", ",", 4) %>%
as.data.table(.) %>%
lapply(., function(x) str_split_fixed(x, "=", 2)) %>%
do.call(cbind, .) %>%
.[,seq(2,4, by = 2)] %>%
data.table(., corregidos[, -1])
tabla$V2 <- NULL
tabla$'2' <- tabla[, 2] %>%
lapply(., function(x) str_split_fixed(x, "=", 2)) %>%
as.data.table() %>%
.[,2]
names(tabla)[2] <- "V2"
tabla$contador <- trunc(tabla$confidence*tabla$count)
tabla[V1 == "", ] <- NA
tabla <- na.omit(tabla)
#Nuevo mecanismo que puede utilizar wordcloud/chordiagram/sankey o redespalettes <- ggthemes_data[["tableau"]][["color-palettes"]][["regular"]]
#r <- (reshape2::melt(tabla[,c(1:4,5)], id.vars = "V5") %>%
# .[, .(.N), .(V5, value)])[order(-N)] %>%
# .[str_detect(.$value, ""),]
#Extremos
# extremos <- r[!str_detect(r$V5, "Medio"),][order(V5)]
# color1 <- data.table(colores = palettes$`Tableau 10`[1:3, 2][[1]],
# rangoval = as.character(unique(extremos$V5)))
#21 y 3 variables.
# extremos <- left_join(extremos, color1, by = c("V5" = "rangoval"))Se escoge 10 puertos de embarque para ser representados mediante el diagrama de Sankey. La ventaja es que es un diagrama interactivo, que permite visualizar el monto exacto de las relaciones al sostener el mouse sobre cada línea de conexión.
En este caso se eligen 10 puertos de embarque de modo “aleatorio”. La idea es que se eligen los 10 primeros puertos que tengan el primer registro de una exportación con tramo de valor extremo. Se elige esto sobre lo totalmente aleatorio, dado que exise alta probabilidad de que aparezcan los 10 puertos con mayor N, u otro tipo de ordenamiento que muestre puertos solo con rangos de valor Medio o Relativo, que son los mas frecuentes.
elegidos <- datos[!(str_detect(datos$rangoval, "Medio") | str_detect(datos$rangoval, "Relativamente")),
.(.N), .(nombre_puerto_embarque, regiones)][,1:2][!duplicated(regiones),
unique(nombre_puerto_embarque)]
elegidos## [1] "Aerop. A.m. Benitez" "Valparaíso" "San Vicente"
## [4] "Chungará" "Chacalluta" "Patache"
## [7] "Antofagasta" "Los Libertadores" "San Antonio"
## [10] "Lirquén"
#R.P
#variables_ <- c("cod_tipo_carga_operacionexpo", "tipo_puerto_embarque", "glosa_regionorigen", "nombre_aduana",
# "continente_pais", "estac", "nombre_puerto_embarque")
#contin_table2 <- table(datos$rangoval, datos$tipo_puerto_embarque,
# datos$glosa_regionorigen,datos$zona_geografica_puerto_desembarque,
# datos$cod_tipo_carga_operacionexpo)
# addmargins(contin_table2)
# a2 <- data.frame(prop.table(contin_table2, margin = c(2,3,4)))
# a2$Freq[is.na(a2$Freq)] <- 0
# df_freq <- contin_table2 %>% as.data.frame()
# dummies_freq <- model.matrix(~., data = df_freq[,1:5],
# contrasts.arg = lapply(df_freq[,1:5], contrasts, contrasts=FALSE))# df_arr <- data.table(df_freq[,6], dummies_freq)
# nrow(df_arr[V1 == 0,1])/nrow(df_arr)
#El 80% de los datos tienen 0 observaciones (high sparcity)#El 80% de los datos tienen 0 observaciones (high sparcity)
# ggplot(df_arr[,1], aes(x = V1)) + geom_density(aes(y = ..density..))