1.Carga de datos

setwd("/cloud/project/")
datos <- read.csv("DerramesEEUU.csv", header = TRUE, sep = ";", dec = ",", na.strings = "-")
str(datos)
## 'data.frame':    2760 obs. of  59 variables:
##  $ NumeroInforme                          : int  20100064 20100054 20100092 20100098 20100101 20100102 20100113 20100120 20100039 20100150 ...
##  $ NumeroComplementario                   : int  15072 15114 15120 15127 15130 15132 15146 15162 15197 15205 ...
##  $ DiaAccidente                           : int  8 25 10 28 27 29 11 23 15 11 ...
##  $ MesAccidente                           : int  4 3 5 4 5 5 6 5 3 1 ...
##  $ AnioAccidente                          : int  2010 2010 2010 2010 2010 2010 2010 2010 2010 2010 ...
##  $ HoraAccidente                          : int  6 13 6 24 3 14 7 6 15 2 ...
##  $ AmPmAccidente                          : chr  "a. m." "p. m." "a. m." "p. m." ...
##  $ IDOperador                             : int  31684 18779 30829 12105 20160 30003 1248 300 18718 32296 ...
##  $ NombreOperador                         : chr  "CONOCOPHILLIPS" "SUNOCO, INC (R&M)" "TEPPCO CRUDE PIPELINE, LLC" "MAGELLAN AMMONIA PIPELINE, L.P." ...
##  $ NombreOleoductoInstalacion             : chr  "GD-03, GOLD LINE" "PHILADELPHIA REFINERY - WEST YARD" "HOBBS TO MIDLAND" "WHITING TO EARLY SEGMENT" ...
##  $ UbicacionOleoducto                     : chr  "ONSHORE" "ONSHORE" "ONSHORE" "ONSHORE" ...
##  $ TipoOleoducto                          : chr  "ABOVEGROUND" "ABOVEGROUND" "UNDERGROUND" "UNDERGROUND" ...
##  $ TipoLiquido                            : chr  "REFINED AND/OR PETROLEUM PRODUCT (NON-HVL), LIQUID" "REFINED AND/OR PETROLEUM PRODUCT (NON-HVL), LIQUID" "CRUDE OIL" "HVL OR OTHER FLAMMABLE OR TOXIC FLUID, GAS" ...
##  $ SubtipoLiquido                         : chr  "GASOLINE (NON-ETHANOL)" "OTHER" NA "ANHYDROUS AMMONIA" ...
##  $ NombreLiquido                          : chr  NA "VACUUM GAS OIL (VGO)" NA NA ...
##  $ CiudadAccidente                        : chr  "GREEN RIDGE" "PHILADELPHIA" "HOBBS" "SCHALLER" ...
##  $ CondadoAccidente                       : chr  "PETTIS" "PHILADELPHIA" "LEA" "IDA" ...
##  $ EstadoAccidente                        : chr  "MO" "PA" "NM" "IA" ...
##  $ LatitudAccidente                       : num  38.6 39.9 32.6 42.5 30.2 ...
##  $ LongitudAccidente                      : num  -93.4 -75.2 -103.1 -95.3 -91.2 ...
##  $ CategoriaCausa                         : chr  "NATURAL FORCE DAMAGE" "MATERIAL/WELD/EQUIP FAILURE" "CORROSION" "MATERIAL/WELD/EQUIP FAILURE" ...
##  $ SubcategoriaCausa                      : chr  "TEMPERATURE" "NON-THREADED CONNECTION FAILURE" "EXTERNAL" "CONSTRUCTION, INSTALLATION OR FABRICATION-RELATED" ...
##  $ LiberacionInvoluntariaBarriles         : num  0.24 1700 2 0.36 1.31 ...
##  $ LiberacionIntencionalBarriles          : chr  "0" "0" NA "0.05" ...
##  $ RecuperacionLiquidoBarriles            : num  0.07 1699 0.48 0 0 ...
##  $ PerdidaNetaBarriles                    : num  0.17 1 1.52 0.36 1.31 ...
##  $ IgnicionLiquido                        : chr  "NO" "NO" "NO" "NO" ...
##  $ ExplosionLiquido                       : chr  "NO" "NO" "NO" "NO" ...
##  $ CierreOleoducto                        : chr  "YES" "YES" "NO" "NO" ...
##  $ DiaCierre                              : int  8 25 NA NA 27 NA NA 23 15 11 ...
##  $ MesCierre                              : int  4 3 NA NA 5 NA NA 5 3 1 ...
##  $ AnioCierre                             : int  2010 2010 NA NA 2010 NA NA 2010 2010 2010 ...
##  $ HoraCierre                             : int  6 18 NA NA 3 NA NA 7 16 2 ...
##  $ AmPmCierre                             : chr  "a. m." "p. m." NA NA ...
##  $ DiaReinicio                            : int  9 28 NA NA 27 NA NA 23 15 15 ...
##  $ MesReinicio                            : int  4 3 NA NA 5 NA NA 5 3 1 ...
##  $ AnioReinicio                           : int  2010 2010 NA NA 2010 NA NA 2010 2010 2010 ...
##  $ HoraReinicio                           : int  10 16 NA NA 24 NA NA 9 18 15 ...
##  $ AmPmReinicio                           : chr  "a. m." "p. m." NA NA ...
##  $ EvacuacionesPublicas                   : int  NA 0 NA NA 0 0 0 0 NA 0 ...
##  $ LesionesEmpleadosOperador              : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ LesionesContratistasOperador           : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ LesionesRescatistasEmergencia          : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ OtrasLesiones                          : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ LesionesPublico                        : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ TodasLesiones                          : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ FallecimientosEmpleadosOperador        : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ FallecimientosContratistasOperador     : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ FallecimientosRescatistasEmergencia    : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ OtrosFallecimientos                    : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ FallecimientosPublico                  : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ TodosFallecimientos                    : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ CostosDaniosPropiedad                  : int  0 0 30000 12000 2720 NA 750 1300 NA 29360 ...
##  $ CostosMercanciaPerdidas                : int  27 0 100 30 1500 150 300 340 46 136233 ...
##  $ CostosDaniosPropiedadesPublicasPrivadas: int  0 0 1000 5000 0 0 0 0 NA NA ...
##  $ CostosRespuestaEmergencia              : int  0 0 NA 0 1000 NA 400 2445 10999 NA ...
##  $ CostosRemediacionAmbiental             : int  0 100000 20000 15000 NA NA 6050 3350 452 NA ...
##  $ OtrosCostos                            : int  0 0 NA 0 NA NA 0 2530 NA NA ...
##  $ TodosCostos                            : int  27 100000 51100 32030 5220 150 7500 9965 11497 165593 ...

1.1 Extracción de datos

IgnicionLiquido <- na.omit(datos$IgnicionLiquido)

2.Distribución de Frecuencias

TDF_ignicion <- table(IgnicionLiquido)
tabla_ignicion <- as.data.frame(TDF_ignicion)
names(tabla_ignicion) <- c("Ignicion", "Fo")


tabla_ignicion$Probabilidad <- round(tabla_ignicion$Fo / sum(tabla_ignicion$Fo), 4)

2.1 Tabla de Frecuencia

TDFFinalignicion <- rbind(
  tabla_ignicion,
  data.frame(Ignicion = "TOTAL", 
             Fo = sum(tabla_ignicion$Fo), 
             Probabilidad = 1)
)

library(gt)
tabla_IgnicionLiquido <- TDFFinalignicion %>%
  gt() %>%
  cols_label(
    Ignicion = md("**Ignición de líquidos**"),
    Fo = md("**Frecuencia Observada**"),
    Probabilidad = md("**Probabilidad**")
  ) %>%
  tab_header(
    title = md("**Tabla N° 1**"),
    subtitle = md("**Distribución de accidentes por ignición de líquidos en oleoductos en EE.UU. (2010–2017)**")
  ) %>%
  tab_source_note(
    source_note = md("Autor: Grupo 1")
  ) %>%
  tab_options(
    table.background.color = "white",
    row.striping.background_color = "white",
    table.border.top.color = "black",
    table.border.bottom.color = "black",
    table.border.top.style = "solid",
    table.border.bottom.style = "solid",
    column_labels.font.weight = "bold",  # corregido
    column_labels.border.top.color = "black",
    column_labels.border.bottom.color = "black",
    column_labels.border.bottom.width = px(2),  # requiere library(gt)
    heading.border.bottom.color = "black",
    heading.border.bottom.width = px(2),
    table_body.hlines.color = "gray",
    table_body.border.bottom.color = "black"
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_body(
      rows = Ignicion == "TOTAL" 
    )
  )

tabla_IgnicionLiquido
Tabla N° 1
Distribución de accidentes por ignición de líquidos en oleoductos en EE.UU. (2010–2017)
Ignición de líquidos Frecuencia Observada Probabilidad
NO 2667 0.9663
YES 93 0.0337
TOTAL 2760 1.0000
Autor: Grupo 1

2.2 Gráfica de distribución de probabilidad

barplot(tabla_ignicion$Probabilidad,
        main = "Gráfica No.1: Distribución de probabilidad de ignición 
        de líquidos en accidentes de oleoductos en EE.UU",
        xlab = "Tipo de Oleoducto",
        ylab = "Probabilidad", 
        col = "#FFCC9E", 
        names.arg = tabla_ignicion$Ignicion, 
        las = 1, 
        cex.names = 0.8, 
        cex.axis = 0.8, 
        cex.main = 1.2)

3.Conjetura de Modelo

Se conjetura que el modelo de Bernoulli es el más apropiado para la variable IgnicionLiquido debido a que presenta dos posibles resultados mutuamente excluyentes:

  • YES (Sí): Ocurrió ignición.
  • NO (No): No ocurrió ignición.

Esto cumple con las condiciones para aplicar un modelo Bernoulli, ya que se trata de un experimento dicotómico con un solo ensayo y dos resultados posibles: éxito (1) y fracaso (0).

3.1 Conversión a binario

Para trabajar con el modelo de Bernoulli, se codificaron los valores de la variable en un código binario:

  • YES = 1 → Éxito (accidente con ignición)
  • NO = 0 → Fracaso (accidente sin ignición)
Ignicion_bin <- ifelse(IgnicionLiquido == "YES", 1, 0)

3.2 Cálculo de probabilidad muestral

La probabilidad muestral (\(\hat{p}\)) representa la proporción de accidentes con ignición dentro del total de accidentes observados.

Se calcula como la media aritmética de la variable binaria:

p_bernoulli <- mean(Ignicion_bin)

La probabilidad de que se presente ignición de liquido en accidentes es: 0.03369565

3.3 Cálculo de Frecuencias Experimentales

Frecuencias Observadas

tabla_binaria <- table(factor(Ignicion_bin, levels = c(0,1)))
df_ignicion <- as.data.frame(tabla_binaria)
names(df_ignicion) <- c("IGNICION", "FO")

Probabilidad Experimental

df_ignicion$Probabilidad_Experimental <- round(df_ignicion$FO / sum(df_ignicion$FO) * 100, 2)

3.4 Cálculo de Frecuencias bajo el modelo de Bernoulli

Bajo el supuesto de que la variable sigue una distribución Bernoulli con parámetro (p =0.0337), se calculan las frecuencias esperadas (FE) y la probabilidad teórica. La probabilidad teórica se obtiene como:

  • 𝑃(𝑋 = 0) = 1 - \(\hat{p}\) (No ocurrió ignición)
  • 𝑃(𝑋 = 1) = \(\hat{p}\) (Ocurrió ignición)

Probabilidad Teórica

df_ignicion$Probabilidad_Teorica <- round(c(1 - p_bernoulli, p_bernoulli) * 100, 2)

Frecuencias Esperadas del modelo

# Frecuencias esperadas
df_ignicion$FE <- round((df_ignicion$Probabilidad_Teorica  / 100) * sum(df_ignicion$FO), 4)

3.5 Gráfica comparativa

barplot(
  rbind(df_ignicion$Probabilidad_Experimental, df_ignicion$Probabilidad_Teorica),
  beside = TRUE,
  main = "Gráfica No.2: Comparación realidad y modelo bernoulli de 
  la ignición de líquidos en accidentes en oleoductos",
  names.arg = c("No", "Sí"),
  col = c("#FFCC9E", "#C6D9F2"),
  ylab = "Probabilidad (%)",
  legend.text = c("Experimental", "Teórica"),
  args.legend = list(x = "topright"),
  ylim = c(0,100)
)

3.6 Test de Bondad de ajuste

Dado que el parámetro p del modelo Bernoulli fue estimado directamente a partir de los datos de la muestra, las frecuencias esperadas coinciden con las frecuencias observadas. Esto produce un estadístico Chi-cuadrado igual a cero (X2 = 0) y grados de libertad nulos (gl= 0) Por lo tanto, la prueba de bondad de ajuste no es aplicable en este caso.

4.Conclusión

La variable ‘IgnicionLiquido’ puede modelarse mediante una distribución de Bernoulli, ya que cumple con las condiciones de un experimento dicotómico (solo dos posibles resultados: ‘Sí’ y ‘No’). El parámetro de probabilidad muestral se estima como: \[\hat{p} = 0.0337\] Lo que indica que, aproximadamente, de cada 100 accidentes registrados, 3 ocurren con ignición de líquidos. Este resultado sugiere que la ocurrencia de ignición es baja dentro de los accidentes de oleoductos analizados, pero no despreciable, por lo que resulta importante implementar medidas preventivas específicas para minimizar este riesgo, dado que aunque su probabilidad es reducida, el impacto potencial puede ser alto.