# ==============================================================================
# 1. CARGA DE DATOS
# ==============================================================================
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(ggplot2)
library(knitr)
library(kableExtra)
## 
## Adjuntando el paquete: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(tidyr)
library(readr)

# Carga de datos con tu ruta específica
database_xlsx_Sheet1 <- read_csv("C:/Users/Usuario/Downloads/database.xlsx - Sheet1.csv")
## Warning: One or more parsing issues, call `problems()` on your data frame for details,
## e.g.:
##   dat <- vroom(...)
##   problems(dat)
## Rows: 2795 Columns: 36
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (18): Accident Date/Time, Operator Name, Pipeline/Facility Name, Pipelin...
## dbl (18): Report Number, Supplemental Number, Accident Year, Operator ID, Ac...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# ==============================================================================
# 2. TABLA DE DISTRIBUCIÓN DE FRECUENCIAS 
# ==============================================================================
TDF <- database_xlsx_Sheet1 %>%
  filter(!is.na(`Pipeline Type`)) %>%
  count(`Pipeline Type`, name = "ni") %>%
  mutate(Tipo_Tuberia = case_when(
    `Pipeline Type` == "ABOVEGROUND" ~ "SOBRE EL SUELO",
    `Pipeline Type` == "UNDERGROUND" ~ "SUBTERRÁNEA",
    `Pipeline Type` == "TANK" ~ "TANQUE",
    `Pipeline Type` == "TRANSITION AREA" ~ "ÁREA DE TRANSICIÓN",
    TRUE ~ `Pipeline Type`
  )) %>%
  arrange(desc(ni)) %>% 
  mutate(Posicion_Riesgo = as.character(row_number()), 
         hi = (ni/sum(ni))*100,
         Nivel_Riesgo = c("Riesgo Alto", "Riesgo Medio", "Riesgo Bajo", "Riesgo Muy Bajo"))

 
TDF_con_Total <- TDF %>%
  select(Posicion_Riesgo, Tipo_Tuberia, ni, hi) %>%
  bind_rows(tibble(
    Posicion_Riesgo = "-", 
    Tipo_Tuberia = "TOTAL", 
    ni = sum(.$ni), 
    hi = 100.00
  )) %>%
  mutate(hi = sprintf("%.2f", as.numeric(hi)))

# Renderizado de la tabla
kable(TDF_con_Total, align = 'c', 
      col.names = c("Posición Riesgo", "Tipo de Tubería", "ni (Accidentes)", "hi (%)"),
      caption = "Tabla 1: Tabla de Riesgo por Tipo de Tubería") %>%
  kable_styling(full_width = F, bootstrap_options = c("striped", "hover", "bordered")) %>%
  row_spec(nrow(TDF_con_Total), bold = T, background = "#F2F2F2")
Tabla 1: Tabla de Riesgo por Tipo de Tubería
Posición Riesgo Tipo de Tubería ni (Accidentes) hi (%)
1 SOBRE EL SUELO 1475 53.11
2 SUBTERRÁNEA 985 35.47
3 TANQUE 301 10.84
4 ÁREA DE TRANSICIÓN 16 0.58
TOTAL 2777 100.00
"Nota: De los 2,795 registros iniciales, se procesaron 2,777. Se descartaron 18 filas por contener valores nulos (NA) que impedían su clasificación."
## [1] "Nota: De los 2,795 registros iniciales, se procesaron 2,777. Se descartaron 18 filas por contener valores nulos (NA) que impedían su clasificación."
# ==============================================================================
# 3. GRÁFICA DE PROBABILIDAD 
# ==============================================================================
niveles_riesgo <- TDF$Tipo_Tuberia
TDF$Tipo_Tuberia <- factor(TDF$Tipo_Tuberia, levels = niveles_riesgo, ordered = TRUE)
TDF$Nivel_Riesgo <- factor(TDF$Nivel_Riesgo, levels = c("Riesgo Alto", "Riesgo Medio", "Riesgo Bajo", "Riesgo Muy Bajo"))

ggplot(TDF, aes(x = Tipo_Tuberia, y = as.numeric(hi), fill = Nivel_Riesgo)) +
  geom_col(color = "white", width = 0.7) +
  scale_fill_manual(values = c("Riesgo Alto" = "#4292C6", 
                               "Riesgo Medio" = "#9ECAE1", 
                               "Riesgo Bajo" = "#C6DBEF", 
                               "Riesgo Muy Bajo" = "#DEEBF7")) +
  labs(title = "Gráfica N1: Probabilidad de Accidentes por Categoría",
       x = "Tipo de Tubería", 
       y = "Probabilidad (%)",
       fill = "Nivel de Riesgo") +
  theme_minimal() + 
  theme(legend.position = "top",
        panel.grid.minor = element_blank())

# ==============================================================================
# 4. CONJETURA DEL MODELO (Realidad vs Modelo)
# ==============================================================================
tdf_all <- data.frame(TDF)
tdf_all$x <- 1:nrow(tdf_all) 

Fo1 <- tdf_all$ni / sum(tdf_all$ni)
media_p <- sum(tdf_all$x * tdf_all$ni) / sum(tdf_all$ni)
p_geo <- 1 / media_p
Fe1 <- dgeom(tdf_all$x - 1, prob = p_geo)

df_comp <- data.frame(
  Tipo = factor(tdf_all$Tipo_Tuberia, levels = niveles_riesgo),
  Observada = Fo1,
  Esperada = Fe1
) %>% pivot_longer(cols = c(Observada, Esperada), names_to = "Fuente", values_to = "Val")

ggplot(df_comp, aes(x = Tipo, y = Val, fill = Fuente)) +
  geom_bar(stat = "identity", position = "dodge", color = "black") +
  scale_fill_manual(values = c("Observada" = "#B3DDF2", "Esperada" = "#4292C6"),
                    labels = c("Realidad (Fo)", "Modelo (Fe)")) +
  labs(title = "Gráfica N4: Comparación Realidad vs Modelo Geométrico",
       x = "Tipo de Tubería", y = "Frecuencia Relativa") +
  theme_minimal() + theme(legend.position = "top")

"Seleccionamos el modelo geométrico debido a la jerarquía de los accidentes. Al concentrarse el 53.11% en el primer nivel y disminuir drásticamente en los siguientes, el modelo se acopla a nuestros resultados"
## [1] "Seleccionamos el modelo geométrico debido a la jerarquía de los accidentes. Al concentrarse el 53.11% en el primer nivel y disminuir drásticamente en los siguientes, el modelo se acopla a nuestros resultados"
# ==============================================================================
# 5. TEST DE PEARSON
# ==============================================================================
plot(Fo1, Fe1, 
     main = "Gráfica N5: Evaluación Visual de la Bondad de Ajuste",
     xlab = "Frecuencia Observada (Fo1)", ylab = "Frecuencia Esperada (Fe1)",
     pch = 19, col = "#4292C6", cex = 1.5, xlim = c(0, 1), ylim = c(0, 1))
abline(a = 0, b = 1, col = "red", lwd = 2) 
text(Fo1, Fe1, labels = tdf_all$Tipo_Tuberia, pos = 4, cex = 0.8)

Correlacion1 <- cor(Fo1, Fe1) * 100 

cat("--- RESULTADOS TEST DE PEARSON ---\n")
## --- RESULTADOS TEST DE PEARSON ---
cat("Coeficiente de Correlación:", round(Correlacion1, 2), "%\n\n")
## Coeficiente de Correlación: 94.18 %
# ==============================================================================
# 6. TEST DE CHI CUADRADO
# ==============================================================================
x2 <- sum(((Fo1 - Fe1)^2) / Fe1)
vc <- qchisq(0.95, 3) 

cat("--- RESULTADOS TEST DE CHI CUADRADO ---\n")
## --- RESULTADOS TEST DE CHI CUADRADO ---
cat("Estadístico Calculado (x2):", round(x2, 4), "\n")
## Estadístico Calculado (x2): 0.1057
cat("Valor Crítico (vc):", round(vc, 4), "\n")
## Valor Crítico (vc): 7.8147
cat("Resultado de la Conjetura:", ifelse(x2 < vc, "ACEPTADA", "RECHAZADA"), "\n\n")
## Resultado de la Conjetura: ACEPTADA
# ==============================================================================
# 7. TABLA RESUMEN
# ==============================================================================
tabla_resumen <- data.frame(
  Prueba = c("Pearson", "Chi-Cuadrado"),
  Resultado = c(paste0(round(Correlacion1, 2), "%"), round(x2, 4)),
  Estado = c("Excelente", ifelse(x2 < vc, "ACEPTADO", "RECHAZADO"))
)

kable(tabla_resumen, format = "markdown", align = 'c')
Prueba Resultado Estado
Pearson 94.18% Excelente
Chi-Cuadrado 0.1057 ACEPTADO
# ==============================================================================
# 8. PREGUNTA DE PROBABILIDAD
# ==============================================================================
prob_subterranea <- dgeom(2 - 1, prob = p_geo)

cat("\n--- PREGUNTA DE INVESTIGACIÓN ---\n")
## 
## --- PREGUNTA DE INVESTIGACIÓN ---
cat("¿Cuál es la probabilidad de que ocurra un accidente en la tubería subterránea?\n")
## ¿Cuál es la probabilidad de que ocurra un accidente en la tubería subterránea?
cat("Respuesta:", round(prob_subterranea * 100, 2), "%\n")
## Respuesta: 23.33 %
# ==============================================================================
# 9. CONCLUSIONES
# ==============================================================================
"El modelo nos confirma que el peligro real se concentra en un solo lugar y cae rápido después de ahí. Esto nos permite ser más inteligentes con los recursos: en lugar de gastar tiempo y dinero revisando todo por igual, podemos enfocarnos donde realmente importa, evitando accidentes donde el riesgo es mayor y ahorrando esfuerzos donde la probabilidad es mínima."
## [1] "El modelo nos confirma que el peligro real se concentra en un solo lugar y cae rápido después de ahí. Esto nos permite ser más inteligentes con los recursos: en lugar de gastar tiempo y dinero revisando todo por igual, podemos enfocarnos donde realmente importa, evitando accidentes donde el riesgo es mayor y ahorrando esfuerzos donde la probabilidad es mínima."