Objetivo

Esta actividad simula dos procesos (tiempos de atención y tiempos entre llegadas), genera réplicas, calcula medias por réplica e intervalos de confianza del 95% para la media poblacional de cada conjunto de réplicas.

Parámetros y semilla

set.seed(12345)    # reproducibilidad
n_clientes <- 20   # número de observaciones por réplica
n_rep <- 30        # número de réplicas

# parámetros de las distribuciones
mu_normal <- 15    # media (minutos) para tiempos de atención
sd_normal <- 5     # desviación estándar para tiempos de atención
mean_exp <- 3.5    # media (minutos) para tiempos entre llegadas (exponencial)

Simulación: tiempos de atención (Normal)

Generamos n_rep réplicas, cada réplica contiene n_clientes observaciones de una Normal(15, 5).

library(dplyr)

# función para replicar
replicar_normal <- function(n, mu, sd, reps){
  replicate(reps, rnorm(n, mean = mu, sd = sd), simplify = FALSE)
}

sim_normal_list <- replicar_normal(n_clientes, mu_normal, sd_normal, n_rep)

# calcular medias por réplica y estadísticas básicas
medias_normal <- sapply(sim_normal_list, mean)

df_normal <- tibble(
  replica = 1:n_rep,
  media = medias_normal,
  sd_muestra = sapply(sim_normal_list, sd)
)

# media muestral de las medias, sd y error estándar
mean_medias_normal <- mean(df_normal$media)
sd_medias_normal <- sd(df_normal$media)
se_medias_normal <- sd_medias_normal / sqrt(n_rep)

# intervalo de confianza del 95% usando t
alpha <- 0.05
t_crit <- qt(1 - alpha/2, df = n_rep - 1)
ci_normal <- mean_medias_normal + c(-1, 1) * t_crit * (sd_medias_normal / sqrt(n_rep))

list(df = df_normal, mean = mean_medias_normal, sd = sd_medias_normal, ci = ci_normal)
## $df
## # A tibble: 30 × 3
##    replica media sd_muestra
##      <int> <dbl>      <dbl>
##  1       1  15.4       4.17
##  2       2  17.0       6.04
##  3       3  15.5       6.48
##  4       4  16.2       5.76
##  5       5  17.0       5.49
##  6       6  15.3       4.92
##  7       7  15.5       6.65
##  8       8  13.8       4.55
##  9       9  15.4       5.38
## 10      10  16.3       3.43
## # ℹ 20 more rows
## 
## $mean
## [1] 15.39705
## 
## $sd
## [1] 1.154299
## 
## $ci
## [1] 14.96603 15.82808

Simulación: tiempos entre llegadas (Exponencial)

Generamos n_rep réplicas, cada réplica contiene n_clientes observaciones de una Exponencial con media 3.5 (rate = 1/3.5).

rate_exp <- 1 / mean_exp

replicar_exp <- function(n, rate, reps){
  replicate(reps, rexp(n, rate = rate), simplify = FALSE)
}

sim_exp_list <- replicar_exp(n_clientes, rate_exp, n_rep)

medias_exp <- sapply(sim_exp_list, mean)

df_exp <- tibble(
  replica = 1:n_rep,
  media = medias_exp,
  sd_muestra = sapply(sim_exp_list, sd)
)

mean_medias_exp <- mean(df_exp$media)
sd_medias_exp <- sd(df_exp$media)
se_medias_exp <- sd_medias_exp / sqrt(n_rep)

ci_exp <- mean_medias_exp + c(-1, 1) * t_crit * (sd_medias_exp / sqrt(n_rep))

list(df = df_exp, mean = mean_medias_exp, sd = sd_medias_exp, ci = ci_exp)
## $df
## # A tibble: 30 × 3
##    replica media sd_muestra
##      <int> <dbl>      <dbl>
##  1       1  2.95       3.01
##  2       2  3.03       3.05
##  3       3  2.75       2.01
##  4       4  3.50       3.21
##  5       5  4.40       3.48
##  6       6  4.27       4.98
##  7       7  3.71       3.15
##  8       8  2.80       2.75
##  9       9  2.35       1.69
## 10      10  3.49       3.22
## # ℹ 20 more rows
## 
## $mean
## [1] 3.405822
## 
## $sd
## [1] 0.754524
## 
## $ci
## [1] 3.124078 3.687566

Tabla resumen con datos generados

library(knitr)

resumen_normal <- tibble(
  Distribucion = "Normal (tiempos de atención)",
  n_replicas = n_rep,
  observaciones_por_replica = n_clientes,
  media_de_las_medias = round(mean_medias_normal, 4),
  sd_de_las_medias = round(sd_medias_normal, 4),
  CI_95 = paste0("[", round(ci_normal[1], 4), ", ", round(ci_normal[2], 4), "]")
)

resumen_exp <- tibble(
  Distribucion = "Exponencial (tiempos entre llegadas)",
  n_replicas = n_rep,
  observaciones_por_replica = n_clientes,
  media_de_las_medias = round(mean_medias_exp, 4),
  sd_de_las_medias = round(sd_medias_exp, 4),
  CI_95 = paste0("[", round(ci_exp[1], 4), ", ", round(ci_exp[2], 4), "]")
)

resumen <- bind_rows(resumen_normal, resumen_exp)
knitr::kable(resumen, caption = "Resumen de estadísticas por tipo de distribución")
Resumen de estadísticas por tipo de distribución
Distribucion n_replicas observaciones_por_replica media_de_las_medias sd_de_las_medias CI_95
Normal (tiempos de atención) 30 20 15.3971 1.1543 [14.966, 15.8281]
Exponencial (tiempos entre llegadas) 30 20 3.4058 0.7545 [3.1241, 3.6876]

Mostrar tablas de las medias por réplica

knitr::kable(df_normal, caption = "Medias por réplica - Normal")
Medias por réplica - Normal
replica media sd_muestra
1 15.38258 4.169677
2 17.01927 6.044756
3 15.52588 6.484453
4 16.16063 5.755480
5 17.04156 5.489762
6 15.25402 4.922161
7 15.49252 6.645577
8 13.77353 4.549036
9 15.35590 5.376778
10 16.25485 3.432925
11 14.39770 5.383092
12 15.79582 4.415338
13 14.69924 4.828716
14 14.76928 4.436992
15 14.18267 4.487206
16 16.87499 5.376147
17 16.80834 4.484620
18 14.71570 5.179702
19 16.41891 5.282378
20 15.56396 3.923931
21 13.99193 3.814789
22 17.11978 4.566444
23 15.96481 4.767982
24 12.82433 4.328039
25 13.91938 3.566622
26 13.80532 6.716786
27 15.90514 4.062510
28 17.05628 6.531462
29 14.97224 4.025486
30 14.86502 5.266169
knitr::kable(df_exp, caption = "Medias por réplica - Exponencial")
Medias por réplica - Exponencial
replica media sd_muestra
1 2.950775 3.012968
2 3.033997 3.051372
3 2.745498 2.006035
4 3.497821 3.205942
5 4.396083 3.484777
6 4.272137 4.982712
7 3.709507 3.149230
8 2.798299 2.749528
9 2.350923 1.686117
10 3.485756 3.215409
11 2.078442 1.596768
12 2.303058 2.767269
13 2.706443 1.887911
14 3.331752 4.054962
15 3.226602 4.061749
16 5.164625 3.549688
17 2.847309 2.272845
18 3.908204 5.275636
19 2.635798 1.728578
20 3.681067 3.731804
21 4.297997 2.644518
22 2.979855 1.933564
23 3.569325 3.118995
24 2.522614 2.295121
25 4.216354 4.427812
26 4.477085 2.978933
27 3.202750 3.349143
28 3.921198 2.727322
29 4.185239 2.819616
30 3.678138 3.017392

Gráficas

library(ggplot2)
library(patchwork)

# Gráfico para la distribución normal
g1 <- ggplot(df_normal, aes(x = media)) +
  geom_histogram(aes(y = ..density..), bins = 10, fill = "#69b3a2", color = "white", alpha = 0.8) +
  geom_density(color = "#1f78b4", size = 1.2) +
  geom_vline(xintercept = mean_medias_normal, color = "red", linetype = "dashed", size = 1) +
  labs(title = "Distribución de Medias por Réplica (Normal)",
       x = "Media de la Réplica", y = "Densidad") +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 14),
    axis.title = element_text(size = 12)
  )

# Gráfico para la distribución exponencial
g2 <- ggplot(df_exp, aes(x = media)) +
  geom_histogram(aes(y = ..density..), bins = 10, fill = "#ffb74d", color = "white", alpha = 0.8) +
  geom_density(color = "#e65100", size = 1.2) +
  geom_vline(xintercept = mean_medias_exp, color = "red", linetype = "dashed", size = 1) +
  labs(title = "Distribución de Medias por Réplica (Exponencial)",
       x = "Media de la Réplica", y = "Densidad") +
  theme_minimal(base_size = 13) +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5, size = 14),
    axis.title = element_text(size = 12)
  )

# Combinar ambos gráficos lado a lado con título centrado y sin superposición
g_final <- g1 + g2 + plot_annotation(
  title = "Comparación Visual de las Distribuciones de Medias por Réplica",
  theme = theme(
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5, margin = margin(b = 10))
  )
)

g_final