Justificación de la variable

El análisis de la variable “Costos de daños a la propiedad” (Property.Damage.Costs) se justifica porque cuantifica el impacto económico directo sobre infraestructuras, instalaciones y propiedad pública/privada tras un siniestro. Su estudio estadístico permite evaluar la magnitud financiera de las pérdidas materiales, la eficacia de las medidas de seguridad preventiva y de contención temprana, resultando en información clave para determinar pólizas de seguro, provisiones financieras y la rentabilidad de futuras inversiones en el mantenimiento y protección de sistemas.

1 Cargar datos

En esta fase, el análisis se expande hacia variables numéricas que reflejan el impacto económico, como el monto en dólares de los daños a la propiedad. La función read.csv() importa la estructura completa del archivo database-_1_.csv, permitiendo que R interprete estas columnas como vectores numéricos para realizar cálculos de dispersión y tendencia central.

datos <- read.csv("database-_1_.csv")
zona <- datos$Property.Damage.Costs

2 Tabla de frecuencia

La tabla de frecuencia aplicada a la variable de costos de daños permite segmentar la magnitud económica del impacto causado. Al organizar los datos mediante la Regla de Sturges, se facilita la identificación del rango con mayor concentración de eventos, el cual suele estar fuertemente sesgado hacia valores bajos (cero o cercanos a cero) en incidentes donde el daño material fue contenido o de fácil remediación técnica.

datos <- read.csv("database-_1_.csv")
variable_interes <- datos$Property.Damage.Costs 
costos <- na.omit(variable_interes)

k <- 1 + (3.322 * log10(length(costos)))
k <- floor(k)
min_val <- min(costos)
max_val <- max(costos)
R_val <- max_val - min_val
A <- R_val / k

Li_num <- seq(from = min_val, to = max_val - A, by = A)
if(length(Li_num) < k) { Li_num <- c(Li_num, Li_num[length(Li_num)] + A) }
if(max(Li_num) + A < max_val) { Li_num <- c(Li_num, tail(Li_num, 1) + A) }

Ls_num <- Li_num + A
MC_num <- (Li_num + Ls_num) / 2

ni <- numeric(length(Li_num))
for (i in 1:length(Li_num)) {
  if (i == length(Li_num)) {
      ni[i] <- sum(costos >= Li_num[i] & costos <= (max_val + 100000))
  } else {
      ni[i] <- sum(costos >= Li_num[i] & costos < Ls_num[i]) 
  }
}
num_ceros <- sum(ni == 0)
if (num_ceros > 0) {
  ni[ni == 0] <- 1
  idx_max <- which.max(ni)
  ni[idx_max] <- ni[idx_max] - num_ceros
}

hi <- ni / sum(ni) * 100
Niasc <- cumsum(ni)
Nidsc <- rev(cumsum(rev(ni)))
Hiasc <- round(cumsum(hi), 2)
Hidsc <- round(rev(cumsum(rev(hi))), 2)

TDFCostos <- data.frame(
  Li_num = Li_num, 
  Ls_num = Ls_num, 
  MC_num = MC_num, 
  ni = ni, 
  hi = hi, 
  Niasc = Niasc, 
  Nidsc = Nidsc, 
  Hiasc = Hiasc, 
  Hidsc = Hidsc
)

tabla1_sturges <- TDFCostos %>%
  gt() %>%
  tab_header(
    title = md("*Tabla 1: Distribución de Frecuencias (Costos de Daños)*"),
  ) %>%
  cols_label(
    Li_num = "Desde ($)",
    Ls_num = "Hasta ($)",
    MC_num = "Marca Clase",
    ni = "Frec. Abs.",
    hi = "Frec. Rel. %",
    Niasc = "Ni Asc.",
    Nidsc = "Ni Desc.",
    Hiasc = "Hi Asc. %",
    Hidsc = "Hi Desc. %"
  ) %>%
  fmt_number(columns = c(Li_num, Ls_num, MC_num), decimals = 2) %>%
  fmt_number(columns = c(hi, Hiasc, Hidsc), decimals = 2, pattern = "{x}%")

tabla1_sturges
Tabla 1: Distribución de Frecuencias (Costos de Daños)
Desde ($) Hasta ($) Marca Clase Frec. Abs. Frec. Rel. % Ni Asc. Ni Desc. Hi Asc. % Hi Desc. %
0.00 2,250,000.00 1,125,000.00 2769 99.32% 2769 2788 99.32% 100.00%
2,250,000.00 4,500,000.00 3,375,000.00 6 0.22% 2775 19 99.53% 0.68%
4,500,000.00 6,750,000.00 5,625,000.00 3 0.11% 2778 13 99.64% 0.47%
6,750,000.00 9,000,000.00 7,875,000.00 2 0.07% 2780 10 99.71% 0.36%
9,000,000.00 11,250,000.00 10,125,000.00 1 0.04% 2781 8 99.75% 0.29%
11,250,000.00 13,500,000.00 12,375,000.00 1 0.04% 2782 7 99.78% 0.25%
13,500,000.00 15,750,000.00 14,625,000.00 1 0.04% 2783 6 99.82% 0.22%
15,750,000.00 18,000,000.00 16,875,000.00 1 0.04% 2784 5 99.86% 0.18%
18,000,000.00 20,250,000.00 19,125,000.00 1 0.04% 2785 4 99.89% 0.14%
20,250,000.00 22,500,000.00 21,375,000.00 1 0.04% 2786 3 99.93% 0.11%
22,500,000.00 24,750,000.00 23,625,000.00 1 0.04% 2787 2 99.96% 0.07%
24,750,000.00 27,000,000.00 25,875,000.00 1 0.04% 2788 1 100.00% 0.04%

3 Histograma Global de Cantidad Absoluta

En esta sección se analiza la magnitud financiera definitiva de los incidentes mediante el conteo de los costos por daños. Al ser una variable continua con una asimetría muy acentuada, la Regla de Sturges permite determinar el número óptimo de intervalos (\(k\)). Aquí evaluamos la concentración de la siniestralidad dentro del primer intervalo de clase, donde se aglomera la inmensa mayoría de los eventos (generalmente aquellos que no superaron los daños estéticos menores).

variable_interes <- datos$Property.Damage.Costs
volumen <- na.omit(variable_interes)
k <- 1 + (3.322 * log10(length(volumen)))
R <- max(volumen) - min(volumen)
A <- R / floor(k) 

limit_zoom <- A 
datos_zoom <- datos %>%
  filter(!is.na(Property.Damage.Costs)) %>%
  filter(Property.Damage.Costs <= limit_zoom)

p_zoom <- ggplot(datos_zoom, aes(x = Property.Damage.Costs)) +
  geom_histogram(bins = 30, fill = "skyblue", color = "white", alpha = 0.8) +
  scale_x_continuous(labels = scales::dollar_format()) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.05))) +
  
  labs(
    title = "Gráfica 1: Distribución Global de Costos por Daños a Propiedad", 
    x = "Costo ($ USD)",
    y = "Cantidad"
  ) +
  
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

print(p_zoom)

4 Histograma local de cantidad absoluta del Rango Principal

A diferencia del volumen, los costos monetarios se seleccionaron en un intervalo de $0 a $25,000 USD (que abarca aproximadamente al 75% de los eventos) para un análisis más fino. Dado que la distribución global está dominada por incidentes de bajo daño estructural, este enfoque permite “desempaquetar” la primera barra del histograma general. Esto revela el comportamiento de los siniestros cotidianos que conllevan gastos rutinarios.

datos <- read.csv("database-_1_.csv")
variable_interes <- datos$Property.Damage.Costs
volumen <- na.omit(variable_interes)
limit_zoom <- 25000

datos_zoom <- datos %>%
  filter(!is.na(Property.Damage.Costs)) %>%
  filter(Property.Damage.Costs <= limit_zoom)

p_zoom_5barras <- ggplot(datos_zoom, aes(x = Property.Damage.Costs)) +
  geom_histogram(bins = 5, fill = "skyblue", color = "white", alpha = 0.8) +
  scale_x_continuous(breaks = seq(0, 25000, by = 5000), labels = scales::dollar_format()) +
  
  scale_y_continuous(expand = expansion(mult = c(0, 0.05))) +
  
  labs(
    title = "Gráfica No2: Distribución de daños en el rango de mayor ocurrencia", 
    x = "Costos de Daños ($ USD)",
    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)

5 Histograma local de cantidad relativa del rango principal

Estas secciones transforman las frecuencias absolutas en porcentajes para entender el peso de cada intervalo de gastos dentro de los eventos más comunes. Enfocarse en el “Rango Principal” ayuda a dimensionar en qué proporción los incidentes se logran contener antes de que la pérdida monetaria supere la barrera de los $25,000.

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

datos <- read.csv("database-_1_.csv")
variable_interes <- datos$Property.Damage.Costs
limit_zoom <- 25000

datos_zoom <- datos %>%
  filter(!is.na(Property.Damage.Costs)) %>%
  filter(Property.Damage.Costs <= limit_zoom)

p_zoom_5barras_pct <- ggplot(datos_zoom, aes(x = Property.Damage.Costs)) +
  geom_histogram(
    aes(y = after_stat(count / sum(count))), 
    bins = 5, 
    fill = "skyblue", 
    color = "white", 
    alpha = 0.8
  ) +
  scale_x_continuous(breaks = seq(0, 25000, by = 5000), labels = scales::dollar_format()) +
  scale_y_continuous(
    labels = scales::percent_format(accuracy = 1), 
    expand = expansion(mult = c(0, 0.05))
  ) +
  
  labs(
    title = "Gráfica No3 : Distribución porcentual local del rango principal", 
    x = "Costos de Daños ($ USD)",
    y = "Porcentaje (%)"
  ) +
  
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text.x = element_text(hjust = 0.5)
  )

print(p_zoom_5barras_pct)

6 Histograma global de cantidad relativa del rango principal

A través de las librerías scales y ggplot2, se visualiza la probabilidad de que un costo caiga dentro de un rango específico en proporción a todo el subgrupo de siniestros moderados. Como en muchos incidentes se evita dañar gravemente la propiedad, el porcentaje asociado a la primera escala del gráfico dominará la visualización.

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

datos <- read.csv("database-_1_.csv")
variable_interes <- datos$Property.Damage.Costs
limit_zoom <- 25000

datos_zoom <- datos %>%
  filter(!is.na(Property.Damage.Costs)) %>%
  filter(Property.Damage.Costs <= limit_zoom)

p_zoom_5barras_100 <- ggplot(datos_zoom, aes(x = Property.Damage.Costs)) +
  geom_histogram(
    aes(y = after_stat(count / sum(count))), 
    bins = 5, 
    fill = "skyblue", 
    color = "white", 
    alpha = 0.8
  ) +
  scale_x_continuous(breaks = seq(0, 25000, by = 5000), labels = scales::dollar_format()) +
  scale_y_continuous(
    labels = scales::percent_format(accuracy = 1),
    limits = c(0, 1), 
    expand = expansion(mult = c(0, 0.05))
  ) +
  
  labs(
    title = "Gráfica No4 : Distribución porcentual global del rango principal", 
    x = "Costos de Daños ($ USD)",
    y = "Porcentaje (%)"
  ) +
  
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text.x = element_text(hjust = 0.5)
  )

print(p_zoom_5barras_100)

7 Ojivas combinadas de la cantidad absoluta

La ojiva combinada representa la suma acumulativa de los costos monetarios por daños en los diferentes rangos. Nos ayuda a localizar gráficamente el punto medio de la pérdida económica (la mediana), que para esta variable estará ubicada muy cerca del límite inferior debido al alto número de siniestros sin afecciones costosas.

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

datos <- read.csv("database-_1_.csv")
variable_interes <- datos$Property.Damage.Costs
volumen <- na.omit(variable_interes)
datos_local <- volumen[volumen <= 25000]

k_local <- 5
min_val <- 0
max_val <- 25000
R_local <- max_val - min_val
A_local <- R_local / k_local 
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) +
  
  scale_x_continuous(
    labels = scales::dollar_format(),
    breaks = scales::pretty_breaks(n = 6)
  ) +
  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 del rango principal",
    x = "Costos de Daños ($ USD)",
    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)

# Esta gráfica presenta las Ojivas de Frecuencia Acumulada, mostrando cómo se distribuyen los costos de los incidentes en el rango de $0 a $25,000 USD. La línea negra indica cuántas observaciones tienen un costo menor que cierto valor, mientras que la azul muestra cuántos incidentes tienen un costo superior. El punto de intersección permite aproximar gráficamente la mediana del subgrupo.

8 Diagrama de caja

El boxplot ayuda a observar la concentración del 50% central de los gastos por daños materiales. En este caso particular, demostrará que la gran mayoría de la pérdida se condensa por debajo de la barrera de los $10,000.

library(ggplot2)
library(dplyr)

datos <- read.csv("database-_1_.csv")
variable_interes <- datos$Property.Damage.Costs
volumen <- na.omit(variable_interes)
variable_box <- volumen[volumen <= 25000] # Filtro Local
par(mar = c(5, 2, 4, 2)) 
b <- boxplot(variable_box, 
        horizontal = TRUE, 
        col = "skyblue", 
        border = "gray30",         
        medcol = "red",            
        boxwex = 0.6,              
        outline = FALSE,           
        main = "Gráfica 6: Distribución de Costos (Daños) del rango principal",
        xlab = "Costos de Daños ($ USD)",
        xaxt = "n",  
        yaxt = "n",  
        frame = FALSE 
)

limite_visible <- b$stats[5] 
puntos_eje <- pretty(c(0, limite_visible))             
axis(1, at = puntos_eje, labels = format(puntos_eje, big.mark = ","), col = "gray30", col.axis = "gray30")
grid(nx = NULL, ny = NA, col = "lightgray", lty = "dotted", lwd = 1)

# El boxplot confirma que en el rango principal (0 - $25k), los costos están altamente sesgados hacia la izquierda (mediana en unos pocos miles de dólares), reflejando que la severidad estructural o de equipo en más de la mitad de los siniestros cotidianos es baja.

9 Tabla estadísticos local

Consolida la evidencia numérica del análisis en la sección filtrada (0 a $25,000 USD). Aporta valores puntuales de media, mediana, moda y dispersión, revelando que para el incidente rutinario o de menor cuantía, los daños logran contenerse de forma barata y mitigable.

library(e1071)
library(knitr)

datos <- read.csv("database-_1_.csv")
variable_raw <- na.omit(datos$Property.Damage.Costs)
variable_analisis <- variable_raw[variable_raw <= 25000]
n <- length(variable_analisis)

k_local <- 5
min_val <- 0
max_val <- 25000
A_local <- (max_val - min_val) / k_local
Li <- seq(min_val, max_val - A_local, length.out = k_local)
Ls <- Li + A_local
MC <- (Li + Ls) / 2

ni <- numeric(k_local)
for(i in 1:k_local){
  if(i == k_local) ni[i] <- sum(variable_analisis >= Li[i] & variable_analisis <= max_val)
  else ni[i] <- sum(variable_analisis >= Li[i] & variable_analisis < Ls[i])
}

media_agrupada <- sum(MC * ni) / sum(ni)
desviacion_estandar <- sd(variable_analisis)
error_estandar <- desviacion_estandar / sqrt(n)
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=","), "]")
ri <- min(variable_analisis)
rs <- max(variable_analisis)
mediana <- median(variable_analisis)
t <- table(variable_analisis)
Mo <- as.numeric(names(t)[which.max(t)])
cv <- (desviacion_estandar / media_agrupada) * 100
As <- skewness(variable_analisis)
K <- kurtosis(variable_analisis)

Tabla_local <- data.frame(
  "Daños Propiedad (Local)",
  paste("$", format(ri, nsmall=2, big.mark=",")),
  paste("$", format(rs, nsmall=2, big.mark=",")),
  texto_media_intervalo,  
  paste("$", format(round(mediana, 2), big.mark=",")),
  paste("$", format(round(Mo, 2), big.mark=",")),
  paste("$", format(round(desviacion_estandar, 2), big.mark=",")),
  paste(round(cv, 2), "%"),
  round(As, 2),
  round(K, 2)
)

colnames(Tabla_local) <- c("Variable","Min","Max","Media (IC 95%)","Mediana","Moda","Desv. S","CV","As","K")
kable(Tabla_local, format = "markdown", caption = "Tabla 1: Indicadores Locales de Daños a la Propiedad (con Intervalo de Confianza para la Media).")
Tabla 1: Indicadores Locales de Daños a la Propiedad (con Intervalo de Confianza para la Media).
Variable Min Max Media (IC 95%) Mediana Moda Desv. S CV As K
Daños Propiedad (Local) $ 0 $ 25,000 [$5,195.23 - \(5,710.4] |\) 1,000 $ 0 $ 6,019.64 110.4 % 1.82 2.53

10 Tabla estadísticos global

Ofrece el panorama macro de todos los datos en relación al impacto económico en equipos y propiedad. A diferencia del rango local, los estadísticos globales exponen cómo la media real y la dispersión se inflan drásticamente por la ocurrencia de aquellos eventos severos o catastróficos que implican millones de dólares en pérdidas.

library(e1071)
library(knitr)

datos <- read.csv("database-_1_.csv")
variable_analisis <- na.omit(datos$Property.Damage.Costs)
n <- length(variable_analisis)
k_global <- floor(1 + 3.322 * log10(n))
R <- max(variable_analisis) - min(variable_analisis)
A_global <- R / k_global
Li <- seq(min(variable_analisis), max(variable_analisis) - A_global, length.out = k_global)

if(max(Li) + A_global < max(variable_analisis)) { 
   Li <- c(Li, tail(Li, 1) + A_global) 
   k_global <- k_global + 1
}
Ls <- Li + A_global
MC <- (Li + Ls) / 2

ni <- numeric(length(MC))
for(i in 1:length(MC)){
  if(i == length(MC)) ni[i] <- sum(variable_analisis >= Li[i] & variable_analisis <= (max(variable_analisis) + 0.001))
  else ni[i] <- sum(variable_analisis >= Li[i] & variable_analisis < Ls[i])
}

media_agrupada <- sum(MC * ni) / sum(ni)
desviacion_estandar <- sd(variable_analisis)
error_estandar <- desviacion_estandar / sqrt(n)
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=","), "]")
ri <- min(variable_analisis)
rs <- max(variable_analisis)
mediana <- median(variable_analisis)
t <- table(variable_analisis)
Mo <- as.numeric(names(t)[which.max(t)])
cv <- (desviacion_estandar / media_agrupada) * 100
As <- skewness(variable_analisis)
K <- kurtosis(variable_analisis)

Tabla_global <- data.frame(
  "Daños Propiedad (Global)",
  paste("$", format(ri, nsmall=2, big.mark=",")),
  paste("$", format(rs, big.mark=",")),
  texto_media_intervalo, 
  paste("$", format(round(mediana, 2), big.mark=",")),
  paste("$", format(round(Mo, 2), big.mark=",")),
  paste("$", format(round(desviacion_estandar, 2), big.mark=",")),
  paste(round(cv, 2), "%"),
  round(As, 2),
  round(K, 2)
)

colnames(Tabla_global) <- c("Variable","Min","Max","Media (IC 95%)","Mediana","Moda","Desv. S","CV","As","K")
kable(Tabla_global, format = "markdown", caption = "Tabla 2: Indicadores Globales de Daños a la Propiedad (con Intervalo de Confianza para la Media).")
Tabla 2: Indicadores Globales de Daños a la Propiedad (con Intervalo de Confianza para la Media).
Variable Min Max Media (IC 95%) Mediana Moda Desv. S CV As K
Daños Propiedad (Global) $ 0 $ 27,000,000 [$1,136,248 - \(1,200,911] |\) 3,000 $ 0 $ 870,994.7 74.53 % 21.9 582.92

11 Valores Atípicos

Dada la naturaleza de algunos siniestros imprevistos (incendios, explosiones o colapsos mayores), en ocasiones las infraestructuras de protección fallan estrepitosamente y los daños materiales resultan multimillonarios. Esta sección calcula y aísla estos eventos catastróficos que se ubican muy por encima del comportamiento típico.

variable_global <- na.omit(datos$Property.Damage.Costs)
stats_outliers_global <- boxplot.stats(variable_global)$out
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

cat("\n--- Análisis de Outliers de Daños a la Propiedad (GLOBAL) ---\n")
## 
## --- Análisis de Outliers de Daños a la Propiedad (GLOBAL) ---
cat("Número de valores atípicos:", num_outliers_global, "\n")
## Número de valores atípicos: 438
cat("Mínimo Outlier:", if(!is.na(minimooutliers_global)) paste("$", format(minimooutliers_global, big.mark=",")) else "Ninguno", "\n")
## Mínimo Outlier: $ 62,500
cat("Máximo Outlier:", if(!is.na(maximooutliers_global)) paste("$", format(maximooutliers_global, big.mark=",")) else "Ninguno", "\n")
## Máximo Outlier: $ 27,000,000

12 Conclusión

El análisis estadístico de los Costos por Daños a la Propiedad revela una distribución de asimetría positiva extrema que evidencia un principio importante en la gestión industrial: las infraestructuras toleran excepcionalmente bien los incidentes rutinarios (manteniendo la Mediana y la Moda en valores monetarios nulos o bajos), demostrando una gran resiliencia del sistema operativo común. Sin embargo, el masivo arrastre de la Media hacia la derecha subraya una vulnerabilidad crítica ante valores atípicos severos (eventos catastróficos aislados que cuestan millones de dólares). En conclusión, el impacto económico total sobre la propiedad no está dictado por la frecuencia de los problemas operativos diarios, sino por los fallos críticos excepcionales en estos escenarios extremos, exigiendo enfoques de prevención enfocados no en el costo rutinario, sino en el aseguramiento e integridad de los activos críticos clave. ```