Una compañía costarricense dedicada a la distribución de productos de consumo masivo, brindó la información detallada de las importaciones realizadas durante el año 2019. Para la cual se desea realizar un análisis estadístico sobre los siguientes aspectos:
A continuación se muestra una tabla con los datos que serán utilizados en el análisis de este documento:
importaciones<-read.csv("Importaciones2019.csv")
importaciones
Para poder realizar el análisis descriptivo de estos datos, primero se hizo una agrupación de los datos originales por número de importación, sumarizando la cantidad de productos en cada una de ellas.
A continuación se muestra el resultado:A continuación, se muestra un resumen de las principales medidas de tendencia central y de posición de las cantidades de productos importados durante 2019:
summary(Productos.Importados)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.00 6.00 18.00 25.28 27.00 91.00
No existe en R una función ya predefinida para calcular la moda, por lo cual se calculó de la siguiente forma:
moda <- function(x) {
uniqv <- unique(x)
pmoda<- which.max(tabulate(match(x, uniqv)))
modaX<-uniqv[pmoda]
return(modaX)
}
moda(Productos.Importados)
## [1] 1
A continuación, podemos ver un gráfico donde se representa la distribución de frecuencias de las cantidades de productos importados por cada importación realizada en el año 2019, además se está marcando la posición de las medidas de tendencia central:
tabla<-table(Productos.Importados)
plot(tabla,
main = "Productos Importados en 2019",
xlab = "Cantidad de Productos",
ylab = "Frecuencia",
type = "o",
col = "blue")
abline(v=mean(Productos.Importados), col = "red", lwd = 2)
abline(v=median(Productos.Importados), col = "green", lwd = 2)
abline(v=moda(Productos.Importados), col = "darkorange", lwd = 2)
legend("topright",
c("media", "mediana", "moda"), fill = c("red", "green", "darkorange"))
La desviación estándar y la varianza son medidas que nos indican qué tan dispersos o alejados están los datos entre sí, respecto a la media. Para la misma data analizada, se obtuvieron los siguientes resultados de varianza y desviación estándar respectivamente:
varianza.productos <- var(Productos.Importados)
desvest.productos <- sd(Productos.Importados)
\(\sigma^2(X)=700.887234\)
\(\sigma(X)=26.4742749\).
Para conocer la forma en la curva de datos, existen dos medidas. La curtosis, que indica qué tan plana o alta es la curva, es decir qué tan pegados o separados de la media están los datos, y por otro lado la asimetría, que indica si los datos están acumulados al centro o tienen un sesgo hacia la izquierda o a la derecha.
La curtosis para nuestra muestra de datos, nos da un resultado mayor a 3, lo cual indica que es “platicurtica” o que los datos no es´tan tan pegados a la media, tal como hemos podido ver en la gráfica anterior.
curtosis <- function(x) {
media <- mean(x)
desvest <- sd(x)
curtosis <- (sum(((x-media)^4)/(desvest^4)))*(1/(NROW(x)))
return(curtosis)
}
curtosis.productos <- curtosis(Productos.Importados)
\(g_{2}(X)=3.3666706\).
Por otro lado, el coeficiente de asimetría es mayor a cero, lo cual indica que la curva está sesgada hacia la derecha, es decir, que la moda se encuentra a la izquierda de la media, tal como se observa en la gráfica de distribución de frecuencias presentada anteriormente.
asimetria <- function(x) {
modaX <- moda(x)
media <- mean(x)
desvest <- sd(x)
asimX <- (media - modaX)/desvest
return(asimX)
}
asim.productos <- asimetria(resumen$Productos)
\(g(X)=0.9169881\)
El segundo problema consiste en hacer el análisis descriptivo de los costos unitarios de los distintos productos importados durante el año 2019. Como dentro de la data contamos con la información de las unidades importadas de cada producto y el costo total, simplemente realizamos una división para obtener dicho dato. De la siguiente forma:
costos.importaciones <- importaciones$VALOR.CIF/importaciones$UNIDADES
A la data ya extraída del dataset principal, le aplicamos las funciones siguientes para obtener los resultados de las media, mediana, moda, así como los cuartiles 1 y 3:
summary(costos.importaciones)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0018 0.6546 0.9634 2.0558 1.6516 1841.1333
moda(costos.importaciones)
## [1] 0.42
Como podemos ver, la media está en 2.05 y tanto la mediana como la moda son menores, lo cual sugiere que la curva de la data está sesgada a la derecha.
También vemos algo interesante, y es que la distancia entre la media y el valor máximo es mucho más grande que la distancia entre la media y el valor mínimo. Lo mismo suecede, entre el tercer cuartil que representa el 75% de los datos y el valor máximo. Esto nos puede sugerir que existen datos atípicos que pueden estar afectando las medidas de tendencia y pueden generarnos problemas.
Sigamos analizando, y es que las medidas de dispersión nos daran un mejor panoramal de si existe o no datos atípicos. Como podemos ver en este caso en particular, la desviación estándar es de 32.72, lo cual dista mucho del valor de la media que es de 2.06. Esto nos quiere decir que existen unos pocos datos a la derecha de la media que están muy distantes y que pueden estar afectando las medidas de la curva.
varianza.costos <- var(costos.importaciones)
desvest.costos <- sd(costos.importaciones)
\(\sigma^2(costos) = 1070.2894192\)
\(\sigma(costos) = 32.7152781\)
Al analizar de forma gráfica los datos, podemos observar claramente esos datos atípicos y qué tan alejados están de todo el conjunto de datos.
Como podemos ver en la gráfica de cajas, hay 4 datos atípicos y dos de ellos son los que más alejados están del resto de datos. Esto hace que probablemente tengamos que revisar a qué corresponde esos datos y si realmente nos sirve tenerlos en la data, ya que están afectando mis medidas y por ende mi análisis.
Con el objetivo de indentificar estos datos atípicos, creamos un subset de la data original, extrayendo ciertas columnas que nos pueden dar mayor información de dichos elementos.
Para conocer cuales son esos datos, a continuación filtramos los datos cuyo valor (en este caso el costo unitario) es mayor a la desviación estándar.
Este es el resultado que nos arroja:
df.costos <- importaciones[ ,c(3,4,16,20,24)]
costos.u <- importaciones$VALOR.CIF/importaciones$UNIDADES
df.costos <- data.frame(df.costos, cu = costos.u)
df.costos[df.costos$cu > sd(costos.u), ]
Como podemos observar en la gráfica, estos datos tienen valor mucho más grandes que la media, que el tercer cuartil y bastante más grandes incluso que la desviación estándar. Principalmente dos de ellos, que tienen valores de 630 y 1841, que por cierto, este último es el valor del límite máximo de los datos de acuerdo a las estadísticas que vimos antes.
Revisando la descripción de estos productos, podemos darnos cuenta que realmente no son productos que típicamente importe la compañía, y que nos interesan poco o casi nada para el análisis que estamos haciendo. Por esta razón, decidimos sacarlos del análisis.
Al eliminar estos datos de nuestro arreglo analizado, podemos darnos cuenta como nuestras medidas de tendencia central y de posición cambian drásticamente.
A continuación vemos dichos resultados, en donde podemos ver ahora que el valor máximo es de 14.7 y la media es ahora un poco más baja de lo que era anteriorlmente.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00175 0.65418 0.96293 1.24656 1.64667 14.70400
## [1] 0.42
Por otro lado, en las medidas de dispersión también vemos un cambio radical, en el cual podemos darnos cuenta que ahora la desviación estándar es de 0.99, que comparado con la media es un valor bastante cercano.
var.costos.norm <- var(costos.import.norm)
desv.costos.norm <- sd(costos.import.norm)
\(\sigma^2 = 0.9918646\)
\(\sigma = 0.995924\)
Al generar nuevamente las gráficas, podemos ver que ya los datos no están exageradamente dispersos, y que si hay datos atípicos, realmente estos no están tan alejados de la media, ni del conjunto de datos en sí.
Para este caso, la asimetría es mayor a 0, lo cual indica que los datos tienen un sesgo hacia la derecha, y por otro lado, la curtosis mayor a 3, nos sugiere que la forma de esta curva es leptocúrtica, lo cual indica que la mayoría de los datos están muy cercanos a la media, como podemos ver en la gráfica anterior, en donde los cuartiles 1 y 3 están muy pegados a la media.
asimetria.costos <- asimetria(costos.import.norm)
curtosis.costos <- curtosis(costos.import.norm)
\(g = 0.8299414\)
\(g_{2} = 31.7078405\)
Dentro de este análisis, se pretende conocer la cantidad de productos diferentes importados en cada ocasión por la compañía.
Como podemos ver en la información generada, la cantidad va desde 1 hasta 91 productos o SKU’s diferentes en cada importación realizada.
La media, dista mucho de ese límite máximo, ya que está en un promedio de 25 SKU’s en cada importación, mientras que el 75% de las importaciones no contiene más de 27 SKU’s diferentes. Es decir que rara vez, una importación supera este límite.
La desviación estándar tiene un valor de 26. Lo cual nos sugiere que el 98% de las importaiciones realizadas no contenía más de 77 SKU’s diferentes.
La moda, que es de 1, nos sugiere que la mayoría de importaciones hechas en el año, solo contenían 1 SKU. Esto podría ser un punto de análisis más profundo, ya que una posible causa podría ser una planificación inadecuada en la compra de mercancías, por lo cual tengan que estar realizando frecuentemente importaciones adicionales con un solo producto.
El promedio del costo unitario de los productos importados es de $0.96 y el 75% de estos no es mayor a $1.65. Lo cual nos indica que la mayoría de productos tienen un costo relativamente bajo.
Lo anterior, nos lo confirman las medidas de forma, ya que como podemos ver, el coeficiente de asimetría es de 0.83, casi tiene un valor de 1, lo cual indica que existe un sesgo hacia la derecha, y por su parte una curtosis de 31.7 nos dice que la mayoría de datos está muy cercano a la media.
Aún cuando existen costos que se salen de estos valores, estos no van más allá de los $15 que es el límite superior. Esto lo podemos comprobar fácilmente en las gráficas presentadas en la parte del análisis.
Las medidas nos pueden sugerir, que los costos de los productos importados han sido bien manejados para ser lo suficientemente bajos y con esto generar mayo rentabilidad a la compañía. Aunque este análisis podría mejorarse, teniendo información de los precios de mercado de dichos productos, para poder hacer una comparativa razonable, sin embargo, tomando en cuenta el tipo de productos que se analiza, se puede decir que es un costo bastante bajo.
En Costa Rica, la autoridad aduanera selecciona de forma aleatoria algunas importaciones para ser inspeccionadas con mayor minuciosidad y verificar la veracidad de la información declarada por los importadores.
Las importaciones son identificadas con un color verde cuando pueden ser liberadas inmediatamente sin inspección. El semáforo amarillo indica que será una inspección documental y el semáforo rojo indica una inspección física.
Como es lógico, las inspecciones físicas son las más largas y tediosas y los importadores quisieran evitar en la mayor medida posible los semáforos rojos ya que esto se traduce en retrasos en el retiro de la mercancía y en su traslado a las bodegas.
Por lo tanto, para esta situación en particular, la compañía necesita saber cual es la probabilidad de que en un lapso de tiempo o en cierta cantidad de importaciones, una o varias de ellas salgan con semáforo rojo y por lo tanto, deban ser sometidas a un procedimiento de inspección física.
Dentro de los datos obtenidos, se conoce el tipo de semáforo que tuvo cada una de las 141 importaciones realizadas durante el año 2019.
Por lo tanto, extraemos de la data un arreglo que nos indique el tipo de semáforo obtenido para cada importación, el cual graficándolo se visualiza de la siguiente forma:
Semaforos <- resumen$TIPO.LEVANTE
Frec.Semaforos<-table(Semaforos)
Tabla.Semaforos<-data.frame(table(Semaforos))
colnames(Tabla.Semaforos) <- c("Semaforo", "Frecuencia")
Tabla.Semaforos
barplot(Frec.Semaforos,
main = "Distribucion de Frecuencias Semaforos",
xlab = "Semaforo",
ylab = "Frecuencia",
col = c("Yellow", "Red", "Green"),
space = rep(0,3))
Como podemos ver en la tabla, de las 141 importaciones, solamente 5 han salido con semáforo rojo, 1 en amarillo y 135 con semáforo verde.
Para poder analizar mejor la información, con el fin de realizar un análisis probabilístico, vamos a hacer un conteo de cuantas importaciones han salido con semáforo rojo y cuantes no.
Asignamos una variable aleatoria a los datos, colocando un “1” cuando salga un semáforo rojo y un “0” cuando no, obteniendo los siguientes resultados:
## [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [38] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
## [75] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
## [112] 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0
Graficando el arreglo de datos obtenido, este se ve de la siguiente forma:
Frec.Rojos<-table(Semaforos.bimonial)
barplot(Frec.Rojos,
main = "Distribucion Evento Semaforos Rojos",
xlab = "Evento",
ylab = "Frecuencia",
col = c("Green", "Red"),
space = rep(0,2))
El evento 0 representa las veces que no salió un semáforo rojo y el evento 1 las veces que sí. Esto quiere decir que de la data presentada en la primera gráfica, los semáforos amarillos se cuentan en el evento 0 junto con los verdes.
Utilizando la función “descdist” podemos graficar la siguiente interpetación llamada “Gráfica de Cullen & Frey” en la que podemos identificar cual es la forma de distribución que se ajusta más a nuestros datos.
En este caso, los datos son discretos, puesto que la variable aleatoria únicamente asigna los valores enteros 0 y 1 a los distintos eventos.
descdist(Semaforos.bimonial, discrete = T, method = "sample", boot = 10)
## summary statistics
## ------
## min: 0 max: 1
## median: 0
## mean: 0.03546099
## sample sd: 0.1849419
## sample skewness: 5.023621
## sample kurtosis: 26.23676
Como podemos observar en la gráfica, de acuerdo a los parámetros de asimetría y curtosis de nuestros datos, la obervación se ve clasificada en la línea de una distribución de Poisson.
Para terminar de comprobar esto, ponemos el experimento a la luz de las características que distinguen a una distribución de Poisson:
Para este caso en particular, nuestra variable aleatoria cuenta el número de semaforos rojos que aparecen durante un período de tiempo o bien dentro de un volumen de importaciones.
La probabilidad de que salga un semáforo rojo va a depender tanto de la cantidad de importaciones, como del período de tiempo que se analice. Mientras más importaciones se tomen, más probable es que salga un semáforo rojo.
Por último, los intervalos analizados, en este caso puede ser un intervalo de 1 año o un intervalo de 100 importaciones, estos no se superponen y son independientes.
Por lo anterior, se puede comprobar que realmente los datos corresponden a una distribución de Poisson.
Para determinar la PMF de este evento, analizaremos la probabilidad de que salgan de 0 a 20 semáforos rojos en un intervalo de 100 importaciones.
La probabilidad será la proporción de semáforos rojos obtenidos de la data con respecto al total de datos, esto es:
\(p(x) = 0.03546\)
Los demás parámetros necesarios para el caso de una distribución de Poisson, en este caso serán:
\(n = 100\)
\(x = 1, 2, \dots, 100\)
\(\lambda = np = 3.5461\)
Dado lo anterior, los valores de la PMF serían:
n.semaforos <- 100
p.semaforos <- (sum(Semaforos.bimonial == 1)) / (NROW(Semaforos.bimonial))
lambda.semaforos <- n.semaforos*p.semaforos
x.semaforos <- 0:20
pdf.semaforos <- dpois(x.semaforos, lambda.semaforos)
pdf.semaforos
## [1] 2.883690e-02 1.022585e-01 1.813094e-01 2.143138e-01 1.899945e-01
## [6] 1.347479e-01 7.963821e-02 4.034357e-02 1.788279e-02 7.046016e-03
## [11] 2.498587e-03 8.054762e-04 2.380249e-04 6.492769e-05 1.644572e-05
## [16] 3.887876e-06 8.616747e-07 1.797402e-07 3.540982e-08 6.608775e-09
## [21] 1.171769e-09
Graficando lo anterior tenemos:
barplot(pdf.semaforos,
main = "PMF Semaforos rojos en 100 importaciones",
xlab = "Semaforos rojos",
ylab = "Masa de Probabilidad",
col = rainbow(10),
space = rep(0, 21),
names.arg = x.semaforos)
lines(x=x.semaforos+0.5, y=pdf.semaforos, col = "blue", lwd = 2)
En la gráfica podemos observar, que lo más probable es que en un intervalo de 100 importaciones nos salgan 3 semáforos, y que es muy poco probable que salgan más de 6 semáforos en este intervalo.
Los valores y la gráfica de la CDF serían los siguientes:
cdf.semaforos <- ppois(x.semaforos, lambda.semaforos)
cdf.semaforos
## [1] 0.0288369 0.1310954 0.3124049 0.5267186 0.7167131 0.8514610 0.9310992
## [8] 0.9714428 0.9893255 0.9963716 0.9988702 0.9996756 0.9999137 0.9999786
## [15] 0.9999950 0.9999989 0.9999998 1.0000000 1.0000000 1.0000000 1.0000000
plot(x.semaforos, cdf.semaforos,
main = "CDF Semaforos rojos en 100 importaciones",
xlab = "Semaforos rojos",
ylab = "Masa de Probabilidad",
col = "blue",
type="b",
lwd=2,
pch=16)
abline(v=qpois(0.25, lambda.semaforos), col="red") # P_25
abline(v=qpois(0.5, lambda.semaforos), col="green")# P_50
abline(v=qpois(0.75, lambda.semaforos), col="blue")# P_75
En la gráfica se señalan los percentiles 25, 50 y 75
data.psemaforos <- data.frame(x = x.semaforos, px = pdf.semaforos, Fx = cdf.semaforos)
data.psemaforos
A manera de comprobación calculamos el valor esperado y la varianza de la distribución, lo cual conocemos que debe ser igual a \(\lambda\)
valor_esperado <- function(df) {
x <- df[ , 1]
px <- df[ , 2]
ve <- sum(x*px)
return(ve)
}
varianza <- function(df) {
x <- df[ , 1]
px <- df[ , 2]
ve <- sum(x*px)
varX <- sum(((x-ve)^2)*px)
return(varX)
}
VE.semaforos <- valor_esperado(data.psemaforos)
VA.semaforos <- varianza(data.psemaforos)
\(E(x) = 3.5460993\)
\(\sigma^2 = 3.5460992\)
En el análisis de la cantidad de SKU’s incluidos en cada importación, se encontró que un gran número de importaciones, se hace con solamente un SKU. Esto nos sugiere que puede existir una mala planificación en la compra de mercadería y que puede que se haga necesario realizar muchas importaciones de productos específicos, lo cual puede impactar negativamente los costos de importación y por ende el costo final de los productos vendidos y con ello el margen de utilidad de la compañía Sería acertado, hacer un análisis más profundo en donde se revisen exclusivamente estas importaciones con un solo producto y se comparen contra la demanda del mismo y las veces que se han visto cortos de stock de los mismos.
La mayoría de los costos unitarios de los productos importados está dentro de un rango relativamente bajo para el tipo de productos que se compran. La mayor parte de los productos tiene un costo de compra por debajo de los $1.65. Esto puede sugerirnos un manejo adecuado en los costos de importación de los productos. Esto podría considerarse un buen indicador sobre el cual se pueda mantener un seguimiento para mantener y generar un impacto positivo en el margen de utilidad. Por otro lado, sería acertado realizar un análisis comparativo contra los precios de mercado de estos productos para determinar si realmente estos costos son competitivos.
Del análisis de probabilidad se concluyó que para un intervalo de 100 importaciones, la cantidad de semáforos más probable que puede salir es de 3, y que hay un 85% de probabilidad de que la cantidad de semáforos no sea mayor a 5 en ese mismo intervalo. Por lo tanto, la cantidad de revisiones físicas que se pudieran dar en aduanas es bastante baja como para no preocuparse por un impacto negativo en los tiempos de desaduanaje o entrega de la mercadería importada.