AVISO IMPORANTE!

Originalmente, la variable subtipo de líquidos era de naturaleza cualitativa nominal, ya que solo listaba nombres de fluidos sin un orden inherente. Para enriquecer el análisis de seguridad, se realizó una transformación a variable ordinal aplicando un criterio de volatilidad y riesgo de explosión.

#Se reclasificaron los fluidos en tres niveles jerárquicos: #Nivel 1: Bajo riesgo #Nivel 2: Medio riesgo #Nivel 3: Alto riesgo

1 Cargar datos

Importamos el archivo “database (1).csv” desde una ruta local y lo almacena en el objeto datos, usando espacios o tabulaciones como separador.

datos <- read.csv("database-_1_.csv", header = TRUE, sep = ",", dec = ".", check.names = FALSE)

zona<-datos$`Liquid.Subtype`

2 Tabla de frecuencia

Extraemos la variable subtipo de líquidos, omitimos las celdas en blanco o valores iguales a cero y verificamos el tamaño muestral. En la tabla de distribución de frecuencias de la variable Subtipo de Líquidos, el número de clases se determinó mediante la regla de Sturges y el ancho de clase se calculó a partir del rango total de los datos, asegurando una cobertura completa desde el valor mínimo hasta el valor máximo registrado en la muestra.

library(dplyr)
library(knitr)
library(kableExtra)

# 1. Preparar datos
datos_liquidos <- datos %>%
  mutate(Liquid.Subtype = `Liquid Subtype`) %>%
  mutate(Nivel_Riesgo = case_when(
    is.na(Liquid.Subtype) | Liquid.Subtype == "" ~ 1,
    grepl("LPG", Liquid.Subtype) | grepl("OTHER HVL", Liquid.Subtype) ~ 3,
    TRUE ~ 2 
  )) %>%
  mutate(Subtipo_Clean = case_when(
    Nivel_Riesgo == 1 ~ "Crudo / CO2",
    Nivel_Riesgo == 2 ~ "Combustibles refinados",
    Nivel_Riesgo == 3 ~ "Fluidos altos en volátiles"
  ))

TDF_agrupada <- datos_liquidos %>%
  count(Nivel_Riesgo, Subtipo_Clean, name = "ni") %>%
  arrange(Nivel_Riesgo) 

TDF_agrupada$hi_exacto <- (TDF_agrupada$ni / sum(TDF_agrupada$ni)) * 100
TDF_agrupada$DECIMAL_exacto <- TDF_agrupada$hi_exacto / 100 

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

idx_max <- which.max(TDF_agrupada$ni)
TDF_agrupada$hi[idx_max] <- TDF_agrupada$hi[idx_max] + dif_hi
TDF_agrupada$DECIMAL[idx_max] <- TDF_agrupada$DECIMAL[idx_max] + dif_dec
TDF_agrupada$Nivel_Riesgo <- as.character(TDF_agrupada$Nivel_Riesgo)

Sumatoria <- data.frame(
  Nivel_Riesgo = "",
  Subtipo_Clean = "Total",
  ni = sum(TDF_agrupada$ni),
  hi = sum(TDF_agrupada$hi),
  DECIMAL = sum(TDF_agrupada$DECIMAL)
)

TDF_final <- rbind(TDF_agrupada[, c("Nivel_Riesgo", "Subtipo_Clean", "ni", "hi", "DECIMAL")], Sumatoria)
colnames(TDF_final) <- c("Nivel de riesgo", "Subtipos de líquidos", "ni", "hi (%)", "fi")
titulo_formal <- "CUADRO N°1 <br/> Distribución de frecuencias de accidentes según el nivel de riesgo del subtipos de líquidos en Estados Unidos, [2010-2016]"
kable(TDF_final, align = 'c', 
      digits = c(0, 0, 0, 2, 3)) %>%
  kable_styling(full_width = FALSE, position = "center", 
                bootstrap_options = c("striped", "hover", "condensed", "bordered")) %>%
  add_header_above(c(" " = 3, "Frecuencia relativa" = 2), bold = TRUE, background = "#D5D8DC") %>%
  add_header_above(setNames(5, 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(which(TDF_final$`Nivel de riesgo` == "1"), bold = TRUE)
CUADRO N°1
Distribución de frecuencias de accidentes según el nivel de riesgo del subtipos de líquidos en Estados Unidos, [2010-2016]
Frecuencia relativa
Nivel de riesgo Subtipos de líquidos ni hi (%) fi
1 Crudo / CO2 1446 51.74 0.518
2 Combustibles refinados 990 35.42 0.354
3 Fluidos altos en volátiles 359 12.84 0.128
Total 2795 100.00 1.000

3 Cantidad absoluta de Accidentes por Subtipos de líquidos

En la tabla de distribución de frecuencias de esta variable, se aplicó una clasificación por nivel de riesgo (Bajo, Medio y Alto) basada en la volatilidad de los componentes, evidenciando que la mayor cantidad de registros corresponde al Crudo/CO2 (riesgo bajo) con cerca de 1,500 casos, seguido por combustibles de riesgo medio como el Diesel y la Gasolina, mientras que las sustancias de alta volatilidad y riesgo elevado, como los gases licuados, muestran la menor incidencia de accidentes en la muestra estudiada.

library(ggplot2)
library(dplyr)

datos_grafico <- datos %>%
  mutate(Liquid.Subtype = `Liquid Subtype`) %>%
  mutate(Nivel_Riesgo = case_when(
    is.na(Liquid.Subtype) | Liquid.Subtype == "" ~ "1. Bajo",
    grepl("LPG", Liquid.Subtype) | grepl("OTHER HVL", Liquid.Subtype) ~ "3. Alto",
    TRUE ~ "2. Medio" 
  )) %>%
  mutate(Subtipo_Clean = case_when(
    Nivel_Riesgo == "1. Bajo" ~ "Crudo / CO2",
    Nivel_Riesgo == "2. Medio" ~ "Combustibles refinados",
    Nivel_Riesgo == "3. Alto" ~ "Fluidos altos en volátiles"
  )) %>%
  count(Nivel_Riesgo, Subtipo_Clean, name = "ni")
ggplot(datos_grafico, aes(x = reorder(Subtipo_Clean, -ni), y = ni, fill = Nivel_Riesgo)) + 
  geom_bar(stat = "identity", width = 0.5, color = "black") + 
  scale_fill_manual(values = c(
    "1. Bajo" = "#AED6F1",  
    "2. Medio" = "#3498DB",  
    "3. Alto" = "#154360"    
  )) +
  labs(
    title = "Gráfica N1: Distribución local de Accidentes por Nivel de Riesgo",
    x = "Subtipos de líquidos",
    y = "Cantidad",
    fill = "Nivel de Riesgo"
  ) +
  theme_light() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, color = "black", face = "bold"),
    legend.position = "top"
  )

4 Cantidad Absoluta de Accidentes por Subtipos de líquidos

Extraemos la variable subtipo de líquidos, omitimos las celdas en blanco o valores iguales a cero y verificamos el tamaño muestral para determinar la frecuencia absoluta de accidentes tanto en el ámbito local como global.

library(ggplot2)
library(dplyr)

datos_grafico_global <- datos %>%
  mutate(Liquid.Subtype = `Liquid Subtype`) %>%
  mutate(Nivel_Riesgo = case_when(
    is.na(Liquid.Subtype) | Liquid.Subtype == "" ~ "1. Bajo",
    grepl("LPG", Liquid.Subtype) | grepl("OTHER HVL", Liquid.Subtype) ~ "3. Alto",
    TRUE ~ "2. Medio" 
  )) %>%
  mutate(Subtipo_Clean = case_when(
    Nivel_Riesgo == "1. Bajo" ~ "Crudo / CO2",
    Nivel_Riesgo == "2. Medio" ~ "Combustibles refinados",
    Nivel_Riesgo == "3. Alto" ~ "Fluidos altos en volátiles"
  )) %>%
  count(Nivel_Riesgo, Subtipo_Clean, name = "ni")

# 3. Generamos el gráfico
ggplot(datos_grafico_global, aes(x = reorder(Subtipo_Clean, -ni), y = ni, fill = Nivel_Riesgo)) + 
  geom_bar(stat = "identity", width = 0.5, color = "black") + 
  scale_fill_manual(values = c(
    "1. Bajo" = "#AED6F1",   
    "2. Medio" = "#3498DB",  
    "3. Alto" = "#154360"    
  )) +
  scale_y_continuous(
    limits = c(0, 2795),        
    breaks = seq(0, 2795, 500)  
  ) +
  labs(
    title = "Gráfica N2: Distribución global de Accidentes por Nivel de Riesgo",
    x = "Subtipos de Líquidos",
    y = "Cantidad",
    fill = "Nivel de Riesgo"
  ) +
  theme_light() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, color = "black", face = "bold"),
    legend.position = "top"
  )

5 Cantidad relativa de Accidentes por Subtipos de Líquidos

Aunque parezca contradictorio que el mayor número de accidentes ocurra con sustancias de “bajo riesgo”, esto suele indicar que el volumen de transporte y manipulación del crudo es masivamente superior al de gases altamente volátiles. Es un recordatorio de que, estadísticamente, la mayoría de los problemas ocurren donde hay más actividad, incluso si la sustancia es más estable.

library(ggplot2)
library(dplyr)

datos_hi_local <- datos %>%
  mutate(Liquid.Subtype = `Liquid Subtype`) %>%
  # 1. Definimos el Nivel de Riesgo directo
  mutate(Nivel_Riesgo = case_when(
    is.na(Liquid.Subtype) | Liquid.Subtype == "" ~ "1. Bajo",
    grepl("LPG", Liquid.Subtype) | grepl("OTHER HVL", Liquid.Subtype) ~ "3. Alto",
    TRUE ~ "2. Medio" 
  )) %>%
  # 2. Asignamos las categorías limpias y resumidas
  mutate(Subtipo_Clean = case_when(
    Nivel_Riesgo == "1. Bajo" ~ "Crudo / CO2",
    Nivel_Riesgo == "2. Medio" ~ "Combustibles refinados",
    Nivel_Riesgo == "3. Alto" ~ "Fluidos altos en volátiles"
  )) %>%
  count(Nivel_Riesgo, Subtipo_Clean, name = "ni") %>%
  # 3. Calculamos el porcentaje
  mutate(hi_pct = (ni / sum(ni)) * 100)

# 4. Generamos el gráfico de porcentajes
ggplot(datos_hi_local, aes(x = reorder(Subtipo_Clean, -hi_pct), y = hi_pct, fill = Nivel_Riesgo)) +
  geom_bar(stat = "identity", width = 0.5, color = "black") +
  scale_fill_manual(values = c(
    "1. Bajo" = "#AED6F1",
    "2. Medio" = "#3498DB",  
    "3. Alto" = "#154360"    
  )) +
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 20)) +
  labs(
    title = "Gráfica N3: Porcentaje global de Accidentes por Nivel de Riesgo",
    x = "Subtipos de Líquidos",
    y = "Porcentaje (%)",
    fill = "Nivel de Riesgo"
  ) +
  theme_classic() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, color = "black", face = "bold"),
    legend.position = "top"
  )

6 Cantidad relativa de Accidentes por Subtipos de Líquidos

Extraemos la variable subtipo de líquidos, omitimos valores nulos o ceros y determinamos la frecuencia mediante la regla de Sturges. El análisis muestra que el Crudo/CO2 (riesgo bajo) concentra más del 50% de los incidentes (~1,450 casos) a nivel local y global. Las sustancias de alta volatilidad registran la menor cantidad de accidentes, vinculando la siniestralidad al volumen de operación manejado.

library(ggplot2)
library(dplyr)

datos_hi_local <- datos %>%
  mutate(Liquid.Subtype = `Liquid Subtype`) %>%
  # 1. Definimos el Nivel de Riesgo directo desde los datos originales
  mutate(Nivel_Riesgo = case_when(
    is.na(Liquid.Subtype) | Liquid.Subtype == "" ~ "1. Bajo",
    grepl("LPG", Liquid.Subtype) | grepl("OTHER HVL", Liquid.Subtype) ~ "3. Alto",
    TRUE ~ "2. Medio" 
  )) %>%
  # 2. Asignamos las categorías limpias y resumidas
  mutate(Subtipo_Clean = case_when(
    Nivel_Riesgo == "1. Bajo" ~ "Crudo / CO2",
    Nivel_Riesgo == "2. Medio" ~ "Combustibles refinados",
    Nivel_Riesgo == "3. Alto" ~ "Fluidos altos en volátiles"
  )) %>%
  count(Nivel_Riesgo, Subtipo_Clean, name = "ni") %>%
  # 3. Calculamos el porcentaje
  mutate(hi_pct = (ni / sum(ni)) * 100) 

# 4. Generamos el gráfico
ggplot(datos_hi_local, aes(x = reorder(Subtipo_Clean, -hi_pct), y = hi_pct, fill = Nivel_Riesgo)) +
  geom_bar(stat = "identity", width = 0.5, color = "black") +
  scale_fill_manual(values = c(
    "1. Bajo" = "#AED6F1",   
    "2. Medio" = "#3498DB",  
    "3. Alto" = "#154360"    
  )) +
  # Añadimos límites para que la barra más alta tenga espacio para su etiqueta
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 20)) +
  labs(
    title = "Gráfica N4: Porcentaje local de Accidentes por Nivel de Riesgo",
    x = "Subtipos de Líquidos",
    y = "Porcentaje (%)",
    fill = "Nivel de Riesgo"
  ) +
  theme_classic() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, color = "black", face = "bold"),
    legend.position = "top"
  )

7 Diagrama Circular

El diagrama circular de la variable subtipo de líquidos resalta visualmente la hegemonía del Crudo/CO2, que ocupa más de la mitad de la superficie total, reflejando su predominancia en la siniestralidad. Los sectores restantes se distribuyen entre combustibles de riesgo medio y gases de alta volatilidad, evidenciando que la gran mayoría de los incidentes se concentran en una sola categoría operativa. Esta representación permite confirmar que, a pesar de su bajo riesgo intrínseco, el volumen de manejo de este fluido es el factor determinante en la frecuencia de los accidentes.

library(dplyr)
library(ggplot2)

# 1. Preparación de los datos
datos_grafico <- datos %>%
  mutate(Liquid.Subtype = `Liquid Subtype`) %>%
  # Asignamos el Nivel de Riesgo (Bajo, Medio, Alto)
  mutate(Nivel_Riesgo = case_when(
    is.na(Liquid.Subtype) | Liquid.Subtype == "" ~ "Bajo",
    grepl("LPG", Liquid.Subtype) | grepl("OTHER HVL", Liquid.Subtype) ~ "Alto",
    TRUE ~ "Medio"
  )) %>%
  # CORRECCIÓN: Los nombres aquí deben coincidir exactamente con los de arriba
  mutate(Subtipo_Clean = case_when(
    Nivel_Riesgo == "Bajo" ~ "Crudo / CO2",
    Nivel_Riesgo == "Medio" ~ "Combustibles refinados",
    Nivel_Riesgo == "Alto" ~ "Fluidos altos en volátiles"
  )) %>%
  count(Nivel_Riesgo, Subtipo_Clean, name = "ni") %>%
  mutate(hi_pct = round((ni / sum(ni)) * 100, 1)) %>%
  mutate(
    Subtipo_Clean = factor(Subtipo_Clean, levels = c(
      "Fluidos altos en volátiles", 
      "Combustibles refinados", 
      "Crudo / CO2"
    )),
    Nivel_Riesgo = factor(Nivel_Riesgo, levels = c("Alto", "Medio", "Bajo"))
  )

# 2. Definición de colores
colores_riesgo_map <- c(
  "Fluidos altos en volátiles" = "#154360",
  "Combustibles refinados" = "#3498DB",
  "Crudo / CO2" = "#AED6F1"
)

colores_niveles <- c(
  "Alto" = "#154360",
  "Medio" = "#3498DB",
  "Bajo" = "#AED6F1"
)

# 3. Creación del Gráfico
ggplot(datos_grafico, aes(x = "", y = hi_pct, fill = Subtipo_Clean)) +
  geom_bar(stat = "identity", width = 1, color = "white", linewidth = 1) +
  geom_point(aes(color = Nivel_Riesgo), alpha = 0, size = 0) +
  coord_polar("y", start = 0) +
  geom_text(aes(label = paste0(hi_pct, "%")), 
            position = position_stack(vjust = 0.5), 
            color = "white", size = 3.5, fontface = "bold") +
  scale_fill_manual(values = colores_riesgo_map) +
  scale_color_manual(values = colores_niveles) + 
  
  labs(
    title = "Gráfica N5: Distribución de diagrama circular por Subtipos Líquidos y Nivel de Riesgo",
    fill = "Subtipos de Líquidos",
    color = "Nivel de Riesgo" 
  ) +
  
  guides(
    fill = guide_legend(order = 1),
    color = guide_legend(order = 2, override.aes = list(alpha = 1, size = 5, shape = 15))
  ) +
  
  theme_void() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", margin = margin(b = 10)),
    legend.position = "right", 
    legend.text = element_text(size = 9),
    legend.title = element_text(face = "bold", size = 10),
    legend.margin = margin(t = 10, r = 0, b = 0, l = 0)
  )

8 Indicadores Estadístico

Los indicadores estadísticos de la variable subtipo de líquidos muestran una distribución con una moda contundente en la categoría Crudo/CO2, la cual representa la mayor frecuencia absoluta con aproximadamente 1,450 registros. Al analizar la concentración de los datos, se observa que el riesgo bajo domina la muestra con un peso superior al 50%, mientras que las medidas de dispersión reflejan una variabilidad reducida hacia las categorías de riesgo alto, confirmando una asimetría donde la siniestralidad se agrupa en fluidos de gran volumen operativo y baja volatilidad.

library(knitr)
library(kableExtra)

# 1. Encontrar la Moda exacta de tu variable Subtipo_Clean
frecuencias_subtipos <- table(datos_liquidos$Subtipo_Clean)
moda_subtipo <- names(frecuencias_subtipos)[which.max(frecuencias_subtipos)]

# 2. Crear el dataframe con estructura estática para las variables de texto
tabla_estadisticos_liquido <- data.frame(
  Variable = "Subtipo de Líquidos",
  Media = "N/A",
  Mediana = "N/A",
  Moda = moda_subtipo
)

# 3. Renderizar la tabla con el estilo de la imagen
kable(tabla_estadisticos_liquido, 
      align = c('l', 'c', 'c', 'c'), 
      caption = "Tabla 3: Indicadores Estadísticos del Subtipo de Líquidos") %>%
  kable_classic(full_width = FALSE, html_font = "Georgia") %>%
  row_spec(0, bold = TRUE, color = "#6c757d") %>%
  column_spec(1, color = "#6c757d")
Tabla 3: Indicadores Estadísticos del Subtipo de Líquidos
Variable Media Mediana Moda
Subtipo de Líquidos N/A N/A Crudo / CO2

AVISO IMPORANTE!

Aunque la variable original ‘Subtipo de Líquidos’ era nominal, nosotros la enriquecimos transformándola a cualitativa ordinal para reflejar niveles de [riesgo/impacto]. Sin embargo, al ser datos ordinales presentados mediante etiquetas categóricas (‘Crudo / CO2’), las reglas estadísticas dictan que no se pueden aplicar operaciones algebraicas para sacar una Media (las distancias entre niveles no son matemáticamente simétricas), y el software no interpola una Mediana sobre etiquetas de texto. Por ello, la Moda es el único indicador estadístico válido y riguroso para nuestra tabla, mostrándonos el grupo con mayor incidencia absoluta.

9 Conclusión

La variable “Subtipos de líquidos”, presenta como valor más frecuente es “Crudo / CO2” , con una participación destacada en la muestra.