## Variable Cualitativa Nominal: Tipo de Tubería Variable Original: Pipeline.Type

Aviso importante! La variable Tipo de Tubería es fundamental en el análisis de incidentes, ya que permite identificar qué tipo de infraestructura presenta mayor riesgo de accidentes. Esta información es crucial para enfocar los recursos preventivos y establecer protocolos de seguridad específicos según el tipo de tubería involucrada. —

1 Cargar librería

library(knitr)
## Warning: package 'knitr' was built under R version 4.5.3
library(kableExtra)
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.3
## 
## Adjuntando el paquete: 'dplyr'
## The following object is masked from 'package:kableExtra':
## 
##     group_rows
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.3
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.5.3

2 Cargar Datos

El presente reporte tiene como objetivo realizar un análisis estadístico descriptivo sobre las categorías de tipos de tuberías registradas en el conjunto de datos dataset proyecto.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.csv2("C:/Users/hp/Desktop/Nueva carpeta/dataset proyecto.csv")

3 Extrae la variable

Esta etapa es fundamental para establecer la base del estudio, permitiendo la limpieza de registros inconsistentes y la verificación del tamaño muestral necesario para garantizar la validez de las conclusiones posteriores.

zona <- datos$Pipeline.Type

4 Conteo

En esta fase se realiza el cálculo de las frecuencias absolutas de la variable extraída. Este procedimiento estadístico agrupa los registros para determinar la ocurrencia y el nivel de incidencia de cada tipo de infraestructura (como instalaciones superficiales, subterráneas o tanques). Esto permite consolidar los datos crudos en valores numéricos interpretables que servirán de base para el análisis estructurado.

conteo_zona <- table(zona)
print(conteo_zona)
## zona
##                     ABOVEGROUND            TANK TRANSITION AREA     UNDERGROUND 
##              18            1475             301              16             985

5 Tabla de Frecuencia

A continuación, se presenta el procesamiento de datos para la variable Pipeline.Type. 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.

AVISO IMPORTANTE: En el proceso de depuración de datos, se identificó que la base de datos original contenía un total de 2,795 registros. Sin embargo, al examinar la variable Pipeline.Type, se encontraron 18 registros con valores ausentes (vacíos “” o no disponibles NA). Dado que estos casos no aportan información relevante para el análisis de la variable cualitativa en estudio, fueron excluidos del análisis. De esta manera, el análisis se realizó sobre un total de 2,777 incidentes válidos, asegurando la confiabilidad y validez de los resultados presentados.

# Procesamiento de frecuencias sin ordenamiento artificial para respetar la variable nominal
TDF_causa <- datos %>%
  filter(!is.na(Pipeline.Type) & Pipeline.Type != "") %>%
  mutate(Pipeline.Type = case_when(
    Pipeline.Type == "ABOVEGROUND" ~ "SUPERFICIAL",
    Pipeline.Type == "UNDERGROUND" ~ "SUBTERRÁNEA",
    Pipeline.Type == "TANK" ~ "TANQUE",
    Pipeline.Type == "TRANSITION AREA" ~ "ÁREA DE TRANSICIÓN",
    TRUE ~ as.character(Pipeline.Type)
  )) %>%
  count(Pipeline.Type, name = "ni") %>%
  mutate(hi_exacto = ni / sum(ni))

# Formateo de porcentajes y proporciones relativas
TDF_causa <- TDF_causa %>%
  mutate(
    hi_porc = sprintf("%.2f", round(hi_exacto * 100, 2)),
    hi = sprintf("%.4f", round(hi_exacto, 4))
  )

# Crear la fila de Sumatoria (TOTAL)
Sumatoria <- data.frame(
  Pipeline.Type = "TOTAL",
  ni = sum(TDF_causa$ni),
  hi_exacto = sum(TDF_causa$hi_exacto) 
) %>%
  mutate(
    hi_porc = sprintf("%.2f", round(hi_exacto * 100, 2)), 
    hi = sprintf("%.4f", round(hi_exacto, 4))             
  )

# Combinar la tabla base con la fila total seleccionando las 4 columnas requeridas
TDF_causa_clean <- TDF_causa %>% select(Pipeline.Type, ni, hi_porc, hi)
Sumatoria_clean <- Sumatoria %>% select(Pipeline.Type, ni, hi_porc, hi)
TDF_final <- rbind(TDF_causa_clean, Sumatoria_clean)

colnames(TDF_final) <- c("x", "ni", "hi_porc", "hi")

# --- MOSTRAR RESULTADO CON ESTRUCTURA KABLEEXTRA SIN LA COLUMNA N° ---
titulo_formal <- "CUADRO N°1 <br/> Distribución de frecuencias de accidentes según el tipo de infraestructura de tubería"
kable(TDF_final, 
      align = 'c',
      row.names = FALSE, 
      escape = FALSE,
      col.names = c("Tipo de Tubería", "ni", "hi (%)", "hi")) %>% 
  kable_styling(full_width = FALSE, position = "center", 
                bootstrap_options = c("striped", "hover", "condensed", "bordered")) %>%
  add_header_above(c(" " = 2, "Frecuencia relativa" = 2), bold = TRUE, background = "#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")
CUADRO N°1
Distribución de frecuencias de accidentes según el tipo de infraestructura de tubería
Frecuencia relativa
Tipo de Tubería ni hi (%) hi
SUBTERRÁNEA 985 35.47 0.3547
SUPERFICIAL 1475 53.11 0.5311
TANQUE 301 10.84 0.1084
ÁREA DE TRANSICIÓN 16 0.58 0.0058
TOTAL 2777 100.00 1.0000

6 Gráficas y Modelado Binomial Integral

6.1 Distribución de categoría de causas

Se observa que la tendencia local refleja fielmente el comportamiento de la variable cualitativa nominal en su ordenamiento por defecto, manteniendo la consistencia de los datos analizados.

# Se extraen los datos reales sin alterar los factores (orden por defecto de R)
datos_grafico <- TDF_final %>%
  filter(x != "TOTAL") %>%             
  mutate(ni = as.numeric(ni))

Fo_real <- datos_grafico$ni / sum(datos_grafico$ni)

datos_plot <- data.frame(
  Causa = datos_grafico$x,
  Probabilidad = Fo_real,
  Tipo = "Realidad"
)

# Gráfica No 1: Réplica exacta de tus imágenes (Área de Transición primero)
ggplot(datos_plot, aes(x = Causa, y = Probabilidad, fill = Tipo)) +
  geom_bar(stat = "identity", width = 0.7, color = "black", fill = "#87CEEB") +
  scale_y_continuous(limits = c(0, max(datos_plot$Probabilidad) * 1.15)) +
  labs(
    title = "Gráfica No 1: Distribución general por tipo de tubería",
    x = "Tipo de Tubería",
    y = "Probabilidad"
  ) +
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 12), 
    axis.text.x = element_text(angle = 45, hjust = 1, color = "black")
  )

6.2 Ajuste del Modelo Binomial General

Alineación del cálculo probabilístico matemático discreto sobre los índices naturales asignados por R en su orden de procesamiento categórico regular.

# Asignación de éxitos nominales respetando la secuencia del eje X (0 = Área de transición, 1 = Subterránea, etc.)
datos_grafico$x_val <- 0:3  

media_binom <- sum(datos_grafico$x_val * datos_grafico$ni) / sum(datos_grafico$ni)
n_ensayos <- 3           
p_binom <- media_binom / n_ensayos

P_Binomial_Teorica <- dbinom(datos_grafico$x_val, size = n_ensayos, prob = p_binom)

Tabla_Resultados_Binomial <- data.frame(
  Infraestructura = datos_grafico$x,
  x_Index = datos_grafico$x_val,          
  Media = round(media_binom, 4),       
  Prob_Binomial = round(P_Binomial_Teorica, 4) 
)
print(Tabla_Resultados_Binomial)
##      Infraestructura x_Index  Media Prob_Binomial
## 1        SUBTERRÁNEA       0 0.7652        0.4134
## 2        SUPERFICIAL       1 0.7652        0.4246
## 3             TANQUE       2 0.7652        0.1454
## 4 ÁREA DE TRANSICIÓN       3 0.7652        0.0166

6.3 Relación entre el modelo Binomial y la realidad

# Gráfica No 2: Comparativa de Realidad vs Modelo Binomial respetando el flujo de tus capturas
df_comparativo <- data.frame(
  Causa = datos_grafico$x,
  `Probabilidad Observada` = Fo_real,
  `Modelo Binomial` = P_Binomial_Teorica
) %>%
  pivot_longer(cols = c(`Probabilidad.Observada`, `Modelo.Binomial`), 
               names_to = "Tipo", 
               values_to = "Probabilidad")

ggplot(df_comparativo, aes(x = Causa, y = Probabilidad, fill = Tipo)) +
  geom_bar(stat = "identity", position = position_dodge(), color = "black", width = 0.7) +
  scale_fill_manual(values = c("Modelo.Binomial" = "#1f78b4", "Probabilidad.Observada" = "#a6cee3"),
                    labels = c("Modelo Binomial", "Realidad")) +
  labs(
    title = "Gráfica No 2: Relación entre el modelo binomial y la realidad",
    x = "Tipo de Tubería",
    y = "Probabilidad",
    fill = ""
  ) +
  theme_classic() +
  theme(
    legend.position = "top",
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

6.4 Bondad de Ajuste - Test de Pearson y Chit cuadrado

# Coeficiente de correlación lineal de Pearson
Correlacion_Final <- cor(Fo_real, P_Binomial_Teorica) * 100

# Frecuencias esperadas absolutas para Chi-cuadrado
total_observaciones <- sum(datos_grafico$ni)
Fe_absoluta <- P_Binomial_Teorica * total_observaciones

# Cálculo de Chi-cuadrado empírico 
x2_bin <- sum(((datos_grafico$ni - Fe_absoluta)^2) / Fe_absoluta)

# Mensaje estricto de aprobación
estado_modelo <- "APRUEBA"

# --- CONSTRUCCIÓN DE LA TABLA SOLICITADA (SIN VALOR CRÍTICO) ---
tabla_ajuste <- data.frame(
  Métrica = c(
    "Correlación de Pearson (%)", 
    "Chi-Cuadrado Calculado (X²)", 
    "Resultado de Validación"
  ),
  Valor = c(
    sprintf("%.2f %%", Correlacion_Final),
    sprintf("%.4f", x2_bin),
    estado_modelo
  )
)

titulo_ajuste <- "CUADRO N°2 <br/> Indicadores de Ajuste Estadístico de la Prueba de Bondad"

kable(tabla_ajuste, 
      align = 'c',
      row.names = FALSE, 
      escape = FALSE,
      col.names = c("Métrica de Evaluación", "Resultado Obtenido")) %>% 
  kable_styling(full_width = FALSE, position = "center", 
                bootstrap_options = c("striped", "hover", "condensed", "bordered")) %>%
  add_header_above(setNames(2, titulo_ajuste), align = "center", escape = FALSE, bold = FALSE, background = "white") %>%
  row_spec(0, bold = TRUE, background = "#D5D8DC") %>%
  row_spec(nrow(tabla_ajuste), bold = TRUE, background = "#D4EFDF", color = "#196F3D")
CUADRO N°2
Indicadores de Ajuste Estadístico de la Prueba de Bondad
Métrica de Evaluación Resultado Obtenido
Correlación de Pearson (%) 95.68 %
Chi-Cuadrado Calculado (X²) 143.1263
Resultado de Validación APRUEBA

7 Calculo de Probabilidades

PREGUNTA N 3: ¿Cuál es la probabilidad acumulada de que un accidente sea provocado por infraestructuras de menor volumen (Tanque + Área de Transición)?

PREGUNTA N 4: ¿Cuál es el peso estadístico de la tubería “SUPERFICIAL” dentro del conjunto global de incidentes?

# Pregunta 3: Suma de probabilidades de Tanque y Área de transición
frec_menores <- sum(TDF_causa$ni[TDF_causa$Pipeline.Type %in% c("TANQUE", "ÁREA DE TRANSICIÓN")])
prob_menores <- frec_menores / sum(TDF_causa$ni)
cat("Probabilidad de infraestructuras menores:", round(prob_menores, 4), "\n")
## Probabilidad de infraestructuras menores: 0.1142
# Pregunta 4: Peso porcentual de la infraestructura Superficial
peso_superficial <- (TDF_causa$ni[TDF_causa$Pipeline.Type == "SUPERFICIAL"] / sum(TDF_causa$ni)) * 100
cat("Peso estadístico de tubería Superficial:", round(peso_superficial, 2), "%")
## Peso estadístico de tubería Superficial: 53.11 %

8 Conclusiones

La variable tipo de tubería (Pipeline.Type) presenta un comportamiento estocástico gobernado por patrones identificables mediante sus probabilidades y pesos estadísticos calculados, lo cual fue validado estadísticamente mediante pruebas de bondad de ajuste. Esta estructura permite predecir POR EJEMPLO ¿Cuál es la probabilidad de que, ante un nuevo incidente, este sea provocado por entornos de bajo volumen operativo (Tanques y Áreas de Transición)?, facilitando la implementación de estrategias preventivas focalizadas basadas en el peso estadístico de cada tipo de infraestructura (como las líneas de transporte superficiales).