1 Cargar Datos

El presente reporte tiene como objetivo realizar un análisis estadístico descriptivo sobre las categorías de causas registradas en el conjunto de datos database-1.csv. A través del uso del lenguaje de programación R, se procesará la información para identificar las frecuencias y patrones principales, permitiendo una comprensión clara de los factores predominantes en la muestra estudiada.

datos <- read.csv("database-_1_.csv")
zona<-datos$Cause.Category

2 Tabla de Frecuencia

A continuación, se presenta el procesamiento de datos para la variable Cause.Category. 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 cada categoría.

TDF_causa <- datos %>%
  mutate(Cause.Category = case_when(
    Cause.Category == "CORROSION" ~ "Corrosión",
    Cause.Category == "MATERIAL/WELD/EQUIP FAILURE" ~ "Falla del Equipo",
    Cause.Category == "INCORRECT OPERATION" ~ "Operación Incorrecta",
    Cause.Category == "EXCAVATION DAMAGE" ~ "Daño por Excavación",
    Cause.Category == "NATURAL FORCE DAMAGE" ~ "Fuerzas Naturales",
    Cause.Category == "OTHER OUTSIDE FORCE DAMAGE" ~ "Fuerzas Externas",
    Cause.Category == "ALL OTHER CAUSES" ~ "Causas menores",
    TRUE ~ as.character(Cause.Category) 
  )) %>%
  count(Cause.Category, name = "ni") %>%       
  mutate(ni = case_when(
    TRUE ~ as.numeric(ni) 
  )) %>%
  arrange(desc(ni)) %>%                            
  mutate(hi = (ni / sum(ni)) * 100) %>%          
  mutate(hi = sprintf("%.2f", round(hi, 2)))    

# Sumatoria y Tabla
Sumatoria <- data.frame(
  Cause.Category = "TOTAL",
  ni = sum(TDF_causa$ni),
  hi = "100.00"
)

TDF_final <- rbind(TDF_causa, Sumatoria)
colnames(TDF_final) <- c("Causa del Accidente", "ni", "hi (%)")

kable(TDF_final, align = 'c', 
      caption = "Tabla de Frecuencia: Causas de Accidentes") %>%
  kable_styling(full_width = FALSE, position = "center", 
                bootstrap_options = c("striped", "hover", "bordered")) %>%
  row_spec(nrow(TDF_final), bold = TRUE, background = "#f2f2f2") %>%
  row_spec(1, bold = TRUE, color = "black")
Tabla de Frecuencia: Causas de Accidentes
Causa del Accidente ni hi (%)
Falla del Equipo 1435 51.34
Corrosión 592 21.18
Operación Incorrecta 378 13.52
Causas menores 118 4.22
Fuerzas Naturales 118 4.22
Daño por Excavación 97 3.47
Fuerzas Externas 57 2.04
TOTAL 2795 100.00

3 Distribución absoluta general de categoría de causas

Se presenta un histograma de frecuencias para la variable de categorías de causas. La distribución es notablemente asimétrica a la derecha, concentrando la mayor parte de la siniestralidad en problemas técnicos y de materiales (Equipo y Corrosión). Esta visualización permite identificar rápidamente las áreas críticas que requieren mayor atención o mantenimiento preventivo para reducir el número total de accidentes.

library(ggplot2)
library(dplyr)
orden_final <- c("Corrosión", "Falla del Equipo", "Operación Incorrecta", "Daño por Excavación","Causas menores","Fuerzas Naturales", "Fuerzas Externas")
datos_causa <- datos %>%
  mutate(Cause.Category = case_when(
    Cause.Category == "CORROSION" ~ "Corrosión",
    Cause.Category == "MATERIAL/WELD/EQUIP FAILURE" ~ "Falla del Equipo",
    Cause.Category == "EXCAVATION DAMAGE" ~ "Daño por Excavación",
    Cause.Category == "INCORRECT OPERATION" ~ "Operación Incorrecta",
    Cause.Category == "NATURAL FORCE DAMAGE" ~ "Fuerzas Naturales",
    Cause.Category == "OTHER OUTSIDE FORCE DAMAGE" ~ "Fuerzas Externas",
    Cause.Category == "ALL OTHER CAUSES" ~ "Causas menores",
    TRUE ~ as.character(Cause.Category)
  )) %>%
  count(Cause.Category, name = "ni") %>%
  mutate(Cause.Category = factor(Cause.Category, levels = orden_final))
ggplot(datos_causa, aes(x = Cause.Category, y = ni)) +
  geom_bar(stat = "identity", fill = "skyblue", width = 0.7) +
  scale_y_continuous(limits = c(0, 2795), breaks = c(0, 1000, 2000, 2795)) +
  
  labs(
    title = "Gráfica 1: Cantidad general de Accidentes por Causa generales",
    x = "Causa del Accidente",
    y = "Número de Accidentes"
  ) +
  
  theme_classic() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 10, color = "black"),
    plot.title = element_text(face = "bold", hjust = 0.5)
  )

4 Distribución absoluta local de categoría de causas

Se observa que la tendencia local refleja fielmente el comportamiento del sistema general, manteniendo la jerarquía de las causas de manera proporcional.Los daños por excavación, causas menores, fuerzas naturales y fuerzas externas presentan los valores más bajos, manteniéndose todas por debajo de los 250 incidentes en la escala local.

library(ggplot2)
library(dplyr)
orden_final <- c("Corrosión", "Falla del Equipo", "Operación Incorrecta", "Daño por Excavación","Causas menores","Fuerzas Naturales", "Fuerzas Externas")
datos_causa <- datos %>%
  mutate(Cause.Category = case_when(
    Cause.Category == "CORROSION" ~ "Corrosión",
    Cause.Category == "MATERIAL/WELD/EQUIP FAILURE" ~ "Falla del Equipo",
    Cause.Category == "EXCAVATION DAMAGE" ~ "Daño por Excavación",
    Cause.Category == "INCORRECT OPERATION" ~ "Operación Incorrecta",
    Cause.Category == "NATURAL FORCE DAMAGE" ~ "Fuerzas Naturales",
    Cause.Category == "OTHER OUTSIDE FORCE DAMAGE" ~ "Fuerzas Externas",
    Cause.Category == "ALL OTHER CAUSES" ~ "Causas menores",
    TRUE ~ as.character(Cause.Category)
  )) %>%
  count(Cause.Category, name = "ni") %>%
  mutate(Cause.Category = factor(Cause.Category, levels = orden_final))
ggplot(datos_causa, aes(x = Cause.Category, y = ni)) +
  geom_bar(stat = "identity", fill = "skyblue", width = 0.7) +
  scale_y_continuous(limits = c(0, 1435), breaks = c(0, 500, 1000, 1435)) +
  labs(
    title = "Gráfica 2: Cantidad general de Accidentes por Causa generales",
    x = "Causa del Accidente",
    y = "Número de Accidentes"
  ) +
  
  theme_classic() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 10, color = "black"),
    plot.title = element_text(face = "bold", hjust = 0.5)
  )

5 Incidencia Relativa local por Categoría

La presente gráfica permite visualizar el impacto porcentual de cada categoría sobre el total de incidentes registrados a nivel local. A diferencia de las gráficas de frecuencia absoluta, este análisis facilita la identificación de las prioridades estratégicas mediante una escala relativa.

library(dplyr)
library(ggplot2)
orden_final <- c("Corrosión", "Falla del Equipo", "Operación Incorrecta", 
                 "Daño por Excavación", "Causas menores", "Fuerzas Naturales", 
                 "Fuerzas Externas")
datos_causa <- datos %>%
  mutate(Cause.Category = case_when(
    Cause.Category == "CORROSION" ~ "Corrosión",
    Cause.Category == "MATERIAL/WELD/EQUIP FAILURE" ~ "Falla del Equipo",
    Cause.Category == "EXCAVATION DAMAGE" ~ "Daño por Excavación",
    Cause.Category == "INCORRECT OPERATION" ~ "Operación Incorrecta",
    Cause.Category == "NATURAL FORCE DAMAGE" ~ "Fuerzas Naturales",
    Cause.Category == "OTHER OUTSIDE FORCE DAMAGE" ~ "Fuerzas Externas",
    Cause.Category == "ALL OTHER CAUSES" ~ "Causas menores",
    TRUE ~ as.character(Cause.Category)
  )) %>%
  count(Cause.Category, name = "ni") %>%
  mutate(hi = (ni / sum(ni)) * 100) %>%
  # --- AQUÍ ESTÁ EL CAMBIO CLAVE ---
  # Convertimos a factor usando el vector 'orden_final' como niveles
  mutate(Cause.Category = factor(Cause.Category, levels = orden_final))
ggplot(datos_causa, aes(x = Cause.Category, y = hi)) +
  
  geom_bar(stat = "identity", fill = "skyblue", width = 0.7) +
  scale_y_continuous(limits = c(0, 60), breaks = seq(0, 60, by = 10)) +
  
  labs(
    title = "Gráfica 3: Porcentaje local de Accidentes por Causa",
    x = "Causa del Accidente",
    y = "Porcentaje de Accidentes (%)"
  ) +
  
  theme_classic() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 10, color = "black"),
    plot.title = element_text(face = "bold", hjust = 0.5)
  )

6 Incidencia Relativa global por Categoría de causas

La similitud visual entre ambas gráficas confirma que la muestra local es un reflejo fiel del comportamiento global. Esto valida que cualquier estrategia de mitigación de riesgos diseñada para el total de la base de datos será altamente efectiva si se aplica localmente.

library(dplyr)
library(ggplot2)
orden_final <- c("Corrosión", "Falla del Equipo", "Operación Incorrecta", 
                 "Daño por Excavación", "Causas menores", "Fuerzas Naturales", 
                 "Fuerzas Externas")
datos_causa <- datos %>%
  mutate(Cause.Category = case_when(
    Cause.Category == "CORROSION" ~ "Corrosión",
    Cause.Category == "MATERIAL/WELD/EQUIP FAILURE" ~ "Falla del Equipo",
    Cause.Category == "EXCAVATION DAMAGE" ~ "Daño por Excavación",
    Cause.Category == "INCORRECT OPERATION" ~ "Operación Incorrecta",
    Cause.Category == "NATURAL FORCE DAMAGE" ~ "Fuerzas Naturales",
    Cause.Category == "OTHER OUTSIDE FORCE DAMAGE" ~ "Fuerzas Externas",
    Cause.Category == "ALL OTHER CAUSES" ~ "Causas menores",
    TRUE ~ as.character(Cause.Category)
  )) %>%
  count(Cause.Category, name = "ni") %>%
  mutate(hi = (ni / sum(ni)) * 100) %>%
  mutate(Cause.Category = factor(Cause.Category, levels = orden_final))
ggplot(datos_causa, aes(x = Cause.Category, y = hi)) +
  
  geom_bar(stat = "identity", fill = "skyblue", width = 0.7) +
  scale_y_continuous(limits = c(0, 100), breaks = seq(0, 100, by = 20)) +
  
  labs(
    title = "Gráfica 4: Porcentaje general de Accidentes por Causa",
    x = "Causa del Accidente",
    y = "Porcentaje de Accidentes (%)"
  ) +
  
  theme_classic() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 10, color = "black"),
    plot.title = element_text(face = "bold", hjust = 0.5)
  )

7 Diagrama Circular

El diagrama circular ofrece una visión integral de la participación de cada causa en el total de accidentes registrados. Esta representación permite identificar de manera inmediata qué proporción del problema ocupa cada categoría.

datos_pastel <- datos %>%
  mutate(Cause.Category = case_when(
    Cause.Category == "CORROSION" ~ "Corrosión",
    Cause.Category == "MATERIAL/WELD/EQUIP FAILURE" ~ "Falla del Equipo",
    Cause.Category == "EXCAVATION DAMAGE" ~ "Daño por Excavación",
    Cause.Category == "INCORRECT OPERATION" ~ "Operación Incorrecta",
    Cause.Category == "NATURAL FORCE DAMAGE" ~ "Fuerzas Naturales",
    Cause.Category == "OTHER OUTSIDE FORCE DAMAGE" ~ "Fuerzas Externas",
    Cause.Category == "ALL OTHER CAUSES" ~ "Causas menores",
    TRUE ~ as.character(Cause.Category)
  )) %>%
  count(Cause.Category, name = "ni") %>%
  mutate(prop = ni / sum(ni) * 100) %>%
  arrange(desc(Cause.Category)) %>%
  mutate(ypos = cumsum(prop) - 0.5 * prop)
ggplot(datos_pastel, aes(x = "", y = prop, fill = Cause.Category)) +
  
  geom_bar(stat = "identity", width = 1, color = "white") +
  
  coord_polar("y", start = 0) +
  
  theme_void() + 
  geom_text(aes(label = paste0(round(prop, 1), "%")), 
            position = position_stack(vjust = 0.5), 
            color = "black", size = 3) +
  
  labs(
    title = "Diagrama Circular: Causas de Accidentes",
    fill = "Causa del Accidente"
  ) +
  scale_fill_brewer(palette = "Blues") +
  theme(
    legend.position = "right", # Posición a la derecha
    legend.title = element_text(face = "bold"),
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14)
  )

8 Indicadores Estadíticos

Este indicador funciona como una conclusión técnica directa. Al señalar a la “Falla del Equipo” como el factor predominante, el reporte proporciona una base sólida para la toma de decisiones, sugiriendo que las acciones correctivas y de inversión deben enfocarse prioritariamente en la integridad y mantenimiento de los componentes físicos.

datos_espanol <- datos %>%
  mutate(Cause.Category = case_when(
    Cause.Category == "CORROSION" ~ "Corrosión",
    Cause.Category == "MATERIAL/WELD/EQUIP FAILURE" ~ "Falla del Equipo",
    Cause.Category == "EXCAVATION DAMAGE" ~ "Daño por Excavación",
    Cause.Category == "INCORRECT OPERATION" ~ "Operación Incorrecta",
    Cause.Category == "NATURAL FORCE DAMAGE" ~ "Fuerzas Naturales",
    Cause.Category == "OTHER OUTSIDE FORCE DAMAGE" ~ "Fuerzas Externas",
    Cause.Category == "ALL OTHER CAUSES" ~ "Causas menores",
    TRUE ~ as.character(Cause.Category)
  ))
tabla_causas <- table(na.omit(datos_espanol$Cause.Category))

causa_top <- names(tabla_causas)[which.max(tabla_causas)]
cantidad_top <- max(tabla_causas)
total_eventos <- sum(tabla_causas)
porcentaje_top <- round((cantidad_top / total_eventos) * 100, 2)
cat("La causa principal de los accidentes es:", causa_top, "\n")
## La causa principal de los accidentes es: Falla del Equipo
cat("Ocurrió", cantidad_top, "veces, lo que representa el", porcentaje_top, "% del total de casos.\n")
## Ocurrió 1435 veces, lo que representa el 51.34 % del total de casos.

9 Conclusión

El análisis de las causas revela que la Falla del Equipo es el factor predominante, consolidándose como la moda estadística. No obstante, factores humanos y externos, como la Operación Incorrecta, conservan una relevancia significativa. La evidencia gráfica sugiere que, si bien la integridad de la infraestructura es el punto más crítico, las deficiencias en los procedimientos operativos también impactan considerablemente en la siniestralidad total.