1. Una barra de longitud \(x_1\) será unida mediante soldadura a otra de longitud \(x_2\). Si \(x_1\sim\mathcal{N}(30,\ 0.81)\) y \(x_2\sim\mathcal{N}(18,\ 0.3^2)\), simule la soldadura de \(n=500\) barras; tome \(L=x_1+x_2\) como longitud total y considere especificaciones de diseño \(T=50\pm5\) cm. Determine el estimador de la probabilidad de que una barra esté fuera de especificación, \(\hat{p}\) (proporción con \(L<\mathrm{LSL}\) o \(L>\mathrm{USL}\)); calcule además los coeficientes de capacidad \(C_p\) y \(C_{pk}\) del proceso. ¿Considera que el proceso está bajo control estadístico? Nota: consulte qué son los índices de capacidad \(C_p\) y \(C_{pk}\) y qué significa que un proceso esté bajo control estadístico.

NOTA: Para este ejercicio, tener en cuenta el siguiente glosario.

Unidades: todas las longitudes en centímetros (cm). Distribuciones: \(\mathcal{N}(\mu,\sigma^{2})\) denota Normal con media \(\mu\) y varianza \(\sigma^{2}\).

A. Parámetros del problema y especificaciones. \(n\): tamaño de la simulación (número de barras); \(\mu_{1}\): media de \(x_{1}\); \(\sigma_{1}\): desviación estándar de \(x_{1}\), con \(\sigma_{1}=\sqrt{0.81}=0.9\); \(\mu_{2}\): media de \(x_{2}\); \(\sigma_{2}\): desviación estándar de \(x_{2}\) \((0.3)\); \(\mathrm{LSL}=45\); \(\mathrm{USL}=55\); \(T=50\).

B. Variables aleatorias y longitud soldada. \(x_{1}\sim\mathcal{N}(30,0.81)\); \(x_{2}\sim\mathcal{N}(18,0.3^{2})\); longitud total \(L=x_{1}+x_{2}\).

C. Parámetros teóricos de \(L\). Media \(\mu_{L}=\mu_{1}+\mu_{2}\); desviación estándar \(\sigma_{L}=\sqrt{\sigma_{1}^{2}+\sigma_{2}^{2}}\).

D. Estadísticos muestrales (de la simulación). Media muestral \(\hat{\mu}\); desviación estándar muestral \(\hat{\sigma}\).

E. Probabilidad fuera de especificación. Proporción muestral \(\displaystyle \hat{p}=\frac{1}{n}\sum_{i=1}^{n}\mathbf{1}{,L_{i}<\mathrm{LSL}\ \lor\ L_{i}>\mathrm{USL},}\); conteo de piezas fuera \(\sum \mathbf{1}{\cdot}\); probabilidad teórica \(\displaystyle p_{\mathrm{teo}}=\Phi!\left(\frac{\mathrm{LSL}-\mu_{L}}{\sigma_{L}}\right)+1-\Phi!\left(\frac{\mathrm{USL}-\mu_{L}}{\sigma_{L}}\right)\).

F. Índices de capacidad del proceso. \(\displaystyle C_{p}=\frac{\mathrm{USL}-\mathrm{LSL}}{6,\hat{\sigma}}\), \(\displaystyle C_{pu}=\frac{\mathrm{USL}-\hat{\mu}}{3,\hat{\sigma}}\), \(\displaystyle C_{pl}=\frac{\hat{\mu}-\mathrm{LSL}}{3,\hat{\sigma}}\), \(\displaystyle C_{pk}=\min(C_{pu},C_{pl})\).

G. Objetos tabulares de resultados. Barra: identificador \(1,\dots,n\); \(x_{1}\), \(x_{2}\): valores simulados (redondeados); \(L\): longitud total \(x_{1}+x_{2}\) (redondeada); Fuera_Espec: “Sí” si \(L<\mathrm{LSL}\) o \(L>\mathrm{USL}\), “No” en caso contrario.

H. Reproducibilidad y funciones. SEED_STM: semilla usada con set.seed(); \(\Phi(\cdot)\): CDF de la Normal estándar (R: pnorm); \(\mathbf{1}{\cdot}\): función indicadora; rnorm(n, mean, sd): generador de \(\mathcal{N}(\text{mean},\text{sd}^{2})\).

Opciones de knitr y semilla global

SEED_SIM <- 20251119
set.seed(SEED_SIM)

1.1. Parámetros del problema

n <- 500
mu1 <- 30
sd1 <- sqrt(0.81) # 0.9
mu2 <- 18
sd2 <- 0.3
LSL <- 45
USL <- 55
Tgt <- 50
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.5.2
muL_th <- mu1 + mu2
sdL_th <- sqrt(sd1^2 + sd2^2)

teoricos <- data.frame(
Parametro = c("μ_L = μ1 + μ2", "σ_L = sqrt(σ1^2 + σ2^2)"),
Valor = round(c(muL_th, sdL_th), 6)
)

if (knitr::is_html_output() && requireNamespace("kableExtra", quietly = TRUE)) {
kableExtra::kbl(teoricos, booktabs = TRUE,
caption = "Parámetros teóricos de L = x1 + x2") |>
kableExtra::kable_styling()
} else {
knitr::kable(teoricos, caption = "Parámetros teóricos de L = x1 + x2")
}
Parámetros teóricos de L = x1 + x2
Parametro Valor
μ_L = μ1 + μ2 48.000000
σ_L = sqrt(σ1^2 + σ2^2) 0.948683

1.2. Simulación de 500 barras

x1 <- rnorm(n, mean = mu1, sd = sd1)
x2 <- rnorm(n, mean = mu2, sd = sd2)
L  <- x1 + x2

# Estimadores muestrales para capacidad

muL_hat <- mean(L)
sdL_hat <- sd(L)

c(muL_hat = muL_hat, sdL_hat = sdL_hat)
##    muL_hat    sdL_hat 
## 47.9513713  0.9460268
barras <- data.frame(
Barra       = seq_len(n),
x1          = round(x1, 3),
x2          = round(x2, 3),
L           = round(L, 3),
Fuera_Espec = ifelse(L < LSL | L > USL, "Sí", "No")
)

if (knitr::is_html_output() && requireNamespace("DT", quietly = TRUE)) {
DT::datatable(barras, rownames = FALSE,
options = list(pageLength = 25, autoWidth = TRUE))
} else {
knitr::kable(barras, caption = "Simulación de 500 barras (x1, x2 y L = x1 + x2)")
}

1.3. Probabilidad de estar fuera de especificación (estimador y valor teórico)

(#eq1:phat) \[ \hat{p}=\frac{1}{n}\sum_{i=1}^{n}\mathbf{1}\{\;L_i<\mathrm{LSL}\ \lor\ L_i>\mathrm{USL}\;\} \]

p_hat <- mean(L < LSL | L > USL)
count_oos <- sum(L < LSL | L > USL)

p_teo <- pnorm(LSL, mean = muL_th, sd = sdL_th) +
1 - pnorm(USL, mean = muL_th, sd = sdL_th)

c(barras_fuera = count_oos, p_hat = p_hat, p_teorica = p_teo)
## barras_fuera        p_hat    p_teorica 
## 0.0000000000 0.0000000000 0.0007827011

1.4. Índices de capacidad 𝐶𝑝 y 𝐶𝑝𝑘

(#eq2:cp-cpk) \[ C_p=\frac{\mathrm{USL}-\mathrm{LSL}}{6\,\hat{\sigma}},\qquad C_{pk}=\min\!\left\{\,\frac{\mathrm{USL}-\hat{\mu}}{3\,\hat{\sigma}},\ \frac{\hat{\mu}-\mathrm{LSL}}{3\,\hat{\sigma}}\,\right\} \]

Cp_hat  <- (USL - LSL) / (6 * sdL_hat)
Cpu_hat <- (USL - muL_hat) / (3 * sdL_hat)
Cpl_hat <- (muL_hat - LSL) / (3 * sdL_hat)
Cpk_hat <- min(Cpu_hat, Cpl_hat)

c(Cp = Cp_hat, Cpu = Cpu_hat, Cpl = Cpl_hat, Cpk = Cpk_hat)
##       Cp      Cpu      Cpl      Cpk 
## 1.761754 2.483590 1.039918 1.039918
h1 <- hist(L,
breaks = "FD",
main = "Longitud total L (x1 + x2)",
xlab = "L (cm)",
col = "gray90", border = "gray40")
abline(v = c(LSL, Tgt, USL), lwd = c(2,2,2), lty = c(2,3,2), col = c("red","blue","red"))

legend("topright", bty = "n",
legend = c(paste0("LSL = ", LSL),
paste0("Tgt = ", Tgt),
paste0("USL = ", USL),
paste0("p\u0302 fuera = ", round(p_hat, 4)),
paste0("Cp = ", round(Cp_hat, 3)),
paste0("Cpk = ", round(Cpk_hat, 3))),
lty = c(2,3,2,NA,NA,NA), lwd = c(2,2,2,NA,NA,NA),
col = c("red","blue","red", NA, NA, NA))

1.5. Conclusión sobre capacidad y control estadístico

Con \(C_p\) alto y \(C_{pk}\approx 1\), el proceso cumple (pocas piezas fuera de especificación), pero no está centrado en \(T=50\). Para afirmar control estadístico se requieren datos en secuencia temporal y cartas de control (p. ej., \(\bar{X}!-!R\) o \(\mathrm{EWMA}\)) sin señales especiales. Con la información dada (una sola corrida simulada), no puede certificarse el control; sólo la capacidad.

2. Cada 20 minutos llegan piezas a una estación de reproceso. El número de defectos que una pieza puede tener com o máximo es 3. Se sabe que estos defectos siguen una distribución Binomial con media 2.4. El tiempo para realizar las reparaciones correspondientes se distribuye exponencial con λ = 0,2 piezas por minuto por cada defecto que tenga la pieza. Determine, ¿cuánto tiempo tomará procesar 200 piezas? Use 10 réplicas.

NOTA: Para este ejercicio, tener en cuenta el siguiente glosario.

2.1. Parámetros

N_piezas <- 200
Delta <- 20
n_def_max <- 3
media_D <- 2.4
p_def <- media_D / n_def_max
lambda_def <- 0.2
SEED_P2_BASE <- 20251119

ES_teo <- (media_D) / lambda_def
rho_teo <- ES_teo / Delta

list(
N_piezas = N_piezas, Delta = Delta,
n_def_max = n_def_max, p_def = p_def,
lambda_def = lambda_def,
ES_teorico_min = ES_teo, utilizacion_promedio = rho_teo
)
## $N_piezas
## [1] 200
## 
## $Delta
## [1] 20
## 
## $n_def_max
## [1] 3
## 
## $p_def
## [1] 0.8
## 
## $lambda_def
## [1] 0.2
## 
## $ES_teorico_min
## [1] 12
## 
## $utilizacion_promedio
## [1] 0.6

2.2. Función de simulación (una réplica)

sim_reproceso <- function(N, Delta, n_def_max, p_def, lambda_def, seed = NULL) {
if (!is.null(seed)) set.seed(seed)
llegada <- (0:(N-1)) * Delta
D <- rbinom(N, size = n_def_max, prob = p_def)

S <- numeric(N)
pos <- D > 0
S[pos] <- rgamma(sum(pos), shape = D[pos], rate = lambda_def)

ini <- fin <- numeric(N)
ini[1] <- llegada[1]
fin[1] <- ini[1] + S[1]
if (N > 1) {
for (i in 2:N) {
ini[i] <- max(llegada[i], fin[i-1])
fin[i] <- ini[i] + S[i]
}
}

data.frame(
Pieza = 1:N,
Llegada_min = llegada,
Defectos = D,
Servicio_min = S,
Inicio_min = ini,
Fin_min = fin,
Espera_min = ini - llegada,
En_Sistema_min = fin - llegada
)
}

2.3. 10 réplicas y tiempo total para 200 piezas

R <- 10
resultados <- vector("list", R)
makespan <- numeric(R)

for (r in 1:R) {
run <- sim_reproceso(
N = N_piezas, Delta = Delta,
n_def_max = n_def_max, p_def = p_def,
lambda_def = lambda_def,
seed = SEED_P2_BASE + r
)
resultados[[r]] <- run
makespan[r] <- tail(run$Fin_min, 1)
}

tabla_replicas <- data.frame(
Replica = 1:R,
Tiempo_min = round(makespan, 3),
Tiempo_horas = round(makespan/60, 4)
)

media_ms <- mean(makespan)
sd_ms <- sd(makespan)
tcrit <- qt(0.975, df = R-1)
ic95 <- media_ms + c(-1, 1) * tcrit * sd_ms / sqrt(R)

if (knitr::is_html_output() && requireNamespace("DT", quietly = TRUE)) {
DT::datatable(tabla_replicas, rownames = FALSE,
options = list(pageLength = 10, autoWidth = TRUE))
} else {
knitr::kable(tabla_replicas, caption = "Punto 2 — Tiempos por réplica")
}
c(
media_min     = round(media_ms, 3),
sd_min        = round(sd_ms, 3),
IC95_min_inf  = round(ic95[1], 3),
IC95_min_sup  = round(ic95[2], 3),
media_horas   = round(media_ms/60, 4)
)
##    media_min       sd_min IC95_min_inf IC95_min_sup  media_horas 
##    3992.8510       8.1280    3987.0370    3998.6660      66.5475

2.4. Revisión teórica

Como la utilización promedio 𝜌=𝐸[𝑆]/Δ=12/20=0.6<1, el servidor suele quedar ocioso entre llegadas. Por ello, el tiempo total está dominado por el instante de llegada de la pieza 200 más el servicio de esa última pieza:

\[ \tag{#eq3:teo} t_{\text{teo}} \approx (N-1)\,\Delta + \mathbb{E}[S] = 199\cdot20 + (5\,\mathbb{E}[D]) = 3980 + 12 = 3992\ \text{min} \;(\approx 66.533\ \text{h}). \]

t_arr_200 <- (N_piezas - 1) * Delta
ES_last <- media_D / lambda_def
t_teo <- t_arr_200 + ES_last

c(arribo_200_min = t_arr_200,
E_S_ultima_min = ES_last,
t_teorico_min = t_teo,
t_teorico_horas = t_teo/60)
##  arribo_200_min  E_S_ultima_min   t_teorico_min t_teorico_horas 
##      3980.00000        12.00000      3992.00000        66.53333
h2 <- hist(makespan,
breaks = max(4, floor(sqrt(length(makespan)))),
main = "Tiempo total para 200 piezas",
xlab = "Minutos (makespan)",
col = "gray90", border = "gray40")
abline(v = media_ms, lwd = 2)
abline(v = ic95, lwd = 2, lty = 2)
abline(v = t_teo, col = "red", lwd = 2, lty = 3)

legend("topleft", bty = "n",
legend = c(paste0("Promedio = ", round(media_ms,1), " min"),
paste0("IC95 = [", round(ic95[1],1), ", ", round(ic95[2],1), "]"),
paste0("Teórico \u2248 ", round(t_teo,1), " min (", round(t_teo/60,2), " h)")),
lty = c(1,2,3), lwd = 2, col = c("black","black","red"))

2.5. Conclusión

3. Un camión de reparto tarda 30 ± 10 minutos en ser cargado, 20 ± 5 minutos en ser descargado, y 40 minutos con distribución exponencial en trasladarse, ya sea de su base al lugar de entrega, o del lugar de entrega a su base.
  1. Simule el sistema por 10 horas y realice 5 réplicas.

  2. Calcule un intervalo de confianza para el número de viajes que se pueden hacer en un día.

  3. Sólo hay espacio para cargar un camión a la vez. Si la em presa necesita realizar al menos 10 entregas por día, ¿qué recomendaciones daría para lograrlo? Justifique su respuesta y establezca sus supuestos.

NOTA: Para este ejercicio, tener en cuenta el siguiente glosario.

3.1. Parámetros

H <- 10 * 60 
R3 <- 5
SEED_P3 <- 20251119

load_min <- 20; load_max <- 40
unld_min <- 15; unld_max <- 25
rate_trip <- 1/40

3.2. Simulador con 1 cargador y N camiones

sim_dia_camiones <- function(H, N_trucks = 1, seed = NULL) {
if (!is.null(seed)) set.seed(seed)

cargador_free <- 0

t_base <- rep(0, N_trucks)
entregas <- 0
busy_cargador <- 0

repeat {
j <- which.min(t_base)
t_llega_base <- t_base[j]
if (t_llega_base > H) break

t_ini_carga <- max(t_llega_base, cargador_free)
if (t_ini_carga > H) break

t_carga <- runif(1, load_min, load_max)
t_fin_carga <- t_ini_carga + t_carga

busy_cargador <- busy_cargador + max(0, min(t_fin_carga, H) - t_ini_carga)
cargador_free <- t_fin_carga

t <- t_fin_carga
t <- t + rexp(1, rate_trip)
t <- t + runif(1, unld_min, unld_max)

if (t <= H) entregas <- entregas + 1

t <- t + rexp(1, rate_trip)
t_base[j] <- t

}

data.frame(
entregas = entregas,
util_cargador = busy_cargador / H
)
}

3.3. a. Simule 10 horas, 5 réplicas (1 camión)

set.seed(SEED_P3)
res_1cam <- vector("list", R3)
for (r in 1:R3) {
  res_1cam[[r]] <- sim_dia_camiones(H, N_trucks = 1, seed = SEED_P3 + r)
}
tab_1cam <- do.call(rbind, res_1cam)
tab_1cam$replica <- 1:R3
tab_1cam <- tab_1cam[, c("replica","entregas","util_cargador")]

m1  <- mean(tab_1cam$entregas)
s1  <- sd(tab_1cam$entregas)
tcr <- qt(0.975, df = R3 - 1)
ic1 <- m1 + c(-1, 1) * tcr * s1 / sqrt(R3)

list(
  resultados      = tab_1cam,
  media_entregas  = m1,
  sd              = s1,
  IC95            = ic1
)
## $resultados
##   replica entregas util_cargador
## 1       1        5     0.2439287
## 2       2        6     0.2572088
## 3       3        4     0.2415326
## 4       4        3     0.1931743
## 5       5        4     0.2138388
## 
## $media_entregas
## [1] 4.4
## 
## $sd
## [1] 1.140175
## 
## $IC95
## [1] 2.984285 5.815715

3.4. b) IC del número de viajes (entregas) por día

c(
media_entregas_1cam = round(m1, 3),
IC95_inf = round(ic1[1], 3),
IC95_sup = round(ic1[2], 3)
)
## media_entregas_1cam            IC95_inf            IC95_sup 
##               4.400               2.984               5.816

3.5. c) ¿Cómo lograr ≥ 10 entregas/día con un solo cargador?

Evaluamos 𝑁=1, 2, 3, 4 camiones en el mismo horizonte, con el mismo cargador (capacidad 1).

eval_camiones <- function(N_vals = 1:4, R = 5, H = 600, seed0 = 20251119) {
out <- data.frame()
set.seed(seed0)
for (N in N_vals) {
entreg <- numeric(R)
util   <- numeric(R)
for (r in 1:R) {
rr <- sim_dia_camiones(H, N_trucks = N, seed = seed0 + 100*N + r)
entreg[r] <- rr$entregas
util[r]   <- rr$util_cargador
}
m  <- mean(entreg); s <- sd(entreg)
tC <- qt(0.975, df = R - 1)
IC <- m + c(-1, 1) * tC * s / sqrt(R)
out <- rbind(out, data.frame(
N_camiones = N,
media_entregas = m,
sd = s,
IC95_inf = IC[1],
IC95_sup = IC[2],
util_cargador_prom = mean(util)
))
}
out
}

tab_N <- eval_camiones(N_vals = 1:4, R = R3, H = H, seed0 = SEED_P3)
if (knitr::is_html_output() && requireNamespace("DT", quietly = TRUE)) {
DT::datatable(round(tab_N, 3), options = list(pageLength = 5, autoWidth = TRUE))
} else {
knitr::kable(round(tab_N, 3), caption = "Entregas por día vs. número de camiones (1 cargador)")
}
x <- tab_1cam$entregas
x <- x[!is.na(x)]
stopifnot(length(x) > 0)

m3 <- if (exists("tab_N")) {
  z <- tab_N$media_entregas[tab_N$N_camiones == 3]
  if (length(z) == 1) z else NA_real_
} else NA_real_

xmax <- max(ceiling(max(x)), 10, if (!is.na(m3)) ceiling(m3) else 10) + 0.5
xmin <- floor(min(x)) - 0.5

br <- seq(xmin, xmax, by = 1)
if (length(unique(x)) == 1) br <- c(x[1] - 0.5, x[1] + 0.5)

hist(x,
     breaks = br,
     xlim   = c(xmin, xmax),
     main   = "Entregas en 10 h con 1 camión (5 réplicas)",
     xlab   = "Entregas por día",
     col    = "gray90", border = "gray40")

abline(v = m1, lwd = 2)
abline(v = ic1, lwd = 2, lty = 2)
abline(v = 10, col = "red", lwd = 2, lty = 3)
if (!is.na(m3)) abline(v = m3, col = "orange", lwd = 2, lty = 3)

leg_txt <- c(
  paste0("Promedio (1 cam) = ", round(m1, 2)),
  paste0("IC95 (1 cam) = [", round(ic1[1], 2), ", ", round(ic1[2], 2), "]"),
  "Meta = 10"
)
leg_lty <- c(1, 2, 3)
leg_col <- c("black", "black", "red")

if (!is.na(m3)) {
  leg_txt <- c(leg_txt, paste0("Promedio (3 cam) \u2248 ", round(m3, 2)))
  leg_lty <- c(leg_lty, 3)
  leg_col <- c(leg_col, "orange")
}

legend("topright", bty = "n", legend = leg_txt, lty = leg_lty, lwd = 2, col = leg_col)

Recomendación, claro según resultados obtenidos.

Justificación: el cargador no es el problema (media de carga = 30 min ⇒ capacidad ≈ 20 cargas en 10 h). Sino que, el limitante es el tiempo de ciclo dominado por viajes. Añadir camiones paraleliza viajes/descargas mientras el cargador atiende secuencialmente.

Supuestos.