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.
# 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.