Se simulará la soldadura de 500 barras. La longitud total \(L\) es la suma de dos componentes:
La longitud total (\(L = x_1 + x_2\)) necesita cumplir con las especificaciones de diseño: \(50 \pm 5\) cm.
Se requiere estimar la probabilidad de que una barra esté fuera de especificaciones (OOS) y se calcularán los índices de capacidad \(C_p\) y \(C_{pk}\).
Generamos las 500 simulaciones y las guardamos en un
data.frame para inspeccionarlas.
set.seed(42) # Para reproducibilidad
n_sim <- 500
# Parámetros
media_x1 <- 30
sd_x1 <- sqrt(0.81) # Varianza es 0.81, DE es la raíz
media_x2 <- 18
sd_x2 <- 0.3
LSL <- 45
USL <- 55
# Simulación
x1 <- rnorm(n_sim, mean = media_x1, sd = sd_x1)
x2 <- rnorm(n_sim, mean = media_x2, sd = sd_x2)
L_total <- x1 + x2 # Longitud total de las 500 barras
# 1. Crear un data.frame con los resultados
datos_simulados_p1 <- data.frame(
Simulacion_N = 1:n_sim,
x1 = round(x1, 4),
x2 = round(x2, 4),
Longitud_Total_L = round(L_total, 4)
)
# 2. Mostrar los primeros 6 resultados
cat("Mostrando las primeras 6 de 500 simulaciones:\n")
## Mostrando las primeras 6 de 500 simulaciones:
kable(head(datos_simulados_p1), caption = "Primeras 6 Simulaciones (Problema 1)")
| Simulacion_N | x1 | x2 | Longitud_Total_L |
|---|---|---|---|
| 1 | 31.2339 | 18.3087 | 49.5426 |
| 2 | 29.4918 | 18.2744 | 47.7662 |
| 3 | 30.3268 | 17.9993 | 48.3261 |
| 4 | 30.5696 | 18.0408 | 48.6104 |
| 5 | 30.3638 | 17.7840 | 48.1478 |
| 6 | 29.9045 | 17.9406 | 47.8451 |
# 3. Guardar los 500 resultados en un CSV
write.csv(datos_simulados_p1, "problema1_simulacion_barras.csv", row.names = FALSE)
Ahora, calculamos las métricas solicitadas usando los 500 datos simulados de \(L\).
# Usamos el vector L_total del chunk anterior
L <- L_total
# 1. Probabilidad de estar Fuera de Especificaciones (OOS)
fuera_spec <- sum(L < LSL | L > USL)
prob_fuera_spec <- fuera_spec / n_sim
cat(paste("Total de barras simuladas:", n_sim, "\n"))
## Total de barras simuladas: 500
cat(paste("Barras fuera de especificación (OOS):", fuera_spec, "\n"))
## Barras fuera de especificación (OOS): 0
cat(paste("Probabilidad estimada de OOS:", round(prob_fuera_spec * 100, 2), "%\n\n"))
## Probabilidad estimada de OOS: 0 %
# 2. Índices de Capacidad (Cp y Cpk)
# Usamos la media y desviación de nuestros datos simulados
mu_proceso <- mean(L)
sigma_proceso <- sd(L)
# Fórmula Cp
Cp <- (USL - LSL) / (6 * sigma_proceso)
# Fórmula Cpk
Cpk_sup <- (USL - mu_proceso) / (3 * sigma_proceso)
Cpk_inf <- (mu_proceso - LSL) / (3 * sigma_proceso)
Cpk <- min(Cpk_sup, Cpk_inf)
# Imprimir resultados de capacidad
cat(paste("Media del proceso (μ):", round(mu_proceso, 4), "\n"))
## Media del proceso (μ): 47.9665
cat(paste("Desv. Estándar del proceso (σ):", round(sigma_proceso, 4), "\n\n"))
## Desv. Estándar del proceso (σ): 0.9258
cat(paste("Índice Cp:", round(Cp, 4), "\n"))
## Índice Cp: 1.8003
cat(paste("Índice Cpk:", round(Cpk, 4), "\n"))
## Índice Cpk: 1.0681
Este gráfico muestra las 500 longitudes simuladas. Las líneas rojas son los límites de especificación. La línea azul es la media de nuestro proceso.
# --- NUEVO: Visualización de las 500 simulaciones ---
ggplot(data = datos_simulados_p1, aes(x = Longitud_Total_L)) +
geom_histogram(binwidth = 0.2, fill = "lightblue", color = "black", alpha = 0.8) +
# Límites de especificación
geom_vline(xintercept = LSL, color = "red", linetype = "dashed", size = 1) +
geom_vline(xintercept = USL, color = "red", linetype = "dashed", size = 1) +
# Media del proceso
geom_vline(xintercept = mu_proceso, color = "blue", linetype = "dotted", size = 1.2) +
labs(title = "Distribución de las 500 Longitudes de Barra Simuladas",
x = "Longitud Total (cm)",
y = "Frecuencia (de 500)",
caption = paste("LSL (45cm) y USL (55cm) en rojo. Media (", round(mu_proceso, 2), "cm) en azul.")) +
theme_minimal()
Como indica la nota, es importante diferenciar “capacidad” de “control”.
Resultados: 1. La probabilidad estimada de que una barra esté fuera de especificaciones es de 0%. 2. El índice \(C_p \approx 1.8\). Como \(C_p > 1.33\), el proceso tiene una dispersión (varianza) lo suficientemente pequeña como para caber dentro de las especificaciones. 3. El índice \(C_{pk} \approx 1.07\). Este es el índice clave. Un \(C_{pk} < 1.33\) (y especialmente tan cercano a 1.0) indica que, aunque la dispersión es buena, el proceso no está centrado.
Respuesta: Como se observa en el histograma, la media del proceso (\(\mu \approx 48\)) está demasiado cerca del LSL (45). Por lo tanto, el proceso no se considera capaz (\(C_{pk} < 1.33\)) de cumplir las especificaciones de forma robusta, ya que no está centrado.
Ahora simularemos el tiempo total para procesar 200 piezas bajo un sistema de cola.
Usamos un bucle para simular el sistema de colas (D/G/1) donde el taller es un servidor único. Nota: Se mostrarán los resultados finales de las 10 réplicas
set.seed(42)
n_replicas <- 10
n_piezas <- 200
tasa_llegada <- 20 # minutos entre piezas
lambda_defecto <- 0.2
media_t_defecto <- 1 / lambda_defecto # 5 minutos
# Vector para guardar el tiempo final de cada réplica
resultados_replicas_t2 <- numeric(n_replicas)
# Bucle para las 10 réplicas
for (i in 1:n_replicas) {
tiempo_salida_taller <- 0 # El taller está libre al inicio
# Bucle para las 200 piezas
for (j in 1:n_piezas) {
# 1. Tiempo de llegada de la pieza j
tiempo_llegada <- j * tasa_llegada
# 2. Simular defectos y tiempo de reparación
defectos <- rbinom(1, size = 3, prob = 0.8)
tiempo_reparacion <- 0
if (defectos > 0) {
media_t_total <- defectos * media_t_defecto
tasa_total <- 1 / media_t_total
tiempo_reparacion <- rexp(1, rate = tasa_total)
}
# 3. Simulación de la cola
# El taller no puede empezar a reparar antes de que (A) la pieza llegue
# y (B) el taller esté libre del trabajo anterior.
tiempo_inicio_reparacion <- max(tiempo_llegada, tiempo_salida_taller)
# 4. Tiempo de finalización
tiempo_fin_reparacion <- tiempo_inicio_reparacion + tiempo_reparacion
# 5. Actualizar el estado del taller
tiempo_salida_taller <- tiempo_fin_reparacion
}
# Guardar el tiempo final de la última pieza
resultados_replicas_t2[i] <- tiempo_salida_taller
}
A continuación se muestran los tiempos totales (en minutos) que tomó procesar las 200 piezas en cada una de las 10 réplicas.
# Crear la tabla de resultados
tabla_resultados_t2 <- data.frame(
Replica = 1:n_replicas,
Tiempo_Total_Minutos = resultados_replicas_t2
)
# Imprimir la tabla
kable(tabla_resultados_t2,
caption = "Tiempo Total para Procesar 200 Piezas (10 Réplicas)",
digits = 2)
| Replica | Tiempo_Total_Minutos |
|---|---|
| 1 | 4018.83 |
| 2 | 4009.64 |
| 3 | 4015.58 |
| 4 | 4003.34 |
| 5 | 4012.00 |
| 6 | 4040.39 |
| 7 | 4000.80 |
| 8 | 4023.88 |
| 9 | 4012.42 |
| 10 | 4009.12 |
# Calcular e imprimir el promedio
tiempo_promedio <- mean(resultados_replicas_t2)
cat(paste("\n\nTiempo promedio de las 10 réplicas:", round(tiempo_promedio, 2), "minutos.\n"))
##
##
## Tiempo promedio de las 10 réplicas: 4014.6 minutos.
El tiempo total promedio para procesar 200 piezas, basado en 10 réplicas, es de aproximadamente 4014.6 minutos.
Se simula un solo camión de reparto durante un día laboral de 10 horas (600 minutos) para estimar el número de viajes completados.
Simulamos el ciclo del camión 5 veces. Un “viaje” se cuenta como completado después de la descarga.
set.seed(42)
n_replicas_camion <- 5
tiempo_simulacion <- 600 # 10 horas * 60 minutos
# Vector para guardar el número de viajes por réplica
viajes_por_replica <- numeric(n_replicas_camion)
# --- NUEVO: Data.frame para guardar TODOS los ciclos ---
todos_los_ciclos <- data.frame()
# Bucle de las 5 réplicas
for (i in 1:n_replicas_camion) {
tiempo_actual <- 0
viajes_completados <- 0
# Bucle 'while' que simula el día de 10 horas
while (TRUE) {
# Tiempos del ciclo
t_carga <- runif(1, min = 20, max = 40)
t_viaje_ida <- rexp(1, rate = 1/40)
t_descarga <- runif(1, min = 15, max = 25)
# Tiempo para completar la entrega (sin incluir la vuelta)
tiempo_hasta_entrega <- t_carga + t_viaje_ida + t_descarga
# Si no puede completar la entrega dentro del tiempo, se detiene
if (tiempo_actual + tiempo_hasta_entrega > tiempo_simulacion) {
break
}
# Si la completa, actualizamos tiempo y contamos el viaje
tiempo_actual <- tiempo_actual + tiempo_hasta_entrega
viajes_completados <- viajes_completados + 1
# Ahora simulamos la vuelta a la base
t_viaje_vuelta <- rexp(1, rate = 1/40)
# --- NUEVO: Guardar datos del ciclo ---
# Guardamos los datos de este ciclo antes de verificar si puede volver
todos_los_ciclos <- rbind(todos_los_ciclos, data.frame(
Replica = i,
Viaje_N = viajes_completados,
T_Carga = t_carga,
T_Viaje_Ida = t_viaje_ida,
T_Descarga = t_descarga,
T_Viaje_Vuelta = t_viaje_vuelta,
Tiempo_Acumulado = tiempo_actual + t_viaje_vuelta # Tiempo al final del ciclo
))
# --- Fin de adición ---
# Si no puede volver a la base dentro del tiempo, se detiene
# (El viaje ya fue contado, pero no puede iniciar uno nuevo)
if (tiempo_actual + t_viaje_vuelta > tiempo_simulacion) {
break
}
# Si puede volver, actualizamos el tiempo y el ciclo reinicia
tiempo_actual <- tiempo_actual + t_viaje_vuelta
}
# Guardamos el total de viajes de esta réplica
viajes_por_replica[i] <- viajes_completados
}
tabla_resultados_t3 <- data.frame(
Replica = 1:n_replicas_camion,
Viajes_Completados = viajes_por_replica
)
kable(tabla_resultados_t3, caption = "Viajes Completados en 10 Horas (5 Réplicas)")
| Replica | Viajes_Completados |
|---|---|
| 1 | 6 |
| 2 | 3 |
| 3 | 4 |
| 4 | 3 |
| 5 | 2 |
Usamos t.test() sobre nuestros 5 resultados para
calcular el IC del 95%.
ic_viajes <- t.test(viajes_por_replica, conf.level = 0.95)
# Imprimir el IC
cat(paste("\nMedia de viajes:", round(ic_viajes$estimate, 2), "\n"))
##
## Media de viajes: 3.6
cat(paste("Intervalo de Confianza 95% para los viajes: [",
round(ic_viajes$conf.int[1], 4),
",",
round(ic_viajes$conf.int[2], 4),
"]\n"))
## Intervalo de Confianza 95% para los viajes: [ 1.7169 , 5.4831 ]
Análisis: El intervalo de confianza (1.72 - 5.48) está muy por debajo del objetivo de 10 entregas. El problema es el largo tiempo de ciclo para un solo camión.
El tiempo de ciclo esperado (promedio) es:
En 10 horas (600 minutos), un camión solo puede hacer \(600 / 130 \approx 4.6\) viajes, lo cual coincide con nuestra simulación.
Recomendaciones:
Adelante se mostrarán los datos detallados de cada ciclo de viaje simulado en las 5 réplicas. Los tiempos están en minutos.
| Replica | Viaje_N | T_Carga | T_Viaje_Ida | T_Descarga | T_Viaje_Vuelta | Tiempo_Acumulado |
|---|---|---|---|---|---|---|
| 1 | 1 | 38.30 | 7.93 | 21.42 | 1.53 | 69.17 |
| 1 | 2 | 34.73 | 58.55 | 21.57 | 16.41 | 200.43 |
| 1 | 3 | 29.15 | 17.53 | 24.35 | 28.59 | 300.05 |
| 1 | 4 | 29.25 | 3.26 | 19.75 | 4.83 | 357.13 |
| 1 | 5 | 38.08 | 59.84 | 24.89 | 2.29 | 482.23 |
| 1 | 6 | 27.80 | 12.39 | 22.38 | 24.88 | 569.68 |
| 2 | 1 | 36.66 | 199.84 | 21.12 | 48.46 | 306.07 |
| 2 | 2 | 28.72 | 118.82 | 24.74 | 52.34 | 530.68 |
| 2 | 3 | 32.80 | 9.24 | 18.98 | 22.78 | 614.48 |
| 3 | 1 | 20.78 | 19.90 | 21.77 | 70.26 | 132.71 |
| 3 | 2 | 25.22 | 1.15 | 21.76 | 15.71 | 196.55 |
| 3 | 3 | 23.79 | 31.13 | 23.28 | 15.46 | 290.21 |
| 3 | 4 | 24.81 | 125.93 | 16.40 | 60.93 | 518.28 |
| 4 | 1 | 30.29 | 273.86 | 20.82 | 65.98 | 390.95 |
| 4 | 2 | 27.18 | 11.65 | 22.76 | 5.09 | 457.63 |
| 4 | 3 | 24.67 | 100.77 | 15.86 | 36.56 | 635.49 |
| 5 | 1 | 33.35 | 338.49 | 22.34 | 41.02 | 435.20 |
| 5 | 2 | 30.30 | 19.52 | 21.19 | 10.10 | 516.31 |