1 Cargar Librerias

La preparación del entorno y la importación de paquetes especializados son pasos esenciales para el análisis. Herramientas como dplyr facilitan la gestión ágil de los datos, mientras que knitr y kableExtra aseguran que la presentación de resultados y tablas cumpla con el rigor visual requerido en reportes de ingeniería.

# Cargar librerías necesarias
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(knitr)
library(kableExtra)
## 
## Adjuntando el paquete: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(ggplot2)

2 Cargar datos

El estudio estadístico inicia con la carga de los registros históricos del archivo principal (database-1.csv). Este procedimiento preserva la estructura de la base de datos original, permitiendo la correcta asimilación de las variables operativas. Mantener la nomenclatura nativa es clave para asegurar la trazabilidad de los incidentes en la red.

datos <- read.csv("database-_1_.csv", header = TRUE, sep = ",", dec = ".", check.names = FALSE)
names(datos)
##  [1] "Report Number"                       
##  [2] "Supplemental Number"                 
##  [3] "Accident Year"                       
##  [4] "Accident Date/Time"                  
##  [5] "Operator ID"                         
##  [6] "Operator Name"                       
##  [7] "Pipeline/Facility Name"              
##  [8] "Pipeline Location"                   
##  [9] "Pipeline Type"                       
## [10] "Liquid Type"                         
## [11] "Liquid Subtype"                      
## [12] "Liquid Name"                         
## [13] "Accident City"                       
## [14] "Accident County"                     
## [15] "Accident State"                      
## [16] "Accident Latitude"                   
## [17] "Accident Longitude"                  
## [18] "Cause Category"                      
## [19] "Cause Subcategory"                   
## [20] "Unintentional Release (Barrels)"     
## [21] "Intentional Release (Barrels)"       
## [22] "Liquid Recovery (Barrels)"           
## [23] "Net Loss (Barrels)"                  
## [24] "Liquid Ignition"                     
## [25] "Liquid Explosion"                    
## [26] "Pipeline Shutdown"                   
## [27] "Shutdown Date/Time"                  
## [28] "Restart Date/Time"                   
## [29] "Public Evacuations"                  
## [30] "Property Damage Costs"               
## [31] "Lost Commodity Costs"                
## [32] "Public/Private Property Damage Costs"
## [33] "Emergency Response Costs"            
## [34] "Environmental Remediation Costs"     
## [35] "Other Costs"                         
## [36] "All Costs"

3 Extrae la variable

Para enfocar la evaluación, es necesario aislar métricas específicas del sistema. En esta fase se extrae la variable del tipo de infraestructura (Pipeline Type). Este paso metodológico es vital, pues permite clasificar los incidentes según las características físicas de la línea de transporte, asegurando un diagnóstico preciso sobre qué instalaciones presentan mayor vulnerabilidad.

zona <- datos$`Pipeline Type`

4 Conteo

El cálculo de frecuencias absolutas convierte los datos crudos en métricas interpretables. Mediante esta tabulación estadística, se cuantifica la recurrencia de derrames según el tipo de ducto afectado. Consolidar esta información proporciona una base numérica sólida para identificar patrones de riesgo y proponer mejoras directas en la gestión operativa de la infraestructura.

conteo_zona <- table(zona)
print(conteo_zona)
## zona
##                     ABOVEGROUND            TANK TRANSITION AREA     UNDERGROUND 
##              18            1475             301              16             985

5 Tabla de frecuencia

A continuación, se presenta el procesamiento de datos para la variable Pipeline Type. Se detalla el código utilizado en R para la importación del archivo CSV y la posterior generación de la tabla de frecuencias, con el fin de analizar la incidencia de siniestros según el tipo de infraestructura.

library(dplyr)
library(knitr)
library(kableExtra)
TDF_tuberia <- datos %>%
  mutate(`Pipeline Type` = case_when(
    `Pipeline Type` == "ABOVEGROUND" ~ "Superficial",
    `Pipeline Type` == "UNDERGROUND" ~ "Subterráneo",
    `Pipeline Type` == "TANK" ~ "Tanque",
    `Pipeline Type` == "TRANSITION AREA" ~ "Área de Transición",
    is.na(`Pipeline Type`) | `Pipeline Type` == "" ~ "No especificado", 
    TRUE ~ "Otro" 
  )) %>%
  count(`Pipeline Type`, name = "ni") %>%        
  arrange(desc(ni))
TDF_tuberia$hi_exacto <- (TDF_tuberia$ni / sum(TDF_tuberia$ni)) * 100
TDF_tuberia$DECIMAL_exacto <- TDF_tuberia$hi_exacto / 100

TDF_tuberia$hi <- round(TDF_tuberia$hi_exacto, 2)
TDF_tuberia$DECIMAL <- round(TDF_tuberia$DECIMAL_exacto, 3)
dif_hi <- 100 - sum(TDF_tuberia$hi)
dif_dec <- 1 - sum(TDF_tuberia$DECIMAL)

idx_max <- which.max(TDF_tuberia$ni)
TDF_tuberia$hi[idx_max] <- TDF_tuberia$hi[idx_max] + dif_hi
TDF_tuberia$DECIMAL[idx_max] <- TDF_tuberia$DECIMAL[idx_max] + dif_dec
Sumatoria <- data.frame(
  `Pipeline Type` = "Total", 
  ni = sum(TDF_tuberia$ni),
  hi = sum(TDF_tuberia$hi),
  DECIMAL = sum(TDF_tuberia$DECIMAL),
  check.names = FALSE
)

TDF_final <- rbind(TDF_tuberia[, c("Pipeline Type", "ni", "hi", "DECIMAL")], Sumatoria)
colnames(TDF_final) <- c("Tipo de tubería", "ni", "hi (%)", "fi")
titulo_formal <- "CUADRO N° [1] <br/> Distribucion de frecuencias segun el tipo de tuberia en accidentes de oleoductos de Estados Unidos, [2010 - 2016]"
kable(TDF_final, align = 'c', digits = c(0, 0, 2, 3)) %>%
  kable_styling(full_width = FALSE, position = "center", 
                bootstrap_options = c("striped", "hover", "condensed", "bordered")) %>%
  add_header_above(c(" " = 2, "Frecuencia relativa" = 2), 
                   bold = c(FALSE, TRUE), 
                   background = c("white", "#D5D8DC")) %>%
  add_header_above(setNames(4, titulo_formal), align = "center", escape = FALSE, bold = FALSE, background = "white") %>%
  row_spec(0, bold = TRUE) %>%
  row_spec(nrow(TDF_final), bold = TRUE, background = "#f2f2f2") %>%
  row_spec(1, bold = TRUE) 
CUADRO N° [1]
Distribucion de frecuencias segun el tipo de tuberia en accidentes de oleoductos de Estados Unidos, [2010 - 2016]
Frecuencia relativa
Tipo de tubería ni hi (%) fi
Superficial 1475 52.78 0.528
Subterráneo 985 35.24 0.352
Tanque 301 10.77 0.108
No especificado 18 0.64 0.006
Área de Transición 16 0.57 0.006
Total 2795 100.00 1.000

AVISO IMPORANTE! La diferencia entre los 2,795 siniestros totales de la base de datos y los 2,777 reportados en el análisis se debe a que existen 18 registros que no contienen información (valores nulos o vacíos) en la variable “Pipeline Type”. Para asegurar la precisión del estudio estadístico, el código en R aplicó un filtro de limpieza que excluye automáticamente estos datos faltantes, garantizando que el análisis de frecuencias, los porcentajes y los gráficos reflejen únicamente los incidentes donde el tipo de infraestructura está válidamente documentado.

6 Gráficas

6.1 Cantidad absoluta de tipo de tubería

A continuación, se presenta un gráfico de barras que ilustra la distribución absoluta de los distintos tipos de tuberías implicados en accidentes. Esta representación visual permite apreciar de forma rápida e intuitiva cuáles son las infraestructuras con mayor incidencia, destacando la diferencia entre los sistemas expuestos al exterior y los enterrados

ggplot(TDF_tuberia, aes(x = reorder(`Pipeline Type`, -ni), y = ni)) +
  geom_bar(stat = "identity", fill = "#2980b9") +
  labs(title = "Gráfica N 1: Distribución Absoluta global de tipo de tubería",
       x = "Tipo de Tubería",
       y = "Cantidad") +
  theme_minimal() +
  # Inclinamos los textos del eje X para que se lean bien
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  ylim(0, max(TDF_tuberia$ni) * 1.1)

6.2 Cantidad absoluta de tipo de tubería

El siguiente gráfico mantiene el análisis de frecuencias absolutas enfocado en el volumen de siniestros por cada clasificación específica de infraestructura.

ggplot(TDF_tuberia, aes(x = reorder(`Pipeline Type`, -ni), y = ni)) +
  geom_bar(stat = "identity", fill = "#2980b9") +
  labs(title = "Gráfica N 2: Distribución Absoluta local de tipo de tubería",
       x = "Tipo de Tubería",
       y = "Cantidad") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  ylim(0, max(TDF_tuberia$ni) * 1.1)

6.3 Cantidad Relativa de tipo de tubería

A través de la gráfica de incidencia relativa, se estandariza el volumen de siniestros expresando cada tipo de tubería como una proporción del total. Esta métrica porcentual es fundamental para evaluar probabilísticamente el peso específico de cada infraestructura frente al universo completo de datos observados.

# Convertimos 'hi' a numérico para graficar correctamente
TDF_tuberia <- TDF_tuberia %>% mutate(hi_num = as.numeric(hi))

ggplot(TDF_tuberia, aes(x = reorder(`Pipeline Type`, -hi_num), y = hi_num)) +
  geom_bar(stat = "identity", fill = "#2980b9") +
  labs(title = "Gráfica N 3: Distribución Relativa global de tipo de tubería",
       x = "Tipo de Tubería",
       y = "Porcentaje (hi %)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  ylim(0, 100)

6.4 Cantidad Relativa de tipo de tubería

Al enfocar el análisis porcentual ajustando los ejes a la incidencia real de la muestra, observamos con mayor detalle la distribución de probabilidad de fallo de cada tipo de conducto. Esta visualización facilita enfocar la atención en el análisis de riesgos.

# Usamos TDF_tuberia
ggplot(TDF_tuberia, aes(x = reorder(`Pipeline Type`, -hi_num), y = hi_num)) +
  geom_bar(stat = "identity", fill = "#2980b9") +
  labs(title = "Gráfica N 4: Distribución Relativa local de tipo de tubería",
       x = "Tipo de Tubería",
       y = "Porcentaje (%)") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  ylim(0, max(TDF_tuberia$hi_num) * 1.1)

6.5 Diagrama circular

El siguiente diagrama circular muestra la composición porcentual de la siniestralidad, permitiendo visualizar de un vistazo qué tipos de tuberías o infraestructuras concentran la mayor proporción de los incidentes.

ggplot(TDF_tuberia, aes(x = "", y = hi_num, fill = `Pipeline Type`)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(hi, "%")), position = position_stack(vjust = 0.5), size = 4) +
  scale_fill_brewer(palette = "Blues") +
  labs(title = "Gráfica N 5: Distribución de tipos de tubería") +
  theme_void() + 
  theme(legend.position = "right", 
        legend.title = element_blank(),
        plot.title = element_text(hjust = 0.5, face = "bold"),
        plot.subtitle = element_text(hjust = 0.5))

7 Indicadores Estadísticos

Dado el carácter nominal de la variable analizada, el estudio de tendencia central no admite promedios ni desviaciones estándar, por lo que se fundamenta estrictamente en el análisis de frecuencias y la Moda estadística. A continuación, se presentan los indicadores descriptivos que cuantifican el tamaño de la muestra y determinan el tipo de instalación con mayor probabilidad de siniestro.

# Cargar librerías necesarias
library(dplyr)
library(knitr)
# library(kableExtra) # Ya no es estrictamente necesario para el formato básico, pero puedes dejarlo

# 1. Cálculos de los indicadores (tu código original)
total_accidentes <- sum(TDF_tuberia$ni)
idx_max <- which.max(TDF_tuberia$ni)

moda_cat <- as.character(TDF_tuberia$`Pipeline Type`[idx_max])
moda_frec <- TDF_tuberia$ni[idx_max]
moda_porcentaje <- TDF_tuberia$hi[idx_max]

# 2. Crear el Data Frame con la estructura de la imagen
tabla_indicadores_tuberia <- data.frame(
  Variable = "Tipo de Tubería", # O "Pipeline Type"
  Media = "N/A",
  Mediana = "N/A",
  Moda = moda_cat
)

# 3. Generar la tabla con el formato formal para el reporte
kable(tabla_indicadores_tuberia, 
      caption = "Tabla 9: Indicadores Estadísticos del Tipo de Tubería", # Ajusta el número de tabla
      align = c("l", "c", "c", "c"))
Tabla 9: Indicadores Estadísticos del Tipo de Tubería
Variable Media Mediana Moda
Tipo de Tubería N/A N/A Superficial

8 Conclusión

La variable nominal Tipo de Tubería tiene como valor más frecuente el estado ‘Superficial’ (moda), abarcando el 52.77% de los registros de Tipo de Tubería.