CARGAR LIBRERÍAS Y DATOS
library(dplyr)
##
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
setwd("D:/Data")
datos <- read.csv("derrames_globales_.csv", header = TRUE, sep = ";", dec =".")
# Asignación correcta de variables
x_global <- as.numeric(as.character(datos[, 17])) # X: Maximo_liberacion_galones
y_global <- as.numeric(as.character(datos[, 21])) # Y: Respuesta_actual_galones
## Warning: NAs introducidos por coerción
datos_raw <- data.frame(x = x_global, y = y_global)
datos_clean <- na.omit(datos_raw)
# Filtro: Y debe ser > 0 para aplicar logaritmo en el modelo exponencial
datos_finales <- subset(datos_clean, y > 0)
plot(datos_finales$x, datos_finales$y,
col = rgb(0, 0, 1, 0.5),
pch = 16, cex = 0.8,
main = "Relación entre Máximo Liberación y Respuesta Actual",
xlab = "Máximo Liberación (Galones)",
ylab = "Respuesta Actual (Galones)")
\[ Y = a \cdot e^{b \cdot X} \] \[ \ln(Y) = \ln(a) + b \cdot X \]
# Modelo linealizado: log(y) vs x
modelo_exp <- lm(log(y) ~ x, data = datos_finales)
# Cálculo de coeficientes
res <- summary(modelo_exp)
res
##
## Call:
## lm(formula = log(y) ~ x, data = datos_finales)
##
## Residuals:
## Min 1Q Median 3Q Max
## -8.1721 -1.9531 -0.3299 1.7898 11.1831
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.162e+00 8.040e-02 101.520 < 2e-16 ***
## x 5.567e-08 7.436e-09 7.486 1.25e-13 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3.005 on 1401 degrees of freedom
## Multiple R-squared: 0.03847, Adjusted R-squared: 0.03778
## F-statistic: 56.05 on 1 and 1401 DF, p-value: 1.246e-13
# Recuperamos los parámetros originales
a_global <- exp(coef(modelo_exp)[1])
b_global <- coef(modelo_exp)[2]
x_seq <- seq(min(datos_finales$x), max(datos_finales$x), length.out = 500)
y_pred <- a_global * exp(b_global * x_seq)
plot(datos_finales$x, datos_finales$y,
col = rgb(0, 0, 1, 0.5),
pch = 16, cex = 0.8,
main = "Relación entre Máximo Liberación y Respuesta Actual",
xlab = "Máximo Liberación (Galones)",
ylab = "Respuesta Actual (Galones)")
lines(x_seq, y_pred, col = "red", lwd = 2)
pearson_r <- cor(datos_finales$x, log(datos_finales$y), method = "pearson")
cat("=== RESULTADO TEST DE PEARSON (GLOBAL) ===\n")
## === RESULTADO TEST DE PEARSON (GLOBAL) ===
cat("Coeficiente (R):", round(pearson_r, 4), "\n")
## Coeficiente (R): 0.1961
if(abs(pearson_r) > 0.7) {
cat("INTERPRETACIÓN: Correlación Fuerte.\n")
} else if(abs(pearson_r) > 0.4) {
cat("INTERPRETACIÓN: Correlación Moderada.\n")
} else {
cat("INTERPRETACIÓN: Correlación Débil.\n")
}
## INTERPRETACIÓN: Correlación Débil.
# Eliminamos el 2.5% más bajo y el 2.5% más alto para quitar ruido extremo
limites <- quantile(datos_clean$x, probs = c(0.025, 0.975))
datos_sin_outliers <- subset(datos_clean,
x > limites[1] &
x < limites[2] &
y > 0)
# Aplicación del Límite de Zoom (14 millones)
limite_volumen <- 14000000
datos_zoom <- subset(datos_sin_outliers, x <= limite_volumen)
# Generación del Modelo Optimizado
modelo_zoom <- lm(log(y) ~ x, data = datos_zoom)
a_zoom <- exp(coef(modelo_zoom)[1])
b_zoom <- coef(modelo_zoom)[2]
x_seq_zoom <- seq(0, max(datos_zoom$x), length.out = 500)
y_pred_zoom <- a_zoom * exp(b_zoom * x_seq_zoom)
plot(datos_zoom$x, datos_zoom$y,
col = rgb(0, 0.5, 0, 0.5), # Verde
pch = 16, cex = 0.8,
main = paste("Relación entre Máximo liberación y respuesta actual [0-14000000]"),
xlab = "Volumen Liberado (Galones)",
ylab = "Respuesta Actual (Galones)")
lines(x_seq_zoom, y_pred_zoom, col = "red", lwd = 3)
legend("topright", legend = "Modelo Intervalo", col = "red", lwd = 3, bty = "n")
Test de Pearson intervalo [0-14000000]
pearson_zoom <- cor(datos_zoom$x, log(datos_zoom$y), method = "pearson")
cat("=== COMPARACIÓN DE AJUSTE ===\n")
## === COMPARACIÓN DE AJUSTE ===
pearson_global <- cor(datos_finales$x, log(datos_finales$y), method = "pearson")
cat("Pearson Global:", round(pearson_global, 4), "\n")
## Pearson Global: 0.1961
cat("Pearson Intervalo:", round(pearson_zoom, 4), "\n\n")
## Pearson Intervalo: 0.4984
if(abs(pearson_zoom) > abs(pearson_global)) {
cat("CONCLUSIÓN: La limpieza de outliers y el intervalo MEJORAN el ajuste.\n")
}
## CONCLUSIÓN: La limpieza de outliers y el intervalo MEJORAN el ajuste.
\[Y = 2020.527 \cdot e^{5.519e-06 \cdot X}\]
cat("\n=== ECUACIÓN FINAL (OPTIMIZADA) ===\n")
##
## === ECUACIÓN FINAL (OPTIMIZADA) ===
# Usamos a_zoom y b_zoom que son los del modelo mejorado
cat(paste0("Respuesta = ", round(a_zoom, 4), " * e^(", format(b_zoom, scientific = TRUE, digits=4), " * Volumen)"), "\n")
## Respuesta = 2020.527 * e^(5.519e-06 * Volumen)
nuevo_volumen <- 500000
log_prediccion <- predict(modelo_zoom, newdata = data.frame(x = nuevo_volumen))
prediccion <- exp(log_prediccion)
cat("\n=== PREDICCIÓN ===\n")
##
## === PREDICCIÓN ===
cat("Para un derrame de", nuevo_volumen, "galones:\n")
## Para un derrame de 5e+05 galones:
cat("Respuesta estimada:", round(prediccion, 2), "galones\n")
## Respuesta estimada: 31902.44 galones
Conclusiones Entre la variable independiente volumen liberado (X) y la variable dependiente máximo liberación (Y) se ha modelado una relación matemática de tipo regresión exponencial. Este modelo describe un comportamiento donde la tasa de cambio de la respuesta es proporcional a su valor actual. La relación se expresa mediante la fórmula \(Y = 2020.527 \cdot e^{5.519e-06 \cdot X}\), sujeta a las restricciones de incluir valores de respuesta positivos. El modelo permite realizar una estimación para un derrame de 500000 gal, se estima una recuperación de 31902.44