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.
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)
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
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
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")
| 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] |
knitr::kable(df_normal, caption = "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")
| 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 |
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)