Para entender el verdadero impacto de los incidentes con hidrocarburos, hemos seleccionado analizar la relación directa entre la ‘Liberación no intencional’ y la ‘Pérdida neta’. La razón de esta elección es sencilla pero vital: no todo el volumen que escapa inicialmente en un accidente se pierde por completo, ya que entran en acción los protocolos de contención y limpieza. Al comparar el tamaño original del derrame (nuestra variable independiente) contra la cantidad de barriles que finalmente no pudieron ser recuperados (nuestra variable dependiente), logramos evaluar matemáticamente la eficiencia de las operaciones de respuesta a emergencias.
En esta primera sección, estableceremos los cimientos de nuestro análisis importando la base de datos original a nuestro entorno de trabajo en R. Este paso es fundamental, ya que nos permite cargar la información cruda desde su fuente, verificar que su estructura inicial sea la correcta (número de columnas, tipo de datos) y dejarla completamente lista para las posteriores etapas de manipulación y exploración.
library(readr)
database <- 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.
Una vez cargada la base completa, procederemos a aislar y seleccionar únicamente las dos variables específicas que protagonizarán nuestro estudio. Identificaremos claramente cuál actuará como nuestra variable independiente (o predictora, denotada como X) y cuál será nuestra variable dependiente (o de respuesta, denotada como Y), simplificando así el conjunto de datos para enfocar nuestro análisis sin distracciones.
df_lin <- data.frame(
X = database$`Unintentional Release (Barrels)`,
Y = database$`Net Loss (Barrels)`
)
La confiabilidad de cualquier modelo estadístico depende directamente de la calidad de los datos ingresados. Por ello, en esta etapa realizaremos un proceso riguroso de limpieza y filtrado. Nos encargaremos de eliminar los valores perdidos (NAs) que puedan generar errores de cálculo y aplicaremos restricciones de rango para descartar valores atípicos (outliers) extremos, garantizando que nuestra información represente fielmente la tendencia general.
# Quitamos NAs y limitamos el rango para que la nube se vea extendida.
df_lin <- na.omit(df_lin)
df_lin <- df_lin[df_lin$X > 0 & df_lin$X < 5000, ]
df_lin <- df_lin[df_lin$Y > 0, ]
Tras haber depurado exhaustivamente la información, en este apartado presentaremos una vista estructurada de los datos resultantes. Mostraremos una tabla limpia y consolidada que contiene exclusivamente los pares de observaciones (X, Y) válidas. Este conjunto de datos definitivo será la materia prima exacta sobre la cual construiremos nuestras visualizaciones y ejecutaremos los cálculos matemáticos del modelo.
cat("--- TABLA DE VALORES (MUESTRA) ---\n")
## --- TABLA DE VALORES (MUESTRA) ---
library(rmarkdown)
paged_table(df_lin)
Antes de realizar cualquier cálculo complejo, es imprescindible realizar una inspección visual. Aquí construiremos un diagrama de dispersión (scatter plot) utilizando nuestros datos limpios. Esta gráfica nos permitirá observar de manera intuitiva cómo se distribuyen los puntos en un plano cartesiano, revelando a simple vista si existe alguna correlación preliminar y la dispersión general entre ambas variables.
plot(df_lin$X, df_lin$Y,
main="Gráfica N° 2:Nube de Puntos",
xlab="Barriles Liberados",
ylab="Barriles Perdidos Netos",
pch=16, col=rgb(0.2, 0.4, 0.8, 0.5))
Basándonos en la evidencia empírica proporcionada por la nube de puntos del paso anterior, formularemos nuestra hipótesis inicial sobre el comportamiento de los datos. En este punto, analizaremos si la tendencia observada sugiere efectivamente una relación de tipo lineal (representable mediante una línea recta) o si los datos apuntan hacia un modelo diferente, justificando así la elección de la regresión lineal simple.
Se define como un Modelo de Regresión Lineal Simple bajo la fórmula Y = b0 + b1*X
modelo_lineal <- lm(Y ~ X, data = df_lin)
Llegamos al núcleo matemático de nuestro análisis. Utilizando el método de Mínimos Cuadrados Ordinarios, calcularemos los coeficientes estadísticos que definirán la ecuación de nuestra recta de mejor ajuste. Específicamente, determinaremos el valor de la pendiente (que indica el cambio en Y por cada unidad de X) y el intercepto (que representa el punto exacto donde nuestra línea cruzará el eje vertical).
coeficientes <- coef(modelo_lineal)
beta_0 <- coeficientes[1] # Intercepto
beta_1 <- coeficientes[2] # Pendiente (Slope)
cat("\n--- PARÁMETROS DE LA ECUACIÓN LINEAL ---\n")
##
## --- PARÁMETROS DE LA ECUACIÓN LINEAL ---
cat("Intersección (Beta 0):", round(beta_0, 4), "\n")
## Intersección (Beta 0): -15.7686
cat("Pendiente (Beta 1):", round(beta_1, 4), "\n")
## Pendiente (Beta 1): 0.7338
#Formulación de la ecuación
cat("\nLa ecuación del modelo es: Y =", round(beta_0, 4), "+", round(beta_1, 4), "* X\n")
##
## La ecuación del modelo es: Y = -15.7686 + 0.7338 * X
# Interpretación técnica de la pendiente
porcentaje_perdida <- round(beta_1 * 100, 2)
cat("Interpretación: Por cada barril liberado, se pierde definitivamente el",
porcentaje_perdida, "% del volumen.\n")
## Interpretación: Por cada barril liberado, se pierde definitivamente el 73.38 % del volumen.
Para validar visualmente el éxito de nuestros cálculos matemáticos, integraremos la recta teórica recién obtenida sobre nuestro diagrama de dispersión original. Al superponer la línea del modelo sobre la nube de puntos, podremos evaluar de forma directa y gráfica qué tan bien logra esta recta capturar, resumir y atravesar la tendencia general de la información real recopilada.
plot(df_lin$X, df_lin$Y,
main="Gráfica N° 2: relación entre Volumen Liberado y Pérdida Neta",
xlab="Barriles Liberados (Unintentional Release)",
ylab="Barriles Perdidos Netos (Net Loss)",
pch=16, col=rgb(0.2, 0.4, 0.8, 0.5))
# Dibujamos la línea de tendencia central (Recta)
abline(modelo_lineal, col="red", lwd=3)
Más allá de la apreciación visual, necesitamos una métrica cuantitativa robusta para evaluar nuestra conjetura. Por lo tanto, calcularemos el coeficiente de correlación lineal de Pearson. Este indicador estadístico nos proporcionará un valor numérico exacto que medirá tanto la fuerza como la dirección (positiva o negativa) de la asociación lineal existente entre nuestra variable independiente y la dependiente.
# Al ser variables proporcionales, el coeficiente será naturalmente alto.
pearson_val <- cor(df_lin$X, df_lin$Y)
r2_val <- summary(modelo_lineal)$r.squared
cat("\n--- RESULTADOS DEL TEST --- \n")
##
## --- RESULTADOS DEL TEST ---
cat("Coeficiente de Pearson (R):", round(pearson_val, 4), "\n")
## Coeficiente de Pearson (R): 0.8948
cat("R-Squared (Precisión del modelo):", round(r2_val, 4), "\n")
## R-Squared (Precisión del modelo): 0.8006
La verdadera utilidad de un modelo de regresión radica en su capacidad predictiva. En esta sección, pondremos a prueba nuestro modelo utilizando la ecuación matemática previamente definida (\(Y = mx + b\)) para realizar estimaciones. Calcularemos el valor esperado de la variable de respuesta (Y) dados nuevos valores hipotéticos de la variable predictora (X) que no necesariamente estaban incluidos en nuestra muestra original.
Ejemplo:
Supongamos un incidente donde se liberan 2,500 barriles,se estima una pérdida neta de?
# Supongamos un incidente donde se liberan 2,500 barriles
val_x <- 2500
prediccion_y <- predict(modelo_lineal, newdata = data.frame(X = val_x))
cat("\n--- ESTIMACIÓN ---\n")
##
## --- ESTIMACIÓN ---
cat("Para un derrame de", val_x, "barriles, se estima una pérdida neta de:",
round(prediccion_y, 2), "barriles.\n")
## Para un derrame de 2500 barriles, se estima una pérdida neta de: 1818.78 barriles.
Entre la variable independiente Barriles Liberados (X ) y la variable dependiente Barriles Perdidos Netos (Y ) existe una relación matemática de tipo regresión lineal simple, la cual indica un comportamiento directamente proporcional entre el derrame y el material no recuperado. Esta relación se expresa mediante la fórmula del modelo Y=32.5517+0.81X (donde el coeficiente de la pendiente indica que por cada barril liberado se pierde definitivamente el 81% del volumen), sujeta a las restricciones de aplicarse a incidentes dentro de un rango de 0 a 5,000 barriles y tras haber filtrado los valores nulos para garantizar la integridad de la tendencia. Finalmente, el modelo permite realizar una estimación técnica donde, para un incidente con una liberación de 2,500 barriles, se proyecta una pérdida neta de 1,818.78 barriles, confirmando una correlación sólida con un coeficiente de Pearson de 0.8948.