Problema 1: Soldadura de Barras

1.1. Planteamiento del Problema

Se simulará la soldadura de 500 barras. La longitud total \(L\) es la suma de dos componentes:

  • \(x_1 \sim N(\mu=30, \sigma^2=0.81)\), por lo tanto, \(x_1 \sim N(30, 0.9)\).
  • \(x_2 \sim N(\mu=18, \sigma=0.3)\).

La longitud total (\(L = x_1 + x_2\)) necesita cumplir con las especificaciones de diseño: \(50 \pm 5\) cm.

  • Límite de Especificación Inferior (LSL) = 45 cm.
  • Límite de Especificación Superior (USL) = 55 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}\).

1.2. Simulación y Visualización de Datos

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)")
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)

1.3. Cálculos

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

1.4. Visualización del Proceso (Histograma)

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 = "green", linetype = "dashed", size = 1) +
  geom_vline(xintercept = USL, color = "green", 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()

1.5. Conclusión - Problema 1

Como indica la nota, es importante diferenciar “capacidad” de “control”.

  • Control Estadístico: Se refiere a si el proceso es estable y predecible en el tiempo (se mide con gráficas de control). No podemos determinar esto con los datos dados.
  • Capacidad del Proceso (\(C_p\) y \(C_{pk}\)): Mide si el proceso es capaz de cumplir con las especificaciones.

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.


Problema 2: Estación de Reproceso

2.1. Planteamiento del Problema

Ahora simularemos el tiempo total para procesar 200 piezas bajo un sistema de cola.

  • Llegadas: Determinísticas, 1 pieza cada 20 minutos.
  • Piezas: 200.
  • Defectos (D): \(D \sim \text{Binomial}(n, p)\). Se nos dice \(\mu = 2.4\) y el máximo es 3. La única distribución Binomial que cumple esto es con \(n=3\) y \(p=0.8\) (ya que \(\mu = n \times p = 3 \times 0.8 = 2.4\)).
  • Tiempo de Reparación (T): Exponencial con \(\lambda = 0.2\) piezas/minuto por cada defecto.
    • Esto significa que la media de reparación por defecto es \(1 / \lambda = 1 / 0.2 = 5\) minutos.
    • Si una pieza tiene \(D\) defectos, el tiempo medio total de reparación será \(D \times 5\) minutos.
    • Por lo tanto, el rate (tasa) para una pieza con \(D\) defectos es \(\lambda_D = 1 / (D \times 5)\).
  • Réplicas: 10.

2.2. Simulación del Proceso

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
}

2.3. Resultados - Problema 2

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)
Tiempo Total para Procesar 200 Piezas (10 Réplicas)
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.

2.4. Conclusión - Problema 2

El tiempo promedio para procesar 200 piezas, basado en 10 réplicas, es de aproximadamente 4014.6 minutos.


Problema 3: Camión de Reparto

3.1. Planteamiento del Problema

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.

  • \(T_{\text{carga}}\): Uniforme(\(30 \pm 10\)) \(\implies \text{runif(1, 20, 40)}\)
  • \(T_{\text{viaje\_ida}}\): Exponencial(\(\mu=40\)) \(\implies \text{rexp(1, 1/40)}\)
  • \(T_{\text{descarga}}\): Uniforme(\(20 \pm 5\)) \(\implies \text{runif(1, 15, 25)}\)
  • \(T_{\text{viaje\_vuelta}}\): Exponencial(\(\mu=40\)) \(\implies \text{rexp(1, 1/40)}\)
  • Restricción: (Para un solo camión, la restricción de 1 bahía de carga no genera cola).
  • Simulación: 10 horas (600 min), 5 réplicas.

3.2. Simulación

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
}

3.3. Resultados y Análisis (partes a, b, c)

a) Resultados de las 5 Réplicas

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)")
Viajes Completados en 10 Horas (5 Réplicas)
Replica Viajes_Completados
1 6
2 3
3 4
4 3
5 2

b) Intervalo de Confianza para el Número de Viajes

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 ]

c) Recomendaciones para alcanzar 10 entregas

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:

  • Carga: (20+40)/2 = 30 min
  • Viaje Ida: 40 min
  • Descarga: (15+25)/2 = 20 min
  • Viaje Vuelta: 40 min
  • Total Ciclo Esperado: 30 + 40 + 20 + 40 = 130 minutos

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:

  1. Añadir un segundo camión:Esta sería la forma más sencilla de duplicar la capacidad. No obstante, la limitación de que solo puede cargarse un camión a la vez (indicada en el punto 3c) pasaría a ser el nuevo cuello de botella. En ese caso, los camiones tendrían que esperar turno para acceder a la bahía de carga, por lo que haría falta un modelo de colas más completo (G/G/1) para determinar si dos camiones alcanzan o si el tiempo de espera se vuelve excesivo
  2. Reducir Tiempos de Ciclo:
    • Viajes (80 min / 61.5% del ciclo): Los viajes son el componente más largo. Buscar rutas más cortas o rápidas es prioritario.
    • Carga (30 min / 23% del ciclo): Optimizar el proceso de carga (ej. pre-alistamiento) podría reducir estos 30 minutos.
    • Descarga (20 min / 15.5% del ciclo): Es el tiempo más corto, pero optimizarlo también suma.

Datos Simulados del Problema 3

Adelante se mostrarán los datos detallados de cada ciclo de viaje simulado en las 5 réplicas. Los tiempos están en minutos.

Datos Detallados de Simulación (Problema 3)
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