# Datos

meses <- c("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
           "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre",
           "Diciembre")

ocupacion <- c(78, 82, 75, 80, 85, 88, 92, 90, 86, 84, 80, 83)

hotel <- data.frame(mes = meses, ocupacion = ocupacion)
hotel
##           mes ocupacion
## 1       Enero        78
## 2     Febrero        82
## 3       Marzo        75
## 4       Abril        80
## 5        Mayo        85
## 6       Junio        88
## 7       Julio        92
## 8      Agosto        90
## 9  Septiembre        86
## 10    Octubre        84
## 11  Noviembre        80
## 12  Diciembre        83
mean(ocupacion)   # media observada
## [1] 83.58333
sd(ocupacion)     # desviacion estandar observada
## [1] 4.981025
# Funcion de bootstrap
# Genera n_iteraciones submuestras del mismo tamano que los datos
# originales (12), muestreando con reemplazo, y guarda la media de
# cada submuestra.

bootstrap_media <- function(datos, n_iteraciones) {

  medias <- numeric(n_iteraciones)

  for (i in 1:n_iteraciones) {
    muestra <- sample(datos, size = length(datos), replace = TRUE)
    medias[i] <- mean(muestra)
  }

  return(medias)
}
# 1) Bootstrap con 1,000 repeticiones

set.seed(123)
medias_1000 <- bootstrap_media(ocupacion, 1000)

mean(medias_1000)
## [1] 83.57342
ic_1000 <- quantile(medias_1000, c(0.025, 0.975))
ic_1000
##     2.5%    97.5% 
## 80.83125 86.25208
hist(medias_1000,
     breaks = 30,
     main = "Bootstrap - 1,000 repeticiones",
     xlab = "Ocupacion promedio (%)",
     ylab = "Frecuencia",
     col = "lightblue")
abline(v = ic_1000, col = "red", lwd = 2, lty = 2)
abline(v = mean(ocupacion), col = "darkgreen", lwd = 2)

#2)  Bootstrap con 100,000 repeticiones 
# Se deja la misma semilla para que la comparacion sea contra el
# numero de iteraciones y no contra otra corrida aleatoria.

set.seed(123)
medias_100k <- bootstrap_media(ocupacion, 100000)

mean(medias_100k)
## [1] 83.58052
ic_100k <- quantile(medias_100k, c(0.025, 0.975))
ic_100k
##     2.5%    97.5% 
## 80.91667 86.25000
hist(medias_100k,
     breaks = 50,
     main = "Bootstrap - 100,000 repeticiones",
     xlab = "Ocupacion promedio (%)",
     ylab = "Frecuencia",
     col = "lightblue")
abline(v = ic_100k, col = "red", lwd = 2, lty = 2)
abline(v = mean(ocupacion), col = "darkgreen", lwd = 2)

# Comparacion de los dos intervalos
comparacion <- data.frame(
  repeticiones = c(1000, 100000),
  media = c(mean(medias_1000), mean(medias_100k)),
  limite_inf = c(ic_1000[1], ic_100k[1]),
  limite_sup = c(ic_1000[2], ic_100k[2]),
  amplitud = c(ic_1000[2] - ic_1000[1], ic_100k[2] - ic_100k[1])
)
comparacion
##   repeticiones    media limite_inf limite_sup amplitud
## 1        1e+03 83.57342   80.83125   86.25208 5.420833
## 2        1e+05 83.58052   80.91667   86.25000 5.333333
# 3) Correccion: diciembre fue 73% y no 83%

ocupacion_corr <- ocupacion
ocupacion_corr[12] <- 73

mean(ocupacion_corr)
## [1] 82.75
sd(ocupacion_corr)
## [1] 5.848465
set.seed(123)
medias_1000_corr <- bootstrap_media(ocupacion_corr, 1000)
ic_1000_corr <- quantile(medias_1000_corr, c(0.025, 0.975))
ic_1000_corr
##     2.5%    97.5% 
## 79.50000 85.91875
set.seed(123)
medias_100k_corr <- bootstrap_media(ocupacion_corr, 100000)
ic_100k_corr <- quantile(medias_100k_corr, c(0.025, 0.975))
ic_100k_corr
##     2.5%    97.5% 
## 79.50000 85.91667
hist(medias_100k_corr,
     breaks = 50,
     main = "Bootstrap con diciembre corregido (73%) - 100,000 repeticiones",
     xlab = "Ocupacion promedio (%)",
     ylab = "Frecuencia",
     col = "lightpink")
abline(v = ic_100k_corr, col = "red", lwd = 2, lty = 2)
abline(v = mean(ocupacion_corr), col = "darkgreen", lwd = 2)

# Tabla final con los cuatro escenarios
resultados <- data.frame(
  escenario = c("Original 1,000", "Original 100,000",
                "Corregido 1,000", "Corregido 100,000"),
  media = c(mean(medias_1000), mean(medias_100k),
            mean(medias_1000_corr), mean(medias_100k_corr)),
  limite_inf = c(ic_1000[1], ic_100k[1], ic_1000_corr[1], ic_100k_corr[1]),
  limite_sup = c(ic_1000[2], ic_100k[2], ic_1000_corr[2], ic_100k_corr[2])
)
resultados$amplitud <- resultados$limite_sup - resultados$limite_inf
resultados
##           escenario    media limite_inf limite_sup amplitud
## 1    Original 1,000 83.57342   80.83125   86.25208 5.420833
## 2  Original 100,000 83.58052   80.91667   86.25000 5.333333
## 3   Corregido 1,000 82.77758   79.50000   85.91875 6.418750
## 4 Corregido 100,000 82.74665   79.50000   85.91667 6.416667
# 4) Riesgo de caer por debajo del 80%
# Proporcion de submuestras bootstrap cuya media queda por debajo
# del umbral de 80%, antes y despues de la correccion.

mean(medias_100k < 80)
## [1] 0.00381
mean(medias_100k_corr < 80)
## [1] 0.04367