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. 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")
# 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)
# 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
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)