1 Justificación de las dos variables

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.

2 Cargar datos

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.

3 Extraer las dos variables

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)`
)

3.1 Limpieza y filtro

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, ]

4 Conteo de las dos variables

Una vez concluida la fase de depuración y filtrado, resulta indispensable conocer el tamaño exacto de nuestra muestra final. Determinar el número de observaciones útiles no es un mero formalismo; este conteo nos indicará el volumen de datos con el que construiremos nuestro modelo, lo cual impacta directamente en la significancia, el margen de error y el poder estadístico de nuestros futuros resultados. A continuación, verificaremos la cantidad total de registros (pares de variables X e Y) que han superado nuestros estrictos criterios de calidad y se encuentran listos para el análisis cuantitativo.

# Contar el número total de observaciones (filas) que quedaron para el análisis
numero_observaciones <- nrow(df_lin)

# Imprimir el resultado
cat("El número de observaciones válidas para el análisis (X e Y) es:", numero_observaciones, "\n")
## El número de observaciones válidas para el análisis (X e Y) es: 1283
# Opcional: Si deseas conocer el número de elementos en cada variable individualmente
conteo_X <- length(df_lin$X)
conteo_Y <- length(df_lin$Y)

cat("Elementos en la variable X (Liberación no intencional):", conteo_X, "\n")
## Elementos en la variable X (Liberación no intencional): 1283
cat("Elementos en la variable Y (Pérdida neta):", conteo_Y, "\n")
## Elementos en la variable Y (Pérdida neta): 1283

5 Tabla de pares de valores

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)

6 Gráficas

6.1 Gráfica de nube de puntos

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.

# 1. Tu código original de extracción y limpieza
df_lin <- data.frame(
  X = database$`Unintentional Release (Barrels)`,
  Y = database$`Net Loss (Barrels)`
)


# 3. Tu código original de graficación
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))

6.2 Conjeturar el modelo

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)

6.3 Gráfico con la línea del modelo

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)

7 Test de bondad del modelo

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

7.1 Coeficiente de correlación de Pearson

cat("Coeficiente de Pearson (R):", round(pearson_val, 4), "\n")
## Coeficiente de Pearson (R): 0.9184

7.2 Coeficiente de Determinación

cat("Coeficiente de Determinación:", round(r2_val, 4), "\n")
## Coeficiente de Determinación: 0.8435

7.3 La ecuación del modelo

coeficientes <- coef(modelo_lineal)

beta_0 <- coeficientes[1] # Intercepto
beta_1 <- coeficientes[2] # Pendiente (Slope)

#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 = -32.6068 + 0.7952 * 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 79.52 % del volumen.
Tabla N°1 del Resumen del Modelo de Regresión Lineal
Variable Tipo Pearson R2 Intercepto Pendiente Ecuación
Liberación no intencional (Barriles) Independiente (x)
Pérdida neta (Barriles) Dependiente (y) 0.9184 0.8435 -32.6068 0.7952 y = 0.7952x + -32.6068
Autor: Brandon

8 Estimación

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: 1955.38 barriles.

9 Conclusión

Entre los Barriles Liberados y los Barriles Perdidos Netos existe una relación de tipo lineal cuya ecuación matemática está representada por \(y = 0.81x + 32.5517\), siendo ‘x’ los Barriles Liberados y ‘y’ los Barriles Perdidos Netos.El modelo estimado muestra que por cada barril que aumentan los Barriles Liberados, los Barriles Perdidos Netos aumentan en aproximadamente 0.81 barriles. El intercepto representa el valor estimado cuando los Barriles Liberados son 0, y su presencia mejora el ajuste estadístico del modelo. El R² ≈ 84% indica un buen nivel de explicación de los datos. 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.