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 Librerias

La inicialización del entorno computacional y la carga de paquetes especializados son procedimientos de rigor. El uso de la librería dplyr asegura una gestión eficiente de los datos, mientras que knitr y kableExtra resultan indispensables para maquetar la salida de los resultados con la calidad y formalidad visual requerida en reportes de ingeniería.

library(htmltools)
library(gt)
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(e1071)
## Warning: package 'e1071' was built under R version 4.5.3
library(ggplot2)
## 
## Adjuntando el paquete: 'ggplot2'
## The following object is masked from 'package:e1071':
## 
##     element
library(scales)

2 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", header = TRUE, sep = ",", dec = ".", check.names = FALSE)

3 Extrae la variable

Para dimensionar las consecuencias financieras de los incidentes, se procede a aislar la variable cuantitativa referente a los costos por daños a la propiedad (Property.Damage.Costs). Esta extracción es fundamental para evaluar el impacto económico directo sobre la infraestructura afectada. Se aplica un filtrado de valores nulos para garantizar que la evaluación contemple exclusivamente registros financieros confirmados.

# CORRECCIÓN: Se extrae usando comillas invertidas y espacios
costos_propiedad <- datos$`Property Damage Costs`

# Se asigna a 'zona' el vector numérico depurado
zona <- costos_propiedad[!is.na(costos_propiedad)]

4 Conteo

La tabulación de frecuencias absolutas agrupa los valores monetarios reportados por cada siniestro. Debido a la naturaleza continua de las pérdidas financieras, este cálculo inicial expone la asimetría extrema característica de los costos de derrames, justificando la posterior compresión de datos en intervalos para lograr un diagnóstico económico preciso e interpretable.

conteo_zona <- table(zona)
print(conteo_zona)
## zona
##        0        1        3        5       10       15       20       25 
##      539        1        1        4       12        5        9       14 
##       28       30       40       50       52       56       65       75 
##        1        4        2       29        1        1        1        2 
##       80       85      100      108      110      125      130      140 
##        2        1       83        1        1        2        1        2 
##      150      166      181      190      200      204      216      232 
##        8        1        1        1       43        1        1        1 
##      250      300      327      350      375      392      397      400 
##       24       29        1        5        1        1        1       13 
##      413      433      445      450      480      490      498      500 
##        1        1        1        2        1        1        1      101 
##      550      600      664      700      750      791      800      820 
##        1       10        1        6        6        1        5        1 
##      852      900      919      924      925      937      940      950 
##        1        4        1        1        1        1        1        1 
##      953      980     1000     1100     1125     1134     1150     1160 
##        1        1      118        2        1        1        1        1 
##     1168     1171     1175     1198     1200     1250     1291     1300 
##        1        1        1        1        8        1        1        3 
##     1307     1317     1324     1350     1360     1385     1395     1400 
##        1        1        1        3        2        1        1        1 
##     1423     1445     1500     1530     1597     1600     1650     1684 
##        1        1       49        1        1        4        1        1 
##     1700     1720     1750     1800     1826     1840     1950     1992 
##        2        1        1        4        1        1        1        1 
##     2000     2048     2050     2095     2100     2130     2150     2246 
##       53        1        1        1        3        1        2        1 
##     2250     2300     2304     2370     2446     2456     2500     2550 
##        1        5        1        1        1        1       48        1 
##     2600     2625     2677     2680     2685     2700     2720     2770 
##        1        1        1        1        1        1        1        1 
##     2800     2803     2850     2901     2911     2978     3000     3099 
##        4        1        1        1        2        1       38        1 
##     3100     3200     3250     3300     3334     3359     3400     3404 
##        1        1        2        2        1        1        1        1 
##     3413     3449     3462     3500     3557     3600     3623     3700 
##        1        1        1       21        1        2        1        4 
##     3837     3900     4000     4075     4080     4100     4169     4195 
##        1        1       26        1        1        2        1        1 
##     4200     4213     4387     4500     4645     4670     4700     4737 
##        2        1        1        6        1        1        1        1 
##     4800     4820     4825     4830     4909     4995     5000     5035 
##        1        1        1        1        1        1       88        1 
##     5200     5300     5340     5370     5371     5376     5400     5403 
##        1        3        1        1        1        1        1        1 
##     5420     5500     5535     5600     5660     5754     5800     5927 
##        1        3        2        2        1        1        1        1 
##     5931     6000     6020     6232     6233     6300     6415     6428 
##        1       18        1        1        1        1        1        1 
##     6500     6700     6702     6709     6750     6755     6800     6826 
##        5        1        1        1        1        1        1        1 
##     6900     6915     7000     7026     7057     7063     7104     7215 
##        2        1       21        1        1        1        1        1 
##     7340     7387     7395     7400     7470     7500     7700     7747 
##        1        1        1        1        1       10        1        1 
##     7850     7949     8000     8100     8314     8370     8397     8407 
##        1        1       19        1        1        1        1        1 
##     8450     8500     8700     8875     9000     9070     9404     9500 
##        1        4        2        1        6        1        1        4 
##     9514     9700     9769     9830     9900     9928     9950     9970 
##        1        1        1        1        1        1        1        1 
##    10000    10040    10376    10431    10500    10508    10675    10700 
##       71        1        1        1        4        1        1        1 
##    10900    11000    11174    11250    11300    11355    11500    11734 
##        1        7        1        1        1        1        3        1 
##    11852    12000    12046    12049    12087    12200    12500    13000 
##        1       16        1        1        1        1        2        8 
##    13318    13430    13500    13785    13895    14000    14035    14120 
##        1        1        3        1        1        8        1        1 
##    14251    14321    14350    14415    14500    14750    14790    14819 
##        1        1        1        1        1        1        1        1 
##    14970    15000    15020    15085    15200    15441    15500    15525 
##        1       34        1        1        2        1        1        1 
##    15670    15700    15830    16000    16200    16215    16400    16404 
##        1        1        1        8        1        1        1        1 
##    16420    16450    16451    16701    16960    16967    17000    17019 
##        1        1        1        1        1        1        4        1 
##    17111    17246    17500    18000    18103    18151    18382    18399 
##        1        1        1        4        1        1        1        1 
##    18659    19000    19230    19281    19342    19495    19500    19784 
##        1        7        1        1        1        1        1        1 
##    19808    20000    20100    20300    20400    20795    21000    21778 
##        1       47        1        1        1        1        1        1 
##    22000    22350    22500    22739    23000    23450    23877    23938 
##        3        1        1        1        5        1        1        1 
##    24000    24421    24629    24822    24850    25000    25284    25300 
##        2        1        1        1        1       28        1        1 
##    25539    25900    26000    26170    26456    26500    26589    26714 
##        1        1        6        1        1        2        1        1 
##    26761    27000    27200    27257    27530    27700    27901    28000 
##        1        2        1        1        4        1        1        2 
##    28025    28072    28107    28489    28776    29000    29267    29360 
##        1        1        1        1        1        1        1        1 
##    29525    30000    30942    30955    31000    31500    31669    31800 
##        1       24        1        1        4        1        1        1 
##    32000    32238    32535    32800    33000    33500    33600    34199 
##        1        1        1        1        2        1        1        1 
##    35000    35128    35500    35723    36000    36500    36850    37000 
##       21        1        1        1        3        1        1        1 
##    37731    38199    38200    38500    38700    38920    39428    40000 
##        1        1        1        1        1        1        1       16 
##    40221    40472    40500    40594    40903    41000    41548    42000 
##        1        1        2        1        1        3        1        5 
##    42052    42315    42500    42525    42593    42700    42780    43000 
##        1        1        2        1        1        1        1        1 
##    43184    43438    43500    44400    44975    45000    45394    45600 
##        1        1        1        1        1       10        1        1 
##    46000    46260    46397    46887    46900    47000    48264    49000 
##        1        1        1        1        1        1        1        1 
##    49400    49955    50000    51000    51814    52500    52529    53000 
##        1        1       29        2        1        1        1        1 
##    54591    54700    55000    55750    56000    56130    57354    58000 
##        1        1        5        1        1        1        1        2 
##    58283    59400    59440    59880    60000    60497    60800    61000 
##        1        1        1        1        8        1        1        1 
##    61269    61307    62000    62500    63604    64000    64111    65000 
##        1        1        3        1        1        1        1        6 
##    65262    65520    65735    65800    66000    67647    68000    70000 
##        1        1        1        1        1        1        1        4 
##    71000    71841    72000    72117    73000    73503    74000    75000 
##        3        1        2        1        1        1        1       10 
##    75494    75630    76940    79087    80000    80005    81600    82000 
##        1        1        1        1        6        1        1        1 
##    82070    82987    83000    83264    83560    85000    85574    86000 
##        1        1        1        1        1        2        1        2 
##    86611    87500    88252    88506    89815    89878    90000    90005 
##        1        2        1        1        1        1        3        1 
##    92000    92064    92500    92682    96000    96278    97000    97169 
##        1        1        1        1        1        1        1        1 
##    98000   100000   104000   104956   105000   105450   107000   108000 
##        1       15        1        1        1        1        2        2 
##   108235   109000   109184   110000   110500   111000   112565   113311 
##        1        1        1        2        1        2        1        1 
##   115000   118000   119000   120000   121000   121500   122000   123000 
##        2        1        1        5        1        1        2        1 
##   125000   125664   126700   127747   128000   128015   128645   130000 
##       10        1        1        1        1        1        1        3 
##   131882   131956   133500   134000   135752   136851   137656   139000 
##        1        1        1        1        1        1        1        1 
##   140000   140600   141492   141500   142435   142500   144000   145000 
##        2        1        1        1        1        1        2        1 
##   145608   147000   147320   147800   148550   149622   150000   152000 
##        1        1        1        1        1        1       11        2 
##   153554   153960   154099   155000   155059   155534   160000   160862 
##        1        1        1        1        1        1        3        1 
##   162000   165000   165325   167450   169800   170034   171000   172000 
##        1        2        1        1        1        1        1        1 
##   173000   174000   175000   178000   180000   180220   184000   185000 
##        2        1        5        1        1        1        1        1 
##   186221   188580   190000   191869   193000   194000   195329   196960 
##        2        1        1        1        1        1        1        1 
##   196988   198899   200000   205120   207262   208000   210000   214500 
##        1        1        6        1        1        1        1        1 
##   216000   220000   222000   224278   230000   232972   233000   244000 
##        1        1        1        1        2        1        1        1 
##   246000   247849   248000   250000   252249   255500   263000   264000 
##        1        1        1        7        1        1        1        1 
##   264734   265000   267200   267563   269051   271645   275000   276656 
##        1        1        1        1        1        1        1        1 
##   278154   280000   285000   285500   288098   300000   302458   303053 
##        1        1        1        1        1        4        1        1 
##   304203   313899   313944   322200   325000   327500   332463   337771 
##        1        1        1        1        1        1        1        1 
##   340000   345058   347577   350000   350238   351261   352632   363545 
##        2        1        1        6        1        1        1        1 
##   370000   370115   375000   384650   385000   392745   400000   403000 
##        1        1        2        1        1        1        3        1 
##   415000   429678   450000   450500   465816   470000   476000   476737 
##        1        1        1        1        1        1        1        1 
##   482000   484000   500000   513000   513460   515262   517016   523867 
##        1        1        4        1        1        1        1        1 
##   528705   545700   549459   550000   570000   575000   580000   590464 
##        1        1        1        4        1        1        1        1 
##   597569   600000   620000   621597   648703   660000   664000   675000 
##        1        2        1        1        1        1        1        1 
##   679337   730000   734810   750000   754000   760000   767843   800000 
##        1        1        1        1        1        1        1        1 
##   825000   833000   848137   850000   852922   864819   870000   874500 
##        1        1        1        1        1        1        1        1 
##   900000   930000   935000   966352   990000  1000000  1010700  1054438 
##        1        1        1        1        1       10        1        1 
##  1072650  1110105  1130319  1200000  1250000  1330000  1430918  1441000 
##        1        1        1        2        1        1        1        1 
##  1446227  1500000  1510369  1560277  1600000  1633000  1700000  1800000 
##        1        5        1        1        1        1        1        1 
##  1821591  1830000  1922910  2000000  2030000  2034000  2072440  2200000 
##        1        1        1        5        1        1        1        2 
##  2453123  2810324  2960000  3000000  3762189  4200000  4588574  5000000 
##        1        1        1        1        1        1        1        1 
##  5277000  7368470  7701361  9868173 11614000 14130000 24323483 27000000 
##        1        1        1        1        1        1        1        1

5 Tabla de frecuencia

5.1 Regla de sturges

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", header = TRUE, sep = ",", dec = ".")
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%

6 Tabla de frecuencia simplificada

A continuación se presenta la distribución de frecuencias simplificada correspondiente a los costos por daños a la propiedad (Property.Damage.Costs) derivados de los incidentes en oleoductos. Mediante la aplicación de la regla de Sturges, los valores económicos se han agrupado en intervalos definidos por sus límites y marcas de clase. Al prescindir de las frecuencias acumuladas, esta versión condensa la información para enfocarse exclusivamente en la frecuencia absoluta y la relativa porcentual, permitiendo observar de manera directa y concisa la cantidad de accidentes asociados a cada rango económico y la proporción que estos representan sobre el impacto total de los eventos analizados.

# Asegúrate de tener cargadas estas librerías
library(dplyr)
library(gt)

# 1. Creación del DataFrame SIMPLIFICADO (omitimos Niasc, Nidsc, Hiasc, Hidsc)
TDFCostos_Simp <- data.frame(
  Li_num = Li_num, 
  Ls_num = Ls_num, 
  MC_num = MC_num, 
  ni = ni, 
  hi = hi
)

# 2. Creación de la tabla simplificada con gt()
tabla1_simplificada <- TDFCostos_Simp %>%
  gt() %>%
  tab_header(
    title = md("*Tabla 2: Distribución de Frecuencias simplificada (Costos de Daños)"),
  ) %>%
  cols_label(
    Li_num = "Desde ($)",
    Ls_num = "Hasta ($)",
    MC_num = "Marca Clase",
    ni = "Frec. Abs.",
    hi = "Frec. Rel. %"
  ) %>%
  fmt_number(columns = c(Li_num, Ls_num, MC_num), decimals = 2) %>%
  fmt_number(columns = c(hi), decimals = 2, pattern = "{x}%")

# 4. Imprimir la tabla
tabla1_simplificada
*Tabla 2: Distribución de Frecuencias simplificada (Costos de Daños)
Desde ($) Hasta ($) Marca Clase Frec. Abs. Frec. Rel. %
0.00 2,250,000.00 1,125,000.00 2769 99.32%
2,250,000.00 4,500,000.00 3,375,000.00 6 0.22%
4,500,000.00 6,750,000.00 5,625,000.00 3 0.11%
6,750,000.00 9,000,000.00 7,875,000.00 2 0.07%
9,000,000.00 11,250,000.00 10,125,000.00 1 0.04%
11,250,000.00 13,500,000.00 12,375,000.00 1 0.04%
13,500,000.00 15,750,000.00 14,625,000.00 1 0.04%
15,750,000.00 18,000,000.00 16,875,000.00 1 0.04%
18,000,000.00 20,250,000.00 19,125,000.00 1 0.04%
20,250,000.00 22,500,000.00 21,375,000.00 1 0.04%
22,500,000.00 24,750,000.00 23,625,000.00 1 0.04%
24,750,000.00 27,000,000.00 25,875,000.00 1 0.04%

7 Gráfica

7.1 Histograma 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)

7.2 Histograma de cantidad absoluta

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 local de Costos por Daños a Propiedad", 
    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)

7.3 Histograma de cantidad relativa

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 de Costos por Daños a Propiedad", 
    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)

7.4 Histograma de cantidad relativa

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 de Costos por Daños a Propiedad", 
    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.5 Ojivas combinadas

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 de Costos por Daños a Propiedad",
    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.

7.6 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)",
        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.

7.7 Tabla estadístico

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.

options(scipen = 999) # Evita que los números grandes pasen a notación científica
library(e1071)
library(knitr)

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

# Regla de Sturges
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)

# Creación del DataFrame asginando directamente los nombres a las columnas (Evita que se muevan)
Tabla_global <- data.frame(
  "Variable" = "Daños Propiedad",
  "Min" = paste("$", format(round(ri, 2), nsmall=2, big.mark=",")),
  "Max" = paste("$", format(round(rs, 2), nsmall=2, big.mark=",")),
  "Media (IC 95%)" = texto_media_intervalo, 
  "Mediana" = paste("$", format(round(mediana, 2), nsmall=2, big.mark=",")),
  "Moda" = paste("$", format(round(Mo, 2), nsmall=2, big.mark=",")),
  "Desv. S" = paste("$", format(round(desviacion_estandar, 2), nsmall=2, big.mark=",")),
  "CV" = paste(round(cv, 2), "%"),
  "As" = round(As, 2),
  "K" = round(K, 2),
  check.names = FALSE # Fundamental para que respete espacios y caracteres especiales en los títulos
)

# Imprimir la tabla perfectamente alineada al centro ("c")
kable(Tabla_global, format = "markdown", align = "c", caption = "Tabla 2: Indicadores de Daños a la Propiedad")
Tabla 2: Indicadores de Daños a la Propiedad
Variable Min Max Media (IC 95%) Mediana Moda Desv. S CV As K
Daños Propiedad $ 0.00 $ 27,000,000.00 [$1,136,248 - $1,200,911] $ 3,000.00 $ 0.00 $ 870,994.74 74.53 % 21.9 582.92

7.8 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 ---\n")
## 
## --- Análisis de Outliers de Daños a la Propiedad ---
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

8 Conclusión

La variable continua Daños a la Propiedad fluctúa entre $0.00 y $27,000,000.00, con valores que giran en torno a una mediana de $3,000.00, presentando una desviación estándar de $870,994.74 y un comportamiento marcadamente heterogéneo (CV del 74.53%). Se identifican 438 valores atípicos que se presentan a partir de los $62,500; asimismo, la distribución muestra una asimetría fuertemente positiva (21.9) y una concentración leptocúrtica (582.92), lo cual indica que la gran mayoría de los incidentes acumulan costos por daños relativamente bajos, representando un comportamiento general beneficioso desde la perspectiva del impacto económico, a pesar de la existencia de eventos catastróficos atípicos de alcance multimillonario.