1 Librerías

El primer paso para el desarrollo del modelo es preparar nuestro entorno de trabajo cargando los paquetes necesarios para la manipulación de datos, generación de tablas formales y renderizado del documento. Evitaremos la notación científica para facilitar la lectura de los ejes.

library(readr)
library(rmarkdown)
library(knitr)
library(kableExtra)

2 Carga de datos

Realizamos la importación del conjunto de datos en bruto hacia nuestro entorno en R. Este paso nos permite acceder al historial documentado de incidentes en la infraestructura, estableciendo la base empírica de nuestro análisis estadístico.

library(readr)
datos <- read_csv("database-_1_.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.

3 Seleccionar dos variables

Para comprender el verdadero impacto logístico y ambiental de los incidentes, este análisis se centra en relacionar el éxito de la limpieza con el daño ambiental definitivo.

Justificación Causa-Efecto: Definimos el “Líquido Recuperado” como nuestra variable independiente o causa (X), y a la “Pérdida Neta” como nuestra variable dependiente o efecto (Y). Analizar esta relación nos permite evaluar la eficiencia de respuesta: en derrames de gran magnitud, a medida que aumenta el volumen que se logra recuperar, el volumen que inevitablemente se pierde en el ambiente tiende a acelerarse debido a la escala masiva del incidente.

df_po <- data.frame(
  X = datos$`Liquid Recovery (Barrels)`,
  Y = datos$`Net Loss (Barrels)`
)
## Datos en la variable X (Barriles Liberados): 325
## Datos en la variable Y (Costo del Producto Perdido): 325
##        X                Y          
##  Min.   :  51.5   Min.   :    945  
##  1st Qu.: 100.0   1st Qu.:   6000  
##  Median : 220.0   Median :  12530  
##  Mean   : 611.8   Mean   :  46383  
##  3rd Qu.: 650.0   3rd Qu.:  43000  
##  Max.   :4950.0   Max.   :1092448

4 Tabla de pares de valores

Verificamos el tamaño de la muestra sin procesar y presentamos una vista estructurada de los datos resultantes antes de la limpieza. Forzamos la numeración de las filas para visualizar correctamente la estructura original.

cat("--- TABLA DE VALORES ---")
## --- TABLA DE VALORES ---
library(rmarkdown) 
paged_table(df_exp)

5 Gráfica de dispersión

Construimos un diagrama de dispersión inicial (nube de puntos) para realizar un análisis exploratorio visual y observar de manera empírica cómo se distribuyen los datos crudos en el plano cartesiano.

plot(df_exp$X, df_exp$Y, 
     main="Gráfica N° 1: Nube de Puntos",
     xlab="Líquido Recuperado", ylab="Pérdida Neta",
     pch=16, col=rgb(0.1, 0.4, 0.8, 0.5))

6 Conjetura del modelo

La gráfica inicial presenta un agrupamiento denso y ruido provocado por valores nulos, lo que impide ver la tendencia real. Por lo tanto, debemos proceder con un refinamiento crítico.

6.1 Tratamiento de los datos

Aplicamos un proceso riguroso de depuración para eliminar ruido y enfocarnos en los derrames significativos: eliminamos NAs, acotamos el rango operativo, quitamos ceros (obligatorio para logaritmos) y eliminamos los puntos donde casi no hubo pérdida para revelar la tendencia exponencial creciente.

# 1. Quitar NAs de la base original
df_exp <- na.omit(df_exp)

# 2. Rango operativo acotado para el modelo exponencial (X > 0 y X < 5000)
df_exp <- df_exp[df_exp$X > 0 & df_exp$X < 5000, ]

# 3. Omitimos valores en 0 o negativos en Y (estrictamente necesario para aplicar logaritmos)
df_exp <- df_exp[df_exp$Y > 0, ]

# 4. Filtro para evitar puntos atípicos pegados al piso que no siguen el crecimiento
df_exp <- df_exp[df_exp$Y > (df_exp$X * 0.5), ] 
## Total de observaciones tras aislar la curva exponencial: 319

6.2 Nueva gráfica de dispersión

Graficamos nuevamente los datos depurados. Verificamos que el grupo marcado ha desaparecido.

plot(df_exp$X, df_exp$Y, 
     main="Gráfica N° 2: Nube de Puntos Tratada",
     xlab="Líquido Recuperado (Barriles)", 
     ylab="Pérdida Neta (Barriles)",
     pch=16, 
     col=rgb(0.1, 0.4, 0.8, 0.5))

6.3 Nueva conjetura

Se conjetura un modelo exponencial: El costo del producto perdido (Y) presenta un crecimiento acelerado respecto al volumen (X) debido a la pérdida de economías de escala en incidentes mayores.

\(Y = a \cdot e^{bX}\)

modelo_log <- lm(log(Y) ~ X, data = df_exp)

A partir de la observación de la gráfica tratada, notamos que a medida que la recuperación aumenta, la pérdida neta también experimenta un crecimiento acelerado hacia arriba. Justificamos la elección de un modelo de crecimiento exponencial.Se conjetura un modelo exponencial clásico, cuya ecuación matemática base es:\[Y = a \cdot e^{bX}\]

6.4 Cálculo de parámetros

Procedemos a calcular los estimadores matemáticos. Transformamos el modelo exponencial a uno lineal mediante la aplicación de logaritmos naturales en la variable dependiente Y, y extraemos los coeficientes.

A partir de la observación de la gráfica anterior, formulamos una hipótesis sobre el comportamiento matemático del fenómeno. Al notar que los costos parecen dispararse a medida que aumenta el volumen del derrame, justificamos la elección de un modelo de crecimiento acelerado (como el modelo exponencial) por encima de una simple relación lineal básica.

# Aplicamos logaritmo solo a Y para el modelo exponencial
modelo_log <- lm(log(Y) ~ X, data = df_exp)

a <- exp(coef(modelo_log)[1]) # Intersección (Parámetro a)
b <- coef(modelo_log)[2]      # Tasa de crecimiento (Parámetro b, positivo)

cat("Parámetro a (Intersección):", a, "\n")
## Parámetro a (Intersección): 7907.773
cat("Parámetro b (Crecimiento):", b, "\n")
## Parámetro b (Crecimiento): 0.001111098
cat("\nLa ecuación del modelo exponencial es: Y =", round(a, 4), "* e^(", round(b, 6), "* X )\n")
## 
## La ecuación del modelo exponencial es: Y = 7907.773 * e^( 0.001111 * X )

6.5 Realidad y modelo

Para validar nuestro cálculo, superponemos la curva teórica generada por nuestra ecuación matemática sobre la nube de puntos reales.

# No usamos escala logarítmica para que se note la curva exponencial
plot(df_exp$X, df_exp$Y, 
     main="Gráfica N° 1: relación entre Volumen y Costo de Producto",
     xlab="Barriles Liberados", ylab="Costo Producto Perdido ($)",
     pch=16, col=rgb(0.1, 0.4, 0.8, 0.5))

# Creamos la línea roja que cruza la nube de puntos
x_seq <- seq(min(df_exp$X), max(df_exp$X), length.out=1000)
y_pred <- a * exp(b * x_seq)
lines(x_seq, y_pred, col="red", lwd=3)

7 Test de Pearson y Ajuste

Sometemos nuestro modelo a una evaluación estadística rigurosa cuantificando la fuerza y la dirección de la relación con el coeficiente de Pearson y el Coeficiente de Determinación (\(R^2\)).

# El coeficiente se calcula sobre la relación transformada (Y con logaritmo)
pearson_val <- cor(df_exp$X, log(df_exp$Y))
r2_val <- summary(modelo_log)$r.squared

cat("Coeficiente de correlación de Pearson (R):", round(pearson_val, 4), "\n")
## Coeficiente de correlación de Pearson (R): 0.7449
cat("Coeficiente de Determinación (R2):", round(r2_val, 4), "\n")
## Coeficiente de Determinación (R2): 0.5549
ecuacion_str <- paste0("y = ", round(a, 4), " * e^(", round(b, 6), "x)")

tabla_resumen <- data.frame(
  Variable = c("Líquido Recuperado", "Pérdida Neta"),
  Tipo = c("Independiente (x)", "Dependiente (y)"),
  R = c("", as.character(round(pearson_val, 4))),
  R2 = c("", as.character(round(r2_val, 4))),
  Parametro_a = c("", as.character(round(a, 4))),
  Parametro_b = c("", as.character(round(b, 6))),
  Ecuacion = c("", ecuacion_str)
)

colnames(tabla_resumen) <- c("Variable", "Tipo", "R", "R2", "Parámetro a", "Parámetro b", "Ecuación")

tabla_resumen %>%
  kable(format = "html", caption = "<b>Tabla N°1: Resumen del Modelo Exponencial</b>", align = "c", escape = FALSE) %>%
  kable_styling(bootstrap_options = c("hover", "condensed"), full_width = FALSE, position = "center") %>%
  row_spec(0, bold = TRUE, background = "#F2F2F2", color = "#333333") %>%
  footnote(general = "Autor: Brandon", footnote_as_chunk = TRUE)
Tabla N°1: Resumen del Modelo Exponencial
Variable Tipo R R2 Parámetro a Parámetro b Ecuación
Líquido Recuperado Independiente (x)
Pérdida Neta Dependiente (y) 0.7449 0.5549 7907.7733 0.001111 y = 7907.7733 * e^(0.001111x)
Note: Autor: Brandon

8 Estimación

¿Cuánto costaría un derrame de 2,000 barriles cual es el valor estimado es?

val_test <- 2000
prediccion <- a * exp(b * val_test)
cat("\n--- ESTIMACIÓN ---\n")
## 
## --- ESTIMACIÓN ---
cat("Para un derrame de 2,000 barriles, el valor estimado es: $", format(round(prediccion, 2), big.mark=","))
## Para un derrame de 2,000 barriles, el valor estimado es: $ 72,969.57

8.1 Restricciones

Es matemáticamente incorrecto utilizar este modelo predictivo para cualquier posible escenario sin considerar sus limitaciones intrínsecas:

  • Dominio Acotado: El modelo es válido únicamente para estimar valores dentro del rango operativo empírico de la variable tratada (X > 0 y X < 5000 barriles). Extrapolar predicciones fuera de estos límites carece de rigurosidad estadística y puede derivar en proyecciones irreales.
  • Naturaleza Física: La variable dependiente (Y) representa una pérdida neta o costo, por lo que no puede admitir predicciones en cifras negativas. Cualquier estimación matemática teórica donde el intercepto domine y cause un resultado menor a cero queda automáticamente descartada en la realidad operativa.

9 Conclusión

Entre el Líquido Recuperado y la Pérdida Neta existe una relación de tipo exponencial creciente, explicada por un coeficiente de determinación R² de 58.86%, lo que indica que el modelo logra explicar una moderada proporción de la variabilidad de la Pérdida Neta en función del Líquido Recuperado. El coeficiente de correlación fue de 74.49%, evidenciando una relación fuerte y positiva entre las variables analizadas. La ecuación matemática estimada del modelo es:\[y = 8064.8634 \cdot e^{0.001032x}\]