La precipitación se define como una variable cuantitativa continua, ya que se expresa mediante valores numéricos reales, generalmente medidos en milímetros, que pueden adoptar cualquier valor decimal dentro de un intervalo determinado. Esta característica de continuidad permite describir con precisión la magnitud de los eventos de lluvia, reflejando de manera adecuada la variabilidad y la intensidad de la precipitación registrada en cada evento.
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 variab precipitación, 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 Precipitación, se definió un número de 5 clases de forma preestablecida para optimizar la visualización. El ancho de cada intervalo se calculó dividiendo el rango total de los datos entre l número fijo de clases.
# 1. Preparación de la variable
datos_analizar <- datos$Precipitation
# 2. Cálculos base
xmin <- min(datos_analizar, na.rm = TRUE)
xmax <- max(datos_analizar, na.rm = TRUE)
R <- xmax - xmin
# Definición manual de clases
K <- 5
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 <- 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)
TDF <- data.frame(
Li = round(Li, 2),
Ls = round(Ls, 2),
MC = round(MC, 2),
ni = ni,
hi_porc = round(hi, 2),
Ni_asc = Ni_asc,
Ni_desc = Ni_desc,
Hi_asc_porc = round(Hi_asc, 2),
Hi_desc_porc = round(Hi_desc, 2)
)
# 7. Mostrar Tabla
kable(TDF,
caption = "Tabla No. 1: Distribución de Frecuencias de Precipitación",
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.01 | 18.95 | 9.48 | 237 | 64.75 | 237 | 366 | 64.75 | 100.00 |
| 18.95 | 37.89 | 28.42 | 84 | 22.95 | 321 | 129 | 87.70 | 35.25 |
| 37.89 | 56.84 | 47.36 | 34 | 9.29 | 355 | 45 | 96.99 | 12.30 |
| 56.84 | 75.78 | 66.31 | 9 | 2.46 | 364 | 11 | 99.45 | 3.01 |
| 75.78 | 94.72 | 85.25 | 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.
# Generación de la Gráfica No. 1
ggplot(TDF, aes(x = MC, y = hi_porc)) +
# Geometría de barras: El ancho 'width' debe ser igual a la amplitud 'A'
geom_bar(stat = "identity",
fill = "steelblue",
color = "black",
alpha = 0.8,
width = A) +
# Configuración del eje X: Mostramos los límites inferiores y el último superior
scale_x_continuous(breaks = c(Li, Ls[K]),
labels = function(x) round(x, 2)) +
# Configuración del eje Y: Formato de porcentaje y margen superior del 10%
scale_y_continuous(labels = function(x) paste0(x, "%"),
limits = c(0, max(TDF$hi_porc) * 1.1),
expand = c(0, 0)) +
# Etiquetas informativas
labs(
title = "Gráfica No. 1: Histograma de Distribución Porcentual de Precipitación",
x = "Precipitación (mm)",
y = "Porcentaje (%)",
caption = "Fuente: Datos VOLCAN A"
) +
# Estilo visual limpio
theme_classic() +
theme(
plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
axis.text.x = element_text(angle = 45, hjust = 1)
)Se selecciono el modelo exponencial para esta vatiable porque visualmente las barras muestran un decaimiento constante este comportamiento “en escalera descendente” es la firma visual característica de una función exponencial .
# 1. Estimación del parámetro Lambda
media_precip <- mean(datos_analizar, na.rm = TRUE)
lambda_exp <- 1 / media_precip
# 2. Generación de los puntos para la curva teórica
x_curva <- seq(xmin, xmax, length.out = 300)
# Escalado de la densidad: dexp() * Amplitud * 100
y_curva <- dexp(x_curva, rate = lambda_exp) * A * 100
df_conjetura <- data.frame(x = x_curva, y = y_curva)
# 3. Construcción de la Gráfica No. 2
ggplot(TDF, aes(x = MC, y = hi_porc)) +
# Histograma (usando la amplitud A calculada en la TDF)
geom_bar(stat = "identity",
fill = "steelblue",
color = "black",
alpha = 0.8,
width = A) +
# Superposición de la CURVA EXPONENCIAL - SE USÓ linewidth PARA EVITAR WARNING
geom_line(data = df_conjetura, aes(x = x, y = y),
color = "red", linewidth = 1.2) +
# Configuración del eje X: Límites de los intervalos
scale_x_continuous(breaks = c(Li, Ls[K]),
labels = function(x) round(x, 2)) +
# Configuración del eje Y: Formato de porcentaje
scale_y_continuous(labels = function(x) paste0(x, "%"),
limits = c(0, max(c(TDF$hi_porc, df_conjetura$y)) * 1.1),
expand = c(0, 0)) +
# Etiquetas y títulos
labs(
title = "Gráfica No. 2: Modelo de probabilidad exponencial para precipitación",
subtitle = paste("Modelo: f(x) = λe^(-λx) | Lambda (λ) =", round(lambda_exp, 5)),
x = "Precipitación (mm)",
y = "Porcentaje (%)",
caption = "Fuente: Datos obtenidos de VOLCAN A.csv"
) +
theme_classic() +
theme(plot.title = element_text(hjust = 0.5, face = "bold"))Para verificar la validez de la conjetura, comparamos las frecuencias observadas obtenidas de los datos con las frecuencias esperadas que predice el modelo exponencial. La correlación de Pearson nos permite cuantificar qué tan bien se ajusta la curva teórica a la distribución real de la precipitación.
# 1. Definir Frecuencia Observada
Fo <- ni
# 2. Calcular Probabilidades Teóricas (P)
P <- numeric(K)
for (i in 1:K) {
P[i] <- pexp(cortes[i+1], rate = lambda_exp) -
pexp(cortes[i], rate = lambda_exp)
}
# 3. Calcular Frecuencia Esperada (Fe)
# Se multiplica la probabilidad teórica por el tamaño total de la muestra
n_total <- length(datos_analizar)
Fe <- P * n_total
# 4. Cálculo de Correlación de Pearson
Correlacion_Exp <- cor(Fo, Fe) * 100
# 5. Resultados de la Validación
cat("--- CONCLUSIÓN DE LA CONJETURA EXPONENCIAL (PRECIPITACIÓN) ---\n")## --- CONCLUSIÓN DE LA CONJETURA EXPONENCIAL (PRECIPITACIÓN) ---
## Tamaño de la muestra total: 366 registros
## Correlación del modelo: 99.92 %
Para dar rigor estadístico a la conjetura, aplicamos la prueba de Chi-cuadrado. Esta prueba evalúa si las discrepancias entre los porcentajes observados en la muestra y los porcentajes teóricos del modelo exponencial son lo suficientemente pequeñas como para ser atribuidas al azar, o si por el contrario, el modelo debe ser rechazado.
# 1. Grados de libertad
grados_libertad <- (K - 2)
# 2. Nivel de significancia
nivel_significancia <- 0.5
# 3. Preparación de Frecuencias Porcentuales
# Fo_porc: Porcentajes observados (hi de la TDF)
# Fe_porc: Porcentajes teóricos (basados en la integral de la curva)
Fo_porc <- hi
Fe_porc <- P * 100
# 4. Cálculo del estadístico Chi-Cuadrado (X2)
# Sumatoria de (Obs - Esp)^2 / Esp
x2 <- sum((Fe_porc - Fo_porc)^2 / Fe_porc)
# 5. Determinación del Umbral (Valor Crítico)
# Punto de corte en la distribución Chi-cuadrado
umbral_aceptacion <- qchisq(1 - nivel_significancia, grados_libertad)
# 6. Decisión Estadística
modelo_aceptado <- x2 < umbral_aceptacion
# --- Impresión de Resultados ---
cat("--- PRUEBA DE CHI-CUADRADO PARA PRECIPITACIÓN ---\n")## --- PRUEBA DE CHI-CUADRADO PARA PRECIPITACIÓN ---
## Grados de Libertad: 3
## Estadístico Chi-Cuadrado (X2) calculado: 0.7206
## Umbral de aceptación (Valor Crítico): 2.366
## ¿El modelo es aceptado estadísticamente?: SÍ
Se presenta la siguiente tabla comparativa que consolida los resultados de la Correlación de Pearson y la prueba de Chi-cuadrado. Este resumen permite confirmar si el modelo propuesto es estadísticamente válido para describir el comportamiento de la precipitación en el Volcán A.
# 1. Definición de la etiqueta del modelo analizado
Modelos <- c("Modelo Exponencial Puro")
# 2. Creación del Dataframe con los resultados consolidados
tabla_resumen_precip <- data.frame(
Modelo = Modelos,
Pearson = c(round(Correlacion_Exp, 2)),
Chi_Sq = c(round(x2, 2)),
Umbral = c(round(umbral_aceptacion, 2)),
Resultado = c(ifelse(modelo_aceptado, "ACEPTADO", "RECHAZADO"))
)
# 3. Renombrar columnas para una presentación profesional
colnames(tabla_resumen_precip) <- c("Modelo de Probabilidad",
"Correlación Pearson (%)",
"Chi Cuadrado (X2)",
"Umbral de Aceptación",
"Decisión Final")
# 4. Generación de la tabla con formato kable
library(knitr)
kable(tabla_resumen_precip,
format = "markdown",
align = "lcccc",
caption = "Tabla Nro. 2: Resumen de test de bondad de para el modelo exponencial para Precipitación")| Modelo de Probabilidad | Correlación Pearson (%) | Chi Cuadrado (X2) | Umbral de Aceptación | Decisión Final |
|---|---|---|---|---|
| Modelo Exponencial Puro | 99.92 | 0.72 | 2.37 | ACEPTADO |
Una vez validado el modelo exponencial, procedemos a resolver interrogantes clave sobre el comportamiento futuro de la precipitación en el Volcán A, utilizando las funciones de distribución de probabilidad.
¿Cuál es la cantidad de precipitación (en mm) estimada, tal que el 90% de los eventos futuros de lluvia presentarían valores iguales o menores a dicha cantidad?
# 1. Cálculo del cuantil 0.90 usando el parámetro lambda_exp
precip_90 <- qexp(0.90, rate = lambda_exp)
# 2. Resultado
cat("Resultado: ", round(precip_90, 2), "mm")## Resultado: 39.39 mm
¿Cuál es la probabilidad de que, en un evento futuro de precipitación, el acumulado se encuentre entre 20 mm y 60 mm, de acuerdo con el modelo exponencial estimado?
# 1. Cálculo de la probabilidad (P(20 < X < 60))
probabilidad_rango <- pexp(60, rate = lambda_exp) - pexp(20, rate = lambda_exp)
# 2. Conversión a porcentaje
probabilidad_porc <- probabilidad_rango * 100
# 3. Resultado
cat("Probabilidad calculada:", round(probabilidad_porc, 2), "%")## Probabilidad calculada: 28.06 %
# 1. Preparar áreas sombreadas
df_sombra_90 <- data.frame(x = seq(0, precip_90, length.out = 100))
df_sombra_90$y <- dexp(df_sombra_90$x, rate = lambda_exp) * A * 100
df_sombra_rango <- data.frame(x = seq(20, 60, length.out = 100))
df_sombra_rango$y <- dexp(df_sombra_rango$x, rate = lambda_exp) * A * 100
# 2. Curva completa
df_curva_final <- data.frame(x = seq(0, xmax, length.out = 300))
df_curva_final$y <- dexp(df_curva_final$x, rate = lambda_exp) * A * 100
# 3. Gráfica con LEYENDA
ggplot() +
# Histograma base
geom_bar(data = TDF, aes(x = MC, y = hi_porc),
stat = "identity", fill = "gray90", color = "black", alpha = 0.5, width = A) +
# ÁREAS SOMBREADAS con mapeo para leyenda
geom_ribbon(data = df_sombra_90,
aes(x = x, ymin = 0, ymax = y, fill = "Umbral No Extremo (90%)"),
alpha = 0.3) +
geom_ribbon(data = df_sombra_rango,
aes(x = x, ymin = 0, ymax = y, fill = "Rango Probabilidad (20-60 mm)"),
alpha = 0.6) +
# Línea del modelo
geom_line(data = df_curva_final, aes(x = x, y = y), color = "darkred", size = 1.1) +
# Configuración manual de colores de la leyenda
scale_fill_manual(values = c("Umbral No Extremo (90%)" = "red",
"Rango Probabilidad (20-60 mm)" = "#228B22")) +
# Escalas y etiquetas
scale_y_continuous(labels = function(x) paste0(x, "%"), expand = expansion(mult = c(0, 0.1))) +
scale_x_continuous(breaks = sort(unique(c(0, 20, 60, round(precip_90, 1), round(xmax, 1))))) +
labs(
title = "Inferencia de probabilidad sobre el Modelo exponencial de Precipitación",
x = "Precipitación (mm)",
y = "Densidad de probabilidad",
fill = "Zonas de Inferencia",
caption = "Fuente: Análisis basado en datos de VOLCAN A.csv"
) +
theme_minimal() +
theme(
legend.position = "bottom",
plot.title = element_text(face = "bold", size = 14, hjust = 0.5),
panel.grid.minor = element_blank(),
axis.text.x = element_text(angle = 45, hjust = 1)
)## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# 1. Cálculo de estadísticos descriptivos básicos para Precipitación
n_total_p <- length(datos_analizar)
x_bar_p <- mean(datos_analizar, na.rm = TRUE)
sd_p <- sd(datos_analizar, na.rm = TRUE)
# 2. Parámetros para el Teorema del Límite Central (Confianza 95%)
z_95 <- 1.96
error_estandar_p <- sd_p / sqrt(n_total_p)
margen_error_95_p <- z_95 * error_estandar_p
# 3. Estimación de los Intervalos de Confianza (Media Poblacional)
lim_inf_p <- x_bar_p - margen_error_95_p
lim_sup_p <- x_bar_p + margen_error_95_p
# 4. Creación del dataframe para la tabla resumen
tabla_precip_tlc <- data.frame(
Parametro = "Precipitación Promedio Diaria",
Lim_Inferior = lim_inf_p,
Media_Muestral = x_bar_p,
Lim_Superior = lim_sup_p,
Error_Estandar = paste0("+/- ", sprintf("%.2f", margen_error_95_p)),
Confianza = "95% (Z=1.96)"
)
# 5. Generación de la tabla con formato profesional usando gt
tabla_final_tlc <- tabla_precip_tlc %>%
gt() %>%
tab_header(
title = md("**ESTIMACIÓN DE LA MEDIA POBLACIONAL DE PRECIPITACIÓN**"),
subtitle = "Inferencia Basada en el Teorema del Límite Central (TLC)"
) %>%
cols_label(
Parametro = "Parámetro",
Lim_Inferior = "Límite Inferior (mm)",
Media_Muestral = "Promedio Muestral (mm)",
Lim_Superior = "Límite Superior (mm)",
Error_Estandar = "Margen de Error"
) %>%
fmt_number(
columns = c(Lim_Inferior, Media_Muestral, Lim_Superior),
decimals = 2
) %>%
tab_style(
style = list(
cell_fill(color = "#EBF5FB"),
cell_text(color = "#1B4F72", weight = "bold")
),
locations = cells_body(columns = Media_Muestral)
)
# Mostrar la tabla
tabla_final_tlc| ESTIMACIÓN DE LA MEDIA POBLACIONAL DE PRECIPITACIÓN | |||||
| Inferencia Basada en el Teorema del Límite Central (TLC) | |||||
| Parámetro | Límite Inferior (mm) | Promedio Muestral (mm) | Límite Superior (mm) | Margen de Error | Confianza |
|---|---|---|---|---|---|
| Precipitación Promedio Diaria | 15.45 | 17.10 | 18.76 | +/- 1.65 | 95% (Z=1.96) |
La variable Precipitación, ha sido modelada con éxito mediante una Distribución Exponencial para eventos de alta frecuencia. Con una media aritmética muestral de 17.10 mm, definida por un margen de error de 1.65 mm.Mediante el Teorema del Límite Central (TLC), sabemos que la media aritmética poblacional de la precipitación diaria se encuentra entre [15.45 ; 18.76] mm con un 95% de confianza (\(Z=1.96\)). Esta inferencia estadística permite establecer umbrales de seguridad y previsiones hídricas sólidas, fundamentadas en un modelo matemático validado (\(\mu = 17.10 \pm 1.65\)).