1 Cargar Datos

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

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: Cantidad local 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 Agrupación

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 1: 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 = "Frecuencia Relativa (hi) - Agrupación 1",
    x = "Causa del Accidente",
    y = "Frecuencia Relativa (hi)"
  ) +
  
  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"

5 Agrupación 2

# 1. Filtramos para la Agrupación 2
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
orden_grupo2 <- c("Daño por Excavación", "Causas menores", "Fuerzas Naturales", "Fuerzas Externas")
tdf_agrupacion2$Cause.Category <- factor(tdf_agrupacion2$Cause.Category, levels = orden_grupo2)

# 3. Graficamos
library(ggplot2)
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 = "Frecuencia Relativa (hi) - Agrupación 2",
    x = "Causa del Accidente",
    y = "Frecuencia Relativa (hi)"
  ) +
  
  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)
  )

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 = "Frecuencia Relativa (hi) - Orden Personalizado",
    x = "Causa del Accidente",
    y = "Frecuencia Relativa (hi)"
  ) +
  
  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"

6 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"

7 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.