1 IDENTIFICAIÓN Y JUSTIFICACIÓN

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.

2 CARGAR DATOS

Importamos el archivo “VOLCAN A.csv” desde una ruta local y lo almacena en el objeto datos, usando espacios o tabulaciones como separador.

# setwd("C:/Users/ronal/OneDrive/Desktop")
datos <- read.csv("VOLCAN A.csv", header = TRUE, sep = ",", dec = ".")
View(datos)

3 EXTARER LA VARIABLE

Extraemos la variable viento, omitimos las celdas en blanco o valores iguales a cero y verificamos el tamaño muestral

viento <- na.omit(datos$Wind)
viento <- viento [viento > 0]
n_total <- length(viento)

4 TABLA DE FRECUENCIA

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)
Tabla No. 1: Distribución de Frecuencias de la variable Viento
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

5 HISTOGRAMA

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)
  )

6 CONJETURA DE MODELO LOG-NORMAL

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)
  )

TEST DE PEARSON

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) ---
cat("Tamaño de la muestra total:", n_total, "registros\n")
## Tamaño de la muestra total: 366 registros
cat("Parámetros estimados: mu =", round(mu_log, 4), ", sigma =", round(sigma_log, 4), "\n")
## Parámetros estimados: mu = 0.5344 , sigma = 0.2725
cat("Correlación del modelo:", round(Correlacion_Log, 2), "%\n")
## Correlación del modelo: 95.73 %

8 TEST DE CHI-CUADRADO

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) ---
cat("Grados de Libertad:", grados_libertad, "\n")
## Grados de Libertad: 7
cat("Estadístico Chi-Cuadrado (X2) calculado:", round(x2, 4), "\n")
## Estadístico Chi-Cuadrado (X2) calculado: 5.0692
cat("Umbral de aceptación (Valor Crítico):", round(umbral_aceptacion, 4), "\n")
## Umbral de aceptación (Valor Crítico): 6.3458
cat("¿El modelo es aceptado estadísticamente?:", ifelse(modelo_aceptado, "SÍ", "NO"), "\n")
## ¿El modelo es aceptado estadísticamente?: SÍ

9 TABLA DE RESUMEN

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")
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

10 CÁLCULO DE PROBABILIDADES

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 %

10.1 CÁLCULO GRÁFICO DE PROBABILIDADES

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.

### 8. Gráfica Maestra de Inferencia Probabilística
# 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))

# 4. Salida de resultados (Responde a las dos preguntas)
cat("--- RESULTADOS DE INFERENCIA ---\n")
## --- 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 %.

11 TEOREMA DE LÍMITE CENTRAL

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)

CONCLUSIONES

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\)).