Importamos el archivo “database.xls” que contiene el histórico de
incidentes en oleoductos. Utilizamos clean_names() para
asegurar que el manejo de las columnas sea eficiente.
library(readxl)
library(janitor)
library(tidyverse)
library(knitr)
library(DT)
datos <- read_excel("database.xls") %>% clean_names()
Se identifican y extraen las columnas correspondientes al volumen de pérdida no intencional y los costos totales asociados.
v_barrels <- datos$unintentional_release_barrels
v_costs <- datos$all_costs
Definimos nuestras variables de estudio: Barriles (X) como causa y Costo Total (Y) como efecto.
x_indep <- v_barrels
y_depen <- v_costs
Consolidamos los datos filtrando valores NA y ceros. Presentamos una tabla interactiva para facilitar la exploración de los datos.
tabla_pares <- data.frame(X = x_indep, Y = y_depen) %>%
filter(!is.na(X), !is.na(Y), X > 0, Y > 0)
datatable(tabla_pares,
colnames = c("Barriles (X)", "Costos USD (Y)"),
options = list(pageLength = 10))
La nube de puntos en escala logarítmica permite visualizar la relación potencial de forma lineal.
ggplot(tabla_pares, aes(x = X, y = Y)) +
geom_point(alpha = 0.4, color = "dodgerblue4") +
scale_x_log10() + scale_y_log10() +
labs(title = "Nube de Puntos (Log-Log)", x = "Log10: Barriles", y = "Log10: Costos") +
theme_minimal()
Tras observar la tendencia lineal en logaritmos, conjeturamos un modelo de la forma: \[Y = \alpha \cdot X^{\beta}\] Este modelo es ideal para representar costos que crecen de forma no lineal ante desastres ambientales. # 7. CALCULAR PARÁMETROS (LOGARITMO X Y LOGARITMO Y) Procedemos a la linealización mediante logaritmos neperianos para obtener los parámetros mediante el método de mínimos cuadrados.
log_x <- log(tabla_pares$X)
log_y <- log(tabla_pares$Y)
modelo_lineal <- lm(log_y ~ log_x)
beta <- coef(modelo_lineal)[2]
alpha <- exp(coef(modelo_lineal)[1])
Para el modelo ajustado, se han obtenido los siguientes valores fundamentales:
Superponemos la curva del modelo calculado sobre los datos reales. Se utilizan escalas logarítmicas para visualizar correctamente todos los órdenes de magnitud.
x_curva <- seq(min(tabla_pares$X), max(tabla_pares$X), length.out = 500)
df_curva <- data.frame(X = x_curva, Y = alpha * (x_curva^beta))
ggplot(tabla_pares, aes(x = X, y = Y)) +
geom_point(alpha = 0.6, color = "steelblue", size = 2) +
geom_line(data = df_curva, color = "firebrick", size = 1.2) +
scale_x_log10() + scale_y_log10() +
labs(title = "Ajuste del Modelo Potencial",
subtitle = paste("Ecuación: Y =", format(round(alpha, 2), big.mark = ","), "* X^", round(beta, 2))) +
theme_minimal()
Calculamos el coeficiente de correlación de Pearson sobre los datos transformados para determinar la fuerza de la relación lineal entre las variables logarítmicas.
r_pearson <- cor(log_x, log_y)
cat("Correlación de Pearson (r):", round(r_pearson, 4))
## Correlación de Pearson (r): 0.5111
R²: 0.2612 ( 26.12 %)
Finalmente, utilizamos el modelo para realizar una estimación práctica. ¿Cuál sería el costo esperado para un incidente de 500 barriles?
x_estimar <- 500
y_estimado <- alpha * (x_estimar^beta)
cat("Para un derrame de", x_estimar, "barriles, el costo estimado es de $",
format(round(y_estimado, 2), big.mark = ","))
## Para un derrame de 500 barriles, el costo estimado es de $ 235,116.9