1 Cargar Datos

datos <- read.csv("database-_1_.csv")
zona<-datos$Liquid.Subtype

2 Tabla de distribución de frecuencia

#Extraemos la columna Cantidad del resumen de la variable subtipo de liquidos, la guardamos en ni, calculamos su suma total, luego obtenemos el porcentaje (hi) que representa cada valor de ni respecto al total. Después creamos un nuevo resumen de datos llamado TDFCausa que incluye las categorías de causas originales más ni y hi.
datos_liquidos <- datos %>%
  mutate(Subtipo_Clean = case_when(
    is.na(Liquid.Subtype) | Liquid.Subtype == "" ~ "CRUDO / CO2",
    grepl("DIESEL", Liquid.Subtype) ~ "DIESEL / JET FUEL / KEROSENE",
    grepl("GASOLINE", Liquid.Subtype) ~ "GASOLINA",
    grepl("LPG", Liquid.Subtype) ~ "GASES LICUADOS",
    grepl("OTHER HVL", Liquid.Subtype) ~ "LÍQUIDO AlTAMENTE VOLÁTIL",
    TRUE ~ "AMONÍACO, BIODIESEL" 
  )) %>%
  mutate(Nivel_Riesgo = case_when(
    Subtipo_Clean == "CRUDO / CO2" ~ 1,
    Subtipo_Clean %in% c("GASOLINA", "DIESEL / JET FUEL / KEROSENE", "AMONÍACO, BIODIESEL") ~ 2,
    Subtipo_Clean %in% c("GASES LICUADOS", "LÍQUIDO AlTAMENTE VOLÁTIL") ~ 3,
    
    TRUE ~ 0
  ))
TDF_agrupada <- datos_liquidos %>%
  count(Nivel_Riesgo, Subtipo_Clean, name = "ni") %>%
  arrange(Nivel_Riesgo, desc(ni)) 
ni_total <- sum(TDF_agrupada$ni)
TDF_agrupada$hi <- (TDF_agrupada$ni / ni_total) * 100
TDF_agrupada$hi <- sprintf("%.2f", round(TDF_agrupada$hi, 2))
Sumatoria <- data.frame(
  Nivel_Riesgo = "",
  Subtipo_Clean = "TOTAL",
  ni = ni_total,
  hi = "100.00"
)

TDF_final <- rbind(TDF_agrupada, Sumatoria)
colnames(TDF_final) <- c("Nivel Riesgo", "Tipo de Subtipo de Líquido", "ni", "hi (%)")
kable(TDF_final, align = 'c', 
      caption = "Tabla 1: Frecuencia de Líquidos por Riesgo") %>%
  kable_styling(full_width = FALSE, position = "center", 
                bootstrap_options = c("striped", "hover", "condensed")) %>%
  row_spec(nrow(TDF_final), bold = TRUE, background = "#f2f2f2") %>%
  row_spec(which(TDF_final$`Nivel Riesgo` == "3"), bold = TRUE)
Tabla 1: Frecuencia de Líquidos por Riesgo
Nivel Riesgo Tipo de Subtipo de Líquido ni hi (%)
1 CRUDO / CO2 1446 51.74
2 DIESEL / JET FUEL / KEROSENE 410 14.67
2 GASOLINA 376 13.45
2 AMONÍACO, BIODIESEL 204 7.30
3 GASES LICUADOS 188 6.73
3 LÍQUIDO AlTAMENTE VOLÁTIL 171 6.12
TOTAL 2795 100.00
datos %>%
  mutate(Subtipo = case_when(
    is.na(Liquid.Subtype) | Liquid.Subtype == "" ~ "CRUDO / CO2 ",
    grepl("DIESEL", Liquid.Subtype) ~ "DIESEL / JET FUEL / KEROSENE",
    grepl("GASOLINE", Liquid.Subtype) ~ "GASOLINA",
    grepl("LPG", Liquid.Subtype) ~ "AMONÍACO, BIODIESEL",
    grepl("OTHER HVL", Liquid.Subtype) ~ "LÍQUIDO ALTAMENTE VOLÁTIL",
    TRUE ~ "GASES LICUADOS"),
  Riesgo = case_when(
    Subtipo == "CRUDO / CO2 " ~ "1. Bajo",
    Subtipo %in% c("GASES LICUADOS", "LÍQUIDO ALTAMENTE VOLÁTIL") ~ "3. Alto",
    TRUE ~ "2. Medio")) %>% # Simplificamos: todo lo demás cae en Medio
  count(Riesgo, Subtipo) %>%
  ggplot(aes(x = reorder(Subtipo, -n), y = n, fill = Riesgo)) + 
  geom_col(width = 0.75, color = "black") +
  scale_fill_manual(values = c("#AED6F1", "#3498DB", "#154360")) +
  labs(title = "Gráfica N1: Nivel de Riesgo", x = "Subtipo", y = "Cantidad") +
  theme_light() + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "top")

datos %>%
  mutate(Subtipo = case_when(
    is.na(Liquid.Subtype) | Liquid.Subtype == "" ~ "CRUDO / CO2 ",
    grepl("DIESEL", Liquid.Subtype) ~ "DIESEL / JET FUEL / KEROSENE",
    grepl("GASOLINE", Liquid.Subtype) ~ "GASOLINA",
    grepl("LPG", Liquid.Subtype) ~ "AMONÍACO, BIODIESEL",
    grepl("OTHER HVL", Liquid.Subtype) ~ "LÍQUIDO ALTAMENTE VOLÁTIL",
    TRUE ~ "GASES LICUADOS"),
  Riesgo = case_when(
    Subtipo == "CRUDO / CO2 " ~ "1. Bajo",
    Subtipo %in% c("GASES LICUADOS", "LÍQUIDO ALTAMENTE VOLÁTIL") ~ "3. Alto",
    TRUE ~ "2. Medio")) %>% 
  filter(Subtipo %in% c("CRUDO / CO2 ", "DIESEL / JET FUEL / KEROSENE", "GASOLINA")) %>%
  count(Riesgo, Subtipo) %>%
  ggplot(aes(x = reorder(Subtipo, -n), y = n, fill = Riesgo)) + 
  geom_col(width = 0.75, color = "black") +
  scale_fill_manual(values = c(
    "1. Bajo" = "#AED6F1", 
    "2. Medio" = "#3498DB", 
    "3. Alto" = "#154360"
  )) +
  
  labs(title = "Gráfica N1: Principales Líquidos", x = "Subtipo", y = "Cantidad") +
  theme_light() + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1), legend.position = "top")

Liquid1_3 <- TDF_agrupada[1:3, ]
tdfliquid1_3 <- data.frame(Liquid1_3)
hi1 <- tdfliquid1_3$ni / sum(tdfliquid1_3$ni)
hi1
## [1] 0.6478495 0.1836918 0.1684588
datos %>%
  mutate(Subtipo = case_when(
    is.na(Liquid.Subtype) | Liquid.Subtype == "" ~ "CRUDO / CO2 ",
    grepl("DIESEL", Liquid.Subtype) ~ "DIESEL / JET FUEL / KEROSENE",
    grepl("GASOLINE", Liquid.Subtype) ~ "GASOLINA",
    grepl("LPG", Liquid.Subtype) ~ "AMONÍACO, BIODIESEL",
    grepl("OTHER HVL", Liquid.Subtype) ~ "LÍQUIDO ALTAMENTE VOLÁTIL",
    TRUE ~ "GASES LICUADOS"),
  Riesgo = case_when(
    Subtipo == "CRUDO / CO2 " ~ "1. Bajo",
    Subtipo %in% c("GASES LICUADOS", "LÍQUIDO ALTAMENTE VOLÁTIL") ~ "3. Alto",
    TRUE ~ "2. Medio")) %>% 
  filter(Subtipo %in% c("CRUDO / CO2 ", "DIESEL / JET FUEL / KEROSENE", "GASOLINA")) %>%
  count(Riesgo, Subtipo) %>% mutate(hi = n / sum(n)) %>%
  ggplot(aes(reorder(Subtipo, -hi), hi, fill = Riesgo)) + 
  geom_col(width = 0.75, col = "black") +
  scale_fill_manual(values = c("1. Bajo"="#AED6F1", "2. Medio"="#3498DB", "3. Alto"="#154360")) +
  labs(title="Gráfica N°5: Probabilidad (Top 3)", x="Subtipo", y="Probabilidad (hi)") +
  theme_light() + theme(axis.text.x = element_text(angle=45, hjust=1), legend.position="top")

Liquid1_3 <- TDF_agrupada[1:3, ]
tdfliquid1_3 <- data.frame(Liquid1_3)
tdfliquid1_3$x <- 1:3 

# 2. Calcular parámetros (Media y p)
media_subset3 <- sum(tdfliquid1_3$x * tdfliquid1_3$ni) / sum(tdfliquid1_3$ni)
p_geo <- 1 / media_subset3

# 3. Calcular Distribución Geométrica
P_Geometrica <- dgeom(tdfliquid1_3$x - 1, prob = p_geo)
data.frame(
  Liquido = tdfliquid1_3$Subtipo_Clean,
  Prob_Geom = P_Geometrica
)
##                        Liquido  Prob_Geom
## 1                  CRUDO / CO2 0.65763111
## 2 DIESEL / JET FUEL / KEROSENE 0.22515243
## 3                     GASOLINA 0.07708519
Liquid1_3 <- TDF_agrupada[1:3, ]
df_geo <- data.frame(Liquid1_3)
df_geo$x <- 1:3 
df_geo$Real <- df_geo$ni / sum(df_geo$ni)
media_subset3 <- sum(df_geo$x * df_geo$ni) / sum(df_geo$ni)
p_geo <- 1 / media_subset3
df_geo$Geometrica <- dgeom(df_geo$x - 1, prob = p_geo)
df_grafica <- df_geo %>%
  select(Subtipo_Clean, x, Real, Geometrica) %>%
  pivot_longer(cols = c("Real", "Geometrica"), names_to = "Tipo", values_to = "Probabilidad")

# --- 4. GENERAR GRÁFICA ---
ggplot(df_grafica, aes(x = reorder(Subtipo_Clean, x), y = Probabilidad, fill = Tipo)) +
  geom_col(position = "dodge", width = 0.7, color = "black") +
  scale_fill_manual(
    values = c("Real" = "#87CEEB", "Geometrica" = "#2E86C1"),
    labels = c("Real" = "Probabilidad Observada", "Geometrica" = "Modelo Geométrico")
  ) +
  labs(
    title = "Gráfica N°7: Comparación Real vs. Modelo Geométrico",
    x = "Subtipo de Líquido",
    y = "Probabilidad"
  ) +
  theme_light() +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.text.x = element_text(angle = 45, hjust = 1, color = "black"),
    legend.position = "top",
    legend.title = element_blank()
  )

Liquid1_3 <- TDF_agrupada[1:3, ]
tdfliquid1_3 <- data.frame(Liquid1_3)
tdfliquid1_3$x <- 1:3 
hi1 <- tdfliquid1_3$ni / sum(tdfliquid1_3$ni)

Fo1 <- hi1
Fo1  
## [1] 0.6478495 0.1836918 0.1684588
media_subset3 <- sum(tdfliquid1_3$x * tdfliquid1_3$ni) / sum(tdfliquid1_3$ni)
p_geo <- 1 / media_subset3

P1 <- dgeom(tdfliquid1_3$x - 1, prob = p_geo)

Fe1 <- P1
Fe1  
## [1] 0.65763111 0.22515243 0.07708519
# 1. RECUPERAR DATOS (De lo que calculamos antes)
# -----------------------------------------------
# Fo1 = Frecuencia Observada (Tus datos reales)
Fo1 <- tdfliquid1_3$ni / sum(tdfliquid1_3$ni)

# Fe1 = Frecuencia Esperada (Modelo Geométrico)
media_subset3 <- sum(tdfliquid1_3$x * tdfliquid1_3$ni) / sum(tdfliquid1_3$ni)
p_geo <- 1 / media_subset3
Fe1 <- dgeom(tdfliquid1_3$x - 1, prob = p_geo)

# 2. GENERAR LA GRÁFICA (Estilo Base R igual a tu ejemplo)
# --------------------------------------------------------
# plot() crea los puntos
plot(Fo1, Fe1,
     main = "Gráfica N°8: Comparación Observada vs. Esperada",
     xlab = "Frecuencia Observada (Fo1)",
     ylab = "Frecuencia Esperada (Fe1)",
     pch = 1,        # pch=1 son círculos vacíos (como en tu imagen)
     cex = 1.5,      # Tamaño de los puntos
     xlim = c(0, 1), # Límites de ejes (0 a 1 porque son probab.)
     ylim = c(0, 1))

# abline() dibuja la línea roja diagonal
# a=0, b=1 dibuja una línea de 45 grados (y = x)
abline(a = 0, b = 1, col = "red", lwd = 2) 

# (Opcional) Texto para identificar los puntos
text(Fo1, Fe1, labels = tdfliquid1_3$Subtipo_Clean, pos = 4, cex = 0.7)

Correlacion1 <- cor(Fo1, Fe1) * 100 
Correlacion1
## [1] 97.5898
x2 <- sum(((Fo1 - Fe1)^2) / Fe1)
x2
## [1] 0.1160907
vc <- qchisq(0.95, 2) 
vc
## [1] 5.991465
x2 < vc
## [1] TRUE
# 1. Definir el nombre de la variable que analizamos
Variable <- c("Subtipo de Líquido")

# 2. Crear el cuadro de datos con los resultados previos
# Usamos round(..., 2) para dejarlo bonito con 2 decimales
tabla_resumen <- data.frame(
  Variable, 
  round(Correlacion1, 2), 
  round(x2, 2), 
  round(vc, 2)
)

# 3. Asignar los nombres de las columnas (Igual que en tu imagen)
colnames(tabla_resumen) <- c("Variable", "Test Pearson (%)", "Chi Cuadrado", "Umbral de aceptación")

kable(tabla_resumen, 
      format = "markdown", 
      caption = "Tabla Resumen: Test de Bondad de Ajuste (Modelo Geométrico)")
Tabla Resumen: Test de Bondad de Ajuste (Modelo Geométrico)
Variable Test Pearson (%) Chi Cuadrado Umbral de aceptación
Subtipo de Líquido 97.59 0.12 5.99
n1 <- sum(tdfliquid1_3$ni)
n1  
## [1] 2232
#PREGUNTA: ¿Cuál es la probabilidad de que ocurra un accidente de RIESGO BAJO?
dgeom(1 - 1, prob = p_geo)
## [1] 0.6576311