Esta sección está dedicada al estudio de las variables de tipo cualitativo nominal. El Grupo 2 utilizará tablas de frecuencia y gráficos de barras para resumir la información y destacar las clases o grupos más recurrentes en el conjunto de datos.

1 Operator Name

# 1. Cargar datos
database <- read.csv("database.csv", header=TRUE, sep=",", dec=".")


# 1. Buscar la columna del Operador automáticamente
col_operador <- grep("Operator", names(database), value = TRUE)[1]
raw_operador <- database[[col_operador]]

# 2. Crear la tabla de frecuencias
Tabla_Op <- as.data.frame(table(raw_operador))
colnames(Tabla_Op) <- c("Operador", "Freq")

# 3. Ordenar de mayor a menor
Tabla_Op <- Tabla_Op[order(-Tabla_Op$Freq), ]

# 4. Seleccionar solo el Top 10
Top10_Op <- head(Tabla_Op, 10)

# 5. Hacer el Gráfico
# Ajustamos el margen izquierdo (mar) para que quepan los nombres largos
par(mar=c(5, 12, 4, 2)) 

barplot(Top10_Op$Freq,
        names.arg = Top10_Op$Operador,
        col = "darkblue",
        horiz = TRUE,   # Barras horizontales para leer mejor
        las = 2,        # Texto perpendicular
        main = "Top 10 Operators with the Most Accidents",
        ylab= "Operator",
        xlab = "Number of Accidents")

2 Pipeline/Facility Name

# 1. Buscar la columna automáticamente (usamos "Facility" para asegurar)
col_tuberia <- grep("Facility", names(database), value = TRUE)[1]
raw_tuberias <- database[[col_tuberia]]

# 2. Crear tabla de frecuencias
Tabla_Pipe <- as.data.frame(table(raw_tuberias))
colnames(Tabla_Pipe) <- c("Nombre", "Freq")

# 3. Ordenar de mayor a menor
Tabla_Pipe <- Tabla_Pipe[order(-Tabla_Pipe$Freq), ]

# 4. Seleccionar solo el Top 10
Top10_Pipe <- head(Tabla_Pipe, 10)

# 5. Hacer el Gráfico

par(mar=c(5, 15, 4, 2)) 

barplot(Top10_Pipe$Freq,
        names.arg = Top10_Pipe$Nombre,
        col = "forestgreen", 
        horiz = TRUE,        
        las = 2,          
        main = "Top 10 Pipelines with the Most Accidents",
        xlab = "Number of Accidents",
        cex.names = 0.7)     

3 Pipeline Location

# 1. Buscar la columna automáticamente (usamos "Location" para encontrarla fácil)
col_ubicacion <- grep("Location", names(database), value = TRUE)[1]
raw_ubicacion <- database[[col_ubicacion]]

# 2. Limpiar datos (quitamos vacíos si hay)
raw_ubicacion <- na.omit(raw_ubicacion)

# 3. Crear tabla y calcular porcentajes
tabla_loc <- table(raw_ubicacion)
porcentajes <- round(prop.table(tabla_loc) * 100, 1)

# 4. Gráfico con porcentajes en el título
par(mar=c(5, 5, 4, 2))
barplot(tabla_loc,
        col = c("blue", "brown"), 
        
        main = paste("Ubicación: Onshore (", porcentajes["ONSHORE"], "%) vs Offshore", sep=""),
        ylab = "Cantidad de Accidentes",
        las = 1)

# 5. Mostrar tabla en el reporte
print(tabla_loc)
## raw_ubicacion
## OFFSHORE  ONSHORE 
##       18     2777

4 Pipeline Type

# 1. PREPARACIÓN DE DATOS
# Buscamos la columna "Pipeline Type" (o Pipeline.Type) automáticamente
cols_pipe <- grep("Pipeline", names(database), value = TRUE)
col_target <- grep("Type", cols_pipe, value = TRUE)[1]
raw_type <- database[[col_target]]

# Limpiamos datos vacíos (Esto es vital para evitar errores de gráfico vacío)
raw_type <- raw_type[raw_type != ""]

# 2. CÁLCULOS
frecuencias_pipeline <- table(raw_type)
frecuencias_pipeline_ordenadas <- sort(frecuencias_pipeline, decreasing = TRUE)

# 3. GRÁFICO (Con tus colores personalizados)
barplot(frecuencias_pipeline_ordenadas,
        main = "Distribución de Pipeline Types",
        xlab = "Tipo de Pipeline",
        ylab = "Frecuencia",
        # Tus colores hexadecimales:
        col = c("#FF6B6B", "#4ECDC4", "#45B7D1", "#96CEB4", "#FFEAA7")[1:length(frecuencias_pipeline_ordenadas)],
        border = "white",
        cex.names = 0.8)

5 liquid Type

# 1. PREPARACIÓN DE DATOS
# Buscamos la columna de forma segura
cols_liq <- grep("Liquid", names(database), value = TRUE)
col_target <- grep("Type", cols_liq, value = TRUE)[1]
raw_liquid <- database[[col_target]]

# Limpiamos vacíos
raw_liquid <- raw_liquid[raw_liquid != ""]

# 2. TABLA Y ORDENAMIENTO
frecuencias_liquid <- table(raw_liquid)
frecuencias_liquid_ordenadas <- sort(frecuencias_liquid, decreasing = TRUE)

# 3. RENOMBRAR CATEGORÍAS (Tu lógica)
# Definimos el "diccionario" de traducción
nuevos_nombres_liquid <- c(
  "HVL OR OTHER FLAMMABLE OR TOXIC FLUID, GAS" = "Gas VAF / Tóxico",
  "CRUDE OIL" = "Crudo",
  "REFINED AND/OR PETROLEUM PRODUCT (NON-HVL), LIQUID" = "Producto Refinado",
  "CO2 (CARBON DIOXIDE)" = "CO2",
  "BIOFUEL / ALTERNATIVE FUEL (INCLUDING ETHANOL BLENDS)" = "Biocombustible"
)

# Aplicamos los nombres con seguridad:
nombres_actuales <- names(frecuencias_liquid_ordenadas)
# Buscamos el nombre nuevo en el diccionario
labels_nuevos <- nuevos_nombres_liquid[nombres_actuales]
# Si alguno no estaba en la lista (sale NA), le dejamos el nombre original para que no falle
labels_nuevos[is.na(labels_nuevos)] <- nombres_actuales[is.na(labels_nuevos)]

# Asignamos los nombres finales
names(frecuencias_liquid_ordenadas) <- labels_nuevos

# 4. GRÁFICO HORIZONTAL (Tu diseño)
par(mar = c(5, 12, 4, 2))  # Margen izquierdo amplio para que quepan los textos

barplot(frecuencias_liquid_ordenadas,
        horiz = TRUE,
        main = "Distribución de Liquid Types",
        xlab = "Frecuencia",
        col = "lightcoral",
        las = 1,
        cex.names = 0.8,  
        border = "white",
        font.main = 2)

6 liquid Subtype

# 1. PREPARACIÓN DE DATOS
# Buscamos la columna de forma segura (Liquid Subtype)
cols_liq <- grep("Liquid", names(database), value = TRUE)
col_target <- grep("Subtype", cols_liq, value = TRUE)[1]
raw_subtype <- database[[col_target]]

# Limpiamos vacíos (Importante para que no salga una barra sin nombre)
raw_subtype <- raw_subtype[raw_subtype != ""]

# 2. CÁLCULOS
frecuencias_subtype <- table(raw_subtype)
frecuencias_subtype_ordenadas <- sort(frecuencias_subtype, decreasing = TRUE)

# 3. RENOMBRAR CATEGORÍAS (Tu lógica)
# Diccionario de traducción
nuevos_nombres <- c(
  "BIODIESEL" = "BIODIESEL",
  "LPG (LIQUEFIED PETROLEUM GAS)" = "LPG",
  "GASOLINE (NON-ETHANOL)" = "GASOLINA SIN ETANOL",
  "DIESEL, FUEL OIL, KEROSENE, JET FUEL" = "COMBUSTIBLES VARIOS",
  "ANHYDROUS AMMONIA" = "AMONÍACO ANHIDRO", 
  "OTHER HVL" = "OTROS HVL",
  "MIXTURE OF REFINED PRODUCTS (TRANSMIX OR OTHER MIXTURE)" = "MEZCLAS REFINADAS",
  "OTHER" = "OTROS"
)

# --- LÓGICA DE SEGURIDAD ---
# Intentamos traducir los nombres
nombres_actuales <- names(frecuencias_subtype_ordenadas)
labels_finales <- nuevos_nombres[nombres_actuales]

# Si algún nombre no estaba en tu lista (sale NA), usamos el nombre original
# Esto evita que el gráfico falle si hay un dato nuevo
labels_finales[is.na(labels_finales)] <- nombres_actuales[is.na(labels_finales)]

# Aplicamos los nombres
names(frecuencias_subtype_ordenadas) <- labels_finales

# 4. GRÁFICO HORIZONTAL (Tu diseño exacto)
par(mar = c(5, 12, 4, 2)) 

barplot(frecuencias_subtype_ordenadas,
        horiz = TRUE,
        main = "Distribución de Liquid Subtypes",
        xlab = "Frecuencia",
        col = "lightblue",
        las = 1,  
        cex.names = 0.8, 
        border = "white",
        font.main = 2)

7 liquid Name

# 1. PREPARACIÓN DE DATOS
# Buscamos la columna de forma segura (Liquid Name)
cols_liq <- grep("Liquid", names(database), value = TRUE)
col_target <- grep("Name", cols_liq, value = TRUE)[1]
raw_name <- database[[col_target]]

# Limpiamos vacíos
raw_name <- raw_name[raw_name != ""]

# 2. CÁLCULOS
frecuencias_name <- table(raw_name)
frecuencias_name_ordenadas <- sort(frecuencias_name, decreasing = TRUE)

# ¡IMPORTANTE! Nos quedamos con el Top 10
frecuencias_name_ordenadas <- head(frecuencias_name_ordenadas, 10)

# 3. RENOMBRAR CATEGORÍAS 
# Traducimos los líquidos más comunes
nuevos_nombres_liq <- c(
  "CRUDE OIL" = "CRUDO",
  "GASOLINE (NON-ETHANOL)" = "GASOLINA (SIN ETANOL)",
  "REFINED AND/OR PETROLEUM PRODUCT (NON-HVL), LIQUID" = "PRODUCTO REFINADO",
  "HVL OR OTHER FLAMMABLE OR TOXIC FLUID, GAS" = "GAS INFLAMABLE/TÓXICO",
  "DIESEL, FUEL OIL, KEROSENE, JET FUEL" = "DIESEL / KEROSENO",
  "CO2 (CARBON DIOXIDE)" = "DIÓXIDO DE CARBONO (CO2)",
  "BIOFUEL / ALTERNATIVE FUEL (INCLUDING ETHANOL BLENDS)" = "BIOCOMBUSTIBLE",
  "LPG (LIQUEFIED PETROLEUM GAS)" = "GAS LICUADO (LPG)",
  "ANHYDROUS AMMONIA" = "AMONÍACO ANHIDRO"
)

# --- LÓGICA DE SEGURIDAD ---
nombres_actuales <- names(frecuencias_name_ordenadas)
labels_finales <- nuevos_nombres_liq[nombres_actuales]

# Si aparece un líquido raro no traducido, usamos el original
labels_finales[is.na(labels_finales)] <- nombres_actuales[is.na(labels_finales)]

# Aplicamos los nombres
names(frecuencias_name_ordenadas) <- labels_finales

# 4. GRÁFICO HORIZONTAL (Tu diseño exacto)
# Margen izquierdo amplio (14)
par(mar = c(5, 14, 4, 2))  

barplot(frecuencias_name_ordenadas,
        horiz = TRUE,
        main = "Top 10 Líquidos (Liquid Name)",
        xlab = "Frecuencia",
        col = "lightsalmon", 
        las = 1,
        cex.names = 0.7, 
        border = "white",
        font.main = 2)

8 Accident City

# Cargar librerías (por si acaso no están cargadas arriba)
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(ggplot2)

# --- 1. PREPARACIÓN DE DATOS ---
# Buscamos la columna "Accident City" (o Accident.City) automáticamente
col_city <- grep("City", names(database), value = TRUE)[1]

# Creamos la tabla 'top_ciudades'
top_ciudades <- database %>%
  count(Ciudad = .[[col_city]], sort = TRUE) %>% # Cuenta y renombra la columna a "Ciudad"
  rename(Recuento = n) %>%                       # Renombra el conteo a "Recuento"
  head(10)                                       # Toma solo el Top 10

# --- 2. CREAR EL GRÁFICO ---
grafico_ciudades <- top_ciudades %>%
  ggplot(aes(x = reorder(Ciudad, Recuento), y = Recuento)) +
  geom_col(fill = "steelblue") +                 
  coord_flip() + 
  labs(
    title = "Top 10 Cities with the Most Accidents",
    x = "Ciudad",
    y = "Recuento de Accidentes"
  ) +
  theme_minimal() +                              
  theme(axis.text.y = element_text(size = 8))    

# --- 3. MOSTRAR EL GRÁFICO ---
print(grafico_ciudades)

9 Accident Country

# 1. PREPARACIÓN DE DATOS
# Buscamos la columna de forma segura (Accident County)
col_target <- grep("County", names(database), value = TRUE)[1]
raw_county <- database[[col_target]]

# Limpiamos vacíos (Importante)
raw_county <- raw_county[raw_county != ""]

# 2. CÁLCULOS
frecuencias_county <- table(raw_county)
frecuencias_county_ordenadas <- sort(frecuencias_county, decreasing = TRUE)

# ¡IMPORTANTE! Seleccionamos solo el TOP 10
top_10_county <- head(frecuencias_county_ordenadas, 10)

# 3. GRÁFICO HORIZONTAL
# Margen izquierdo amplio (12)
par(mar = c(5, 12, 4, 2))

barplot(top_10_county,
        horiz = TRUE,
        main = "Top 10 Condados con más Accidentes",
        xlab = "Frecuencia",
        col = "mediumpurple",
        las = 1,            
        cex.names = 0.8,    
        border = "white",
        font.main = 2)

10 Accident State

# 1. PREPARACIÓN DE DATOS
# Buscamos la columna de forma segura (Accident State)
col_target <- grep("State", names(database), value = TRUE)[1]
raw_state <- database[[col_target]]

# Limpiamos vacíos
raw_state <- raw_state[raw_state != ""]

# 2. CÁLCULOS
frecuencias_state <- table(raw_state)
frecuencias_state_ordenadas <- sort(frecuencias_state, decreasing = TRUE)

# ¡IMPORTANTE! Nos quedamos solo con el Top 10 para que el gráfico se vea bien
frecuencias_state_ordenadas <- head(frecuencias_state_ordenadas, 10)

# 3. RENOMBRAR CATEGORÍAS (Diccionario de Traducción)
# Traducimos las abreviaturas más comunes de EE.UU.
nuevos_nombres_state <- c(
  "TX" = "TEXAS",
  "LA" = "LUISIANA",
  "CA" = "CALIFORNIA",
  "OK" = "OKLAHOMA",
  "PA" = "PENSILVANIA",
  "IL" = "ILLINOIS",
  "OH" = "OHIO",
  "KS" = "KANSAS",
  "MN" = "MINNESOTA",
  "NM" = "NUEVO MÉXICO"
)

# --- LÓGICA DE SEGURIDAD ---
nombres_actuales <- names(frecuencias_state_ordenadas)
labels_finales <- nuevos_nombres_state[nombres_actuales]

# Si aparece un estado que no está en la lista (sale NA), usamos su abreviatura original
labels_finales[is.na(labels_finales)] <- nombres_actuales[is.na(labels_finales)]

# Aplicamos los nombres
names(frecuencias_state_ordenadas) <- labels_finales

# 4. GRÁFICO HORIZONTAL (Tu diseño exacto)
# Margen izquierdo ajustado (12)
par(mar = c(5, 12, 4, 2))  

barplot(frecuencias_state_ordenadas,
        horiz = TRUE,
        main = "Top 10 Estados (Accident State)",
        xlab = "Frecuencia",
        col = "black", 
        las = 1,
        cex.names = 0.8,
        border = "white",
        font.main = 2)

11 Cause Subcategory

# 1. PREPARACIÓN DE DATOS
# Buscamos la columna de forma segura (Cause Category)
cols_cause <- grep("Cause", names(database), value = TRUE)
col_target <- grep("Category", cols_cause, value = TRUE)[1]
raw_cause <- database[[col_target]]

# Limpiamos vacíos
raw_cause <- raw_cause[raw_cause != ""]

# 2. CÁLCULOS
frecuencias_cause <- table(raw_cause)
frecuencias_cause_ordenadas <- sort(frecuencias_cause, decreasing = TRUE)

# 3. RENOMBRAR CATEGORÍAS (Diccionario de Traducción)
# Aquí defino la traducción de las causas comunes en esta base de datos
nuevos_nombres_causa <- c(
  "CORROSION" = "CORROSIÓN",
  "EXCAVATION DAMAGE" = "DAÑO POR EXCAVACIÓN",
  "INCORRECT OPERATION" = "OPERACIÓN INCORRECTA",
  "MATERIAL/WELD/EQUIP FAILURE" = "FALLA MATERIAL/EQUIPO",
  "NATURAL FORCE DAMAGE" = "FUERZAS NATURALES",
  "OTHER OUTSIDE FORCE DAMAGE" = "DAÑO EXTERNO",
  "ALL OTHER CAUSES" = "OTRAS CAUSAS"
)

# --- LÓGICA DE SEGURIDAD ---
# Intentamos traducir los nombres
nombres_actuales <- names(frecuencias_cause_ordenadas)
labels_finales <- nuevos_nombres_causa[nombres_actuales]

# Si aparece una causa rara que no puse en la lista, usamos su nombre original en inglés
labels_finales[is.na(labels_finales)] <- nombres_actuales[is.na(labels_finales)]

# Aplicamos los nombres
names(frecuencias_cause_ordenadas) <- labels_finales

# 4. GRÁFICO HORIZONTAL (Tu diseño exacto)
# Margen izquierdo amplio (14) para que quepan los textos como "FALLA MATERIAL..."
par(mar = c(5, 14, 4, 2))  

barplot(frecuencias_cause_ordenadas,
        horiz = TRUE,
        main = "Causas Principales (Cause Category)",
        xlab = "Frecuencia",
        col = "lightsalmon", 
        las = 1,  # Etiquetas horizontales
        cex.names = 0.8, # Ajuste de letra
        border = "white",
        font.main = 2)

12 Cause Subcategory

# 1. PREPARACIÓN DE DATOS
# Buscamos la columna de Subcategoría
cols_cause <- grep("Cause", names(database), value = TRUE)
col_target <- grep("Subcategory", cols_cause, value = TRUE)[1]
raw_sub <- database[[col_target]]

# Limpiamos vacíos
raw_sub <- raw_sub[raw_sub != ""]

# 2. CÁLCULOS
frecuencias_sub <- table(raw_sub)
frecuencias_sub_ordenadas <- sort(frecuencias_sub, decreasing = TRUE)

# ¡CAMBIO IMPORTANTE! Mostramos el TOP 20 para ver más detalles
top_20_sub <- head(frecuencias_sub_ordenadas, 20)

# 3. GRÁFICO HORIZONTAL GRANDE
# fig.height=8 hace que el gráfico sea más alto para que quepan 20 barras
# mar=c(...) con 18 a la izquierda para leer los nombres largos
par(mar = c(5, 18, 4, 2))

barplot(top_20_sub,
        horiz = TRUE,
        main = "Top 20 Causas Específicas (Subcategorías)",
        xlab = "Frecuencia",
        col = "firebrick",     
        las = 1,             
        cex.names = 0.6,     
        border = "white",
        font.main = 2)

13 liquid Ignition

# 1. Cargar librerías necesarias
library(ggplot2)

# 2. Seleccionar la columna automáticamente
# Buscamos la columna que tenga la palabra "Ignition" (funciona con espacios o puntos)
nombre_columna <- grep("Ignition", names(database), value = TRUE)[1]

# 3. Graficar con ggplot2
grafica <- ggplot(database, aes(x = .data[[nombre_columna]])) +
  geom_bar(fill = "orangered") + 
  theme_minimal() +
  labs(
    x = "Hubo Ignición?",
    y = "Cantidad de Accidentes",
    title = paste("Frecuencia de:", nombre_columna)
  )

# Mostrar la gráfica en el reporte
print(grafica)

14 Liquid Explosion

# 1. PREPARACIÓN DE DATOS
# Buscamos la columna de forma segura (Liquid Explosion)
col_target <- grep("Explosion", names(database), value = TRUE)[1]
raw_explosion <- database[[col_target]]

# Limpiamos vacíos
raw_explosion <- raw_explosion[raw_explosion != ""]

# 2. TABLA Y ORDENAMIENTO
frecuencias_explosion <- table(raw_explosion)
frecuencias_explosion_ordenadas <- sort(frecuencias_explosion, decreasing = TRUE)

# 3. RENOMBRAR CATEGORÍAS
# Diccionario de traducción
nuevos_nombres_explosion <- c(
  "YES" = "Sí",
  "NO" = "No"
)

# Aplicamos los nombres con seguridad:
nombres_actuales <- names(frecuencias_explosion_ordenadas)
labels_nuevos <- nuevos_nombres_explosion[nombres_actuales]
# Si alguno no estaba en la lista, usamos el original
labels_nuevos[is.na(labels_nuevos)] <- nombres_actuales[is.na(labels_nuevos)]

# Asignamos los nombres finales
names(frecuencias_explosion_ordenadas) <- labels_nuevos

# 4. GRÁFICO HORIZONTAL
par(mar = c(5, 12, 4, 2))  # Margen izquierdo amplio

barplot(frecuencias_explosion_ordenadas,
        horiz = TRUE,
        main = "Explosión de Líquido (Liquid Explosion)",
        xlab = "Frecuencia",
        col = "orangered",  
        las = 1,
        cex.names = 1.0,
        border = "white",
        font.main = 2)

15 Pipeline Shutdown

# 1. PREPARACIÓN DE DATOS
# Buscamos la columna de forma segura (Pipeline Shutdown)
# "Shutdown" es la palabra clave única
col_target <- grep("Shutdown", names(database), value = TRUE)[1]
raw_shutdown <- database[[col_target]]

# Limpiamos vacíos
raw_shutdown <- raw_shutdown[raw_shutdown != ""]

# 2. TABLA Y ORDENAMIENTO
frecuencias_shutdown <- table(raw_shutdown)
frecuencias_shutdown_ordenadas <- sort(frecuencias_shutdown, decreasing = TRUE)

# 3. RENOMBRAR CATEGORÍAS 
# Definimos el "diccionario" de traducción
nuevos_nombres_shutdown <- c(
  "YES" = "Sí",
  "NO" = "No"
)

# Aplicamos los nombres con seguridad:
nombres_actuales <- names(frecuencias_shutdown_ordenadas)
# Buscamos el nombre nuevo en el diccionario
labels_nuevos <- nuevos_nombres_shutdown[nombres_actuales]
# Si alguno no estaba en la lista (sale NA), le dejamos el nombre original
labels_nuevos[is.na(labels_nuevos)] <- nombres_actuales[is.na(labels_nuevos)]

# Asignamos los nombres finales
names(frecuencias_shutdown_ordenadas) <- labels_nuevos

# 4. GRÁFICO HORIZONTAL (Tu diseño)
par(mar = c(5, 12, 4, 2))  # Margen izquierdo amplio

barplot(frecuencias_shutdown_ordenadas,
        horiz = TRUE,
        main = "Estado de Pipeline Shutdown",
        xlab = "Frecuencia",
        col = "skyblue",   
        las = 1,
        cex.names = 1.0,   
        border = "white",
        font.main = 2)