1 Carga de Dataset

El primer paso crítico en cualquier análisis de datos es la importación correcta de la fuente de información. En esta sección, se utiliza la función read.csv() para cargar el archivo de datos externo al entorno de trabajo de R. Este proceso transforma los datos crudos en un “data frame”, permitiendo que el software reconozca las columnas y filas para su posterior manipulación.

database <- read.csv("database-_1_.csv", header = TRUE, sep = ",", dec = ".", check.names = FALSE)

raw_evacuaciones <- database$`Public Evacuations`
raw_evacuaciones <- raw_evacuaciones[raw_evacuaciones != ""]
raw_evacuaciones <- na.omit(raw_evacuaciones)

evacuaciones_obj <- floor(as.numeric(as.character(raw_evacuaciones)))
evacuaciones_num <- as.numeric(evacuaciones_obj)
evacuaciones_num <- na.omit(evacuaciones_num)
evacuaciones_obj <- evacuaciones_obj[!is.na(evacuaciones_num)]

# Filtrar índices lógicos (las evacuaciones deben ser mayores a 0 para excluir los ceros)
valid_indices <- evacuaciones_num > 0
evacuaciones_num <- evacuaciones_num[valid_indices]
evacuaciones_obj <- evacuaciones_obj[valid_indices]

2 Tabla de frecuencia con regla de sturges

Una vez cargados los datos, el siguiente paso es la organización mediante tablas de frecuencia. Esta técnica estadística agrupa la información de una variable específica para contar cuántas veces ocurre cada evento (en este caso, la cantidad de personas evacuadas en cada incidente).

library(rmarkdown)
library(ggplot2)
## 
## Adjuntando el paquete: 'ggplot2'
## The following object is masked from 'package:e1071':
## 
##     element
# Cargar y limpiar datos
datos <- read.csv("database-_1_.csv", stringsAsFactors = FALSE)
evacuaciones_limpias <- floor(as.numeric(datos$Public.Evacuations))
evacuaciones_limpias <- evacuaciones_limpias[!is.na(evacuaciones_limpias) & evacuaciones_limpias >= 0]

# --- 10 INTERVALOS FIJOS ---
intervalos <- cut(evacuaciones_limpias, breaks = 10, include.lowest = TRUE, right = FALSE)
tabla_base <- table(intervalos)

ni_completo <- as.vector(tabla_base)
Magnitud_completa <- names(tabla_base)

# --- ELIMINAR LOS 0 (CORREGIDO) ---
# Debe ser estrictamente > 0 para que los intervalos vacíos desaparezcan
indices_validos <- ni_completo > 0

ni <- ni_completo[indices_validos]
Magnitud <- Magnitud_completa[indices_validos]

# --- CORRECCIÓN VISUAL DEL "-0.7" ---
# Reemplaza cualquier inicio negativo generado por R (ej. [-0.7) por un "[0" limpio
Magnitud <- sub("\\[-[0-9\\.]+", "\\[0", Magnitud)

# Calcular porcentajes (hi) con los datos filtrados
hi <- round(ni / sum(ni) * 100, 2)

# Ajuste por diferencia de redondeo para que sume 100%
diferencia <- 100 - sum(hi)
if(diferencia != 0 && sum(ni) > 0){
  indice_max <- which.max(ni)
  hi[indice_max] <- hi[indice_max] + diferencia
}

# Frecuencias acumuladas
Ni_asc <- cumsum(ni)
Ni_dsc <- rev(cumsum(rev(ni)))
Hi_asc <- cumsum(hi)            
Hi_dsc <- rev(cumsum(rev(hi)))

# Ensamblar el DataFrame Final
TDFMagnitudFin <- data.frame(
  "Intervalos (Evacuados)" = Magnitud, 
  "ni" = ni, 
  "hi (%)" = hi, 
  "Ni Asc" = Ni_asc, 
  "Ni Dsc" = Ni_dsc, 
  "Hi Asc" = Hi_asc, 
  "Hi Dsc" = Hi_dsc,
  check.names = FALSE
)

# Mostrar la tabla
paged_table(TDFMagnitudFin, options = list(rows.print = 10))

AVISO IMPORANTE!

Antes de analizar los porcentajes, quiero hacer una aclaración importante sobre el total de nuestra muestra. Si revisan la base original de la PHMSA, verán que hay 2,975 incidentes registrados en total. Sin embargo, para este análisis estamos trabajando con una muestra exacta de 2,338 casos. ¿Qué pasó con los 637 registros restantes? Fueron excluidos mediante un filtro de limpieza estadística. Estos 637 incidentes venían con la casilla de evacuaciones en blanco y, estadísticamente, no podemos asumir que ‘no tener el dato’ significa ‘cero evacuados’. Por transparencia y rigor matemático, depuramos la base para trabajar únicamente con los incidentes que cuentan con información validada y certera

3 Tabla simplificada

La siguiente tabla presenta una distribución estadística simplificada de las evacuaciones públicas registradas durante los incidentes en oleoductos. Con el fin de facilitar la lectura y el análisis, los datos extraídos de los registros de la PHMSA se han estructurado en rangos de magnitud, omitiendo aquellos intervalos que no presentaron ningún evento (frecuencia nula). Esta síntesis permite identificar rápidamente en qué rangos se concentra la mayor cantidad de eventos mediante sus frecuencias absolutas y sus respectivos porcentajes

library(rmarkdown)
library(ggplot2)

# Cargar y limpiar datos
datos <- read.csv("database-_1_.csv", stringsAsFactors = FALSE)
evacuaciones_limpias <- floor(as.numeric(datos$Public.Evacuations))
evacuaciones_limpias <- evacuaciones_limpias[!is.na(evacuaciones_limpias) & evacuaciones_limpias >= 0]

# --- 10 INTERVALOS FIJOS ---
intervalos <- cut(evacuaciones_limpias, breaks = 10, include.lowest = TRUE, right = FALSE)

# --- TABLA DE FRECUENCIAS ---
tabla_base <- table(intervalos)

ni_completo <- as.vector(tabla_base)
Magnitud_completa <- names(tabla_base)

# --- ELIMINAR LOS 0 ---
indices_validos <- ni_completo > 0
ni <- ni_completo[indices_validos]
Magnitud <- Magnitud_completa[indices_validos]

# --- CORRECCIÓN VISUAL DEL "-0.7" ---
# Reemplaza cualquier inicio negativo generado por R (ej. [-0.7) por un "[0" limpio
Magnitud <- sub("\\[-[0-9\\.]+", "\\[0", Magnitud)

# Calcular porcentajes (hi) 
hi <- round(ni / sum(ni) * 100, 2)

# Ajuste por diferencia de redondeo
diferencia <- 100 - sum(hi)
if(diferencia != 0 && sum(ni) > 0){
  indice_max <- which.max(ni)
  hi[indice_max] <- hi[indice_max] + diferencia
}

# --- ENSAMBLAR LA TABLA SIMPLIFICADA ---
TDF_Simplificada <- data.frame(
  "Rango de Evacuados" = Magnitud, 
  "Frecuencia (ni)" = ni, 
  "Porcentaje (%)" = hi, 
  check.names = FALSE
)

# Mostrar la tabla simplificada
paged_table(TDF_Simplificada, options = list(rows.print = 10))

4 Distribución de la Magnitud de Evacuaciones

En esta sección se analiza la magnitud definitiva de los incidentes mediante el conteo de personas evacuadas. La Regla de Sturges permite determinar el número óptimo de intervalos (\(k\)). Aquí evaluamos la concentración masiva de la siniestralidad dentro del primer intervalo de clase (el valor cero), donde la inmensa mayoría de los eventos no supusieron un riesgo habitacional.

p_barras <- ggplot(TDFMagnitudFin, aes(x = `Intervalos (Evacuados)`, y = ni)) +
  geom_col(fill = "steelblue", color = "white", alpha = 0.8) +
  scale_y_continuous(limits = c(0, 2795)) +
  
  labs(
    title = "Gráfica No 1: Distribución global de Evacuaciones por Intervalos", 
    x = "Rangos de Personas Evacuadas",
    y = "Cantidad de Incidentes"
  ) +
  
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

print(p_barras)

5 Incidencia de Evacuaciones en Eventos de Derrame

Dado que la distribución global está completamente dominada por el valor 0, filtramos el análisis hacia un subgrupo manejable. El intervalo local se limitó de 0 a 50 evacuados para observar con mayor detalle los incidentes de impacto civil bajo o moderado, desempaquetando la primera porción del conjunto de datos.

library(ggplot2)
library(dplyr)
library(scales)

datos <- read.csv("database-_1_.csv")
variable_interes <- datos$Public.Evacuations

limit_zoom <- 4

datos_zoom <- datos %>%
  filter(!is.na(Public.Evacuations)) %>%
  filter(Public.Evacuations <= limit_zoom)

p_zoom_5barras <- ggplot(datos_zoom, aes(x = Public.Evacuations)) +
  geom_bar(fill = "steelblue", color = "white", alpha = 0.8) +
  
  # Forzamos las marcas del eje X para que vayan del 0 al 3, de uno en uno
  scale_x_continuous(breaks = seq(0, 4, by = 1), labels = scales::comma_format()) +
  
  coord_cartesian(ylim = c(0, 10)) +
  
  labs(
    title = "Gráfica No 2: Distribución local de Evacuaciones", 
    x = "Número de Personas Evacuadas",
    y = "Cantidad"
  ) +
  
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text.x = element_text(hjust = 0.5)
  )

print(p_zoom_5barras)

6 Cantidad Relativa de Evacuaciones Públicas

Los histogramas ofrecen una representación visual de la densidad de los datos. Mientras que el histograma global muestra la magnitud total de la siniestralidad, los enfoques locales con amplamiento de datos que nos permiten ‘desempaquetar’ los rangos de baja escala, revelando la frecuencia exacta de pequeños desplazamientos que suelen quedar ocultos en la visualización general

library(ggplot2)
library(dplyr)
library(scales)

datos <- read.csv("database-_1_.csv")
limit_zoom <- 4

datos_zoom <- datos %>%
  filter(!is.na(Public.Evacuations)) %>%
  filter(Public.Evacuations <= limit_zoom)

p_zoom_5barras_pct <- ggplot(datos_zoom, aes(x = Public.Evacuations)) +
  geom_bar(
    aes(y = after_stat(count / sum(count))), 
    binwidth = 1, 
    fill = "steelblue", 
    color = "white", 
    alpha = 0.8
  ) +
  # Eje X del 0 al 7 de uno en uno
  scale_x_continuous(breaks = seq(0, 4, by = 1), labels = scales::comma_format()) +
  coord_cartesian(ylim = c(0, 0.05)) + 
  scale_y_continuous(labels = scales::percent_format(accuracy = 0.1)) +
  
  labs(
    title = "Gráfica No 3: Distribución porcentual global de Evacuaciones",
    x = "Personas Evacuadas",
    y = "Porcentaje (%)"
  ) +
  
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text.x = element_text(hjust = 0.5)
  )
## Warning in geom_bar(aes(y = after_stat(count/sum(count))), binwidth = 1, :
## Ignoring unknown parameters: `binwidth`
print(p_zoom_5barras_pct)

7 Porcentaje de Incidentes con Evacuación Pública

Esta sección se enfoca en el comportamiento rutinario de la industria, analizando los evacuados para observar la frecuencia de eventos de impactos.

library(ggplot2)
library(dplyr)
library(scales)

datos <- read.csv("database-_1_.csv")
limit_zoom <- 4

datos_zoom <- datos %>%
  filter(!is.na(Public.Evacuations)) %>%
  filter(Public.Evacuations <= limit_zoom)

p_zoom_5barras_pct <- ggplot(datos_zoom, aes(x = Public.Evacuations)) +
  geom_bar(
    aes(y = after_stat(count / sum(count))), 
    binwidth = 1, 
    fill = "steelblue", 
    color = "white", 
    alpha = 0.8
  ) +
  # Eje X del 0 al 4 de uno en uno
  scale_x_continuous(breaks = seq(0, 4, by = 1), labels = scales::comma_format()) +
  
  # ZOOM Y al 1.0% (0.01 = 1.0%)
  coord_cartesian(ylim = c(0, 0.01)) + 
  scale_y_continuous(labels = scales::percent_format(accuracy = 0.1)) +
  
  labs(
    title = "Gráfica No 3: Distribución porcentual local de Evacuaciones",
    x = "Personas Evacuadas",
    y = "Porcentaje (%)"
  ) +
  
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text.x = element_text(hjust = 0.5)
  )
## Warning in geom_bar(aes(y = after_stat(count/sum(count))), binwidth = 1, :
## Ignoring unknown parameters: `binwidth`
print(p_zoom_5barras_pct)

8 Ojivas convinadas

La ojiva es la herramienta clave para el análisis acumulativo. Al observar cómo se suman las frecuencias, podemos determinar con precisión en qué punto se alcanza el 50% o el 95% de la siniestralidad total. En esta variable, la curva ascendente es casi vertical al inicio, confirmando que la mayoría de los casos no escalan a niveles masivos de evacuación.

library(ggplot2)
library(dplyr)
library(scales)

datos <- read.csv("database-_1_.csv")
volumen <- na.omit(datos$Public.Evacuations)
datos_local <- volumen[volumen <= 7]

# Ajuste matemático para 7 escalones exactos
k_local <- 4
min_val <- 0
max_val <- 4
A_local <- 1 
Li_num <- seq(min_val, max_val - A_local, length.out = k_local)
Ls_num <- Li_num + A_local
ni_local <- numeric(k_local)

for(i in 1:k_local){
  if(i == k_local){
    ni_local[i] <- sum(datos_local >= Li_num[i] & datos_local <= max_val)
  } else {
    ni_local[i] <- sum(datos_local >= Li_num[i] & datos_local < Ls_num[i])
  }
}

Niasc <- cumsum(ni_local)
Nidsc <- rev(cumsum(rev(ni_local)))

datos_asc <- data.frame(x = c(min_val, Ls_num), y = c(0, Niasc), Tipo = "Ascendente")
datos_dsc <- data.frame(x = c(Li_num, max_val), y = c(Nidsc, 0), Tipo = "Descendente")
datos_ojivas_plot <- rbind(datos_asc, datos_dsc)

p_ojiva_cruzada_solida <- ggplot(datos_ojivas_plot, aes(x = x, y = y, color = Tipo, linetype = Tipo)) +
  geom_line(linewidth = 0.8) +
  geom_point(size = 2) +
  
  # Eje X del 0 al 7
  scale_x_continuous(breaks = seq(0, 4, by = 1), labels = scales::comma_format()) +
  
  scale_color_manual(values = c("Ascendente" = "black", "Descendente" = "blue")) +
  scale_linetype_manual(values = c("Ascendente" = "solid", "Descendente" = "solid")) +
  
  labs(
    title = "Gráfica 5: Distribución Acumulada Comparativa",
    x = "Personas Evacuadas",
    y = "Cantidad Acumulada",
    color = NULL,
    linetype = NULL
  ) +
  
  theme_bw() + 
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    legend.position = c(0.85, 0.5),
    legend.background = element_rect(color = "black", fill = "white"),
    axis.text = element_text(color = "black")
  )

print(p_ojiva_cruzada_solida)

9 Diagrama de caja

El diagrama de cajas se utiliza para resumir la distribución a través de cuartiles y detectar visualmente los valores atípicos. En el caso de las evacuaciones, este gráfico es fundamental para demostrar cómo la mediana se ancla en el cero, desplazando cualquier incidente con evacuados a la categoría de anomalía o ‘outlier’.

library(ggplot2)
library(dplyr)


datos <- read.csv("database-_1_.csv")
evacuaciones <- na.omit(datos$Public.Evacuations)
evacuaciones_filtradas <- evacuaciones[evacuaciones >= 0 & evacuaciones <= 4]
par(mar = c(5, 6, 4, 2)) 

# 3. Dibujar el diagrama de caja
boxplot(evacuaciones_filtradas,
        horizontal = TRUE,
        col = "lightblue",         
        xlab = "Personas Evacuadas",
        medcol = "red", medlwd = 3,
        pch = 19,                  
        outline = TRUE,            
        ylim = c(0, 4)            
)
mtext("Gráfica 6: Distribución de Evacuaciones",
      side = 3, line = 1.5, cex = 1.2, font = 2)
axis(1, at = 0:4, labels = 0:4)

AVISO IMPORTANTE!

Al observar la gráfica, el diagrama de caja adopta la forma de una única línea vertical anclada en el cero en lugar de su estructura tradicional. Esto no es un error visual, sino un reflejo fiel de la realidad de nuestra industria: cerca del 99.5% de los incidentes registrados no requirieron evacuaciones, provocando que el valor mínimo, los cuartiles y la mediana colapsen matemáticamente en el valor cero. Lejos de ser un problema estadístico, esta representación gráfica es una excelente prueba de resiliencia operativa que confirma la eficacia de los sistemas de contención y demuestra que, ante eventualidades rutinarias, el riesgo de desplazamiento para la población civil es prácticamente nulo.

10 Tabla estadístico

Al contrastar las métricas locales frente a las generales, podemos medir con exactitud cómo los valores extremos inflan la desviación estándar y el coeficiente de asimetría.

library(rmarkdown)
library(ggplot2)
library(e1071)
library(knitr)

# --- 1. CARGAR Y LIMPIAR DATOS ---
datos <- read.csv("database-_1_.csv", stringsAsFactors = FALSE)
evacuaciones_limpias <- floor(as.numeric(datos$Public.Evacuations))
evacuaciones_limpias <- evacuaciones_limpias[!is.na(evacuaciones_limpias) & evacuaciones_limpias >= 0]

# --- 2. GENERAR TABLA DE FRECUENCIAS (10 Intervalos) ---
intervalos <- cut(evacuaciones_limpias, breaks = 10, include.lowest = TRUE, right = FALSE)
tabla_base <- table(intervalos)

ni_completo <- as.vector(tabla_base)
Magnitud_completa <- names(tabla_base)

indices_validos <- ni_completo > 0
ni <- ni_completo[indices_validos]
Magnitud <- Magnitud_completa[indices_validos]

# --- CORRECCIÓN VISUAL DEL "-0.7" ---
# Reemplaza el inicio negativo generado por R por un "[0" limpio antes de extraer los límites
Magnitud <- sub("\\[-[0-9\\.]+", "\\[0", Magnitud)

hi <- round(ni / sum(ni) * 100, 2)
diferencia <- 100 - sum(hi)
if(diferencia != 0 && sum(ni) > 0){
  indice_max <- which.max(ni)
  hi[indice_max] <- hi[indice_max] + diferencia
}

# (Opcional) Guardamos el dataframe original que hiciste
TDFMagnitudFin <- data.frame(
  "Intervalos" = Magnitud, "ni" = ni, "hi (%)" = hi, check.names = FALSE
)

# --- 3. EXTRACCIÓN DE LÍMITES PARA ESTADÍSTICA AGRUPADA ---
# Limpiamos los corchetes y paréntesis del texto del intervalo
limites_limpios <- gsub("\\[|\\]|\\(|\\)", "", Magnitud)
# Separamos los números por la coma
limites_lista <- strsplit(limites_limpios, ",")

# Convertimos los textos extraídos en números reales (Li y Ls)
Li <- as.numeric(sapply(limites_lista, `[`, 1))
Ls <- as.numeric(sapply(limites_lista, `[`, 2))

# Calculamos las Marcas de Clase (MC) de la tabla
MC <- (Li + Ls) / 2
n_total <- sum(ni)

# --- 4. CÁLCULO DE INDICADORES AGRUPADOS ---
# Media Agrupada
media_agrupada <- sum(MC * ni) / n_total

# Desviación Estándar Agrupada (Varianza de datos agrupados)
varianza_agrupada <- sum(ni * (MC - media_agrupada)^2) / (n_total - 1)
desv_estandar_agrupada <- sqrt(varianza_agrupada)

# Coeficiente de Variación
cv <- if(media_agrupada > 0) (desv_estandar_agrupada / media_agrupada) * 100 else 0

# Intervalo de Confianza (95%)
error_estandar <- desv_estandar_agrupada / sqrt(n_total)
margen_error <- 1.96 * error_estandar
ic_inferior <- media_agrupada - margen_error
ic_superior <- media_agrupada + margen_error
texto_media_intervalo <- paste0("[", format(round(ic_inferior, 2), big.mark=","), " - ", format(round(ic_superior, 2), big.mark=","), "]")

# --- 5. INDICADORES DE POSICIÓN Y FORMA EXACTOS ---
# Mínimo exacto desde los datos crudos para evitar errores de intervalos
ri <- min(evacuaciones_limpias)
rs <- max(Ls)

# Nota metodológica: Para Mediana, Moda, Asimetría y Curtosis se utilizan 
# los datos directos, ya que las fórmulas agrupadas pierden precisión técnica 
# al tener intervalos de tamaño grande.
mediana_exacta <- median(evacuaciones_limpias)
t <- table(evacuaciones_limpias)
Mo <- as.numeric(names(t)[which.max(t)])
As <- skewness(evacuaciones_limpias)
K <- kurtosis(evacuaciones_limpias)

# --- 6. CONSTRUCCIÓN Y PRESENTACIÓN DE LA TABLA ---
Tabla_indicadores <- data.frame(
  "Evacuaciones",
  format(ri, big.mark=","),
  format(rs, big.mark=","),
  texto_media_intervalo, 
  format(round(mediana_exacta, 2), big.mark=","),
  format(round(Mo, 2), big.mark=","),
  format(round(desv_estandar_agrupada, 2), big.mark=","),
  paste(round(cv, 2), "%"),
  format(round(As, 2), big.mark=","),
  format(round(K, 2), big.mark=",")
)

colnames(Tabla_indicadores) <- c("Variable","Min","Max","Media Agrup. (IC 95%)","Mediana","Moda","Desv. S Agrup.","CV","As","K")

# Imprimir la tabla de indicadores
kable(Tabla_indicadores, format = "markdown", align = "c", caption = "Tabla 2: Indicadores Estadísticos (Calculados desde Tabla de 10 Intervalos).")
Tabla 2: Indicadores Estadísticos (Calculados desde Tabla de 10 Intervalos).
Variable Min Max Media Agrup. (IC 95%) Mediana Moda Desv. S Agrup. CV As K
Evacuaciones 0 701 [34.95 - 36.25] 0 0 16.12 45.29 % 32.2 1,131.01

11 Valores Atípicos

Esta sección se enfoca en los ‘Cisnes Negros’ del dataset: eventos de baja frecuencia pero impacto catastrófico. Identificar los valores atípicos permite aislar aquellos fallos críticos de seguridad donde la evacuación superó los rangos normales, siendo esta la información más valiosa para el diseño de planes de contingencia y gestión de crisis.

# 1. Cargar la totalidad de los datos
datos <- read.csv("database-_1_.csv")
variable_global <- na.omit(datos$Public.Evacuations)
variable_global <- variable_global[variable_global >= 0] # Asegurar valores válidos

# 2. Calcular valores atípicos usando la estadística de boxplot (Global)
stats_outliers_global <- boxplot.stats(variable_global)$out

# 3. Contar y obtener los extremos catastróficos
num_outliers_global <- length(stats_outliers_global)
minimooutliers_global <- if(num_outliers_global > 0) min(stats_outliers_global) else NA
maximooutliers_global <- if(num_outliers_global > 0) max(stats_outliers_global) else NA

# 4. Imprimir resultados en el reporte
cat("\n--- Análisis de Outliers de Evacuaciones Públicas ---\n")
## 
## --- Análisis de Outliers de Evacuaciones Públicas ---
cat("Número total de valores atípicos detectados:", num_outliers_global, "\n")
## Número total de valores atípicos detectados: 53
if(num_outliers_global > 0){
  cat("Outlier más bajo (Inicio de anomalía):", minimooutliers_global, "persona(s)\n")
  cat("Outlier más alto (Evento catastrófico):", maximooutliers_global, "persona(s)\n")
  cat("\nNota: La existencia de un valor máximo de", maximooutliers_global, "personas indica un evento de\nextrema gravedad que se aleja totalmente del comportamiento típico de la industria.")
} else {
  cat("No existen valores atípicos en la base de datos.")
}
## Outlier más bajo (Inicio de anomalía): 1 persona(s)
## Outlier más alto (Evento catastrófico): 700 persona(s)
## 
## Nota: La existencia de un valor máximo de 700 personas indica un evento de
## extrema gravedad que se aleja totalmente del comportamiento típico de la industria.

12 Conclusión

La variable “Evacuaciones” fluctúa entre 0 y 701 y sus valores se encuentran alrededor de 0, con una desviación estándar de 16.12, siendo una variable muy heterogénea, dado su alto coeficiente de variación del 45,29%, cuyos valores se concentran en la parte baja de la distribución con la agregación de valores atípicos de 53 outliers; por todo lo anterior, el comportamiento de la variable es marcadamente irregular.