1 Regresión Lineal

1.0.1 Carga de datos

setwd("/cloud/project")
datos <- read.csv("DERRAMES_GLOBALEST.csv", header = TRUE, sep = ";" , dec = ".")
str(datos)
## 'data.frame':    3550 obs. of  23 variables:
##  $ Id                              : int  6786 6250 8220 6241 6216 6620 6262 6229 6201 6221 ...
##  $ Dia                             : int  19 3 21 16 19 7 10 12 18 29 ...
##  $ Mes                             : int  1 6 4 3 12 10 2 5 3 1 ...
##  $ Año                             : chr  "A" "1979" "2010" "1978" ...
##  $ Nombre                          : chr  "Arabian Gulf Spills; Persian Gulf, Kuwait" "IXTOC I; Bahia de Campeche, Mexico" "Deepwater Horizon; Gulf of Mexico" "Amoco Cadiz; Brittany, France" ...
##  $ Ubicacion                       : chr  "Persian Gulf, Kuwait" "Bahia de Campeche, Mexico" "Gulf of Mexico" "Brittany, France" ...
##  $ Latitud                         : chr  "29,5" "19,4083" "28,7367" "48,5833" ...
##  $ Longuitud                       : chr  "48" "-92,325" "-88,3872" "-4,71667" ...
##  $ Amenaza                         : chr  "Oil" "Oil" "Oil" "Oil" ...
##  $ Etiquetas                       : chr  "" "Collision" "" "Grounding" ...
##  $ Tipo_de_crudo                   : chr  "Kuwait crude oil" "IXTOC I crude oil" "Diesel, crude oil" "Arabian light crude, Iranian light crude, Bunker C" ...
##  $ Cantidad_recuperada_superficie  : int  NA NA 1 NA NA NA NA NA NA NA ...
##  $ Cantidad_recuperada_costas      : int  NA NA 1 NA NA NA NA NA NA NA ...
##  $ Cantidad_tratada_biologicamente : int  1 NA 1 1 NA NA NA NA NA NA ...
##  $ Cantidad_dispersada_quimicamente: int  NA 1 1 1 NA NA NA 1 1 1 ...
##  $ Cantidad_quemada                : int  NA 1 1 NA NA NA NA 1 1 1 ...
##  $ Maximo_liberacion_galones       : int  336000009 NA 205000000 68000017 NA NA NA 9240000 36100000 NA ...
##  $ Barreras_de_contencion_flotantes: int  35 12 182 17 3 3 7 8 5 6 ...
##  $ Causa_principal                 : chr  "Daño del tanque  " "Incendio y explosion " "Incendio y explosion " "Daño del tanque " ...
##  $ Volumen_derramados_galones      : chr  "336.000.000" "365.000.000" "600.000.000" "68.000.000" ...
##  $ Respuesta_actual_galones        : chr  "336000000" "252000000" "168000000" "68700000" ...
##  $ Fuente_respuesta                : chr  "description and posts" "posts" "description" "posts" ...
##  $ etiqueta_actualizacion          : chr  "RA updated" "RA newly acquired" "RA updated" "RA updated" ...
options(scipen = 999)  # Evita notación científica

1.1 Definir rangos

rango_x <- c(0, 4000)   # Respuesta_actual_galones
rango_y <- c(0, 4000)   # Maximo_liberacion_galones

1.2 Conversión a numérico

datos$Respuesta_actual_galones <-
  as.numeric(as.character(datos$Respuesta_actual_galones))
## Warning: NAs introduced by coercion
datos$Maximo_liberacion_galones <-
  as.numeric(as.character(datos$Maximo_liberacion_galones))

1.3 Filtrado por Rangos + NA + ceros

datos_filtrados <- subset(
  datos,
  Respuesta_actual_galones >= rango_x[1] &
    Respuesta_actual_galones <= rango_x[2] &
    Maximo_liberacion_galones >= rango_y[1] &
    Maximo_liberacion_galones <= rango_y[2]
)

datos_filtrados <- subset(
  datos_filtrados,
  !is.na(Respuesta_actual_galones) &
    !is.na(Maximo_liberacion_galones) &
    Respuesta_actual_galones > 0 &
    Maximo_liberacion_galones > 0
)

1.4 Eliminar duplicados (X, Y)

datos_unicos <- datos_filtrados[
  !duplicated(datos_filtrados[, c(
    "Respuesta_actual_galones",
    "Maximo_liberacion_galones"
  )]), 
]

#  Eliminar repetidos en X y Y
# (valores totalmente independientes)
datos_independientes <- datos_unicos[
  !duplicated(datos_unicos$Respuesta_actual_galones) &
    !duplicated(datos_unicos$Maximo_liberacion_galones),
]

1.5 Test de bondad

x_ind <- as.numeric(datos_independientes$Respuesta_actual_galones)
y_ind <- as.numeric(datos_independientes$Maximo_liberacion_galones)
modelo_lineal_ind <- lm(y_ind ~ x_ind)
summary(modelo_lineal_ind)
## 
## Call:
## lm(formula = y_ind ~ x_ind)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1621.08   -41.67   -27.24    12.60  2155.39 
## 
## Coefficients:
##             Estimate Std. Error t value            Pr(>|t|)    
## (Intercept) 45.28181   55.78067   0.812               0.419    
## x_ind        0.95489    0.03808  25.073 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 370.6 on 79 degrees of freedom
## Multiple R-squared:  0.8884, Adjusted R-squared:  0.887 
## F-statistic: 628.7 on 1 and 79 DF,  p-value: < 0.00000000000000022

1.6 Resultados del modelo

# Coeficientes
intercepto <- coef(modelo_lineal_ind)[1]
pendiente  <- coef(modelo_lineal_ind)[2] 

# Correlación
r  <- cor(x_ind, y_ind)
r2 <- r^2 * 100
cat("\nEcuación de regresión lineal (sin duplicados):\n")
## 
## Ecuación de regresión lineal (sin duplicados):
cat("y =", round(intercepto, 4), "+", round(pendiente, 6), "* x\n")
## y = 45.2818 + 0.95489 * x
cat("R² =", round(r2, 2), "%\n")
## R² = 88.84 %

1.7 Representación gráfica del modelo

plot(x_ind, y_ind,
     pch = 19,
     col = rgb(0, 191, 255, 120, maxColorValue = 255),
     cex = 0.9,
     main = "Relación lineal entre Respuesta actual\n y Máxima Liberación de Petróleo",
     xlab = "Respuesta actual (galones)",
     ylab = "Máxima liberación (galones)",
     cex.main = 0.9,
     cex.lab = 0.9,
     cex.axis = 0.8,
     bty = "l")

abline(modelo_lineal_ind, col = "darkgreen", lwd = 2)
grid(col = "gray80", lty = "dotted")

legend("topleft",
       legend = c("Datos observados", "Recta de regresión"),
       col = c("deepskyblue3", "darkgreen"),
       pch = c(19, NA),
       lty = c(NA, 1),
       lwd = c(NA, 2),
       cex = 0.8,
       bty = "n")

1.8 Conclusión

La regresión lineal muestra una relación positiva entre la Respuesta actual y la Máxima liberación de petróleo, evidenciada por una pendiente positiva. La cercanía de los datos a la recta de regresión indica un buen ajuste del modelo, lo que sugiere que la respuesta actual es un predictor estadísticamente significativo de la máxima liberación dentro del rango analizado.