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.
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)
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)
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)]
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
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% |
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% |
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)
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)
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)
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)
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.
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.
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")
| 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 |
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
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.