Taller: bondad de ajuste para los tiempos de procesamiento de pedidos

Presentado por:

Oscar David Maturana Muñoz

Angel Luis Durango Padilla

Alan David Petro Hernandez

Jovvanis Andres Petro Maldonado

Jose Julian Pacheco Diaz

Fecha de publicación

9 de octubre de 2026

1 Introducción

Una empresa de distribución de productos desea analizar el comportamiento de los tiempos asociados al procesamiento de sus pedidos. Para ello, durante diferentes jornadas de operación registró información sobre las principales etapas del proceso.

El área de operaciones desea utilizar estos datos como entrada para un modelo de simulación, por lo que antes de generar observaciones aleatorias necesita identificar una distribución de probabilidad apropiada para cada variable.

  1. Tiempo de recepción y registro (min), continua.
  2. Tiempo de preparación (min), continua.
  3. Tiempo de despacho (min), continua.
  4. Unidades por pedido, discreta.

2 Datos

La base de datos contiene el registro de 30 pedidos procesados en diferentes jornadas de operación. Cada fila es un pedido y cada columna una variable del proceso:

  • Tiempo de recepción y registro (minutos): lo que tarda la empresa en recibir y registrar el pedido.
  • Tiempo de preparación (minutos): lo que tarda en alistarse el pedido.
  • Tiempo de despacho (minutos): lo que tarda en salir el pedido.
  • Unidades de pedido: cantidad de unidades solicitadas, que es un conteo entero.

Las tres primeras variables son continuas (pueden tomar cualquier valor positivo) y la cuarta es discreta (solo toma valores enteros). Esta diferencia es importante porque decide qué herramientas se pueden usar: fit.cont() solo aplica a variables continuas, mientras que para el conteo se necesitan distribuciones discretas.

Antes de analizar se hacen dos cosas: leer el archivo de Excel y convertir las columnas a formato numérico (el archivo usa la coma como separador decimal). Después se verifica que haya 30 datos por variable y que no existan valores faltantes.

Código
library(readxl)
library(knitr)
library(rriskDistributions)

# Ruta del archivo (si R no lo encuentra, revisar que no sobren caracteres como "}")
ruta <- "C:/Users/OSCAR}/OneDrive - UPB/David/OneDrive - UPB/Datos quiz.xlsx"
Datos_quiz <- read_excel(ruta)

# Variables (las comas decimales se pasan a punto)
a_num <- function(z) as.numeric(gsub(",", ".", as.character(z)))
tiempo_recepcion   <- a_num(Datos_quiz$`Tiempo de recepción`)
tiempo_preparacion <- a_num(Datos_quiz$`Tiempo de preparación`)
tiempo_despacho    <- a_num(Datos_quiz$`Tiempo de despacho`)
unidades_pedido    <- a_num(Datos_quiz$`Unidades de pedido`)

# Verificación: 30 datos y ningún NA
length(tiempo_recepcion)
[1] 30
Código
sum(is.na(c(tiempo_recepcion, tiempo_preparacion, tiempo_despacho, unidades_pedido)))
[1] 0

3 Análisis exploratorio

Antes de ajustar distribuciones conviene conocer el comportamiento de los datos. El análisis exploratorio permite ver el centro, la dispersión y la forma de cada variable, y así tener una primera idea de qué distribuciones pueden ser razonables.

Se usan dos herramientas:

  • Estadísticos descriptivos (summary(), sd() y var()): mínimo, máximo, media, mediana y dispersión. Si la media y la mediana son parecidas, los datos son aproximadamente simétricos; si la media es bastante mayor que la mediana, hay una cola larga hacia la derecha.
  • Gráficos (histogramas y diagrama de barras): muestran la forma de la distribución. Una campana sugiere una Normal; una cola a la derecha sugiere Lognormal, Gamma o Weibull. En una variable discreta se usan barras porque se cuentan las veces que aparece cada valor.
Código
summary(tiempo_recepcion);   sd(tiempo_recepcion)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  3.800   4.425   5.050   5.073   5.750   6.500 
[1] 0.788247
Código
summary(tiempo_preparacion); sd(tiempo_preparacion)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   9.50   11.75   13.20   13.62   15.53   19.00 
[1] 2.579907
Código
summary(tiempo_despacho);    sd(tiempo_despacho)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  3.100   4.025   4.750   4.787   5.475   6.500 
[1] 0.9554682
Código
summary(unidades_pedido);    sd(unidades_pedido)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   7.00   11.25   15.00   15.43   19.75   26.00 
[1] 5.263297
Código
var(unidades_pedido)
[1] 27.7023
Código
par(mfrow = c(2, 2))
hist(tiempo_recepcion,   main = "Recepción",   xlab = "Minutos", col = "steelblue")
hist(tiempo_preparacion, main = "Preparación", xlab = "Minutos", col = "seagreen")
hist(tiempo_despacho,    main = "Despacho",    xlab = "Minutos", col = "goldenrod")
barplot(table(unidades_pedido), main = "Unidades por pedido", xlab = "Unidades", col = "tomato")

Código
par(mfrow = c(1, 1))

Lectura de resultados:

  • Recepción: media de 5,07 min y mediana de 5,05 min, con valores entre 3,8 y 6,5 min. Son casi iguales, así que los datos son prácticamente simétricos.
  • Preparación: media de 13,62 min y mediana de 13,20 min, con valores entre 9,5 y 19 min. La media está un poco por encima de la mediana, lo que indica una ligera cola hacia la derecha (algunos pedidos tardan bastante más que el resto).
  • Despacho: media de 4,79 min y mediana de 4,75 min, con valores entre 3,1 y 6,5 min. También es muy simétrica.
  • Unidades por pedido: media de 15,43 y mediana de 15, con valores entre 7 y 26 unidades. La varianza (27,7) es casi el doble de la media. En una Poisson ambas serían iguales, así que esta distribución probablemente no se ajuste bien y conviene probar también una Binomial negativa.

En general, las tres variables de tiempo tienen forma de campana y no muestran valores extremos, por lo que varias distribuciones pueden ajustar de forma similar. Las pruebas de bondad de ajuste permiten decidir con un criterio objetivo.

4 Hipótesis y pruebas

Para cada variable y cada distribución candidata se plantea, con \(\alpha = 0{,}05\):

\[H_0: \text{los datos siguen la distribución propuesta} \qquad H_1: \text{no la siguen}\]

Se rechaza \(H_0\) si el valor-p \(< 0{,}05\).

  • Kolmogorov-Smirnov: \(D = \max_x |F_n(x) - F_0(x)|\). Compara la acumulada empírica con la teórica.
  • Anderson-Darling: igual que KS, pero da más peso a las colas.
  • Chi-cuadrado: \(\chi^2 = \sum_{i=1}^{k} \frac{(O_i - E_i)^2}{E_i}\), con \(gl = k - 1 - m\) (\(k\) clases, \(m\) parámetros estimados).
  • AIC y BIC: \(AIC = 2k - 2\ln L\), \(BIC = k\ln n - 2\ln L\). No son pruebas; entre las distribuciones no rechazadas, menor valor = mejor ajuste.

Criterio de decisión: se descartan las rechazadas, se elige la de menor AIC/BIC (si la diferencia es menor a 2 son equivalentes) y se revisan los gráficos y que tenga sentido para un tiempo (valores positivos).

5 Variables continuas con fit.cont()

fit.cont() abre una ventana interactiva con varias distribuciones, gráficos de diagnóstico y las pruebas anteriores. Se ejecuta en la consola, una variable a la vez; por eso los bloques tienen eval: false y los resultados de la ventana se copian en las tablas.

5.1 Tiempo de recepción

Código
# Ejecutar en la consola: revisar la ventana, marcar la distribución y presionar OK
prueba_recepcion <- fit.cont(tiempo_recepcion)
prueba_recepcion    # distribución elegida y parámetros

Resultados de la ventana de fit.cont(tiempo_recepcion):

Distribución logL AIC BIC Chisq(p) AD(value) H(AD) KS(value) H(KS)
Normal -34,92 73,84 76,65 0,77 0,36 no rechazada 0,09 no rechazada
Cauchy -43,22 90,43 93,24 0,29 0,76 no rechazada 0,14 no rechazada
Logística -36,2 76,4 79,21 0,74 0,39 no rechazada 0,10 no rechazada
Uniforme NULL NULL NULL 0,97 Inf NULL 0,06 no rechazada
Gamma -34,76 73,53 76,33 0,83 0,34 no rechazada 0,09 no rechazada
Lognormal -34,8 73,59 76,39 0,84 0,34 no rechazada 0,09 no rechazada
Weibull -35,42 74,84 77,64 0,63 0,43 no rechazada 0,10 no rechazada
Exponencial -78,72 159,44 160,84 0,00 9,89 rechazada 0,53 rechazada
Chi-cuadrado -62,54 127,09 128,49 0,00 6,03 NULL 0,37 rechazada
F -101,75 207,5 210,3 0,00 17,92 NULL 0,70 rechazada
t de Student -127,9 257,79 259,19 0,00 32,76 NULL 0,84 rechazada

Análisis:

  • Rechazadas: Exponencial, Chi-cuadrado, F y t de Student (Chisq(p) = 0,00 y KS “rejected”).
  • No rechazadas: Normal, Cauchy, Logística, Uniforme, Gamma, Lognormal y Weibull.
  • AIC/BIC: la Gamma tiene el menor valor (73,53 y 76,33). La Lognormal (73,59) y la Normal (73,84) están a menos de 1 punto, así que ajustan casi igual.
  • Uniforme: no se elige porque no tiene AIC/BIC (NULL) y su AD es infinito.
  • Gráficos: el QQ-plot y el PP-plot quedan cerca de la línea, sin desviaciones fuertes en los extremos.

Decisión: distribución seleccionada: Gamma (menor AIC/BIC, Chisq(p) = 0,83, KS = 0,09 y AD = 0,34, ambos no rechazados). Solo toma valores positivos, como corresponde a un tiempo.

Parámetros (deben coincidir con prueba_recepcion en la consola): shape ≈ 42,63 y rate ≈ 8,40.

Verificación: la Gamma tiene media \(\alpha/\beta = 42{,}63/8{,}40 \approx 5{,}07\) min y desviación \(\sqrt{\alpha}/\beta \approx 0{,}78\) min. Los datos tienen media 5.07 y desviación 0.79: coinciden.

5.2 Tiempo de preparación

Código
# Ejecutar en la consola: revisar la ventana, marcar la distribución y presionar OK
prueba_preparacion <- fit.cont(tiempo_preparacion)
prueba_preparacion    # distribución elegida y parámetros

Resultados de la ventana de fit.cont(tiempo_preparacion):

Distribución logL AIC BIC Chisq(p) AD(value) H(AD) KS(value) H(KS)
Normal -70,49 144,98 147,79 0,74 0,29 no rechazada 0,08 no rechazada
Cauchy -77,09 158,18 160,98 0,88 0,70 no rechazada 0,13 no rechazada
Logística -71,35 146,7 149,51 0,77 0,29 no rechazada 0,08 no rechazada
Chi-cuadrado -80,17 162,35 163,75 0,06 2,49 NULL 0,19 no rechazada
Uniforme NULL NULL NULL 0,64 Inf NULL 0,10 no rechazada
Gamma -69,93 143,86 146,66 0,81 0,18 no rechazada 0,07 no rechazada
Lognormal -69,83 143,66 146,47 0,82 0,16 no rechazada 0,07 no rechazada
Weibull -71,41 146,82 149,63 0,62 0,43 no rechazada 0,11 no rechazada
Exponencial -108,34 218,68 220,08 0,00 9,19 rechazada 0,50 rechazada
F -144,76 293,52 296,32 0,00 16,52 NULL 0,68 rechazada
t de Student -168,83 339,67 341,07 0,00 30,09 NULL 0,83 rechazada

Análisis:

  • Rechazadas: Exponencial, F y t de Student (Chisq(p) = 0,00 y KS “rejected”).
  • No rechazadas: Normal, Cauchy, Logística, Chi-cuadrado, Uniforme, Gamma, Lognormal y Weibull. La Chi-cuadrado queda al límite (Chisq(p) = 0,06) y con AIC alto (162,35), así que no es buena candidata.
  • AIC/BIC: la Lognormal tiene el menor valor (143,66 y 146,47). La Gamma (143,86) está a menos de 1 punto y la Normal (144,98) a 1,3.
  • Uniforme: no se elige (AIC/BIC NULL y AD infinito).
  • Gráficos: el histograma muestra una ligera cola a la derecha; QQ-plot y PP-plot quedan cerca de la línea.

Decisión: distribución seleccionada: Lognormal (menor AIC/BIC, Chisq(p) = 0,82, KS = 0,07 y AD = 0,16, ambos no rechazados). Representa la ligera asimetría a la derecha y no genera valores negativos.

Parámetros (deben coincidir con prueba_preparacion): meanlog ≈ 2,594 y sdlog ≈ 0,185.

Verificación: la Lognormal tiene media \(e^{\mu+\sigma^2/2} \approx 13{,}62\) min y desviación \(\approx 2{,}55\) min. Los datos tienen media 13.62 y desviación 2.58: coinciden.

5.3 Tiempo de despacho

Código
# Ejecutar en la consola: revisar la ventana, marcar la distribución y presionar OK
prueba_despacho <- fit.cont(tiempo_despacho)
prueba_despacho    # distribución elegida y parámetros

Resultados de la ventana de fit.cont(tiempo_despacho):

Distribución logL AIC BIC Chisq(p) AD(value) H(AD) KS(value) H(KS)
Normal -40,69 85,39 88,19 0,84 0,26 no rechazada 0,07 no rechazada
Cauchy -48,76 101,51 104,31 0,56 0,69 no rechazada 0,12 no rechazada
Logística -41,88 87,76 90,56 0,82 0,29 no rechazada 0,07 no rechazada
Uniforme NULL NULL NULL 0,99 Inf NULL 0,05 no rechazada
Gamma -40,57 85,14 87,94 0,87 0,23 no rechazada 0,07 no rechazada
Lognormal -40,71 85,41 88,22 0,87 0,24 no rechazada 0,07 no rechazada
Weibull -40,92 85,84 88,64 0,82 0,30 no rechazada 0,07 no rechazada
Gompertz -42,21 88,41 91,22 0,63 0,47 NULL 0,09 no rechazada
Exponencial -76,98 155,95 157,35 0,00 8,88 rechazada 0,48 rechazada
Chi-cuadrado -62,03 126,06 127,46 0,00 4,91 NULL 0,33 rechazada
F -98,62 201,24 204,04 0,00 17,28 NULL 0,67 rechazada
t de Student -124,93 251,86 253,26 0,00 32,53 NULL 0,83 rechazada

Análisis:

  • Rechazadas: Exponencial, Chi-cuadrado, F y t de Student (Chisq(p) = 0,00 y KS “rejected”).
  • No rechazadas: Normal, Cauchy, Logística, Uniforme, Gamma, Lognormal, Weibull y Gompertz.
  • AIC/BIC: la Gamma tiene el menor valor (85,14 y 87,94). Normal (85,39), Lognormal (85,41) y Weibull (85,84) están a menos de 1 punto, así que son prácticamente equivalentes.
  • Uniforme: no se elige (AIC/BIC NULL y AD infinito).
  • Gráficos: QQ-plot y PP-plot quedan cerca de la línea y la CDF teórica sigue los escalones de los datos.

Decisión: distribución seleccionada: Gamma (menor AIC/BIC, Chisq(p) = 0,87, KS = 0,07 y AD = 0,23, ambos no rechazados).

Parámetros (deben coincidir con prueba_despacho): shape ≈ 25,49 y rate ≈ 5,33.

Verificación: la Gamma tiene media \(\alpha/\beta \approx 4{,}79\) min y desviación \(\sqrt{\alpha}/\beta \approx 0{,}95\) min. Los datos tienen media 4.79 y desviación 0.96: coinciden.

6 Variable discreta: unidades por pedido

fit.cont() solo ajusta distribuciones continuas y una Normal generaría valores como 14,7 unidades, así que se prueban dos distribuciones discretas con chi-cuadrado: Poisson (\(\lambda = \bar{x}\)) y Binomial negativa (por momentos, válida si \(s^2 > \bar{x}\)).

Código
n <- length(unidades_pedido)
media <- mean(unidades_pedido)
varianza <- var(unidades_pedido)

# Frecuencias observadas en 4 clases: <=11, 12-15, 16-19, >=20
cortes <- c(-Inf, 11, 15, 19, Inf)
observadas <- as.vector(table(cut(unidades_pedido, cortes)))

# Poisson
esp_pois <- n * diff(ppois(cortes, lambda = media))
chi_pois <- sum((observadas - esp_pois)^2 / esp_pois)
p_pois   <- 1 - pchisq(chi_pois, df = 4 - 1 - 1)

# Binomial negativa
tam <- media^2 / (varianza - media)
esp_nb <- n * diff(pnbinom(cortes, size = tam, mu = media))
chi_nb <- sum((observadas - esp_nb)^2 / esp_nb)
p_nb   <- 1 - pchisq(chi_nb, df = 4 - 1 - 2)

kable(data.frame(
  Distribución = c("Poisson", "Binomial negativa"),
  Parámetros   = c(paste0("lambda = ", round(media, 2)),
                   paste0("size = ", round(tam, 2), ", mu = ", round(media, 2))),
  `Chi-cuadrado` = c(chi_pois, chi_nb),
  gl = c(2, 1),
  `Valor-p` = c(p_pois, p_nb),
  check.names = FALSE), digits = 3)
Distribución Parámetros Chi-cuadrado gl Valor-p
Poisson lambda = 15.43 7.232 2 0.027
Binomial negativa size = 19.41, mu = 15.43 1.029 1 0.310

Análisis:

  • La Poisson se rechaza (valor-p ≈ 0,03 < 0,05): su varianza teórica sería ≈ 15,4, muy lejos de la observada (≈ 27,7).
  • La Binomial negativa no se rechaza (valor-p ≈ 0,31), porque admite varianza mayor que la media.

Decisión: distribución seleccionada: Binomial negativa con size ≈ 19,41 y mu ≈ 15,43 (equivale a \(p = \bar{x}/s^2 \approx 0{,}557\)).

7 Conclusiones

Con el análisis exploratorio y las pruebas de bondad de ajuste (Kolmogorov-Smirnov, Anderson-Darling y chi-cuadrado, junto con los criterios AIC y BIC) se identificó una distribución apropiada para cada variable del proceso. La siguiente tabla resume el resultado y los parámetros que se usarían para generar observaciones aleatorias en el modelo de simulación.

Variable Distribución seleccionada Parámetros
Tiempo de recepción Gamma shape ≈ 42,63; rate ≈ 8,40
Tiempo de preparación Lognormal meanlog ≈ 2,594; sdlog ≈ 0,185
Tiempo de despacho Gamma shape ≈ 25,49; rate ≈ 5,33
Unidades por pedido Binomial negativa size ≈ 19,41; mu ≈ 15,43

Con solo 30 datos las pruebas tienen poca potencia: “no rechazar \(H_0\)” indica que la distribución es compatible con los datos, no que sea la verdadera.

Conclusiones principales:

  • Variables de tiempo: las tres pueden representarse con distribuciones continuas positivas (Gamma para recepción y despacho, Lognormal para preparación). En todos los casos se descartaron la Exponencial, la F y la t de Student, que no se ajustan a los datos.
  • Distribuciones equivalentes: en cada variable varias distribuciones (Normal, Gamma, Lognormal) tienen un AIC muy cercano, a menos de 2 puntos. Eso significa que ajustan casi igual de bien; se eligió la de menor AIC/BIC y que, además, solo genera valores positivos, como corresponde a un tiempo.
  • Unidades por pedido: la Poisson se rechazó porque la varianza de los datos es mucho mayor que su media. La Binomial negativa sí es compatible con los datos y es la distribución recomendada para este conteo.
  • Uso en la simulación: estas distribuciones y sus parámetros pueden usarse directamente para generar observaciones aleatorias (rgamma(), rlnorm() y rnbinom()).

Limitación: el análisis se basa en solo 30 pedidos, por lo que las pruebas tienen poca capacidad para detectar diferencias. No rechazar una distribución indica que es compatible con los datos, pero no demuestra que sea la verdadera. Si se dispone de más registros, conviene repetir el análisis para confirmar la elección.

8 Ecuaciones de las distribuciones

Dejar solo las que resulten seleccionadas.

Normal: \(f(x) = \dfrac{1}{\sigma\sqrt{2\pi}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}\)

Lognormal: \(f(x) = \dfrac{1}{x\sigma\sqrt{2\pi}} e^{-\frac{(\ln x-\mu)^2}{2\sigma^2}}, \; x>0\)

Gamma: \(f(x) = \dfrac{\beta^{\alpha}}{\Gamma(\alpha)} x^{\alpha-1} e^{-\beta x}, \; x>0\)

Weibull: \(f(x) = \dfrac{k}{\lambda}\left(\dfrac{x}{\lambda}\right)^{k-1} e^{-(x/\lambda)^k}, \; x>0\)

Logística: \(f(x) = \dfrac{e^{-(x-\mu)/s}}{s\left(1+e^{-(x-\mu)/s}\right)^2}\)

Poisson: \(P(X=x) = \dfrac{e^{-\lambda}\lambda^x}{x!}\)

Binomial negativa: \(P(X=x) = \dbinom{x+r-1}{x} p^r (1-p)^x\), con \(r = \dfrac{\bar{x}^2}{s^2-\bar{x}}\) y \(p = \dfrac{\bar{x}}{s^2}\)