---
title: "Inventario Dataset"
author: "Ricardo R. Palma"
date: "17/1/2022"
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

# Simulación por el Método Montecarlo


Tal como se ha señalado en los textos previos el método Montecarlo es un método fundamentalmente estocástico. Es exactamente lo opuesto a un método deterministico ( o si lo prefieres que se expresa con un modelo matemático).

# Generlidades
La familia de los métodos montecarlo son especialmente interesantes cuando tenemos un modelo matemático determinístico. Sin embargo pueden ser usados aún en casos en los que no tengamos el modelo matemático y esto es la principal ventaja de los métodos estocásticos frente a los determinísticos.
Utilizar Montecarlo es declarar que no tenemos en realidad la más mínima idea de como se relacional las variables del problema y apenas podemos o queremos tener un marco de referencia para ver que riesgo asumimos al decidir. 

En este texto analizaremos tres problemas típicos en los que se puede partir del modelo determínistico matemático y enriqueceremos el análisis con Montecarlo.
La técina es utilizada por gran cantidad de paquetes de software comercial, entre ellos los más notables son Crystal Ball de Oracle y \@Risk de Palizade Software.

Los casos que veremos tienen que ver con el modelo de Wilson para lote económico, análisis del VAN / TIR y Programación por Camino Crítico.
Por una cuestión de practiciad repasaremos el modelo determinístico sólo en el caso del modelo de Wilson y dejamos al lector el repaso de los otros modelos para tener un punto de referencia con el la simulación por el método Montecarlo.





# Flujo de Trabajo

Para trabajar en este método es necesario contar con un dataset (conjunto de datos históricos) o en su defecto con un modelo formal estocástico que nos permita generar ese dataset.

El mecanismo de trabajo práctico implica un enriquecimiento de la información que nos ofrece Montecarlo respecto a métodos como los que nos aporta un modelo formal (determinístico).

A efectos de poder comprender mejor esto que se expresa iniciaremos con el estudio de un modelo determinístico, para luego pasar a tomar ese modelo y someterlo al análisis ampliado del Método Montecarlo.

Seguiremos la secuencia o flujo de trabajo que se detalla:

A- Modelar un diagrama de influencia

B- Obtener Datos Históticos de las Variables

C- Si no es posible armar el dataset buscar en la bibliografía modelos que contemplen las variables

D- Si no es poneible B y/o C Modelar el problema

E- Validar el modelo (alimnetar con datos históricos para obtener valores del presente)

F- Alimentar el **Modelo** con datos del presente y predecir el futuro

G- Simular con **Montecarlo** (alimentar con datos del presente alterados por *ruido* estadístico) y obtener un resultado estadístico

H- Determinar el pronóstico, el nivel de confianza y establecer el riesgo del negocio o problema simulado con Montecarlo

## Diagrama de Influencia

En sí mismo esta técnica ya puede considerarse un modelado del problema. Es un modelado muy simplificado, pero la mayor parte de las veces que se realiza, sobre todo si se hace en una reunión, los resultados pueden ser más que sorprendentes.

En la técnica de simulación por **Dinámica de Sistemas** hay un software desarrollado por el MIT que realiza este tipo de diagrama. El software se llama Ventana Simulator y puede descargarse desde:

[https://vensim.com](https://vensim.com)

![Diagrama de Influencia](influencia.png)



Este diagrama se construye a partir del exágono ROJO en el que se tiene a la variable que se pretende controlar u optimizar.
Dentro de los cuadriláteros hay algunos que representan ***ratios*** o índice de tasas, algunos controlables por la empresa y otros independientes (tal como los impuestos).
Finalmente las elipses representan variables que influyen directa o indirectamente sobre el hexágono y los colores refieren a la categorización de externas (independientes, inciertas, exógenas, o no controlables); e internas (dependientes o en las que es posible influir en parte o sobre las que tenemos certidumbre).


## Modelos determinísticos

Para ofrecer un ejemplo de los pasos del plujo de trabajo abordaremos un caso de gestión de inventarios.

### El Caso de la Freight Forwarder

Un caso de emprendedora exitoso en la región vitı́cola de Mednoza - Argentina está ligado a una egresada de la carrera de ingenierı́a industrial que a comienzos de la década de 1990. Ante la incertidumbre de las crisis económicas decidió, *sin capital alguno*, lanzarse como free lance en el negocio de mover containers con vino a los puertos de Valparaı́so y San Antonio - Chile. En los años 2000 esto se conoció como el negocio de Freight Forwarder en el que todos los activos de trabajo son subcontratado.

Su empresa actuaba como intgradora de servicios entre cada eslabon de la cadena de suministros, entre ellos transportistas, despachantes de aduana, bodegas, navieras y clientes de brokers en el extranjero.

Un factor clave de éxito ( KPI ) era el tamaño de lote óptimo a transportar en cada envı́o. Es bien conocido el modelo de Wilson que data de la década de 1920, pero que hoy resulta casi una garantı́a al fracaso si se utiliza en contextos tan turbulentos como los que nos toca vivir. A pesar de ello el modelo aún se estudia y no es descartado, pues sirve de base para ser mejorado. El modelo tiene tres variables independientes y una dependiente, a saber:

### Variables Independientes

    * Demanda Media Anual D (en Containers por año)

    * Costo de almacenamiento unitario Ca ($ por mes)

    * Costo de emisión o gestión Ce ($ por orden)

### Variable Dependiente

    * Tamaño de Lote Mensual EOQ


La recomendación del Método Montecarlo es salir a buscar en la bibliografía y en los papers modelos determinísticos que vinculen a estas variables. Cuanto más actuales sean los modelos mayor certeza de los resultados obtenidos tendremos.

### Modelo Matemático de Wilson

$$ {EOQ} = \sqrt {(\frac  {2*D * Ce} {Ca} )}$$

<h2>El caso de la Bodega Torrenti operada por el Freight Forwarder</h2>

Esta bodega tiene tres destinos principales de exportación. 

- Estados Unidos demanda 500 TEUs al año
- Brasil demanda 53 TEUs al año
- Cadandá demand 28 TEUs al año

<hr>


- Costo de Almacenamiento U\$D 2.500 

- Costo de Gestión U\$D 750

<h2>Modelado numérico en R-CRAN</h2>


![Diagrama Modelo Base](deterministico.png)

```{r echo=TRUE}
D1 <-500
D2 <-52
D3 <-28

D<- D1+D2+D3

Ca <- 2500
Ce <- 750

EOQ <- sqrt(2*D*Ce/Ca)

EOQ


```

La conclusión final es que la bodega debería enviar **18 containers** por mes para operar en un punto que minimice sus costos logísticos totales.


### Lote Económico resuelto por Montecarlo

Este método no concibe a las variables independientes como fijas, sino que las considera variables aleatorias e introduce Ruido en el modelo matemático.
En esta parte deberíaos analizar el comportamento de cada variable y asociarle una distribución (función paramétrica) de probabilidad. Por sencillez supondremos en este ejemplo que las varaibles siguen una distribución normal.
<br>
En rigor deberíamos estudiar que distribución siguen los datos con los que alimentaremos el modelo.
<bR
R-Cran tiene por defecto definidas las siguientes distribuciones de probabilidad.

- Normal
- Logística
- Uniforme
- Gamma
- Lognormal
- Weibull
- Cauchy
- Exponencial
- Chi-cuadrado
- F
- T-Student.

<br>

Puede explorar el paquete rriskDistributions que le dará una idea más clara.
Generaremos una muestra al azar de 47 valores con media 40 y desvio standard 5

```{r, echo=TRUE}
#    library(rriskDistributions)
#    muestra=rnorm(47,40,5)
#    muestra
#    fit.cont(muestra)
```




<h2>Estocatización de Variables</h2>



- Estados Unidos demanda promedio 500 TEUs al año con una varianza de 90

- Cadandá demanda promedio 28 TEUs con una varianza de 6 al año

- Brasil demanda promedio 93 TEUs al año con una varianza de 8


<hr>



- Costo de Almacenamiento U\$D 2.500 Varianza 1.000

- Costo de Gestión U\$D 750 varianza 250

<h2>Cálculo del EOQ Montecarlo</h2>


```{r, echo=TRUE}
#Genero tres variables aleatorias normales con 
#una cantidad de muestras m igual a tres veces #el tamaño de la media 

m1 <- 500*3
D1 <- rnorm(m1,500,90)
m2 <- 93*3
D2 <- rnorm(m2,93,8)
m3 <- 28*3
D3 <- rnorm(m3,28,6)
D <- c(D1,D2,D3)
# m_d muestras de demanda
m_d <- length(D)

#Generamos las variables aleatorias de costos igual a la cantidad de muestras de demanda que tenemos.

Ca <- rnorm(m_d,2500,1000)

Ce <- rnorm (m_d,750,250)

# Preparo área de graficos 3 filas 1 columna
#par(mfcol=c(1,3))

#Grafico 1
plot(density(D), 
xlab="Demanda TEU", #Change the x-axis label
ylab="Densidad", #y-axis label
main="Muestras de Demanda 5 años")#Main title


#Grafico 2
plot(density(Ca),
xlab="Costo Almacenamiento", #x-axis label
ylab="% eventos registrados", # y label
main="Población Costos Almacenamiento")     


#Grafico 3
plot(density(Ce),
xlab="Costo Gestión Inventario", #x-axis label
ylab="% eventos registrados", # y label
main="Población Costos Emisión")     
     


```


   
     



<h2>Cálculo de muestras de lote Económico EOQ</h2>

En este caso realizaremos las mismas operaciones que antes, pero las variables independientes ahora serán matrices y el resultado será un conjunto de valores con su propia distribución de probabilidades.


```{r, echo=TRUE}
EOQ <- sqrt(2*D*Ce/Ca)
#Media del Lote Económico
mean(EOQ, na.rm=TRUE)
#Varianza del Lote Económico
var(EOQ, na.rm=TRUE)
#Desvio Estandard del Lote Económico
sd(EOQ, na.rm=TRUE)

plot(density(EOQ,na.rm=TRUE))
```

![Modelo Montecarlo](estocastico.png)

Hallaremos los valores máximos y mínimos de las variables dependientes e independientes

```{r}
#Índice Mínimos
which.min(Ca)
which.min(Ce)

which.min(EOQ)

```

Valores Mínimos
```{r}
Ca[which.min(Ca)]
Ce[which.min(Ce)]
EOQ[which.min(EOQ)]
#Máximos
which.max(Ca)
which.max(Ce)
#Atención excuiremos los NA
which.max(EOQ)

```


![Riesgo del Modelo](campana.png)

## Generación de Dataset de Inventario Simulado

Se ha visto como a partir del modelo numérico pudimos hacer el trabajo de simulación. Si tuviésemos datos históricos con solamente calcular los parámetros $\mu$ y $\sigma$ podríamos reporducir el experimento y la simuación
En algunas oportunidades las estadísticas como las de kaggle, CEPAL, Banco Mundial, etc. nos entregan los parámetros para construir el historial. 
Veremos ahora cómo generar el dataset a partir de los parámetros.

Para poder realizar este tipo de simulación es necesario que tengamos un historial de los costos de gestión de un inventario. En este ejercicio estamos pensando en un historial de datos que varios años.
Por caso plantemos un ejemplo que abarca desde 1950 a 2021.

Si el caso es utilizar datos reales, todos los métodos de simulación requieren que se haga un trabajo de tratamiento y depuración de la información. Tendremos que realizar cosas y tomar decisiones que implican:

* a) Remover datos de circunstancias excepcionales o capturados erroneamente.

* b) Revisar los NA

* c) Decidir como se completaran los NA (¿Serán reemplazados por el promedio anual?, ¿Se interpolará?, ¿Se tomará una aproximación basada en el mismo dato de la misma semana del años pasado incrementado por la tendencia?, etc)

* d) Reralizar una actualización a precios constantes si corresponde

* f) Realizar entrevistas y reuniones con expertos para validar

* g) Comparar con datos de cámaras o estaddísticas nacionales
Inicia en 1950, finaliza en Dic 2021

* h) Repasar la consistencia metódica de los datos




## Demanda

Constituiremos el primer dataset que representa la demanda de containers adquiridos por la empresa

```{r}
D1 <- round(rnorm(426,300,30))
D2 <- round(rnorm(426,200,50))
D <- c(D1,D2)
hist(D)
```




Costo de Emisión

```{r}
Ce1 <- rnorm (426,30,4)
Ce2 <- rnorm (426,25,4)
Ce <- c(Ce1,Ce2)
plot(density(Ce))

```


Costo de Almacenamiento

```{r}
Ca1 <- rnorm(426,72,12)
Ca2 <- rnorm(426,95,8)
Ca <- c(Ca1,Ca2)
plot(density(Ca))

```


## Recuperación de datos desde la Web

### Inventario Simulado

Si no deseas generar el datasets, puedes cargarlo con load("Wilson.Rda")

https://themys.sid.uncu.edu.ar/
/rpalma/R-cran/Inventario_Simulado/Wilson.Rda

```{r}
load ("Wilson.Rda")
library(psych)
pairs.panels(Wilson)

```





Lote Económico

```{r}
EOQ <- sqrt(2*D*Ca/Ce)
hist(EOQ)
```
Este método que hemos usado utilizado nos permite crear un dataset semejante al que podríamos obtener si capturamos los datos de la operación de un negocio formal.

Tengamos en cuenta que todos los pasos anteriores no son importantes para el trabajo que vamos a realizar. De hecho la formula del lote económico de Wilson (EOQ) fue creado en 1912. Tiene más de 100 años y en la actualidad , como modelo, garantiza el fracaso en los cotos de gestión de inventario.

*Discutiremos en clase más sobre este tema.*

Guardaremos este archivo y a partir de el realizaremos una simulación por el método Montecarlo.


Grabar Archivo

Guardaremos en archivo en la carpeta que nos indica el comando **getwd()**. Lo haremos utilizando los formatos csv (que ya conocemos) y el formato propio de R-Cran denominado **.Rda**


```{r}
getwd()
Wilson <- cbind(D,Ca,Ce,EOQ)
save (Wilson, file="Wilson.Rda")
write.csv(Wilson,file="Wilson.csv")
```


## Análisis exploratorio


Realizaremos un análisis exploratorio de cada componente del modelo.
Nuestro modelo tiene una variable Dependiente llamada EOQ, que representa la cantidad de contenedores pedidos para satisfacer la demanda. y tres variavles independientes:

* Costo de Almacenamiento *Ca*
* Costo de sostenimiento o gestión del inventario *Ce*
* Demanda anual *D*

### Costo de almacenamiento

```{r}
summary(Ca)
```

Valores máximos y mínimos

```{r}
which.max(Ca)
which.min(Ca)
```

¿Que valor tiene el costo mínimo?

```{r}
Ca[3]
```
¿Qué valores están por arriba del tercer cuanti?

```{r}
which(Ca> 90) 
```
### Histogramas

Evolución de costos de almacenamiento
```{r}

plot(sort(Ca), main ="costos ordenados", type="l")
```


## DataExplorer

DataExplorer simplifica y automatiza el proceso EDA y la generación de informes. El paquete escanea automáticamente cada variable que realiza el perfilado de datos y ofrece varias funciones útiles para generar diferentes gráficos en características discretas y continuas.

Es importante destacar que el paquete permite generar un informe HTML completo sin esfuerzo al invocar la útil función create_report en un conjunto de datos (por ejemplo, create_report(df)). Es posible pasar argumentos adicionales, como una variable de respuesta y, para agregar varios análisis bivariados al informe:

Busca en la carpeta en la que has guardado este archivo.
La biblioteca habrá creado un archivo llamado Reporte.html
Las líneas están comentadas por que este comando no se puede correr dentro de un archivo Marckdown

```{r}
# library(DataExplorer)
# Wilson %>% create_report(output_file = "Report")
```

