Cargar Datos
datos <- read.csv("database-_1_.csv")
zona<-datos$Cause.Category
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
|
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)
)

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