Introducción.

A continuación, presentamos algunos conceptos importantes para la verificación y validación de los modelos de simulación, elementos que garantizan que nuestras simulaciones sean las adecuadas para la toma de decisiones. La verificación se centra en confirmar que el modelo se ha implementado correctamente , mientras que la validación busca determinar si el modelo representa adecuadamente el sistema real que se desea estudiar. Además, presentamos aplicaciones de las simulaciones en problemas reales, como los modelos de líneas de espera, que son cruciales en la gestión de servicios y atención al cliente; los sistemas de inventario, donde la optimización del stock puede impactar significativamente en los costos y en la satisfacción del cliente; y los proyectos de inversión, donde la evaluación de diferentes escenarios económicos es vital para la planificación y el éxito financiero.

Modelos Terminales

Los modelos terminales de simulación se caracterizan por un evento que pone fin a la simulación. Un ejemplo sería medir el tiempo necesario para procesar 10 piezas, vender 10000 pc o atender clientes en una cafetería en un período determinado. El análisis estadístico recomendado incluye el uso de intervalos de confianza y la identificación de la distribución de probabilidad de la variable de salida.

  • Intervalo de Confianza para la media \(\mu\)

Debido a la naturaleza aleatoria de los resultados de este tipo de modelos, es necesario determinar su distribución de probabilidad y su intervalo de confianza (IC) en las diferentes réplicas. Un IC del 95% para la media es dado por \[ [\bar{x}-t_{(0.025,n-1)}\times \frac{s}{\sqrt{n}} \quad;\quad \bar{x}+t_{(0.025,n-1)}\times \frac{s}{\sqrt{n}}]\] Si el número de réplica es mayor a 30 podemos reemplazar el valor de la distribución t por la normal z=1.96

Ejemplo: Los resultados de 15 réplicas de la simulación del tiempo (minutos) de atención de cliente en un Call Center fuerón:

replica <- 15
tiempo_atención <- rnorm(replica,12, 3.5)
round(tiempo_atención,1)
##  [1]  5.8 13.6 15.4 12.5  9.2 11.6 10.7 10.4 14.3 14.5 20.0  6.5 12.1 14.2  6.4

Determine el intervalo de confianza con un nivel de aceptación de 95%.

media <- mean(tiempo_atención)
s <- sd(tiempo_atención)
t <- qt(0.025,replica-1,lower.tail=F)
Lim_inf <- media-t*s/sqrt(replica)
lim_sup <- media+t*s/sqrt(replica)
Intervalo <- cbind(Lim_inf,lim_sup)
print(media)
## [1] 11.81624
print(s)
## [1] 3.837619
print(t)
## [1] 2.144787
print(Intervalo)
##       Lim_inf  lim_sup
## [1,] 9.691036 13.94144
  • Prueba de Bondad de ajustes.

Cuando aplicamos un modelo para describir una serie de datos, es crucial verificar si dicho modelo es adecuado y proporciona una buena representación del fenómeno que estamos analizando. En R , encontramos paquetes para realizar bondad de ajustes , entre los cuales encontramos el paquete fitdistrplus , que ajusta distribuciones por los métodos: maximum likelihood estimation (MLE), moment matching estimation (MME), quantile matching estimation (QME) y maximum goodness-of-fit estimation (MGE). Las distribuciones disponibles son: norm, lnorm, exp, pois, cauchy, gamma, logis, nbinom, geom, beta y weibull del paquete stats; invgamma, llogis, invweibull, pareto1 y pareto del paquete actuar.

# Se ajusta una distribución normal a la variable  tiempo_atención
library(fitdistrplus) 
## Warning: package 'fitdistrplus' was built under R version 4.3.3
## Loading required package: MASS
## Loading required package: survival
## Warning: package 'survival' was built under R version 4.3.3
library(stats)
dis_norm <- fitdist(tiempo_atención, distr = "norm") 
dis_exp<-fitdist(tiempo_atención,"exp")
summary(dis_norm)
## Fitting of the distribution ' norm ' by maximum likelihood 
## Parameters : 
##       estimate Std. Error
## mean 11.816239  0.9572703
## sd    3.707492  0.6768921
## Loglikelihood:  -40.93941   AIC:  85.87883   BIC:  87.29493 
## Correlation matrix:
##      mean sd
## mean    1  0
## sd      0  1
comparacion <- gofstat(f = list(dis_norm, dis_exp))
comparacion
## Goodness-of-fit statistics
##                              1-mle-norm 2-mle-exp
## Kolmogorov-Smirnov statistic 0.12571394 0.3904732
## Cramer-von Mises statistic   0.03488997 0.6679728
## Anderson-Darling statistic   0.29979911 3.3030160
## 
## Goodness-of-fit criteria
##                                1-mle-norm 2-mle-exp
## Akaike's Information Criterion   85.87883  106.0842
## Bayesian Information Criterion   87.29493  106.7923

Modelos no terminales

Las simulaciones no terminales o de estado estable no tienen un punto de finalización definido en el tiempo. Por ejemplo, al modelar la cantidad de máquinas necesarias en un sistema de producción que opera continuamente, la simulación continúa hasta que la variable de interés alcance un estado estable. Es importante determinar la longitud de la corrida para garantizar que los resultados del modelo se estabilicen adecuadamente.

Longitud de Corrida

Para que el resultado de una variable aleatoria alcance un estado estable en una simulación no terminal, es fundamental asegurar que la longitud de la réplica, n sea suficientemente grande para que la variación entre réplicas no exceda un margen de exactitud, e, en el \(100(1-\alpha)\%\) de las veces.

Si se asume que los datos siguen una distribución normal, el tamaño de la corrida de la simulación se puede calcular como: \[n=\Big(\frac{\sigma Z_{\alpha/2}}{e}\Big)^2 \] Si se tiene la certeza de normalidad pero se desconoce el valor de la desviación estándar, será necesario realizar una corrida piloto de tamaño \(n^*\) para determinar un estimador de la desviación. En este caso la longitud de la réplica se determina mediante.

\[n=\Big(\frac{s\times t_{(\alpha/2,n^*-1)}}{e}\Big)^2 \] Ejemplo:
Determine la longitud de la réplica para estimar, dentro de un rango de ±1, el valor medio de una variable normal con desviación estándar 3.5 y un nivel de aceptación de 95% (nivel de rechazo de 5%).

\[n=\Big(\frac{3.5\times 1.96}{1}\Big)^2 \approx 48\]

media <- 12
desviacion <- 3.5
longitud <- 100
replicas <- 2

# Simulación
simulaciones <- replicate(replicas, rnorm(longitud, mean = media, sd = desviacion/sqrt(longitud)))

# Gráfico de líneas para la evolución de los valores simulados
matplot(1:longitud, simulaciones, 
        type = "l", 
        lty = 1, 
        main = "Evolución de los valores simulados", 
        xlab = "Índice", 
        ylab = "Valor simulado",
        ylim=c(11,13))

#legend("topright", legend = paste0("Rep_", 1:replicas), col = rainbow(replicas), lty = 1, cex = 0.6)
#abline(h=c(media-1,media+1))

Modelo de una línea de espera con un servidor

El tiempo que transcurre entre la llegada de ciertas piezas a una estación de inspección sigue una distribución exponencial con media de 4 minutos/pieza. El proceso está a cargo de un operario, y la duración de la inspección sigue una distribución normal con media de 3.0 y desviación estándar de 0.5 minutos/pieza. Calcule el tiempo promedio de permanencia de las piezas en el proceso de inspección.

Variable de estado Tiempo en el sistema de inspección
Entidades Piezas
Eventos Tiempo de llegada
Fin de la inspección
Evento secundario Inicio de la inspección
Actividades Tiempo entre llegadas
Tiempo de inspección
## corridas
n <- 100
piezas <- 1:n # Número de piezas simuladas
media_llegadas <- 4  # parámetro de la exponencial (para el tiempo entre llegadas)

media_inspeccion <- 3  # Media para el tiempo de inspección (distribución normal)
sd_inspeccion <- 0.5  # Desviación estándar

# Generar tiempos entre llegadas (distribución exponencial)
tiempos_llegadas<-rexp(n,rate=1/media_llegadas)

# Generar tiempos de inspección (distribución normal)
tiempos_inspeccion <- rnorm(n, mean = media_inspeccion, sd = sd_inspeccion)

# Inicializar el tiempo de llegada y salida de cada pieza
tiempo_actual <- 0
tiempos_perm <- numeric(n)  # Para almacenar los tiempos de permanencia

for (i in 1:n) {
  tiempo_llegada <- tiempo_actual + tiempos_llegadas[i]
  tiempo_salida <- tiempo_llegada + tiempos_inspeccion[i]
  
  # Calcular el tiempo de permanencia en el sistema
  tiempos_perm[i] <- tiempo_salida - tiempo_actual
  
  # Actualizando el tiempo actual al tiempo de salida
  tiempo_actual <- tiempo_salida
}

# Calcular el tiempo promedio de permanencia
tiempo_promedio_perm <- mean(tiempos_perm)

# Mostrar resultado
cat("El tiempo promedio de permanencia en el proceso de inspección es:", tiempo_promedio_perm, "minutos.\n")
## El tiempo promedio de permanencia en el proceso de inspección es: 7.213968 minutos.