La idea del presente documento es explorar las relaciones entre las variables categóricas y tramos de valor de las exportaciones. La idea es crear categorías para el valor de exportación, de medio que se puedan caracterizar las exportaciones de cada tramo de valor. Es decir, responder a la pregunta ¿Que debiese esperar encontrar cuando sé que las exportaciones tienen un valor muy alto?, o uno muy bajo, uno medio, etc.
De esta forma, se logra tener una percepción mas aguda respecto a la serie de condiciones, atributos o cualidades que tienen las exportaciones de cada tramo (diferenciable) de valor.
library(logisticPCA)
library(tidyverse)
library(data.table)
library(ggthemes)
library(wordcloud2)
library(stringr)
library(DT)
library(circlize)datos <- fread('archivo1_.csv')
set.seed(101)
muestra2 <- na.omit(datos) %>% .[sample(nrow(.), 18000),]
muestra2$V1 <- c()
#crear rangos de valor
muestra2$rangoval <- ifelse(muestra2$lval <3, "Muy Bajo",
ifelse(muestra2$lval < 6, "Bastante Bajo",
ifelse(muestra2$lval < 8, "Relativamente Bajo",
ifelse(muestra2$lval < 10, "Medio Bajo",
ifelse(muestra2$lval < 12, "Medio",
ifelse(muestra2$lval < 14, "Medio Alto",
ifelse(muestra2$lval <16, "Relativamente Alto",
ifelse(muestra2$lval < 18, "BastanteAlto",
ifelse(muestra2$lval < 20, "Alto","Alto")))))))))
#Variables de interés
variables_ <- c("cod_tipo_carga_operacionexpo", "tipo_puerto_embarque",
"glosa_regionorigen", "nombre_aduana",
"zona_geografica_puerto_desembarque", "nombre_puerto_embarque")
#Dummies para el modelo
muestra_2 <- muestra2[,..variables_]
muestra_2 <- data.frame(unclass(muestra_2))
dummies_2 <- model.matrix(~., data = muestra_2,
contrasts.arg = lapply(muestra_2, contrasts, contrasts=FALSE))
rownames(dummies_2) <- muestra2$rangoval
dummies_2 <- dummies_2[,-1]
valor <- rownames(dummies_2)
#Modelo logístico
logpca_model2 = logisticPCA(dummies_2, k = 2)
logpca_model2## 18000 rows and 91 columns
## Rank 2 solution with m = 4
##
## 34.9% of deviance explained
## 78 iterations to converge
Se crea un modelo de PCA logístico con la intención de estudiar si existen características comunes -reflejadas en los principales componentes del PCA logístico- para estos grupos de valor. Estos componentes se construyen mediante la captura de la escencia o naturaleza de la variabilidad de ciertas variables como el tipo de carga, la vía de transporte, la región de origen, el nombre de aduana, la zona de desembarque y el nombre del puerto de embarque.
Se crea una muestra pequeña por alto costo computacional de este tipo de modelos, cuando las variables tienen una alta cardinalidad -como el caso del nombre del puerto de embarque por ejemplo-. La alta cardinalidad es el número de valores únicos (o categoría que es el término que uso en este documento) que tiene cada variable.
El modelo es capaz de explicar solo 32% de la variabilidad. De todas formas se explorará los resultados obtenidos.
Mº PCA logístico
Además se pueden estudiar los valores probabilísticos que el modelo le asigna a cada exportación estudiando los “fitted values”. Por ejemplo, puedo estudiar los gráficos de densidad asociados a cada categoría de cada variable, a partir del tramo de valor al que pertenece la exportación.
Ejemplo 1
Cada punto de cada gráfico de densidad es una probabilidad asignada por el modelo logístico a una exportación que se encuentra en alguna de estos grupos.
Hallazgo: Una vez que sabemos que las exportaciones tienen un valor medio o medio alto (por ejemplo), la probabilidad de que el tipo de carga sea F es en general mayor a que si la exportación fuese de bajo valor.
Otro ejemplo
A continuación se construye un mecanismo para poder estudiar las desviaciones de lo esperado, a partir de los resultados del modelo de PCA logístico. Lo que interesa encontrar es cuales son las categorías, para cada variable, que se encuentran de modo mas frecuente que el esperable cuando el valor de exportación toma ciertos valores.
Por ejemplo, uno puede encontrar que cuando las exportaciones toman un valor muy alto, la vía de transporte utilizada es por vía marítima con mayor frecuencia que lo esperable (hay cierta correlación entre las variables).
Notar que esta es una simplificación, dado que el modelo evalúa cada variable en combinación con las otras, es decir, evalúo cual es la frecuencia esperable cuando la vía de transporte es marítima (se construye a partir de tablas de contingencia y sus frecuencias) pero además la zona de desembarque es Asia y la aduana es Valparaíso, etc. (así para cada una de las variables).
El procedimiento es el siguiente
Ejemplo de 2 columnas de probabilidades ajustadas, asociadas estas a las columnas código F y código G, además del valor al que pertenece la exportación, utilizada para ajustar el modelo
aver2 <- frame2 %>% group_by(valor) %>% summarise_all(list(mean))
aver2 <- data.table(aver2)
filas2 <- as.character(aver2[[1]])Ejemplo de probabilidades promedio para la categoria “codigo F” para cada tramo de valor. Como señale previamente, se toman todas las probabilidades asociadas a esta categoría agrupando por tramo de valor, y se promedian para ese tramo de valor. En este caso, poco superior al 20% es el promedio de las probabilidades para las exportaciones que tienen valor “Alto” asociadas a la categoría “código F”
Ejemplo de una observación de valor Alto y las probabilidades asignadas por el modelo para la variable codigo del tipo de carga
aver2 <- aver2[,-1]
prom2 <- apply(aver2, 2, function(x) mean(x))
aver2 <- data.table(rbind(data.frame(aver2), unname(prom2)))
row.names(aver2) <- c(filas2, "media")
desviaciones2 <- sapply(1:length(aver2), function(x) aver2[[x]]/unname(prom2)[[x]]) - 1
desviaciones2 <- data.table(desviaciones2[1:9,])
colnames(desviaciones2) <- colnames(aver2)
rownames(desviaciones2) <- filas2
desv2 <- t(desviaciones2)
colnames(desv2) <- filas2
View(desv2)
rowna. <- rownames(desv2)
contenedor. <- rowna.
for (i in 1:length(variables_)) {rowna. <- gsub(variables_[i], "", rowna.)}
rownames(desv2) <- rowna.Lectura: Si la exportación es de tramo de valor “Alto”, la probabilidad de que esta pertenezca a la categoria “codigo F” es 37% superior a la del resto de las categorías (que es el promedio de los códigos: F, G, S, L, R).
Por tanto aca encuentro una métrica (que no es para nada lo mejor, es un estudio de exploración, entendiendo que no es un buen modelo y que la metodología no es exacta) para asociar cada tramo de valor a cada categoría de cada variable, que era el objetivo inicial.
Una vez encontradas las métricas, se diseña un sistema para poder visualizar las relaciones entre las categorías y los tramos de valor de las exportaciones.
# wordcloud2(data.frame(rowna., trunc((unname(desv2[,3])+1)^10)), size = 0.22)
knitr::include_graphics('./Bastante-Alto.png')No encuentra categorías que sean significativamente superiores, a excepción de hasta cierto punto la categoría “Puerto marítimo”. Es algo impreciso, porque los categorías que son bastante superiores a lo esperado (como se verá mas adelante con otro procedimiento mas adecuado que este) son por ejemplo la categoría G y la región de antofagasta (puerto marítimo es correcto). Encuentra cierta asociación con Asia que es correcto, con Europa que es relativamente correcto (es la 2º zona de destino luego de Asia para este grupo de exportaciones).
También hay que notar que trabaja con información muestral, que entrega muy pocos resultados para esta categoría.
#wordcloud2(data.frame(rowna., trunc((unname(desv2[,7])+1)^10)), size = 0.2)
knitr::include_graphics('./MuyBajo-.png')#Opcion 2
datos$rangoval <- ifelse(datos$lval <3, "Muy Bajo",
ifelse(datos$lval < 6, "Bastante Bajo",
ifelse(datos$lval < 8, "Relativamente Bajo",
ifelse(datos$lval < 10, "Medio Bajo",
ifelse(datos$lval < 12, "Medio",
ifelse(datos$lval < 14, "Medio Alto",
ifelse(datos$lval <16, "Relativamente Alto",
ifelse(datos$lval < 18, "Bastante Alto",
ifelse(datos$lval < 20, "Alto", "Alto")))))))))
datos$rangoval <- as.factor(datos$rangoval)
datos <- na.omit(datos)
ac2 <- datos[, .(log(mean(valor)), log(sum(valor))),
.(ingles, tipo_puerto_embarque,
nombre_puerto_desembarque, cod_tipo_carga_operacionexpo,
glosa_regionorigen, zona_geografica_puerto_desembarque,
nombre_puerto_embarque, rangoval)][
order(-V1)]
resultados2 <- apply(ac2[, 1:8], 2, function(x) table(x, ac2$rangoval))
conten <- list()
for(i in 1:length(filas2)){
conten[[i]] <- lapply(resultados2, function(x) data.table(x)[V1 == filas2[i]]) %>%
do.call(rbind, .)
}Objetivo
Se utiliza la herramienta “nube de letras” para visualizar las relaciones entre las variables categóricas y los rangos o tramos de valor de las exportaciones. Se intenta responder la pregunta: Si me enterase de que una determinada exportación tiene cierto tramo de valor (por ejemplo “Alto”), ¿Que atributos o características debiese encontrar en dicha exportación?
Que tipo de carga debiese tener, por cual vía de transporte es mas probable que haya viajado, cuales debiesen ser, con mayor seguridad, las regiones de origen de la mercancía, en que zonas debiese desembarcar, a que destino y por cuales puertos debiese esperar que esta mercancía embarque.
De esta forma, encuentro un mecanismo para relacionar estas categorías, atributos o lugares geográficos con cada tramo de valor.
El tramo Bastante bajo es muy dominante en el grupo, y el tramo Alto lo contrario. De lo que se logra observar, la gran mayoría de las exportaciones bajas son de origen nacionalizado o de la región metropolitana.
Lo bastante alto tiene como origen la región de antofagasta, y luego la de atacama.
Esto análisis es interesante de replicar para zonas geográficas de desembarque, dado que tiene una cardinalidad adecuada para este tipo de elementos visuales.
Estas visualizaciones responden preguntas del tipo:
¿Si me encontrara aleatoriamente con una mercancía del nivel mas alto de valor, con que me debiese encontrar?
#wordcloud2(data.frame(conten[[1]][1:435, c(1,3)]), size = .35)
knitr::include_graphics('./Alto.png')La mercancía viaja por puerto marítimo, es del tipo G o R, va destino a Asia, principalmente China pero también pudiese ser Japón su destino, viaja por el puerto de antofagasta o puerto angamos, principalmente.
A diferencia del sistema anterior, en este hay que tener cuidado de las variables con baja cardinalidad, dado que aparecen con mayor frecuencia en cada uno de los grupos definidos previamente.
Al explorar puerto marítimo
Y los tipos de carga
#wordcloud2(data.frame(conten[[2]][1:435, c(1,3)]), size = .35)
knitr::include_graphics('./BastanteAlto.png')En este caso, el puerto marítimo no debiese ser tan potente
#wordcloud2(data.frame(conten[[8]][1:435, c(1,3)]), size = .5)
knitr::include_graphics('./RelativoAlto.png')excluyendo puerto marítimo
#wordcloud2(data.frame(conten[[5]][1:435, c(1,3)]), size = .5)
knitr::include_graphics('./MedioAlto.png')excluyendo puerto marítimo
#wordcloud2(data.frame(conten[[4]][1:435, c(1,3)]), size = .5)
knitr::include_graphics('./Medio.png')Un buen acompañamiento para esta visualización es el familiar histograma (notar que el wordcloud anterior excluí puerto marítimo dado que ocupa bastante espacio y es muy dominante por su muy alta frecuencia y la baja cardinalidad de la variable. En este gráfico lo incluyo):
#wordcloud2(data.frame(conten[[9]][1:435, c(1,3)]), size = .5)
knitr::include_graphics('./RelativamenteBajo.png')Excluyendo puerto maritimo.