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(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)
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
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
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 | 15.3971 | 1.1543 | [14.966, 15.8281] |
| Exponencial (tiempos entre llegadas) | 30 | 20 | 3.4058 | 0.7545 | [3.1241, 3.6876] |
knitr::kable(df_normal, caption = "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")
| 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 |
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