Análisis de datos de entrada y salida de la simulación

Análisis de datos de entrada

En el contexto de la simulación de eventos discretos, el análisis de datos de entrada es una etapa crítica que consiste en identificar, recolectar y modelar adecuadamente los datos que describen el comportamiento del sistema real. Estos datos sirven para alimentar la simulación y asegurar que sus resultados sean realistas y útiles.

Objetivo del análisis de datos de entrada

Su propósito principal es encontrar distribuciones de probabilidad adecuadas para representar:

  • Tiempos entre llegadas

  • Duraciones de servicio o procesamiento

  • Fallas de equipos

  • Otros procesos estocásticos del sistema

Pasos típicos:

  1. Recolección de datos históricos o mediante observación directa del sistema.

  2. Análisis exploratorio para entender patrones y detectar errores o valores atípicos.

  3. Ajuste de distribuciones para datos. Pruebas de bondad de ajuste.

Una buena caracterización de los datos de entrada mejora la validez del modelo de simulación, permitiendo tomar decisiones más acertadas basadas en sus resultados.

Situación problema

  • Se está modelando la atención de clientes para cajas generales en un banco para el día lunes entre las 8:00 am y las 9:00am

  • El banco cuenta con **3cajeros*$ tiempo completo y un supernumerario**, en caso de que el gerente de sede decida colocarlo a atención en caja.

  • Se tomaron datos para un día lunes (lo ideal es tomar más datos para el mismo día) entre las 8:00 am y las 9:00am.

  • Se tiene el modelo en Flexsim construido mediante General Process Flow

  • Se tiene como \(medida~de~desempeño\) el tiempo promedio en espera de atención. Se tienen muchas PQRS por los tiempos largos de espera.

Los datos recolectados para el \(tiempo~entre~llegadas\) y para el \(tiempo~de~atención\) se muestran en la Tabla 1 (Primeros 50 datos)

Tabla 1: Datos recolecatados
Tiempo entre llegadas (\(S\)) Tiempo de atención (\(S\))
58.14 254.33
3.61 431.06
3.67 391.90
37.32 474.24
13.52 557.41
33.37 323.57
28.86 450.39
29.45 374.94
20.27 416.26
34.90 361.79
21.92 511.57
142.42 653.80
59.68 373.53
13.16 471.22
104.22 519.20
48.41 299.31
113.93 411.70
47.94 420.60
20.19 278.20
26.59 349.62
102.24 490.45
16.80 505.16
53.60 567.27
75.94 479.04
94.23 450.46
0.66 288.72
2.08 652.24
14.00 361.63
7.34 455.81
11.78 461.93
11.85 395.81
198.01 486.39
91.25 229.09
56.19 289.50
80.42 519.21
29.21 671.85
13.07 336.98
99.58 359.90
55.46 361.14
32.10 628.74
45.61 353.25
73.59 504.25
10.90 589.66
9.66 291.87
75.36 430.65
54.12 435.68
199.78 557.79
21.46 322.58
68.49 585.32
30.89 442.30

Puede acceder a los datos en el siguente enlace: Datos Banco

El modelo construído en Flexsim se muestra en la Figura 1

Figura 1: Modelo Banco Flexsim

Puede acceder a los datos en el siguente enlace: Modelo Flexsim Banco

1. Análisis exploratorio de datos de entrada.

Para observar el comportamiento de los datos de entrada se puede realizar un análisis exploratorio, se realizará en este caso en R. Para un resumen estadístico de los datos:

#Datos
library(readxl)
datos_tomados <- read_excel("datos_tomados.xlsx")

#Exploración
summary(datos_tomados)

tiempo_entre_llegadas Atencion
Min. : 0.12 Min. :173.8
1st Qu.: 16.56 1st Qu.:348.1
Median : 37.16 Median :427.1
Mean : 56.23 Mean :433.6
3rd Qu.: 73.16 3rd Qu.:510.5
Max. :411.22 Max. :772.6

Se puede explorar los datos usando herramientas gráficas como los histogramas, para el tiempo entre llegadas

#Datos
library(readxl)
datos_tomados <- read_excel("datos_tomados.xlsx")

#Histograma
hist(datos_tomados$tiempo_entre_llegadas, 
     prob = TRUE,               # Muestra densidad en vez de frecuencia
     col = "blue",         # Color de las barras
     main = "Tiempo entre llegadas", 
     xlab = "Tiempo entre llegadas",
     ylab= "Densidad")

# Añadir la curva de densidad
lines(density(datos_tomados$tiempo_entre_llegadas), 
      col = "red", 
      lwd = 2)  

Para el tiempo de atención

#Datos
library(readxl)
datos_tomados <- read_excel("datos_tomados.xlsx")

#Histograma
hist(datos_tomados$Atencion, 
     prob = TRUE,               # Muestra densidad en vez de frecuencia
     col = "blue",         # Color de las barras
     main = "Tiempo de antención", 
     xlab = "Tiempo de atención",
     ylab= "Densidad")

# Añadir la curva de densidad
lines(density(datos_tomados$Atencion), 
      col = "red", 
      lwd = 2)  

De los resultados anteriores, es muy complicado establecer Distribuciones de probabilidad asociadas a los datos recolectados, por lo que resulta importante realizar pruebas de bondad de ajuste

2. Pruebas de bondad de ajuste.

Se usara la librería rriskDistrutions de R para realizar las pruebas de bondad de ajuste para los datos de entrada: tiempo entre llegadas de clientes y tiempo de atención.

Para el tiempo entre llegadas:

#Datos
library(readxl)
datos_tomados <- read_excel("datos_tomados.xlsx")

#Pruebas
library(rriskDistributions)
ajuste<-fit.cont(datos_tomados$tiempo_entre_llegadas)
            logL      AIC      BIC Chisq(value) Chisq(p) AD(value)

Normal -1944.16 3892.33 3900.05 2.330400e+02 0.00 22.00 Cauchy -1882.74 3769.48 3777.2 1.308800e+02 0.00 17.19 Logistic -1901.37 3806.74 3814.46 1.749800e+02 0.00 13.02 Exponential -1765.33 3532.67 3536.53 1.686000e+01 0.39 0.67 Chi-square -5665.57 11333.13 11336.99 2.012075e+16 0.00 Inf Uniform NULL NULL NULL 3.139800e+02 0.00 Inf Gamma -1764.55 3533.1 3540.82 1.581000e+01 0.39 0.43 Lognormal -1792.72 3589.44 3597.17 5.254000e+01 0.00 4.87 Weibull -1764.27 3532.54 3540.26 1.582000e+01 0.39 0.40 F -2075.68 4155.36 4163.08 7.883200e+02 0.00 106.45 Student -2340.99 4683.97 4687.83 2.063000e+03 0.00 280.75 H(AD) KS(value) H(KS) Normal rejected 0.18 rejected Cauchy rejected 0.19 rejected Logistic rejected 0.17 rejected Exponential not rejected 0.04 not rejected Chi-square NULL 0.39 rejected Uniform NULL 0.24 rejected Gamma NA 0.03 not rejected Lognormal rejected 0.10 rejected Weibull not rejected 0.03 not rejected F NULL 0.42 rejected Student NULL 0.67 rejected

Chosen continuous distribution is: Exponential (exp) Fitted parameters are: rate 0.01778422

Corriendo el código anterior se obtiene una ventana como la mostrada en Figura 2.

Figura 2: Pruebas bondad de ajuste para el tiempo entre llegadas

Se encuentran tres pruebas de bondad de ajuste Chi-cuadrado, Kolmogorov-Smirnov, Anderson-Darling, cada una con ventajas y desventajas. Para el caso, se escogerá. Chi-cuadrado. Para la prueba escogida la distribución seleccionada será Exponencial, de acuerdo al siguiente procedimiento:

Se define \(X: tiempo~entre~llegadas~de~usuarios~del~banco\), por lo tanto:

\[\begin{align} H_0&: X \sim Exp ~(\lambda)\\ \\ H_1&: X \nsim Exp~(\lambda) \end{align}\]

De la prueba de bondad de ajuste se obtiene que \(p-value= 0.90\) (más alto). Por lo que no existe evidencia estadística sufiente para rechazar \(H_0\), los datos ajustan a una distibución Exponencial con \(rate=0.01778422\).

Estos datos se usarán en el modelo de simulación en Flexsim para la llegada de clientes, sin embargo, en Flexsim necesito \(Scale = \frac{1}{rate}\). Por lo que se usará \(scale=56.22962\)

Para el tiempo de atención:

#Datos
library(readxl)
datos_tomados <- read_excel("datos_tomados.xlsx")

#Pruebas
library(rriskDistributions)
ajuste<-fit.cont(datos_tomados$Atencion)
            logL     AIC     BIC Chisq(value) Chisq(p) AD(value)

Normal -2164.13 4332.26 4339.98 1.618000e+01 0.37 0.49 Cauchy -2235.17 4474.33 4482.06 8.770000e+01 0.00 5.37 Logistic -2170.01 4344.03 4351.75 2.077000e+01 0.14 0.82 Exponential -2482.36 4966.71 4970.57 6.365200e+02 0.00 87.16 Chi-square -4279.68 8561.35 8565.21 2.554722e+11 0.00 Inf Uniform NULL NULL NULL 3.606000e+01 0.00 Inf Gamma -2162.34 4328.68 4336.41 1.760000e+01 0.28 0.55 Lognormal -2167.34 4338.68 4346.4 2.491000e+01 0.05 1.37 Weibull -2166.57 4337.13 4344.85 1.813000e+01 0.26 0.81 F -3177.6 6359.21 6366.93 6.915500e+03 0.00 171.58 Student -3428.07 6858.14 6862 1.447311e+04 0.00 326.59 H(AD) KS(value) H(KS) Normal not rejected 0.03 not rejected Cauchy rejected 0.09 rejected Logistic rejected 0.04 not rejected Exponential rejected 0.40 rejected Chi-square NULL 0.33 rejected Uniform NULL 0.07 not rejected Gamma not rejected 0.04 not rejected Lognormal rejected 0.05 not rejected Weibull rejected 0.04 not rejected F NULL 0.63 rejected Student NULL 0.81 rejected

Chosen continuous distribution is: Normal (norm) Fitted parameters are: mean sd 433.6496 115.2010

Corriendo el código anterior se obtiene una ventana como la mostrada en Figura 3.

Figura 3: Pruebas bondad de ajuste para el tiempo de atención

Se define \(X: tiempo~de~atención~de~usuarios~del~banco\), por lo tanto:

\[\begin{align} H_0&: X \sim \Gamma (\gamma, \lambda)\\ \\ H_1&: X \nsim \Gamma(\alpha, \lambda) \end{align}\]

De la prueba de bondad de ajuste se obtiene que \(p-value= 0.10\) (más alto). Por lo que no existe evidencia estadística sufiente para rechazar \(H_0\), los datos ajustan a una distibución Gamma con \(Shape=4.78962779\) y $Rate=0.01294428 $. Como Flexsim solicita como dato \(Scale\) este se obtiene de hacer \(\frac{1}{rate}\). Por lo tanto se obtiene un \(Scale=77.2542\)

Estos datos se usarán en el modelo de simulación en Flexsim para la atención a clientes.

3. Análisis datos de salida.

Una vez realizadas las simulaciones se obtienen datos de salida basados en medidas de desempeño, para el anterior problema se tiene como medida de desempeño el tiempo promedio de espera

Para el sistema original tenemos los siguientes datos de salida, Tabla 2:

Tabla 2: Datos de salida sistema original
Tiempo espera promedio (\(S\))
1359.21
1319.00
1326.00
1328.00
1314.00
1324.00
1384.00
1331.00
1371.00
1372.00
1364.00
1296.00
1334.00
1370.00
1334.00
1364.00
1318.00
1321.00
1308.00
1314.00
1308.00

Se propone entonces un cambio para mejorar la medida de desempeño: agregar una caja y un cajero. Se realizan simulaciones y corridas experimentales. Obteniendo la siguiente información, (Tabla 3)

Tabla 3: Datos de salida cambio
Tiempo espera promedio (\(S\))
1108
1078
1115
1099
1093
1091
1107
1070
1063
1088
1099
1086
1081
1066
1113
1108
1070
1116
1090
1073
1072

Se comprueba de manera estadística si el cambio propuesto en el sistema mejora la medida de desempeño. Se usará una prueba de diferencias de medias, para muestras independientes, la cual exige normalidad en las muestras (se puede usar cualquier prueba, Shapiro-Wilk, Kolmogorov-Smirnov, Anderson-Darling).

Se plantean las hipótesis para verificar la normalidad:

Se define

\(X_1\): tiempo promedio de espera para el sistema original.

\(X_2\): tiempo promedio de espera para el sistema con cambio.

\[\begin{align} H_0&: X_1 \sim N(\mu, \sigma^2)\\ \\ H_1&: X_1 \nsim N(\mu, \sigma^2) \end{align}\]

Se realiza el test de Shapiro-Wilk para \(X_1\)

#Datos
library(readxl)
datos_salida <- read_excel("datos_salida.xlsx")

shapiro.test(datos_salida$espera1)
Shapiro-Wilk normality test

data: datos_salida$espera1 W = 0.91047, p-value = 0.05609

Si el nivel de significancia \(\alpha = 0.05\), no existe evidencia estadística suficiente para rechazar \(H_0\) por lo que \(\X_1 \sim N(\mu, \sigma^2)\) puesto que \(p-value=0.05609 \nless \alpha=0.05\)

Se realiza el test de Shapiro-Wilk para \(X_2\)

#Datos
library(readxl)
datos_salida <- read_excel("datos_salida.xlsx")
shapiro.test(datos_salida$espera2)
Shapiro-Wilk normality test

data: datos_salida$espera2 W = 0.93971, p-value = 0.215

Si el nivel de significancia \(\alpha = 0.05\), no existe evidencia estadística suficiente para rechazar \(H_0\) por lo que \(\X_2 \sim N(\mu, \sigma^2)\) puesto que \(p-value=0.215 \nless \alpha=0.05\)

Cumpliendo la normalidad, entonces se define:

\(\mu_1\): media poblacional grupo 1. Media poblacional del tiempo promedio de espera del sistema original.

\(\mu_2\): media poblacional grupo 2. Media poblacional del tiempo promedio de espera del sistema con cambio.

Planteamiento de hipótesis para comparación.**

Existen tres opciones posibles: prueba bilateral, prueba unilateral a la derecha, prueba unilateral a la izquierda:

a. Opción 1: se utiliza cuando se quiere saber si hay una diferencia, sin importar la dirección.

\[\begin{align} H_0&: \mu_1 = \mu_2\\ \\ H_1&: \mu_1 \neq \mu_2 \end{align}\]

b. Opción 2: se utiliza cuando se quiere saber si la media del grupo 1 es mayor que la del grupo 2.

\[\begin{align} H_0&: \mu_1 \leq \mu_2\\ \\ H_1&: \mu_1 > \mu_2 \end{align}\]

b. Opción 3: se utiliza cuando se quiere saber si la media del grupo 1 es menor que la del grupo 2.

\[\begin{align} H_0&: \mu_1 \geq \mu_2\\ \\ H_1&: \mu_1 < \mu_2 \end{align}\]

Para el ejemplo actual interesa que el la media poblacional del tiempo promedio del sistema con cambio sea menor que la media poblacional del tiempo promedio del sistema sin cambio.

Por lo que escogemos la opción 2:

\[\begin{align} H_0&: \mu_1 \leq \mu_2\\ \\ H_1&: \mu_1 > \mu_2 \end{align}\]

Se realiza la prueba:

#Datos
library(readxl)
datos_salida <- read_excel("datos_salida.xlsx")
t.test(datos_salida$espera1, datos_salida$espera2, alternative = "greater")
Welch Two Sample t-test

data: datos_salida\(espera1 and datos_salida\)espera2 t = 36.337, df = 34.753, p-value < 2.2e-16 alternative hypothesis: true difference in means is greater than 0 95 percent confidence interval: 234.8868 Inf sample estimates: mean of x mean of y 1336.153 1089.810

Si el nivel de significancia \(\alpha = 0.05\), existe evidencia estadística suficiente para rechazar \(H_0\) por lo que \(\mu_1 > \mu_2\), puesto que \(p-value=2.2e-16 \nless \alpha=0.05\). El cambio disminuyó el tiempo promedio de espera.

Dependiendo del interés se puede usar: alternative = "two.sided", alternative = "greater" o alternative = "less".

En caso de no cumplir el supuesto de normalidad de las muestras, se puede usar una prueba no paramétrica.

#Datos
library(readxl)
datos_salida <- read_excel("datos_salida.xlsx")
wilcox.test(datos_salida$espera1, datos_salida$espera2, paired = FALSE, alternative = "two.sided")
Wilcoxon rank sum test with continuity correction

data: datos_salida\(espera1 and datos_salida\)espera2 W = 441, p-value = 3.098e-08 alternative hypothesis: true location shift is not equal to 0