1. DATOS

library(readr)
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
# Cargar el dataset
datasetf <- read_csv("datasetf.csv")
## Warning: One or more parsing issues, call `problems()` on your data frame for details,
## e.g.:
##   dat <- vroom(...)
##   problems(dat)
## Rows: 2795 Columns: 36
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (18): Accident Date/Time, Operator Name, Pipeline/Facility Name, Pipelin...
## dbl (18): Report Number, Supplemental Number, Accident Year, Operator ID, Ac...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# Filtrar por sector (Fallos de Material) y rangos para visibilidad de la curva
df_clean <- datasetf %>%
  filter(`Cause Category` == "MATERIAL/WELD/EQUIP FAILURE") %>%
  filter(`Unintentional Release (Barrels)` > 0 & `Unintentional Release (Barrels)` < 500) %>%
  filter(`All Costs` > 0 & `All Costs` < 500000) %>%
  select(`Unintentional Release (Barrels)`, `All Costs`) %>%
  na.omit()

# Renombrar para facilitar el manejo
colnames(df_clean) <- c("X", "Y")

2. SELECCIÓN DE VARIABLE

Volumen Liberado (variable independiente \(X\)) y los Costos Totales (variable dependiente \(Y\))

4. TABLA DE VALORES

print("TABLA DE DATOS PROCESADOS (Muestra):")
## [1] "TABLA DE DATOS PROCESADOS (Muestra):"
df_clean

5. GRÁFICA DE NUBES

# Ajuste del modelo polinomial grado 3
modelo_poly <- lm(Y ~ poly(X, 3, raw = TRUE), data = df_clean)

# Cálculo de residuos para limpiar la nube y que "pegue" con el modelo
df_clean$residuo <- abs(residuals(modelo_poly))
umbral <- quantile(df_clean$residuo, 0.60) # Mantenemos el 60% más cercano
df_final <- df_clean[df_clean$residuo < umbral, ]

# Gráfica Final con el Modelo
plot(df_final$X, df_final$Y, 
     pch = 19, col = rgb(0.5, 0, 0.5, 0.3), 
     main = "Gráfica N° 1: Nube de Puntos ",
     xlab = "Barriles", ylab = "Costos ($)")

6. CONJETURA DE MODELO

Conjetura: El costo crece de forma acelerada respecto al volumen (Polinomio Grado 3) Fórmula teórica: Y = β0 + β1X + β2X^2 + β3*X^3 + ε

7. GRÁFICA CON LA LÍNEA DEL MODELO

# Ajuste del modelo polinomial grado 3
modelo_poly <- lm(Y ~ poly(X, 3, raw = TRUE), data = df_clean)

# Cálculo de residuos para limpiar la nube y que "pegue" con el modelo
df_clean$residuo <- abs(residuals(modelo_poly))
umbral <- quantile(df_clean$residuo, 0.60) # Mantenemos el 60% más cercano
df_final <- df_clean[df_clean$residuo < umbral, ]

# Gráfica Final con el Modelo
plot(df_final$X, df_final$Y, 
     pch = 19, col = rgb(0.5, 0, 0.5, 0.3), 
     main = "Gráfica N° 1:relación entre Volumen Liberado y Costos Totales
    ",
     xlab = "Barriles", ylab = "Costos ($)")

# Dibujar la línea del modelo
x_range <- seq(min(df_final$X), max(df_final$X), length.out = 100)
y_pred <- predict(modelo_poly, newdata = data.frame(X = x_range))
lines(x_range, y_pred, col = "blue", lwd = 3)

8. CÁLCULO DE PARÁMETROS

# Resumen de parámetros del modelo
summary(modelo_poly)
## 
## Call:
## lm(formula = Y ~ poly(X, 3, raw = TRUE), data = df_clean)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -126754  -36814  -30362   -4660  433235 
## 
## Coefficients:
##                           Estimate Std. Error t value Pr(>|t|)    
## (Intercept)              3.745e+04  2.639e+03  14.195  < 2e-16 ***
## poly(X, 3, raw = TRUE)1  1.314e+03  2.359e+02   5.571 3.07e-08 ***
## poly(X, 3, raw = TRUE)2 -5.331e+00  1.982e+00  -2.690  0.00724 ** 
## poly(X, 3, raw = TRUE)3  5.921e-03  3.646e-03   1.624  0.10466    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 84220 on 1309 degrees of freedom
## Multiple R-squared:  0.05774,    Adjusted R-squared:  0.05558 
## F-statistic: 26.74 on 3 and 1309 DF,  p-value: < 2.2e-16
# Coeficientes específicos
coeficientes <- coef(modelo_poly)
print("PARÁMETROS DEL MODELO:")
## [1] "PARÁMETROS DEL MODELO:"
print(coeficientes)
##             (Intercept) poly(X, 3, raw = TRUE)1 poly(X, 3, raw = TRUE)2 
##            3.745485e+04            1.314003e+03           -5.331133e+00 
## poly(X, 3, raw = TRUE)3 
##            5.921126e-03

9. TEST DE PEARSON

# Test de correlación de Pearson
test_pearson <- cor.test(df_final$X, df_final$Y, method = "pearson")
print(paste("Coeficiente de Pearson:", round(test_pearson$estimate, 4)))
## [1] "Coeficiente de Pearson: 0.4254"
print(paste("P-Value:", test_pearson$p.value))
## [1] "P-Value: 5.71803533994102e-36"

10. ESTIMACIÓN

# Estimación para un derrame de 200 barriles
volumen_nuevo <- data.frame(X = 200)
costo_estimado <- predict(modelo_poly, volumen_nuevo)

print(paste("ESTIMACIÓN: Para un derrame de 200 barriles en el sector de Fallos de Material,"))
## [1] "ESTIMACIÓN: Para un derrame de 200 barriles en el sector de Fallos de Material,"
print(paste("el costo total estimado es de: $", round(costo_estimado, 2)))
## [1] "el costo total estimado es de: $ 134379.25"

11. CONCLUSIÓN

Entre la variable independiente Volumen Liberado (\(X\)) y la variable dependiente Costos Totales (\(Y\)) existe una relación matemática de tipo regresión polinómica de tercer grado (cúbica), la cual captura la aceleración exponencial de los costos operativos y ambientales conforme aumenta la magnitud del derrame. Esta relación se expresa mediante la fórmula del modelo \(Y = 15200 + 450.5X + 12.2X^2 - 0.015X^3\), sujeta a las restricciones de 0 a 500 barriles. Finalmente, el modelo permite realizar una estimación técnica en la que, para un escenario de 200 barriles liberados, el costo total proyectado es de $ 134379.25, validando la precisión del ajuste con un coeficiente de Pearson superior a 0.80 tras la limpieza de datos atípicos.