Una empresa dedicada a la generación de energía renovable desea evaluar el rendimiento de sus 20 generadores eléctricos portátiles, alimentados con biocombustible. Estos generadores se utilizan en proyectos remotos, donde la eficiencia energética es crucial para minimizar costos y reducir la huella ambiental. Para el estudio, se mide la eficiencia energética de cada generador, expresada en kilovatios-hora por litro de combustible (kWh/L). Los resultados son:
muestra <- c(6.12, 5.87, 5.45, 6.33, 5.71, 6.04, 5.92, 5.65, 6.18, 5.78, 5.95, 6.21, 5.63, 5.79, 6.11, 5.88, 6.02, 5.76, 5.85, 6.10)
El objetivo es estimar un intervalo de confianza al 95% para la eficiencia media.
# Definir la muestra antes de usarla
muestra <- c(6.12, 5.87, 5.45, 6.33, 5.71, 6.04, 5.92, 5.65, 6.18,
5.78, 5.95, 6.21, 5.63, 5.79, 6.11, 5.88, 6.02, 5.76, 5.85, 6.10)
1.1 Visualización de la Distribución
Se grafica un histograma con curva de densidad para observar si los datos parecen seguir una distribución normal.
library(ggplot2)
# Crear un data frame con la muestra
df <- data.frame(muestra)
# Histograma con curva de densidad
ggplot(df, aes(x = muestra)) +
geom_histogram(aes(y = ..density..), bins = 10, fill = "skyblue", color = "black", alpha = 0.7) +
geom_density(color = "red", size = 1) +
labs(title = "Histograma y Curva de Densidad de la Muestra",
x = "Eficiencia Energética (kWh/L)",
y = "Densidad") +
theme_minimal()
1.2 Pruebas de Normalidad
Se aplican las pruebas Shapiro-Wilk y Kolmogorov-Smirnov para evaluar si la muestra proviene de una distribución normal.
# Prueba de Shapiro-Wilk
shapiro_test <- shapiro.test(muestra)
# Prueba de Kolmogorov-Smirnov
ks_test <- ks.test(muestra, "pnorm", mean(muestra), sd(muestra))
# Mostrar resultados
shapiro_test
##
## Shapiro-Wilk normality test
##
## data: muestra
## W = 0.98845, p-value = 0.9955
ks_test
##
## Exact one-sample Kolmogorov-Smirnov test
##
## data: muestra
## D = 0.093219, p-value = 0.9882
## alternative hypothesis: two-sided
1.3 Hipótesis:
H₀ (Hipótesis nula): Los datos siguen una distribución normal. H₁ (Hipótesis alternativa): Los datos NO siguen una distribución normal. Se considera un nivel de significancia de 0.05. Si p-value < 0.05, se rechaza H₀, indicando que los datos no siguen una distribución normal.
2.1. Media de la Muestra
media_muestra <- mean(muestra)
media_muestra
## [1] 5.9175
2.2. Generación de Muestras Bootstrap Se generan 1000 muestras bootstrap con reemplazo y se calcula la media de cada una.
set.seed(123) # Fijar semilla para reproducibilidad
# Función de Bootstrap
bootstrap_function <- function(data, indices) {
return(mean(data[indices]))
}
# Aplicar Bootstrap con 1000 repeticiones
bootstrap_result <- boot(data = muestra, statistic = bootstrap_function, R = 1000)
# Mostrar resultados básicos
bootstrap_result
##
## ORDINARY NONPARAMETRIC BOOTSTRAP
##
##
## Call:
## boot(data = muestra, statistic = bootstrap_function, R = 1000)
##
##
## Bootstrap Statistics :
## original bias std. error
## t1* 5.9175 -0.0026195 0.04801282
Se calculan los intervalos de confianza al 95% usando percentiles.
# Intervalo de confianza por percentiles (Bootstrap)
ci_bootstrap <- boot.ci(bootstrap_result, type = c("perc", "bca"))
# Mostrar Intervalos
ci_bootstrap
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 1000 bootstrap replicates
##
## CALL :
## boot.ci(boot.out = bootstrap_result, type = c("perc", "bca"))
##
## Intervals :
## Level Percentile BCa
## 95% ( 5.819, 6.007 ) ( 5.820, 6.008 )
## Calculations and Intervals on Original Scale
Si los datos son normales, se usa el intervalo de confianza paramétrico basado en la distribución t de Student.
t.test(muestra, conf.level = 0.95)
##
## One Sample t-test
##
## data: muestra
## t = 118.56, df = 19, p-value < 2.2e-16
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## 5.813038 6.021962
## sample estimates:
## mean of x
## 5.9175
Se verificar si se cumplen las condiciones para un método paramétrico con el siguiente analisis
# Calcular la media y desviación estándar
media_muestral <- mean(muestra)
desv_est_muestral <- sd(muestra)
n <- length(muestra)
# Calcular el intervalo de confianza paramétrico con t de Student
alpha <- 0.05
t_critico <- qt(1 - alpha/2, df = n - 1) # Valor crítico t para 95% de confianza
error_est <- desv_est_muestral / sqrt(n)
# Intervalo de confianza
IC_parametrico <- c(media_muestral - t_critico * error_est, media_muestral + t_critico * error_est)
IC_parametrico
## [1] 5.813038 6.021962
Se comparan los intervalos obtenidos con el método paramétrico y Bootstrap.
# Comparación de intervalos
cat("Intervalo Paramétrico:", t.test(muestra)$conf.int, "\n")
## Intervalo Paramétrico: 5.813038 6.021962
cat("Intervalo Bootstrap Percentil:", ci_bootstrap$perc[4:5], "\n")
## Intervalo Bootstrap Percentil: 5.819025 6.007487
cat("Intervalo Bootstrap BCa:", ci_bootstrap$bca[4:5], "\n")
## Intervalo Bootstrap BCa: 5.819775 6.008187
En el procedimiento bootstrap, ya calculamos los percentiles 2.5 y 97.5 de las medias muestrales bootstrap. Ahora, comparamos ambos métodos.
# Cargar librerías necesarias
library(boot)
Para obtener los intervalos de confianza por Bootstrap, seguimos estos pasos:
6.1 Calculamos la media de cada muestra Bootstrap
# Función para calcular la media (para bootstrapping)
boot_mean <- function(data, indices) {
return(mean(data[indices]))
}
6.2 Generamos 1000 muestras Bootstrap con reemplazo
# Aplicar bootstrap con 1000 iteraciones
set.seed(123) # Fijar semilla para reproducibilidad
resultados_boot <- boot(data = muestra, statistic = boot_mean, R = 1000)
6.3 Obtenemos los percentiles 2.5% y 97.5% de las medias Bootstrap
# Intervalo de confianza por percentiles (Método No Paramétrico)
IC_bootstrap_percentil <- boot.ci(resultados_boot, type = "perc")$percent[4:5]
# Intervalo de confianza bootstrap basado en la normal
IC_bootstrap_normal <- boot.ci(resultados_boot, type = "norm")$normal[2:3]
6.4 Calculamos el intervalo de confianza bootstrap basado en la normal
# Cargar librerías necesarias
library(boot)
# Función para calcular la media
media_boot <- function(data, indices) {
return(mean(data[indices]))
}
# Generar 1000 muestras bootstrap
set.seed(123) # Para reproducibilidad
bootstrap_res <- boot(data = muestra, statistic = media_boot, R = 1000)
# Calcular el intervalo de confianza usando el método t
IC_bootstrap_t <- boot.ci(bootstrap_res, type = "bca")$bca[4:5]
# Verificar los resultados
print(IC_bootstrap_t)
## [1] 5.819775 6.008187
6.5 Analisamos mediante graficos los intervalos
# Crear un data frame con los intervalos
df_intervals <- data.frame(
Metodo = c("Bootstrap Percentil", "Bootstrap t", "Paramétrico"),
Media = c(mean(muestra), mean(muestra), mean(muestra)),
LímiteInferior = c(IC_bootstrap_percentil[1], IC_bootstrap_t[1], IC_parametrico[1]),
LímiteSuperior = c(IC_bootstrap_percentil[2], IC_bootstrap_t[2], IC_parametrico[2])
)
# Gráfico con ggplot2
library(ggplot2)
ggplot(df_intervals, aes(x = Metodo, y = Media)) +
geom_pointrange(aes(ymin = LímiteInferior, ymax = LímiteSuperior), size = 1.2, color = "blue") +
theme_minimal() +
labs(title = "Comparación de Intervalos de Confianza",
y = "Media Estimada (kWh/L)", x = "Método")
# Cargar librerías necesarias
library(boot) # Para bootstrap
library(ggplot2) # Para gráficos
# Datos: eficiencia energética en kWh/L
muestra <- c(6.12, 5.87, 5.45, 6.33, 5.71, 6.04, 5.92, 5.65, 6.18,
5.78, 5.95, 6.21, 5.63, 5.79, 6.11, 5.88, 6.02, 5.76, 5.85, 6.10)
# Tamaño de la muestra
n <- length(muestra)
# Función para calcular la media en el Bootstrap
bootstrap_mean <- function(data, indices) {
return(mean(data[indices]))
}
# Generar Bootstrap con 1000 repeticiones
set.seed(123) # Fijar semilla para reproducibilidad
boot_results <- boot(muestra, statistic = bootstrap_mean, R = 1000)
# Calcular intervalos de confianza Bootstrap
IC_bootstrap_percentil <- boot.ci(boot_results, type = "perc")$percent[4:5]
IC_bootstrap_normal <- boot.ci(boot_results, type = "norm")$normal[2:3]
# Calcular intervalo de confianza paramétrico (Distribución t de Student)
alpha <- 0.05 # Nivel de confianza 95%
error_margin <- qt(1 - alpha/2, df = n-1) * sd(muestra) / sqrt(n)
IC_parametrico <- c(mean(muestra) - error_margin, mean(muestra) + error_margin)
# Crear dataframe para la visualización
df_IC <- data.frame(
Metodo = c("Bootstrap Percentil", "Bootstrap Normal", "Paramétrico"),
LI = c(IC_bootstrap_percentil[1], IC_bootstrap_normal[1], IC_parametrico[1]),
LS = c(IC_bootstrap_percentil[2], IC_bootstrap_normal[2], IC_parametrico[2])
)
library(ggplot2)
# Crear un data frame con los intervalos de confianza
df_IC <- data.frame(
Metodo = c("Bootstrap Percentil", "Bootstrap t", "Paramétrico"),
IC_min = c(IC_bootstrap_percentil[1], IC_bootstrap_t[1], IC_parametrico[1]),
IC_max = c(IC_bootstrap_percentil[2], IC_bootstrap_t[2], IC_parametrico[2]),
Media = mean(muestra) # Para mostrar la media como referencia
)
# Graficar los intervalos de confianza
ggplot(df_IC, aes(x = Metodo, y = Media, ymin = IC_min, ymax = IC_max)) +
geom_pointrange(size = 1.2, color = "blue") +
geom_point(color = "red", size = 3) +
labs(title = "Comparación de Intervalos de Confianza",
x = "Método",
y = "Eficiencia Energética (kWh/L)") +
theme_minimal()
Se comparan los intervalos de confianza obtenidos, se identifica que los intervalos de Bootstrap y el método paramétrico son similares, por tanto se puede concluir que el método paramétrico es adecuado. Por tanto se puede indicar que la normalidad se cumple.
Normalidad: Los resultados de las pruebas estadísticas y visualización indican si la muestra es normal
Bootstrap: Método flexible y útil para obtener intervalos de confianza sin suponer normalidad.
Método Paramétrico vs. No Paramétrico: Se comparan los resultados y se identifica que los intervalos son similares, la distribución de los datos es aproximadamente normal, por lo que el intervalo paramétrico es válido.