La correcta inicialización del entorno de trabajo y la carga de
librerías especializadas constituyen el primer paso crítico para el
procesamiento estadístico. Herramientas como dplyr permiten
una manipulación estructurada y eficiente de la información, mientras
que paquetes como knitr y kableExtra resultan
indispensables para garantizar que la presentación de los resultados y
las tablas de frecuencias cumplan con los más altos estándares de
calidad visual exigidos en la redacción de informes técnicos y
académicos.
# Cargar librerías necesarias
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(knitr)
library(kableExtra)
##
## Adjuntando el paquete: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
library(ggplot2)
El desarrollo de este análisis cuantitativo parte de la importación exhaustiva de los registros históricos recopilados en el conjunto de datos principal (database-1.csv). Este proceso asegura que se conserve la integridad estructural de la matriz de información original, garantizando la correcta lectura de variables operativas y ambientales. En este paso, se mantiene inalterada la nomenclatura original del origen de los datos, lo cual es vital para el mapeo y trazabilidad correcta de los incidentes reportados a lo largo de la infraestructura.
datos <- read.csv("database-_1_.csv", header = TRUE, sep = ",", dec = ".", check.names = FALSE)
names(datos)
## [1] "Report Number"
## [2] "Supplemental Number"
## [3] "Accident Year"
## [4] "Accident Date/Time"
## [5] "Operator ID"
## [6] "Operator Name"
## [7] "Pipeline/Facility Name"
## [8] "Pipeline Location"
## [9] "Pipeline Type"
## [10] "Liquid Type"
## [11] "Liquid Subtype"
## [12] "Liquid Name"
## [13] "Accident City"
## [14] "Accident County"
## [15] "Accident State"
## [16] "Accident Latitude"
## [17] "Accident Longitude"
## [18] "Cause Category"
## [19] "Cause Subcategory"
## [20] "Unintentional Release (Barrels)"
## [21] "Intentional Release (Barrels)"
## [22] "Liquid Recovery (Barrels)"
## [23] "Net Loss (Barrels)"
## [24] "Liquid Ignition"
## [25] "Liquid Explosion"
## [26] "Pipeline Shutdown"
## [27] "Shutdown Date/Time"
## [28] "Restart Date/Time"
## [29] "Public Evacuations"
## [30] "Property Damage Costs"
## [31] "Lost Commodity Costs"
## [32] "Public/Private Property Damage Costs"
## [33] "Emergency Response Costs"
## [34] "Environmental Remediation Costs"
## [35] "Other Costs"
## [36] "All Costs"
La parametrización del estudio demanda aislar elementos específicos para su evaluación detallada. En esta etapa, se extrae la variable de subcategorías de causa (Cause Subcategory). Este paso metodológico tiene una relevancia técnica fundamental, ya que permite desglosar de manera granular y específica los motivos exactos que desencadenaron los fallos en la red de oleoductos (tales como tipos específicos de corrosión, fallos mecánicos precisos o errores operativos puntuales). Aislar esta variable asegura la precisión necesaria para un diagnóstico profundo de las vulnerabilidades del sistema.
zona <- datos$`Cause Subcategory`
La fase de cálculo de frecuencias absolutas transforma el extenso volumen de datos extraídos en métricas de diagnóstico directamente interpretables. A través de este procedimiento estadístico, se tabulan las observaciones para cuantificar de manera exacta la recurrencia de cada subcategoría causal. La consolidación de estos valores absolutos permite jerarquizar los factores de riesgo más comunes, entregando una base cuantitativa robusta que servirá para focalizar estrategias de mantenimiento preventivo y optimizar la integridad de las líneas de tuberías.
conteo_zona <- table(zona)
print(conteo_zona)
## zona
## CONSTRUCTION, INSTALLATION OR FABRICATION-RELATED
## 112
## DAMAGE BY OPERATOR OR OPERATOR'S CONTRACTOR
## 20
## DEFECTIVE OR LOOSE TUBING/FITTING
## 62
## EARTH MOVEMENT
## 8
## ELECTRICAL ARCING FROM OTHER EQUIPMENT/FACILITY
## 11
## ENVIRONMENTAL CRACKING-RELATED
## 16
## EXTERNAL
## 230
## FAILURE OF EQUIPMENT BODY
## 67
## FIRE/EXPLOSION AS PRIMARY CAUSE
## 4
## FISHING OR MARITIME ACTIVITY
## 1
## HEAVY RAINS/FLOODS
## 25
## HIGH WINDS
## 1
## INCORRECT EQUIPMENT
## 10
## INCORRECT INSTALLATION
## 72
## INCORRECT VALVE POSITION
## 84
## INTENTIONAL DAMAGE
## 3
## INTERNAL
## 362
## LIGHTNING
## 19
## MALFUNCTION OF CONTROL/RELIEF EQUIPMENT
## 171
## MANUFACTURING-RELATED
## 70
## MARITIME EQUIPMENT OR VESSEL ADRIFT
## 1
## MISCELLANEOUS
## 76
## NON-THREADED CONNECTION FAILURE
## 286
## OPERATOR/CONTRACTOR EXCAVATION DAMAGE
## 28
## OTHER EQUIPMENT FAILURE
## 204
## OTHER INCORRECT OPERATION
## 86
## OTHER NATURAL FORCE DAMAGE
## 8
## OTHER OUTSIDE FORCE DAMAGE
## 15
## OVERFILL/OVERFLOW OF TANK/VESSEL/SUMP
## 69
## PIPELINE/EQUIPMENT OVERPRESSURED
## 37
## PREVIOUS DAMAGE DUE TO EXCAVATION
## 12
## PREVIOUS MECHANICAL DAMAGE
## 1
## PUMP OR PUMP-RELATED EQUIPMENT
## 296
## TEMPERATURE
## 57
## THIRD PARTY EXCAVATION DAMAGE
## 57
## THREADED CONNECTION/COUPLING FAILURE
## 151
## UNKNOWN
## 42
## VEHICLE NOT ENGAGED IN EXCAVATION
## 21
A continuación, se presenta el procesamiento de datos para la variable Subcause.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.
library(dplyr)
library(knitr)
library(kableExtra)
datos <- read.csv("database-_1_.csv", header = TRUE, sep = ",", dec = ".", check.names = FALSE)
zona <- datos$`Cause.Subcategory`
TDF_subcausa <- datos %>%
filter(`Cause Subcategory` != "" & !is.na(`Cause Subcategory`)) %>%
mutate(`Cause Subcategory` = case_when(
`Cause Subcategory` == "INTERNAL" ~ "Corrosión Interna",
`Cause Subcategory` == "EXTERNAL" ~ "Corrosión Externa",
`Cause Subcategory` == "PUMP OR PUMP-RELATED EQUIPMENT" ~ "Falla en Equipos de Bombeo",
`Cause Subcategory` %in% c("NON-THREADED CONNECTION FAILURE", "THREADED CONNECTION/COUPLING FAILURE") ~ "Fallas de Conexión",
`Cause Subcategory` == "MALFUNCTION OF CONTROL/RELIEF EQUIPMENT" ~ "Falla en Equipos de Control",
`Cause Subcategory` %in% c("OTHER EQUIPMENT FAILURE", "FAILURE OF EQUIPMENT BODY") ~ "Otras Fallas de Equipos",
TRUE ~ "Climatización"
)) %>%
count(`Cause Subcategory`, name = "ni") %>%
arrange(desc(ni))
TDF_subcausa$hi_exacto <- (TDF_subcausa$ni / sum(TDF_subcausa$ni)) * 100
TDF_subcausa$DECIMAL_exacto <- TDF_subcausa$hi_exacto / 100
TDF_subcausa$hi <- round(TDF_subcausa$hi_exacto, 2)
TDF_subcausa$DECIMAL <- round(TDF_subcausa$DECIMAL_exacto, 3)
dif_hi <- 100 - sum(TDF_subcausa$hi)
dif_dec <- 1 - sum(TDF_subcausa$DECIMAL)
idx_max <- which.max(TDF_subcausa$ni)
TDF_subcausa$hi[idx_max] <- TDF_subcausa$hi[idx_max] + dif_hi
TDF_subcausa$DECIMAL[idx_max] <- TDF_subcausa$DECIMAL[idx_max] + dif_dec
Sumatoria <- data.frame(
`Cause Subcategory` = "Total", # Ajustado a minúscula
ni = sum(TDF_subcausa$ni),
hi = sum(TDF_subcausa$hi),
DECIMAL = sum(TDF_subcausa$DECIMAL),
check.names = FALSE
)
TDF_final <- rbind(TDF_subcausa[, c("Cause Subcategory", "ni", "hi", "DECIMAL")], Sumatoria)
colnames(TDF_final) <- c("Subcategoría de causa", "ni", "hi (%)", "fi")
# Título formal en MAYÚSCULAS
titulo_formal <- "CUADRO N° [1] <br/> Distribución de frecuencias de accidentes según la subcategoría de causa en Estados Unidos, [2010 - 2016]"
kable(TDF_final, align = 'c', digits = c(0, 0, 2, 3)) %>%
kable_styling(full_width = FALSE, position = "center",
bootstrap_options = c("striped", "hover", "condensed", "bordered")) %>%
add_header_above(c(" " = 2, "Frecuencia relativa" = 2),
bold = c(FALSE, TRUE),
background = c("white", "#D5D8DC")) %>%
add_header_above(setNames(4, titulo_formal), align = "center", escape = FALSE, bold = FALSE, background = "white") %>%
row_spec(0, bold = TRUE) %>%
row_spec(nrow(TDF_final), bold = TRUE, background = "#f2f2f2") %>%
row_spec(1, bold = TRUE)
| Subcategoría de causa | ni | hi (%) | fi |
|---|---|---|---|
| Climatización | 1028 | 36.77 | 0.368 |
| Fallas de Conexión | 437 | 15.64 | 0.156 |
| Corrosión Interna | 362 | 12.95 | 0.130 |
| Falla en Equipos de Bombeo | 296 | 10.59 | 0.106 |
| Otras Fallas de Equipos | 271 | 9.70 | 0.097 |
| Corrosión Externa | 230 | 8.23 | 0.082 |
| Falla en Equipos de Control | 171 | 6.12 | 0.061 |
| Total | 2795 | 100.00 | 1.000 |
A continuación, se presenta un diagrama circular que ilustra la distribución porcentual de las distintas subcategorías de causas de accidentes. Esta representación visual permite apreciar de forma rápida e intuitiva cómo se fracciona el 100% de los incidentes registrados, facilitando el contraste entre el peso de las fallas estructurales primarias (como corrosión o fallas de conexión) y el resto de los factores agrupados.
ggplot(TDF_subcausa, aes(x = reorder(`Cause Subcategory`, -ni), y = ni)) +
geom_bar(stat = "identity", fill = "#2980b9") +
labs(title = "Gráfica N 1: Distribución Absoluta General de subcategoria",
x = "Subcategoría de Causa",
y = "Cantidad de Accidentes") +
theme_minimal() +
# Inclinamos los textos del eje X para que se lean bien
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
ylim(0, 2795)
El siguiente gráfico de barras presenta la distribución de los siniestros según su subcategoría de causa. Esta visualización permite identificar rápidamente cuáles son los fallos operativos e infraestructurales que registran un mayor volumen de incidentes.
ggplot(TDF_subcausa, aes(x = reorder(`Cause Subcategory`, -ni), y = ni)) +
geom_bar(stat = "identity", fill = "#2980b9") +
labs(title = "Gráfica N 2: Distribución Absoluta local de subcategoria",
x = "Subcategoría",
y = "Cantidad de Accidentes") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
ylim(0, max(TDF_subcausa$ni) * 1.1)
A través de la gráfica de incidencia relativa, se estandariza el volumen de siniestros expresando cada subcategoría como una proporción del total. Esta métrica porcentual es fundamental para evaluar probabilísticamente el peso específico de cada tipo de falla frente al universo completo de datos observados.
# Convertimos 'hi' a numérico para graficar correctamente
TDF_subcausa <- TDF_subcausa %>% mutate(hi_num = as.numeric(hi))
ggplot(TDF_subcausa, aes(x = reorder(`Cause Subcategory`, -hi_num), y = hi_num)) +
geom_bar(stat = "identity", fill = "#2980b9") +
labs(title = "Gráfica N 3: Distribución Relativa Global de subcategoría de causa ",
x = "Subcategoría de Causa",
y = "Porcentaje (hi %)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
ylim(0, 100)
Al enfocar el análisis porcentual exclusivamente en las fallas estructurales (omitiendo el ruido de factores externos o residuales), se determina la densidad de incidencia de cada error mecánico. Esta representación visual es clave para enfocar los recursos de mantenimiento preventivo hacia los componentes críticos que mayor porcentaje de fallas concentran.
TDF_subcausa <- TDF_subcausa %>% mutate(hi_num = as.numeric(hi))
# Usamos TDF_subcausa que ya incluye "Climatización"
ggplot(TDF_subcausa, aes(x = reorder(`Cause Subcategory`, -hi_num), y = hi_num)) +
geom_bar(stat = "identity", fill = "#2980b9") +
labs(title = "Gráfica N 4: Distribución Relativa local de subcategoría de causa",
x = "Subcategoría",
y = "Porcentaje (hi %)") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
ylim(0, max(TDF_subcausa$hi_num) * 1.1)
El siguiente diagrama circular muestra la composición porcentual de la siniestralidad, permitiendo visualizar de un vistazo qué subcategorías técnicas concentran la mayor proporción de los incidentes.
ggplot(TDF_subcausa, aes(x = "", y = hi_num, fill = `Cause Subcategory`)) +
geom_bar(stat = "identity", width = 1, color = "white") +
coord_polar("y", start = 0) +
geom_text(aes(label = paste0(hi, "%")), position = position_stack(vjust = 0.5), size = 4) +
scale_fill_brewer(palette = "Blues") +
labs(title = "Gráfica N 5:Distribución de Subcategorías") +
theme_void() +
theme(legend.position = "right",
legend.title = element_blank(),
plot.title = element_text(hjust = 0.5, face = "bold"),
plot.subtitle = element_text(hjust = 0.5))
Dado el carácter nominal de la variable analizada, el estudio de tendencia central no admite promedios ni desviaciones estándar, por lo que se fundamenta estrictamente en el análisis de frecuencias y la Moda estadística. A continuación, se presentan los indicadores descriptivos que cuantifican el tamaño de la muestra y determinan el evento de fallo con mayor probabilidad de ocurrencia, tanto a nivel global como en el subconjunto estrictamente técnico.
# Cargar la librería knitr (si no está cargada ya en el chunk anterior)
library(knitr)
# Tu código original
total_accidentes <- sum(TDF_subcausa$ni)
moda_cat <- TDF_subcausa$`Cause Subcategory`[which.max(TDF_subcausa$ni)]
moda_frec <- max(TDF_subcausa$ni)
moda_porcentaje <- TDF_subcausa$hi[which.max(TDF_subcausa$ni)]
# 1. Crear el Data Frame con la estructura de la imagen
tabla_indicadores_subcausa <- data.frame(
Variable = "Subcategoría de Causa",
Media = "N/A",
Mediana = "N/A",
Moda = moda_cat
)
# 2. Generar la tabla con formato formal
kable(tabla_indicadores_subcausa,
caption = "Tabla 8: Indicadores Estadísticos de la Subcategoría de Causa",
align = c("l", "c", "c", "c"))
| Variable | Media | Mediana | Moda |
|---|---|---|---|
| Subcategoría de Causa | N/A | N/A | Climatización |
La variable cualitativa nominal Subcategoría de causa tiene como valor más frecuente el estado ‘Climatización’ (moda), abarcando el 36.78% de los registros de Subcategoría de causa.