library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.2
##
## 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 de variables
x_global <- as.numeric(as.character(datos[, 20])) # X: Volumen Derramado_galones
## Warning: NAs introducidos por coerción
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 inicial: Y > 0 y X > 0 para poder aplicar logaritmos sin error
datos_finales <- subset(datos_clean, y > 0 & x > 0)
plot(datos_finales$x, datos_finales$y,
col = rgb(0, 0, 1, 0.5),
pch = 16, cex = 0.8,
main = "Relación entre Volumen Derramado y Respuesta Actual",
xlab = "Volumen Derramado (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
## -7.5743 -1.6394 -0.0079 1.4052 7.7416
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 7.574e+00 8.150e-02 92.940 < 2e-16 ***
## x 3.442e-05 4.344e-06 7.924 5.62e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 2.55 on 1095 degrees of freedom
## Multiple R-squared: 0.05424, Adjusted R-squared: 0.05337
## F-statistic: 62.79 on 1 and 1095 DF, p-value: 5.617e-15
# Recuperamos los parámetros originales
a_global <- exp(coef(modelo_exp)[1])
b_global <- coef(modelo_exp)[2]
x_seq_global <- seq(min(datos_finales$x), max(datos_finales$x), length.out = 500)
y_pred_global <- a_global * exp(b_global * x_seq_global)
plot(datos_finales$x, datos_finales$y,
col = rgb(0, 0, 1, 0.5),
pch = 16, cex = 0.8,
main = "Relación entre Volumen Derramado y Respuesta Actual",
xlab = "Volumen Derramado (Galones)",
ylab = "Respuesta Actual (Galones)")
lines(x_seq_global, y_pred_global, col = "red", lwd = 2)
pearson_global <- 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_global, 4), "\n")
## Coeficiente (R): 0.2329
if(abs(pearson_global) > 0.7) {
cat("INTERPRETACIÓN: Correlación Fuerte.\n")
} else if(abs(pearson_global) > 0.4) {
cat("INTERPRETACIÓN: Correlación Moderada.\n")
} else {
cat("INTERPRETACIÓN: Correlación Débil.\n")
}
## INTERPRETACIÓN: Correlación Débil.
# Filtramos directamente el intervalo óptimo
datos_zoom <- subset(datos_finales, x >= 10100 & x <= 15100)
# Calculamos el modelo para el intervalo
modelo_zoom <- lm(log(y) ~ x, data = datos_zoom)
# Recuperamos parámetros del modelo exponencial
a_zoom <- exp(coef(modelo_zoom)[1])
b_zoom <- coef(modelo_zoom)[2]
x_curve <- seq(min(datos_zoom$x), max(datos_zoom$x), length.out = 200)
y_curve <- a_zoom * exp(b_zoom * x_curve)
plot(datos_zoom$x, datos_zoom$y,
col = rgb(0, 0.5, 0, 0.6),
pch = 16, cex = 1.2,
main = "Relación Volumen vs Respuesta actual [10100 - 15100] gal",
xlab = "Volumen Derramado (Galones)",
ylab = "Respuesta Actual (Galones)")
# Dibujamos la curva roja
lines(x_curve, y_curve, col = "red", lwd = 3)
legend("topleft", legend = c("Datos Intervalo", "Curva Exponencial"),
col = c(rgb(0, 0.5, 0, 0.6), "red"), pch = c(16, NA), lty = c(NA, 1), lwd = c(NA, 3), bty="n")
pearson_zoom <- cor(datos_zoom$x, log(datos_zoom$y), method = "pearson")
cat("=== COMPARACIÓN DE AJUSTE (R) ===\n")
## === COMPARACIÓN DE AJUSTE (R) ===
cat("Pearson Global:", round(pearson_global, 4), "\n")
## Pearson Global: 0.2329
cat("Pearson Intervalo [10.1k - 15.1k]:", round(abs(pearson_zoom), 4), "\n\n")
## Pearson Intervalo [10.1k - 15.1k]: 0.9489
if(abs(pearson_zoom) > abs(pearson_global)) {
cat("CONCLUSIÓN: El ajuste MEJORA notablemente en este intervalo (R ≈ 0.9489).\n")
}
## CONCLUSIÓN: El ajuste MEJORA notablemente en este intervalo (R ≈ 0.9489).
\[Y = 4409.4801 \cdot e^{8.158e-05 \cdot X}\]
cat("\n=== ECUACIÓN FINAL (OPTIMIZADA) ===\n")
##
## === ECUACIÓN FINAL (OPTIMIZADA) ===
# Usamos a_zoom y b_zoom generados en el bloque anterior
cat(paste0("Respuesta = ", round(a_zoom, 4), " * e^(", format(b_zoom, scientific = TRUE, digits=4), " * Volumen)"), "\n")
## Respuesta = 4409.4801 * e^(8.158e-05 * Volumen)
nuevo_volumen <- 13000
# Usamos el modelo optimizado
prediccion <- a_zoom * exp(b_zoom * nuevo_volumen)
cat("\n=== PREDICCIÓN ===\n")
##
## === PREDICCIÓN ===
cat("Para un derrame de", nuevo_volumen, "galones (dentro del intervalo):\n")
## Para un derrame de 13000 galones (dentro del intervalo):
cat("Respuesta estimada:", round(prediccion, 2), "galones\n")
## Respuesta estimada: 12734.23 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 = 4409.4801 \cdot e^{8.158e-05 \cdot X}\), sujeta a las restricciones de incluir valores de respuesta positivos. El modelo permite realizar una estimación para un derrame de 13000 gal, se estima una recuperación de 12734.23 gal.