Variable de Estudio: Precipitación (mm).
Se determina que esta variable es Cuantitativa Continua. Debido a la naturaleza física de la lluvia, donde la mayor frecuencia se concentra en valores bajos (o cero) y decae progresivamente hacia eventos extremos, se utilizará el modelo Exponencial.
Estrategia Inferencial: 1. Visualización exploratoria de la distribución empírica. 2. Ajuste de un modelo matemático global utilizando la Distribución Exponencial. 3. Prueba de bondad de ajuste (Chi-Cuadrado) y estimación de intervalos de confianza.
# CARGA DE DATOS
tryCatch({
Datos_Brutos <- read.csv("C:\\Users\\User\\Downloads\\datos_clima.antisana.csv", check.names = FALSE)
colnames(Datos_Brutos) <- trimws(colnames(Datos_Brutos))
Datos <- Datos_Brutos %>%
select(any_of(c("Precipitation"))) %>%
mutate(Valor = as.numeric(gsub(",", ".", as.character(`Precipitation`))))
Variable <- na.omit(Datos$Valor)
# Filtro físico (0 a 200 mm)
Variable <- Variable[Variable >= 0 & Variable < 200]
}, error = function(e) {
set.seed(123)
Variable <<- rexp(1000, rate = 0.2)
})
n <- length(Variable)La muestra válida procesada consta de 366 registros diarios.
A continuación se presenta la tabla de distribución de frecuencias.
K_raw <- floor(1 + 3.322 * log10(n))
min_val <- min(Variable)
max_val <- max(Variable)
breaks_raw <- seq(min_val, max_val, length.out = K_raw + 1)
lim_inf_raw <- breaks_raw[1:K_raw]
lim_sup_raw <- breaks_raw[2:(K_raw+1)]
MC_raw <- (lim_inf_raw + lim_sup_raw) / 2
ni_raw <- as.vector(table(cut(Variable, breaks = breaks_raw, right = FALSE, include.lowest = TRUE)))
hi_raw <- (ni_raw / sum(ni_raw)) * 100
df_tabla_raw <- data.frame(
Li = sprintf("%.2f", lim_inf_raw),
Ls = sprintf("%.2f", lim_sup_raw),
MC = sprintf("%.2f", MC_raw),
ni = ni_raw,
hi = sprintf("%.2f", hi_raw)
)
totales_raw <- c("TOTAL", "-", "-", sum(ni_raw), sprintf("%.2f", sum(hi_raw)))
df_final_raw <- rbind(df_tabla_raw, totales_raw)
df_final_raw %>%
gt() %>%
tab_header(
title = md("**DISTRIBUCIÓN DE FRECUENCIAS - ANTISANA**"),
subtitle = md("Variable: Precipitación (mm)")
) %>%
tab_source_note(source_note = "Fuente: Datos Meteorológicos Antisana") %>%
cols_label(
Li = "Lím. Inf", Ls = "Lím. Sup", MC = "Marca Clase (Xi)",
ni = "ni", hi = "hi (%)"
) %>%
cols_align(align = "center", columns = everything()) %>%
tab_style(
style = list(cell_fill(color = "#2E4053"), cell_text(color = "white", weight = "bold")),
locations = cells_title()
) %>%
tab_options(
table.border.top.color = "#2E4053",
data_row.padding = px(6)
)| DISTRIBUCIÓN DE FRECUENCIAS - ANTISANA | ||||
| Variable: Precipitación (mm) | ||||
| Lím. Inf | Lím. Sup | Marca Clase (Xi) | ni | hi (%) |
|---|---|---|---|---|
| 0.01 | 10.53 | 5.27 | 158 | 43.17 |
| 10.53 | 21.06 | 15.80 | 89 | 24.32 |
| 21.06 | 31.58 | 26.32 | 56 | 15.30 |
| 31.58 | 42.10 | 36.84 | 33 | 9.02 |
| 42.10 | 52.63 | 47.36 | 16 | 4.37 |
| 52.63 | 63.15 | 57.89 | 9 | 2.46 |
| 63.15 | 73.67 | 68.41 | 3 | 0.82 |
| 73.67 | 84.20 | 78.94 | 0 | 0.00 |
| 84.20 | 94.72 | 89.46 | 2 | 0.55 |
| TOTAL | - | - | 366 | 100.00 |
| Fuente: Datos Meteorológicos Antisana | ||||
Esta sección presenta la visualización de los datos “crudos” para identificar su tendencia natural.
col_gris <- "#5D6D7E"
col_azul <- "#2E86C1"
breaks_general <- pretty(Variable, n = nclass.Sturges(Variable))
par(mar = c(6, 5, 4, 2))
h_base <- hist(Variable, breaks = breaks_general, plot = FALSE)
plot(h_base,
main = "Gráfica Nº1: Distribución Empírica de Precipitación",
xlab = "Precipitación (mm)", ylab = "Frecuencia Absoluta",
col = col_gris, border = "white", axes = FALSE,
ylim = c(0, max(h_base$counts) * 1.1))
axis(2, las=2)
axis(1, at = breaks_general, labels = breaks_general, las = 2, cex.axis = 0.8)
grid(nx=NA, ny=NULL, col="#D7DBDD", lty="dotted")
legend("topright", legend = "Datos Observados",
col = col_gris, pch = 15, bty = "n")Se procede al ajuste de la Distribución Exponencial, definida por el parámetro de tasa (\(\lambda\)). \[f(x) = \lambda e^{-\lambda x}\]
# 1. Estimación del Parámetro Lambda
lambda_est <- 1 / mean(Variable)
# 2. Gráfica de Ajuste
par(mar = c(6, 5, 4, 2))
plot(h_base,
main = "Gráfica Nº2: Ajuste del Modelo Exponencial",
xlab = "Precipitación (mm)", ylab = "Frecuencia",
col = "#85929E", border = "white", axes = FALSE,
ylim = c(0, max(h_base$counts) * 1.15))
axis(2, las=2)
axis(1, at = breaks_general, labels = breaks_general, las = 2, cex.axis = 0.8)
grid(nx=NA, ny=NULL, col="#D7DBDD", lty="dotted")
# Curva Teórica Exponencial
factor_esc <- n * (breaks_general[2]-breaks_general[1])
curve(dexp(x, rate = lambda_est) * factor_esc,
add = TRUE, col = "#C0392B", lwd = 3)
legend("topright", legend = c("Datos Reales", "Curva Exponencial"),
col = c("#85929E", "#C0392B"), pch = c(15, NA), lwd = c(NA, 3), bty = "n")# 3. Cálculo de Bondad de Ajuste (Chi-Cuadrado)
K_chi <- length(breaks_general) - 1
probs_chi <- numeric(K_chi)
for(i in 1:K_chi) {
probs_chi[i] <- pexp(breaks_general[i+1], rate = lambda_est) -
pexp(breaks_general[i], rate = lambda_est)
}
probs_chi <- probs_chi/sum(probs_chi)
Fo <- as.vector(table(cut(Variable, breaks = breaks_general)))
Fe <- probs_chi * n
chi2_val <- sum((Fo - Fe)^2 / Fe)
crit_val <- qchisq(0.99, K_chi-1-1)
if(crit_val < 0) crit_val <- 3.84
res_chi <- if(chi2_val < crit_val) "APROBADO" else "RECHAZADO"
pear_val <- cor(Fo, Fe) * 100Parámetro Estimado: \(\lambda =\) 0.0585
Resultado
Chi-Cuadrado: APROBADO (8.83 vs Crítico 20.09) |
Pearson: 99.56%
df_resumen <- data.frame(
"Modelo" = "Exponencial (Global)",
"Pearson" = paste0(sprintf("%.2f", pear_val), "%"),
"Chi_Cuadrado_Calc" = sprintf("%.2f", chi2_val),
"Chi_Cuadrado_Crit" = sprintf("%.2f", crit_val),
"Resultado" = res_chi
)
df_resumen %>% gt() %>%
tab_header(title = md("**VALIDACIÓN ESTADÍSTICA DEL MODELO**")) %>%
tab_style(style = cell_text(weight = "bold", color = "black"), locations = cells_body(columns = Resultado))| VALIDACIÓN ESTADÍSTICA DEL MODELO | ||||
| Modelo | Pearson | Chi_Cuadrado_Calc | Chi_Cuadrado_Crit | Resultado |
|---|---|---|---|---|
| Exponencial (Global) | 99.56% | 8.83 | 20.09 | APROBADO |
Utilizando el modelo Exponencial validado, calculamos escenarios hidrológicos clave. Analizaremos un rango intermedio de “lluvia útil” y un umbral de riesgo extremo.
Pregunta 1 (Rango de Aprovechamiento Hídrico): ¿Cuál es la probabilidad de que un día presente una precipitación moderada, definida entre 5 mm y 15 mm? (Zona media útil para recarga).
Pregunta 2 (Alerta de Inundación): En los próximos 30 días, ¿cuántos días se estima que tendrán precipitaciones intensas superiores a 20 mm?
# 1. Definición de Escenarios
# Intervalo Medio (5 a 15 mm)
x1 <- 5
x2 <- 15
prob_media <- pexp(x2, rate = lambda_est) - pexp(x1, rate = lambda_est)
pct_media <- round(prob_media * 100, 2)
# Cola Derecha (> 20 mm)
limite_alto <- 20
n_dias <- 30
prob_alto <- 1 - pexp(limite_alto, rate = lambda_est)
cant_estimada <- round(prob_alto * n_dias)
pct_alto <- round(prob_alto * 100, 2)
# 2. Gráfico de Áreas bajo la Curva
col_ejes <- "#2E4053"
col_relleno_medio <- rgb(0.1, 0.6, 0.4, 0.6)
col_relleno_alto <- rgb(0.8, 0.2, 0.2, 0.6)
par(mar = c(5, 5, 4, 2))
curve(dexp(x, rate = lambda_est),
from = 0, to = max(Variable),
main = "Gráfica Nº3: Áreas de Probabilidad (Densidad Exponencial)",
xlab = "Precipitación (mm)", ylab = "Densidad de Probabilidad",
col = col_ejes, lwd = 2, n = 1000)
# --- ÁREA 1: INTERVALO MEDIO (5 - 15 mm) ---
x_seq_media <- seq(x1, x2, length.out = 100)
y_seq_media <- dexp(x_seq_media, rate = lambda_est)
polygon(c(x1, x_seq_media, x2), c(0, y_seq_media, 0), col = col_relleno_medio, border = NA)
# --- ÁREA 2: COLA EXTREMA (> 20 mm) ---
x_seq_alto <- seq(limite_alto, max(Variable), length.out = 100)
y_seq_alto <- dexp(x_seq_alto, rate = lambda_est)
polygon(c(limite_alto, x_seq_alto, max(Variable)), c(0, y_seq_alto, 0), col = col_relleno_alto, border = NA)
abline(v = c(x1, x2), col = "#145A32", lty = 2, lwd = 1)
abline(v = limite_alto, col = "#922B21", lty = 2, lwd = 1)
legend("topright",
legend = c("Curva Exponencial",
paste0("Lluvia Moderada (", x1, "-", x2, " mm)"),
paste0("Riesgo Alto (> ", limite_alto, " mm)")),
col = c(col_ejes, col_relleno_medio, col_relleno_alto),
lwd = c(2, 10, 10), pch = c(NA, NA, NA), lty = c(1, 0, 0), bty = "n")
grid()Respuestas Gerenciales:
El Teorema del Límite Central (TLC) nos permite estimar la media poblacional verdadera, incluso cuando la distribución original (Exponencial) es altamente asimétrica, gracias al tamaño de la muestra (n > 30).
Los postulados de confianza empírica sugieren: * \(P(\bar{x} - E < \mu < \bar{x} + E) \approx 68\%\) * \(P(\bar{x} - 2E < \mu < \bar{x} + 2E) \approx 95\%\) * \(P(\bar{x} - 3E < \mu < \bar{x} + 3E) \approx 99\%\)
Donde el Margen de Error (E) se define como: \(E = \frac{\sigma}{\sqrt{n}}\)
x_bar <- mean(Variable)
sigma_muestral <- sd(Variable)
n_tlc <- length(Variable)
error_est <- sigma_muestral / sqrt(n_tlc)
margen_error_95 <- 2 * error_est
lim_inf_tlc <- x_bar - margen_error_95
lim_sup_tlc <- x_bar + margen_error_95
tabla_tlc <- data.frame(
Parametro = "Precipitación Promedio",
Lim_Inferior = lim_inf_tlc,
Media_Muestral = x_bar,
Lim_Superior = lim_sup_tlc,
Error_Estandar = paste0("+/- ", sprintf("%.2f", margen_error_95)),
Confianza = "95% (2*E)"
)
tabla_tlc %>%
gt() %>%
tab_header(
title = md("**ESTIMACIÓN DE LA MEDIA POBLACIONAL**"),
subtitle = "Aplicación del Teorema del Límite Central"
) %>%
cols_label(
Parametro = "Parámetro",
Lim_Inferior = "Límite Inferior (mm)",
Media_Muestral = "Media Calculada (mm)",
Lim_Superior = "Límite Superior (mm)",
Error_Estandar = "Error (mm)"
) %>%
fmt_number(
columns = c(Lim_Inferior, Media_Muestral, Lim_Superior),
decimals = 2
) %>%
tab_style(
style = list(cell_fill(color = "#E8F8F5"), cell_text(color = "#145A32", weight = "bold")),
locations = cells_body(columns = Media_Muestral)
)| ESTIMACIÓN DE LA MEDIA POBLACIONAL | |||||
| Aplicación del Teorema del Límite Central | |||||
| Parámetro | Límite Inferior (mm) | Media Calculada (mm) | Límite Superior (mm) | Error (mm) | Confianza |
|---|---|---|---|---|---|
| Precipitación Promedio | 15.42 | 17.10 | 18.79 | +/- 1.68 | 95% (2*E) |
La variable Precipitación medida en mm sigue un modelo Exponencial de parámetros \(\lambda=\) 0.0585. Gracias a esto y al Teorema del Límite Central, podemos decir que la media aritmética poblacional de la precipitación se encuentra entre el valor de \(\mu \in [15.42; 18.79]\), lo que afirmamos con un 95% de confianza (\(\mu = 17.10 \pm 1.68\) mm), y una desviación estándar muestral de 16.12 mm.