1 Cargar Datos

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

2 Tabla de distribución de frecuencia

#Extraemos la tabla de resumen de las Categorías de Causas. Guardamos el conteo en 'ni', calculamos la suma total y obtenemos el porcentaje ('hi') que representa cada causa. Finalmente, creamos el dataframe final con el Nivel de Riesgo, la Categoría de Causas, ni y hi
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 Histograma

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, 1000, 2000, 2795)) +
  
  labs(
    title = "Gráfica 1:Clasificación de Eventos por Categoría de Causa",
    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 Agrupación

5 Agrupación 1

#En esta sección, hemos utilizado la técnica de agrupación de datos para categorizar la totalidad de los incidentes históricos según su "Causa Raíz". Al pasar de los datos crudos a una vista agrupada que son corrosión, falta del equipo y operación incorrecta. Podemos identificar patrones de comportamiento y áreas críticas que requieren atención inmediata.
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)
  )) %>%
  mutate(Agrupacion = case_when(
    Cause.Category %in% c("Falla del Equipo", "Corrosión", "Operación Incorrecta") ~ "Agrupación 1",
    TRUE ~ "Agrupación 2" 
  )) %>%
  count(Agrupacion, Cause.Category, name = "ni") %>%
  mutate(Cause.Category = factor(Cause.Category, levels = orden_final))
datos_grupo1 <- datos_causa %>% filter(Agrupacion == "Agrupación 1")
ggplot(datos_grupo1, aes(x = Cause.Category, y = ni)) +
  geom_bar(stat = "identity", fill = "skyblue", width = 0.7) +
  scale_y_continuous(limits = c(0, 1495), breaks = c(0, 1000, 2000, 2795)) +
  
  labs(
    title = "Gráfica 2: Cantidad general de Accidentes (Agrupación 1)",
    x = "Causa del Accidente",
    y = "Número de Accidentes"
  ) +
  
  theme_classic() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 11, color = "black"),
    plot.title = element_text(face = "bold", hjust = 0.5)
  )

Agrupacion1 <- datos_causa %>%
  filter(Agrupacion == "Agrupación 1")
tdf_agrupacion1 <- data.frame(Agrupacion1)
hi_grupo1 <- tdf_agrupacion1$ni / sum(tdf_agrupacion1$ni)
tdf_agrupacion1$hi <- hi_grupo1
print(hi_grupo1)
## [1] 0.2461538 0.5966736 0.1571726
library(ggplot2)
ggplot(tdf_agrupacion1, aes(x = Cause.Category, y = hi)) +
  geom_bar(stat = "identity", fill = "skyblue", width = 0.7) +
  scale_y_continuous(limits = c(0, max(tdf_agrupacion1$hi) * 1.15)) +
  
  labs(
    title = "Gráfica 3: Distribución Proporcional de las Principales Causas de Accidentes- Agrupación 1",
    x = "Causa del Accidente",
    y = "Probabilidad de Ocurrencia"
  ) +
  
  theme_classic() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 11, color = "black"),
    plot.title = element_text(face = "bold", hjust = 0.5)
  )

print("El modelo es Binomial")
## [1] "El modelo es Binomial"

6 Agrupación 2

#En este sitio usamos la táctica de unión de datos con el fin de que cada caso tenga su clase según su Categoría de causas. Pasamos de la info base a una vista de conjunto, que son daños por exacavación, causas menores, fuerzas naturales y fuerzas externas. Así, vemos los estilos de acción y los puntos clave que piden un ojo atento ya mismo.
Agrupacion2 <- datos_causa %>%
  filter(Agrupacion == "Agrupación 2")
tdf_agrupacion2 <- data.frame(Agrupacion2)
hi_grupo2 <- tdf_agrupacion2$ni / sum(tdf_agrupacion2$ni)
tdf_agrupacion2$hi <- hi_grupo2
print(hi_grupo2)
## [1] 0.3025641 0.2487179 0.1461538 0.3025641
library(ggplot2)
library(dplyr)
orden_especifico <- c("Daño por Excavación", 
                      "Causas menores", 
                      "Fuerzas Naturales", 
                      "Fuerzas Externas")
Datos_Agrupacion2 <- datos_causa %>%
  filter(Cause.Category %in% orden_especifico)
tdf_agrupacion2 <- data.frame(Datos_Agrupacion2)
tdf_agrupacion2$hi <- tdf_agrupacion2$ni / sum(tdf_agrupacion2$ni)
tdf_agrupacion2$Cause.Category <- factor(tdf_agrupacion2$Cause.Category, 
                                         levels = orden_especifico)
ggplot(tdf_agrupacion2, aes(x = Cause.Category, y = hi)) +
  geom_bar(stat = "identity", fill = "skyblue", width = 0.7) +
  scale_y_continuous(limits = c(0, max(tdf_agrupacion2$hi) * 1.15)) +
  
  labs(
    title = "Gráfica 4:Prevalencia de Causas Naturales y Menores en la Frecuencia de Accidentes",
    x = "Causa del Accidente",
    y = "Probabilidad"
  ) +
  
  theme_classic() +
  theme(
    axis.text.x = element_text(angle = 45, hjust = 1, size = 11, color = "black"),
    plot.title = element_text(face = "bold", hjust = 0.5)
  )

print("El modelo es Poisson")
## [1] "El modelo es Poisson"

7 Cálculos de Probabilidad

#¿Cuál es la probabilidad de que el accidente sea por Fuerzas Naturales?
# Calculamos el porcentaje directo de la columna hi (multiplicando por 100)
x <- round(tdf_agrupacion2$hi[tdf_agrupacion2$Cause.Category == "Fuerzas Naturales"] * 100, 1)
print(paste("La probabilidad es de:", x, "%"))
## [1] "La probabilidad es de: 30.3 %"
#¿Cuál es la diferencia de accidentes entre Daño por Excavación y Fuerzas Externas?

diferencia <- tdf_agrupacion2$ni[tdf_agrupacion2$Cause.Category == "Daño por Excavación"] - 
              tdf_agrupacion2$ni[tdf_agrupacion2$Cause.Category == "Fuerzas Externas"]
print(paste("La diferencia es de:", diferencia, "accidentes"))
## [1] "La diferencia es de: 40 accidentes"

8 Conclusión

#En conclusión, la variable evidencia que el riesgo operativo es mayoritariamente endógeno (causado por equipos, corrosión u operación) y, por tanto, controlable mediante políticas de gestión de activos y capacitación técnica. Se recomienda enfocar los recursos de mitigación en las categorías de la Agrupación 1 para lograr la mayor reducción posible en la tasa de accidentes.