La velocidad del viento se define como una variable cuantitativa continua, ya que se expresa mediante valores numéricos reales que pueden adoptar cualquier valor decimal dentro de un intervalo determinado. Esta característica de continuidad es fundamentalpermite registrar con precisión la magnitud del desplazamiento del aire, reflejando fielmente la variabilidad de las ráfagas y la intensidad en cada medición.
Importamos el archivo “VOLCAN A.csv” desde una ruta local y lo almacena en el objeto datos, usando espacios o tabulaciones como separador.
Extraemos la variable viento, omitimos las celdas en blanco o valores iguales a cero y verificamos el tamaño muestral
En la tabla de distribución de frecuencias de la variable viento en el que el número de clases se determinó mediante la regla de Sturges y el ancho de clase se calculó a partir del rango total de los datos.
# 1. Definir el vector de datos
datos_analizar <- viento
# 2. Cálculos base
n <- length(datos_analizar)
xmin <- min(datos_analizar)
xmax <- max(datos_analizar)
R <- xmax - xmin
# Regla de Sturges para calcular K
K <- ceiling(1 + log2(n))
# Amplitud (A)
A <- R / K
# 3. Definición de Límites y Marcas de Clase (MC)
cortes <- seq(xmin, xmax, length.out = K + 1)
Li <- head(cortes, -1)
Ls <- tail(cortes, -1)
MC <- (Li + Ls) / 2
# 4. Cálculo de Frecuencias (ni)
ni <- as.vector(table(cut(datos_analizar, breaks = cortes,
include.lowest = TRUE, right = FALSE)))
# 5. Frecuencias relativas y acumuladas
hi <- ni / sum(ni) * 100
Ni_asc <- cumsum(ni)
Ni_desc <- rev(cumsum(rev(ni)))
Hi_asc <- cumsum(hi)
Hi_desc <- rev(cumsum(rev(hi)))
# 6. Creación del Data Frame final
TDF <- data.frame(
round(Li, 2),
round(Ls, 2),
round(MC, 2),
ni,
hi_porc = round(hi, 2),
Ni_asc,
Ni_desc,
Hi_asc_porc = round(Hi_asc, 2),
Hi_desc_porc = round(Hi_desc, 2)
)
# 7. Formato de tabla para el reporte
kable(TDF,
caption = paste("Tabla No. 1: Distribución de Frecuencias de la variable Viento "),
col.names = c("Lím. Inf.", "Lím. Sup.", "Marca Clase", "ni", "hi (%)",
"Ni Asc.", "Ni Desc.", "Hi Asc. (%)", "Hi Desc. (%)"),
digits = 2)| Lím. Inf. | Lím. Sup. | Marca Clase | ni | hi (%) | Ni Asc. | Ni Desc. | Hi Asc. (%) | Hi Desc. (%) |
|---|---|---|---|---|---|---|---|---|
| 0.59 | 0.83 | 0.71 | 2 | 0.55 | 2 | 366 | 0.55 | 100.00 |
| 0.83 | 1.07 | 0.95 | 18 | 4.92 | 20 | 364 | 5.46 | 99.45 |
| 1.07 | 1.31 | 1.19 | 43 | 11.75 | 63 | 346 | 17.21 | 94.54 |
| 1.31 | 1.55 | 1.43 | 67 | 18.31 | 130 | 303 | 35.52 | 82.79 |
| 1.55 | 1.79 | 1.67 | 63 | 17.21 | 193 | 236 | 52.73 | 64.48 |
| 1.79 | 2.03 | 1.91 | 61 | 16.67 | 254 | 173 | 69.40 | 47.27 |
| 2.03 | 2.27 | 2.15 | 51 | 13.93 | 305 | 112 | 83.33 | 30.60 |
| 2.27 | 2.51 | 2.39 | 41 | 11.20 | 346 | 61 | 94.54 | 16.67 |
| 2.51 | 2.75 | 2.63 | 18 | 4.92 | 364 | 20 | 99.45 | 5.46 |
| 2.75 | 2.99 | 2.87 | 2 | 0.55 | 366 | 2 | 100.00 | 0.55 |
Una vez generada la Tabla de Distribución de Frecuencias, procedemos a visualizar los datos. Esta gráfica es fundamental para identificar la asimetría de la variable continua de precipitación y justificar el uso de modelos probabilísticos posteriores.
# 1. Crear el Histograma
ggplot(TDF, aes(x = round.Li..2., y = hi_porc)) +
# Geometría de barras: Ancho definido por la amplitud 'A'
geom_bar(stat = "identity",
fill = "skyblue3",
color = "black",
alpha = 0.8,
width = A,
just = 0) +
# Configuración del eje X: Marcas en los límites de clase
scale_x_continuous(breaks = c(Li, Ls[K]),
labels = function(x) round(x, 2)) +
# Configuración del eje Y: Formato porcentual y ajuste de escala
scale_y_continuous(labels = function(x) paste0(x, "%"),
limits = c(0, max(TDF$hi_porc) * 1.1),
expand = c(0, 0)) +
# Etiquetas del gráfico
labs(
title = "Gráfica No. 1: Histograma de Distribución Porcentual del Viento",
x = "Velocidad del Viento (m/s)",
y = "Porcentaje (%)",
caption = "Fuente: Datos analizados del Proyecto Volcán A"
) +
# Estilo visual profesional
theme_classic() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
plot.subtitle = element_text(hjust = 0.5, size = 11, color = "darkgray"),
axis.text.x = element_text(angle = 45, hjust = 1)
)Se seleccionó el modelo log-normal para la variable viento porque el histograma presenta una marcada asimetría positiva, donde las frecuencias no comienzan en el punto máximo, sino que muestran un crecimiento inicial rápido hasta alcanzar un pico y, posteriormente, un decaimiento gradual hacia la derecha.
# Se filtran datos mayores a cero para la transformación logarítmica
datos_log <- log(datos_analizar[datos_analizar > 0])
mu_log <- mean(datos_log, na.rm = TRUE)
sigma_log <- sd(datos_log, na.rm = TRUE)
# 2. Generación de los puntos para la curva teórica
x_curva <- seq(xmin, xmax, length.out = 300)
# Ajuste de escala: densidad * amplitud * 100 para eje porcentual
y_curva <- dlnorm(x_curva, meanlog = mu_log, sdlog = sigma_log) * A * 100
df_conjetura_log <- data.frame(x = x_curva, y = y_curva)
# 3. Gráfica Final: Histograma + Curva Log-Normal
ggplot(TDF, aes(x = MC, y = hi_porc)) +
# Histograma base
geom_bar(stat = "identity",
fill = "steelblue",
color = "black",
alpha = 0.7,
width = A) +
# Superposición de la CURVA LOG-NORMAL
geom_line(data = df_conjetura_log, aes(x = x, y = y),
color = "darkgreen", linewidth = 1.2) +
# Configuración de ejes
scale_x_continuous(breaks = c(Li, Ls[K]),
labels = function(x) round(x, 2)) +
scale_y_continuous(labels = function(x) paste0(x, "%"),
limits = c(0, max(c(TDF$hi_porc, df_conjetura_log$y), na.rm = TRUE) * 1.1),
expand = c(0, 0)) +
# Etiquetas y títulos
labs(
title = "Gráfica No. 2: Modelo de probabilidad Log-normal para viento",
subtitle = paste("Parámetros: meanlog (μ) =", round(mu_log, 3),
" | sdlog (σ) =", round(sigma_log, 3)),
x = "Velocidad del Viento (m/s)",
y = "Porcentaje (%)",
) +
theme_classic() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
plot.subtitle = element_text(hjust = 0.5, size = 10, face = "italic"),
axis.text.x = element_text(angle = 45, hjust = 1)
)Para determinar la validez de la conjetura Log-Normal, se comparan las frecuencias observadas en la muestra de viento contra las frecuencias esperadas. La cercanía entre ambos valores se cuantifica mediante el coeficiente de correlación de Pearson
# 1. Definir Frecuencia Observada (ni extraída de la TDF)
Fo <- ni
# 2. Calcular Probabilidades Teóricas (P) bajo la curva Log-Normal
P <- numeric(K)
for (i in 1:K) {
P[i] <- plnorm(cortes[i+1], meanlog = mu_log, sdlog = sigma_log) -
plnorm(cortes[i], meanlog = mu_log, sdlog = sigma_log)
}
# 3. Calcular Frecuencia Esperada (Fe)
n_total <- length(datos_analizar)
Fe <- P * n_total
# 4. Cálculo de Correlación de Pearson
Correlacion_Log <- cor(Fo, Fe) * 100
# 5. Salida de resultados de validación
cat("--- CONCLUSIÓN DE LA CONJETURA LOG-NORMAL (VIENTO) ---\n")## --- CONCLUSIÓN DE LA CONJETURA LOG-NORMAL (VIENTO) ---
## Tamaño de la muestra total: 366 registros
## Parámetros estimados: mu = 0.5344 , sigma = 0.2725
## Correlación del modelo: 95.73 %
Para confirmar si la distribución Log-Normal es un modelo estadísticamente válido para la velocidad del viento en el Volcán Antisana, se realiza la prueba de Chi-Cuadrado (\(\chi^2\)). Esta prueba evalúa si las diferencias entre las frecuencias observadas y las esperadas son lo suficientemente pequeñas como para ser atribuidas al azar o si, por el contrario, el modelo debe ser rechazado.
# 1. Determinación de los Grados de Libertad
grados_libertad <- (K - 3)
# Verificación de seguridad para grados de libertad
if(grados_libertad <= 0) grados_libertad <- 1
# 2. Nivel de significancia
nivel_significancia <- 0.5
# 3. Preparación de Frecuencias Porcentuales
Fo_porc <- hi
Fe_porc <- P * 100
# 4. Cálculo del estadístico Chi-Cuadrado (X2)
x2 <- sum((Fe_porc - Fo_porc)^2 / (Fe_porc + 0.5))
# 5. Determinación del Umbral (Valor Crítico)
umbral_aceptacion <- qchisq(1 - nivel_significancia, grados_libertad)
# 6. Decisión Estadística
modelo_aceptado <- x2 < umbral_aceptacion
# --- SALIDA DE RESULTADOS ---
cat("--- PRUEBA DE CHI-CUADRADO PARA VIENTO (LOG-NORMAL) ---\n")## --- PRUEBA DE CHI-CUADRADO PARA VIENTO (LOG-NORMAL) ---
## Grados de Libertad: 7
## Estadístico Chi-Cuadrado (X2) calculado: 5.0692
## Umbral de aceptación (Valor Crítico): 6.3458
## ¿El modelo es aceptado estadísticamente?: SÍ
En esta sección se sintetizan los resultados de los estadísticos de validación. Se presentan el coeficiente de correlación de Pearson, que mide la relación lineal entre las frecuencias, y el estadístico Chi-Cuadrado, que determina la aceptación formal del modelo probabilístico.
# 1. Definición de las etiquetas de los modelos
Modelos <- c("Modelo Log-Normal")
# 2. Creación del Dataframe con los resultados obtenidos en bloques anteriores
tabla_resumen_viento <- data.frame(
Modelo = Modelos,
Pearson = c(round(Correlacion_Log, 2)),
Chi_Sq = c(round(x2, 2)),
Umbral = c(round(umbral_aceptacion, 2)),
Resultado = c(ifelse(modelo_aceptado, "ACEPTADO", "RECHAZADO"))
)
# 3. Renombrar columnas para un formato de reporte profesional
colnames(tabla_resumen_viento) <- c("Modelo de Probabilidad",
"Correlación Pearson (%)",
"Chi Cuadrado (X2)",
"Umbral de Aceptación",
"Decisión Final")
# 4. Generación de la tabla con kable
library(knitr)
kable(tabla_resumen_viento,
format = "markdown",
align = "lcccc",
caption = "Tabla Nro. 2: Resumen de test de bondad para el modelo log-normal del Viento")| Modelo de Probabilidad | Correlación Pearson (%) | Chi Cuadrado (X2) | Umbral de Aceptación | Decisión Final |
|---|---|---|---|---|
| Modelo Log-Normal | 95.73 | 5.07 | 6.35 | ACEPTADO |
Una vez validado el modelo log-normal, procedemos a resolver interrogantes clave sobre el comportamiento futuro del viento en el Volcán Antisana, utilizando las funciones de distribución de probabilidad.
1). Si se toman 200 mediciones futuras, ¿cuántas veces se espera que el viento sople con una velocidad entre 1.79 y 2.27 (m/s)?
# Parámetros extraídos de la conjetura del modelo
mu_viento <- 0.534
sigma_viento <- 0.273
# 1. Cálculo de la probabilidad del intervalo [1.79, 2.27]
P_intervalo_cant <- plnorm(2.27, meanlog = mu_viento, sdlog = sigma_viento) -
plnorm(1.79, meanlog = mu_viento, sdlog = sigma_viento)
# 2. Proyección para n = 200 mediciones
n_futuro <- 200
cantidad_esperada <- P_intervalo_cant * n_futuro
cat("Resultado: Se esperan aproximadamente", round(cantidad_esperada, 0),
"mediciones en el rango [1.79 - 2.27].\n")## Resultado: Se esperan aproximadamente 56 mediciones en el rango [1.79 - 2.27].
2). ¿Cuál será la probabilidad de que la velocidad del viento se encuentre entre 1.3 y 2.3 m/s?
# 1. Definición de los límites del intervalo de interés
lim_inf <- 1.3
lim_sup <- 2.3
# 2. Cálculo de la probabilidad acumulada P(1.3 <= X <= 2.3)
prob_rango <- plnorm(lim_sup, meanlog = mu_viento, sdlog = sigma_viento) -
plnorm(lim_inf, meanlog = mu_viento, sdlog = sigma_viento)
# 3. Mostrar resultado porcentual
cat("Resultado: La probabilidad de que el viento esté entre 1.3 y 2.3 unidades es del",
round(prob_rango * 100, 2), "%\n")## Resultado: La probabilidad de que el viento esté entre 1.3 y 2.3 unidades es del 70.34 %
Esta sección presenta, una síntesis visual que superpone el modelo Log-Normal sobre el histograma de frecuencias observadas del Volcán Antisana. Se resaltan dos áreas críticas.
# 1. Parámetros y cálculos de probabilidad para las preguntas
mu_viento <- 0.534
sigma_viento <- 0.273
# Pregunta 1: Rango [1.79 - 2.27]
p_pregunta1 <- plnorm(2.27, meanlog = mu_viento, sdlog = sigma_viento) -
plnorm(1.79, meanlog = mu_viento, sdlog = sigma_viento)
cantidad_200 <- p_pregunta1 * 200
# Pregunta 2: Rango [1.3 - 2.3]
p_pregunta2 <- plnorm(2.3, meanlog = mu_viento, sdlog = sigma_viento) -
plnorm(1.3, meanlog = mu_viento, sdlog = sigma_viento)
# 2. Preparar datos para el sombreado (geom_ribbon)
# Área para Pregunta 1 (Naranja)
df_sombra_p1 <- data.frame(x = seq(1.79, 2.27, length.out = 100))
df_sombra_p1$y <- dlnorm(df_sombra_p1$x, meanlog = mu_viento, sdlog = sigma_viento) * A * 100
# Área para Pregunta 2 (Verde)
df_sombra_p2 <- data.frame(x = seq(1.3, 2.3, length.out = 100))
df_sombra_p2$y <- dlnorm(df_sombra_p2$x, meanlog = mu_viento, sdlog = sigma_viento) * A * 100
# Curva completa
df_curva_final <- data.frame(x = seq(min(datos_analizar), max(datos_analizar), length.out = 300))
df_curva_final$y <- dlnorm(df_curva_final$x, meanlog = mu_viento, sdlog = sigma_viento) * A * 100
# 3. Generación del Gráfico con Leyenda Manual
library(ggplot2)
ggplot() +
# Histograma de fondo
geom_bar(data = TDF, aes(x = MC, y = hi_porc),
stat = "identity", fill = "steelblue", color = "black", alpha = 0.1, width = A) +
# Sombreados con 'fill' dentro de aes para generar la leyenda
geom_ribbon(data = df_sombra_p2, aes(x = x, ymin = 0, ymax = y, fill = "Rango 1.3 - 2.3 (70.34%)"),
alpha = 0.4) +
geom_ribbon(data = df_sombra_p1, aes(x = x, ymin = 0, ymax = y, fill = "Rango 1.79 - 2.27 (28.23%)"),
alpha = 0.6) +
# Línea del modelo
geom_line(data = df_curva_final, aes(x = x, y = y), color = "darkgreen", linewidth = 1.2) +
# Configuración de colores de la leyenda
scale_fill_manual(name = "Zonas de Inferencia",
values = c("Rango 1.3 - 2.3 (70.34%)" = "forestgreen",
"Rango 1.79 - 2.27 (28.23%)" = "orange")) +
# Escalas y Etiquetas
scale_y_continuous(labels = function(x) paste0(x, "%"), expand = expansion(mult = c(0, 0.1))) +
scale_x_continuous(breaks = sort(c(1.3, 1.79, 2.27, 2.3))) +
labs(title = "Inferencia Probabilística: Velocidad del Viento",
subtitle = "Análisis de rangos operativos y frecuencias esperadas",
x = "Velocidad del Viento (m/s)",
y = "DENSIDAD DE PROBABILIDAD",
caption = "Modelo Log-Normal aplicado a Datos Volcán A") +
theme_minimal() +
theme(legend.position = "bottom",
plot.title = element_text(face = "bold", size = 14, hjust = 0.5),
plot.subtitle = element_text(hjust = 0.5))## --- RESULTADOS DE INFERENCIA ---
cat("Pregunta 1: En 200 mediciones, se esperan", round(cantidad_200, 0),
"veces vientos entre 1.79 y 2.27 m/s.\n")## Pregunta 1: En 200 mediciones, se esperan 56 veces vientos entre 1.79 y 2.27 m/s.
cat("Pregunta 2: La probabilidad de vientos entre 1.3 y 2.3 m/s es del",
round(p_pregunta2 * 100, 2), "%.\n")## Pregunta 2: La probabilidad de vientos entre 1.3 y 2.3 m/s es del 70.34 %.
A continuación, se aplica el Teorema del Límite Central para estimar el valor promedio real de la velocidad del viento con un nivel de confianza del 95%. Esta técnica estadística permite inferir que, si se realizaran múltiples muestreos, el promedio poblacional se encontraría dentro del intervalo calculado en la gran mayoría de los casos.
# 1. Cálculo de estadísticos descriptivos básicos para Viento
n_total_v <- length(viento)
x_bar_v <- mean(viento, na.rm = TRUE)
sd_v <- sd(viento, na.rm = TRUE)
# 2. Parámetros para el Teorema del Límite Central (Confianza 95%)
z_95 <- 1.96
error_estandar_v <- sd_v / sqrt(n_total_v)
margen_error_95_v <- z_95 * error_estandar_v
# 3. Estimación de los Intervalos de Confianza (Media Poblacional)
lim_inf_v <- x_bar_v - margen_error_95_v
lim_sup_v <- x_bar_v + margen_error_95_v
# 4. Creación del dataframe para la tabla resumen
tabla_viento_tlc <- data.frame(
Parametro = "Velocidad Promedio del Viento",
Lim_Inferior = lim_inf_v,
Media_Muestral = x_bar_v,
Lim_Superior = lim_sup_v,
Error_Estandar = paste0("+/- ", sprintf("%.2f", margen_error_95_v)),
Confianza = "95% (Z=1.96)"
)
# 5. Generación de la tabla con formato profesional usando gt
tabla_final_tlc_viento <- tabla_viento_tlc %>%
gt() %>%
tab_header(
title = md("**ESTIMACIÓN DE LA MEDIA POBLACIONAL DE VIENTO**"),
subtitle = "Inferencia Basada en el Teorema del Límite Central (TLC)"
) %>%
cols_label(
Parametro = "Parámetro",
Lim_Inferior = "Límite Inferior (m/s)",
Media_Muestral = "Promedio Muestral (m/s)",
Lim_Superior = "Límite Superior (m/s)",
Error_Estandar = "Margen de Error"
) %>%
fmt_number(
columns = c(Lim_Inferior, Media_Muestral, Lim_Superior),
decimals = 2
) %>%
tab_style(
style = list(
cell_fill(color = "#F1F9F5"),
cell_text(color = "#145A32", weight = "bold")
),
locations = cells_body(columns = Media_Muestral)
)
# Mostrar la tabla en el reporte
tabla_final_tlc_viento| ESTIMACIÓN DE LA MEDIA POBLACIONAL DE VIENTO | |||||
| Inferencia Basada en el Teorema del Límite Central (TLC) | |||||
| Parámetro | Límite Inferior (m/s) | Promedio Muestral (m/s) | Límite Superior (m/s) | Margen de Error | Confianza |
|---|---|---|---|---|---|
| Velocidad Promedio del Viento | 1.72 | 1.77 | 1.81 | +/- 0.05 | 95% (Z=1.96) |
La variable Viento ha sido modelada con éxito mediante una Distribución Log-Normal. Con una media aritmética muestral de 1.77 m/s, definida por un margen de error de 0.05 m/s.Mediante la aplicación del Teorema del Límite Central, se ha determinado la media aritmética poblacional de la velocidad del viento se encuentra en el intervalo de [1.72 ; 1.81] m/s con un 95% de confianza (Z=1.96). Esta inferencia estadística es fundamental, permitiendo establecer un modelo matemático validado (\(\mu = 1.77 \pm 0.05\)).