La variable subtipo de líquido se define como una variable cualitativa ordinal ya que, aunque clasifica categorías no numéricas, estas se organizan mediante un orden jerárquico basado en su frecuencia de ocurrencia y nivel de criticidad. Esta estructura permite asignar identificadores numéricos (Xi) que reflejan una secuencia lógica, facilitando la medición de la probabilidad acumulada.
Importamos el archivo “database.xls” desde una ruta local y lo almacenamos en el objeto datos, usando el paquete readxl para la lectura y janitor para normalizar los nombres de las columnas.
library(readxl)
library(janitor)
library(tidyverse)
library(knitr)
# 1. Definición de archivo
archivo <- "database.xls"
# 3. Carga con corrección de codificación para evitar errores de tildes
datos <- read_excel(archivo) %>%
mutate(across(where(is.character), ~iconv(., from = "latin1", to = "UTF-8"))) %>%
clean_names()En esta sección se realiza la extracción de la variable Subtipo de Líquido, eliminando valores faltantes (NA) y registros vacíos para asegurar la limpieza de los datos antes del análisis estadístico.
En este apartado se cuantifican los incidentes por categoría y se asigna un identificador numérico (\(X_i\)) a cada subtipo. Se transforman las categorías originales al idioma español para facilitar su interpretación.
# 1. Definir el factor con etiquetas en español
sub_liquido_factor <- factor(sub_liquido_limpio,
levels = c(
"DIESEL, FUEL OIL, KEROSENE, JET FUEL",
"GASOLINE (NON-ETHANOL)",
"LPG (LIQUEFIED PETROLEUM GAS) / NGL (NATURAL GAS LIQUID)",
"OTHER HVL",
"MIXTURE OF REFINED PRODUCTS (TRANSMIX OR OTHER MIXTURE)",
"ANHYDROUS AMMONIA",
"OTHER",
"BIODIESEL"
),
labels = c(
"DIESEL / QUEROSENO", "GASOLINA", "GLP / LGN", "OTROS HVL",
"MEZCLA REFINADOS", "AMONIACO ANHIDRO", "OTROS", "BIODIÉSEL"
))
# 2. Generar frecuencias
ni_sub <- table(sub_liquido_factor)
hi_sub <- prop.table(ni_sub) * 100
# 3. Crear data.frame base
tabla_sub_liquido <- data.frame(
ID = as.character(1:length(ni_sub)),
Sub_Liquido = names(ni_sub),
ni = as.vector(ni_sub),
hi = round(as.vector(hi_sub), 2)
)
# 4. Calcular totales y añadir fila al final
total_ni <- sum(tabla_sub_liquido$ni)
total_hi <- sum(tabla_sub_liquido$hi)
tabla_con_total <- tabla_sub_liquido %>%
bind_rows(data.frame(ID = "-", Sub_Liquido = "TOTAL", ni = total_ni, hi = total_hi))
# 5. Renderizar tabla con kable
kable(tabla_con_total,
col.names = c("Valor (Xi)", "Subtipo de Líquido", "ni", "hi %"),
caption = "Tabla 1: Distribución por Subtipo de Líquido con Totales")| Valor (Xi) | Subtipo de Líquido | ni | hi % |
|---|---|---|---|
| 1 | DIESEL / QUEROSENO | 408 | 30.24 |
| 2 | GASOLINA | 376 | 27.87 |
| 3 | GLP / LGN | 188 | 13.94 |
| 4 | OTROS HVL | 171 | 12.68 |
| 5 | MEZCLA REFINADOS | 98 | 7.26 |
| 6 | AMONIACO ANHIDRO | 55 | 4.08 |
| 7 | OTROS | 51 | 3.78 |
| 8 | BIODIÉSEL | 2 | 0.15 |
| - | TOTAL | 1349 | 100.00 |
Justificación de la muestra:
Se observa que la suma de las frecuencias (1349) no alcanza el total de registros del dataset original (2795). Esto se justifica por la presencia de 1446 registros con valores faltantes (NA) o celdas vacías, los cuales fueron excluidos para no sesgar los cálculos de probabilidad del modelo.
Se presenta el comportamiento visual de la variable mediante una gráfica de barras que muestra la distribución general de los incidentes por subtipo.
ggplot(tabla_sub_liquido, aes(x = factor(ID), y = ni)) +
geom_bar(stat = "identity", fill = "skyblue", color = "black") +
labs(title = "Gráfica N° 1: Distribución general de Subtipo de Líquido",
x = "Subtipo de Líquido (Xi)", y = "Cantidad") +
theme_minimal()Se seleccionó el modelo geométrico debido a que la distribución de frecuencias presenta un decaimiento constante y sucesivo, donde cada barra es proporcionalmente menor a la anterior.
# IMPORTANTE: Forzamos que ID sea numérico para el cálculo matemático
ids_numericos <- as.numeric(tabla_sub_liquido$ID)
nis_numericos <- tabla_sub_liquido$ni
# Cálculo de la media observada y el parámetro p
media_obs <- sum(ids_numericos * nis_numericos) / sum(nis_numericos)
p_estimado <- 1 / media_obs
# Añadimos la columna del modelo a la tabla original (la que no tiene la fila TOTAL aún)
tabla_sub_liquido$hi_modelo <- (p_estimado * (1 - p_estimado)^(ids_numericos - 1)) * 100
# Gráfica comparativa Realidad vs Modelo
df_grafica <- pivot_longer(tabla_sub_liquido, cols = c("hi", "hi_modelo"),
names_to = "Origen", values_to = "Valor")
ggplot(df_grafica, aes(x = factor(ID), y = Valor, fill = Origen)) +
geom_bar(stat = "identity", position = "dodge", color = "black") +
scale_fill_manual(values = c("hi_modelo" = "skyblue", "hi" = "dodgerblue4"),
labels = c("Modelo", "Realidad")) +
labs(title = "Gráfica N° 2: Modelo de probabilidad geométrico de subtipo de líquido",
subtitle = paste("Parámetro p (Éxito) estimado =", round(p_estimado, 4)),
x = "Subtipo de Líquido (Xi)", y = "Probabilidad %") +
theme_minimal()Se calcula el coeficiente de correlación de Pearson para determinar el grado de afinidad lineal entre las frecuencias observadas (Realidad) y las esperadas por el modelo geométrico.
Fo_sub <- tabla_sub_liquido$hi
Fe_sub <- tabla_sub_liquido$hi_modelo
Correlacion_Sub <- cor(Fo_sub, Fe_sub) * 100
cat("La correlación de Pearson (afinidad) entre la Realidad y el Modelo es:",
round(Correlacion_Sub, 2), "%")## La correlación de Pearson (afinidad) entre la Realidad y el Modelo es: 96.1 %
Validación estadística mediante el estadístico Chi-Cuadrado para verificar si las diferencias entre la realidad y el modelo son significativas bajo un umbral crítico.
k <- length(tabla_sub_liquido$ni)
grados_libertad <- k - 2
nivel_significancia <- 0.3
x2 <- sum((Fe_sub - Fo_sub)^2 / Fe_sub)
umbral_aceptacion <- qchisq(1 - nivel_significancia, grados_libertad)
modelo_aceptado <- x2 < umbral_aceptacion
cat("Estadístico Chi-Cuadrado calculado:", round(x2, 4), "\n")## Estadístico Chi-Cuadrado calculado: 6.2707
## Umbral de Aceptación (Valor Crítico): 7.2311
## ¿El modelo es aceptado bajo este umbral?: TRUE
Demostración de la utilidad práctica del análisis mediante la resolución de interrogantes sobre la probabilidad teórica y proyecciones de datos reales. ¿Cuál es la probabilidad teórica de que, ante un nuevo incidente, el líquido involucrado sea Diesel / Queroseno?
prob_teorica_id1 <- p_estimado
cat("Respuesta: La probabilidad teórica es del", round(prob_teorica_id1 * 100, 2), "%")## Respuesta: La probabilidad teórica es del 37.46 %
Si se reportan 500 nuevos incidentes y se mantiene la distribución observada, ¿cuántos involucrarían Gasolina?
hi_gasolina <- tabla_sub_liquido$hi[tabla_sub_liquido$ID == 2]
cantidad_esperada <- (hi_gasolina / 100) * 500
cat("Respuesta: Se esperarían aproximadamente", round(cantidad_esperada, 0), "incidentes.")## Respuesta: Se esperarían aproximadamente 139 incidentes.
La variable subtipo de líquido presenta un comportamiento geométrico. Mediante un parámetro estimado p = 0.37, lo cual fue validado estadísticamente. Esta estructura permite predecir POR EJEMPLO ¿Cuál es la probabilidad de que, ante un nuevo incidente, el líquido involucrado sea e (Diesel / Queroseno)? , facilitando la toma de decisiones preventivas basadas en la probabilidad acumulada de cada subtipo.