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(20251022)    # 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).

set.seed(20251022)
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.7       4.78
##  2       2  17.0       3.71
##  3       3  15.9       5.05
##  4       4  14.2       4.33
##  5       5  15.6       5.40
##  6       6  13.8       4.23
##  7       7  15.9       4.47
##  8       8  16.1       5.78
##  9       9  14.8       4.24
## 10      10  14.0       4.79
## # ℹ 20 more rows
## 
## $mean
## [1] 14.95868
## 
## $sd
## [1] 0.9815764
## 
## $ci
## [1] 14.59215 15.32520

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

set.seed(20251023)
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.30       2.55
##  2       2  4.04       4.22
##  3       3  3.21       3.99
##  4       4  3.31       2.59
##  5       5  3.49       2.45
##  6       6  2.67       2.07
##  7       7  2.92       3.79
##  8       8  2.27       1.84
##  9       9  3.32       3.54
## 10      10  2.29       1.62
## # ℹ 20 more rows
## 
## $mean
## [1] 3.303562
## 
## $sd
## [1] 0.6539728
## 
## $ci
## [1] 3.059365 3.547759

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 14.9587 0.9816 [14.5922, 15.3252]
Exponencial (tiempos entre llegadas) 30 20 3.3036 0.6540 [3.0594, 3.5478]

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.73770 4.778413
2 17.00113 3.713889
3 15.88233 5.045164
4 14.22902 4.330240
5 15.60722 5.400567
6 13.83201 4.227178
7 15.91218 4.469018
8 16.14678 5.783364
9 14.78197 4.244828
10 13.98800 4.790883
11 15.93700 4.296415
12 13.12921 5.273866
13 15.19350 3.255948
14 12.65100 5.022497
15 15.17166 4.346083
16 14.13715 6.333571
17 15.37527 4.499672
18 14.02234 5.364851
19 14.19074 4.863625
20 15.73842 5.756154
21 14.37201 5.007220
22 15.80166 5.941630
23 14.76931 4.996931
24 15.78604 4.238273
25 14.21629 4.923150
26 14.29051 4.625505
27 15.82190 5.645353
28 15.64247 3.604937
29 14.79416 4.864406
30 14.60135 3.406915
knitr::kable(df_exp, caption = "Medias por réplica - Exponencial")
Medias por réplica - Exponencial
replica media sd_muestra
1 2.297888 2.552125
2 4.043884 4.219551
3 3.211334 3.994812
4 3.311602 2.592234
5 3.492655 2.447479
6 2.671921 2.071016
7 2.915276 3.785253
8 2.273692 1.837026
9 3.317712 3.540374
10 2.291087 1.615928
11 2.824782 2.197058
12 3.842919 3.922500
13 2.894826 2.414354
14 3.351773 3.784671
15 2.763044 2.316003
16 2.423808 2.626267
17 3.737572 3.083799
18 4.264823 5.487928
19 3.395186 3.981927
20 4.341441 5.075387
21 3.267726 2.804264
22 3.032849 3.080989
23 3.556680 3.326505
24 4.353132 2.798612
25 2.981326 2.926495
26 4.712213 3.847506
27 3.615634 2.820126
28 3.303561 3.263639
29 3.934293 3.441746
30 2.682221 2.438359

Gráficas

par(mfrow = c(1,2))

hist(df_normal$media, main = "Histograma: medias por réplica (Normal)",
     xlab = "Media de la réplica", breaks = 8)
abline(v = mean_medias_normal, lwd = 2)

hist(df_exp$media, main = "Histograma: medias por réplica (Exponencial)",
     xlab = "Media de la réplica", breaks = 8)
abline(v = mean_medias_exp, lwd = 2)