CARGAR LIBRERÍAS Y DATOS
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 =".")
x_raw <- as.numeric(as.character(datos[, 20])) # Volumen Derramado (Galones)
## Warning: NAs introducidos por coerción
y_raw <- as.numeric(as.character(datos[, 17])) # Máxima Liberación (Galones)
# Crear dataframe inicial y omitir nulos
datos_raw <- data.frame(x = x_raw, y = y_raw)
datos_clean <- na.omit(datos_raw)
# Filtramos valores mayores a cero
datos_finales <- subset(datos_clean, x > 0 & 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 Volumen derramado y Máxima Liberación",
xlab = "Volumen derramado ",
ylab = "Máximo Liberación ")
abline(v=0, h=0, col="gray", lty=2)
\[ Y = \beta_0 + \beta_1 X + \beta_2 X^2 + \beta_3 X^3 \]
# Generar Modelo Polinómico de grado 3
# raw = TRUE usa los polinomios naturales, necesario para ver la ecuación clásica
modelo_poly <- lm(y ~ poly(x, 3, raw = TRUE), data = datos_finales)
# Resumen estadístico
res <- summary(modelo_poly)
res
##
## Call:
## lm(formula = y ~ poly(x, 3, raw = TRUE), data = datos_finales)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2000359 -78807 -75032 -74062 29896272
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 7.431e+04 2.787e+04 2.666 0.007764 **
## poly(x, 3, raw = TRUE)1 1.900e+00 2.531e-01 7.504 1.12e-13 ***
## poly(x, 3, raw = TRUE)2 -1.118e-07 3.251e-08 -3.437 0.000606 ***
## poly(x, 3, raw = TRUE)3 2.158e-15 6.395e-16 3.375 0.000759 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1006000 on 1342 degrees of freedom
## Multiple R-squared: 0.6001, Adjusted R-squared: 0.5992
## F-statistic: 671.3 on 3 and 1342 DF, p-value: < 2.2e-16
# Extracción de Coeficientes
coef_poli <- coef(modelo_poly)
a <- coef_poli[1] # Intercepto (beta 0)
b <- coef_poli[2] # Coeficiente x (beta 1)
c <- coef_poli[3] # Coeficiente x^2 (beta 2)
d <- coef_poli[4] # Coeficiente x^3 (beta 3)
# Secuencia para la curva suave
x_seq <- seq(min(datos_finales$x), max(datos_finales$x), length.out = 500)
# Predicción: a + bx + cx^2 + dx^3
y_pred <- a + b*x_seq + c*x_seq^2 + d*x_seq^3
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 Máxima Liberación",
xlab = "Volumen derramado ",
ylab = "Máximo Liberación ")
# Curva de regresión
lines(x_seq, y_pred, col = "red", lwd = 2)
pearson_r <- cor(datos_finales$x, datos_finales$y, method = "pearson")
cat("=== RESULTADO TEST DE PEARSON ===\n")
## === RESULTADO TEST DE PEARSON ===
cat("Coeficiente de Pearson (r):", round(pearson_r, 4), "\n")
## Coeficiente de Pearson (r): 0.7722
if(abs(pearson_r) > 0.7) {
cat("INTERPRETACIÓN: Correlación Lineal Fuerte.\n")
} else if(abs(pearson_r) > 0.4) {
cat("INTERPRETACIÓN: Correlación Lineal Moderada.\n")
} else {
cat("INTERPRETACIÓN: Correlación Lineal Débil.\n")
}
## INTERPRETACIÓN: Correlación Lineal Fuerte.
Al evaluar la totalidad de los datos, el coeficiente de correlación de Pearson ya indicaba una relación global significativa (superando el 70%). Sin embargo, con el objetivo de maximizar la precisión predictiva y alcanzar una confiabilidad superior, se acotó el análisis a un intervalo específico de [30100 - 35100] galones. Al enfocar el modelo en este rango, logramos aislar el comportamiento de los datos de la interferencia generada por casos extremos, revelando un patrón altamente determinista. Esto demuestra que, en incidentes de esta escala particular, la relación entre el volumen derramado y la máxima liberación obedece a una curva polinomial casi perfecta.
# Filtramos estrictamente el intervalo óptimo
datos_intervalo <- subset(datos_finales, x >= 30100 & x <= 35100)
# Modelo Polinomial Grado 3 para el intervalo
modelo_int <- lm(y ~ poly(x, 3, raw = TRUE), data = datos_intervalo)
summary(modelo_int)
##
## Call:
## lm(formula = y ~ poly(x, 3, raw = TRUE), data = datos_intervalo)
##
## Residuals:
## Min 1Q Median 3Q Max
## -8131.0 -2316.0 -791.4 -233.6 14627.9
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -4.661e+08 4.200e+07 -11.10 1.07e-05 ***
## poly(x, 3, raw = TRUE)1 4.231e+04 3.824e+03 11.07 1.09e-05 ***
## poly(x, 3, raw = TRUE)2 -1.279e+00 1.159e-01 -11.04 1.11e-05 ***
## poly(x, 3, raw = TRUE)3 1.286e-05 1.169e-06 11.00 1.14e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6681 on 7 degrees of freedom
## Multiple R-squared: 0.9522, Adjusted R-squared: 0.9318
## F-statistic: 46.53 on 3 and 7 DF, p-value: 5.436e-05
# Coeficientes del intervalo
coef_int <- coef(modelo_int)
a_int <- coef_int[1] # beta 0
b_int <- coef_int[2] # beta 1
c_int <- coef_int[3] # beta 2
d_int <- coef_int[4] # beta 3
x_seq_int <- seq(min(datos_intervalo$x), max(datos_intervalo$x), length.out = 500)
y_pred_int <- a_int + b_int*x_seq_int + c_int*x_seq_int^2 + d_int*x_seq_int^3
plot(datos_intervalo$x, datos_intervalo$y,
col = rgb(0.8, 0.4, 0, 0.6), pch = 16, cex = 1.2,
main = "Modelo Polinomial Grado 3 [30100 - 35100] gal",
xlab = "Volumen Derramado (Galones)",
ylab = "Máxima Liberación (Galones)")
lines(x_seq_int, y_pred_int, col = "red", lwd = 3)
legend("bottomright", legend = "Modelo Intervalo", col = "red", lwd = 3, bty = "n")
# Para polinomios, extraemos el R de la raíz del R cuadrado del modelo
r_poli_int <- sqrt(summary(modelo_int)$r.squared)
cat("=== COMPARACIÓN DE AJUSTE (R) ===\n")
## === COMPARACIÓN DE AJUSTE (R) ===
cat("Pearson Global:", round(pearson_r, 4), "\n")
## Pearson Global: 0.7722
cat("Ajuste Intervalo [30.1k - 35.1k]:", round(r_poli_int, 4), "\n\n")
## Ajuste Intervalo [30.1k - 35.1k]: 0.9758
if(r_poli_int > abs(pearson_r)) {
cat("CONCLUSIÓN: El ajuste MEJORA drásticamente en este intervalo (R ≈ 0.9758).\n")
} else {
cat("CONCLUSIÓN: El ajuste es débil en este intervalo.\n")
}
## CONCLUSIÓN: El ajuste MEJORA drásticamente en este intervalo (R ≈ 0.9758).
\[ Y = -466000000 + 42300 X - 1.28 X^2 + 0.0000129 X^3 \]
cat("\n=== ECUACIÓN FINAL (INTERVALO) ===\n")
##
## === ECUACIÓN FINAL (INTERVALO) ===
cat("y =", format(a_int, scientific = TRUE, digits = 3),
"+", format(b_int, scientific = TRUE, digits = 3), "* x",
"+", format(c_int, scientific = TRUE, digits = 3), "* x^2",
"+", format(d_int, scientific = TRUE, digits = 3), "* x^3\n")
## y = -4.66e+08 + 4.23e+04 * x + -1.28e+00 * x^2 + 1.29e-05 * x^3
x_nueva <- 33000
y_pred_estimada <- a_int + b_int*x_nueva + c_int*x_nueva^2 + d_int*x_nueva^3
cat("\n=== PREDICCIÓN ===\n")
##
## === PREDICCIÓN ===
cat("Para un volumen derramado de", x_nueva, "galones:\n")
## Para un volumen derramado de 33000 galones:
cat("La máxima liberación estimada es =", round(y_pred_estimada, 2), "galones\n")
## La máxima liberación estimada es = 69822.69 galones
Conclusiones
Entre la variable independiente máxima liberación (X) y la variable dependiente respuesta actual (Y) existe una relación matemática de tipo regresión polinomial de tercer grado Esta relación se expresa mediante la fórmula del modelo:\(Y = -466000000 + 42300 X - 1.28 X^2 + 0.0000129 X^3\). El modelo permite realizar una estimación para un derrame de 33000, se estima una máxima liberación de 69822.69 galones.