1 Carga de Dataset

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

raw_years <- database$`Accident Year`
raw_years <- raw_years[raw_years != ""]
raw_years <- na.omit(raw_years)
years_obj <- floor(as.numeric(as.character(raw_years)))
## Warning: NAs introducidos por coerción
years_num <- as.numeric(years_obj)
years_num <- na.omit(years_num)
years_obj <- years_obj[!is.na(years_num)]
valid_indices <- years_num > 1900 & years_num <= 2025
years_num <- years_num[valid_indices]
years_obj <- years_obj[valid_indices]

2 Tabla de frecuencia

#tabla de frecuencia
datos <- read.csv("database-_1_.csv", stringsAsFactors = FALSE)
anios_limpios <- floor(as.numeric(datos$Accident.Year))
## Warning: NAs introducidos por coerción
anios_limpios <- anios_limpios[!is.na(anios_limpios)]
tabla_base <- table(anios_limpios)
ni <- as.vector(tabla_base)
Magnitud <- names(tabla_base)
hi <- round(ni/sum(ni)*100, 2)
diferencia <- 100 - sum(hi)
if(diferencia != 0){
  indice_max <- which.max(ni)
  hi[indice_max] <- hi[indice_max] + diferencia
}

Ni_asc <- cumsum(ni)
Ni_dsc <- rev(cumsum(rev(ni)))
Hi_asc <- cumsum(hi)            
Hi_dsc <- rev(cumsum(rev(hi)))
TDFMagnitudFin <- data.frame(Magnitud, ni, hi, Ni_asc, Ni_dsc, Hi_asc, Hi_dsc)
library(knitr)

kable(TDFMagnitudFin, 
      caption = "Tabla de Frecuencia de accidentes del año",
      align = "c", 
      col.names = c("Año", "ni", "hi (%)", "Ni Asc", "Ni Dsc", "Hi Asc", "Hi Dsc"))
Tabla de Frecuencia de accidentes del año
Año ni hi (%) Ni Asc Ni Dsc Hi Asc Hi Dsc
2010 350 12.53 350 2793 12.53 100.00
2011 345 12.35 695 2443 24.88 87.47
2012 366 13.10 1061 2098 37.98 75.12
2013 401 14.36 1462 1732 52.34 62.02
2014 454 16.25 1916 1331 68.59 47.66
2015 576 20.63 2492 877 89.22 31.41
2016 301 10.78 2793 301 100.00 10.78

3 Histograma de Cantidad Absoluta Global

library(ggplot2)
## 
## Adjuntando el paquete: 'ggplot2'
## The following object is masked from 'package:e1071':
## 
##     element
TDFMagnitudFin$Magnitud <- as.numeric(as.character(TDFMagnitudFin$Magnitud))
total_ni <- sum(TDFMagnitudFin$ni)
max_ni <- max(TDFMagnitudFin$ni)   
A <- 0.9                           
p_global <- ggplot(TDFMagnitudFin, aes(x = Magnitud, y = ni)) +
  geom_col(fill = "steelblue", color = "black", alpha = 0.8, width = A, linewidth = 0.5) +
  scale_x_continuous(breaks = TDFMagnitudFin$Magnitud) +  
  scale_y_continuous(limits = c(0, total_ni * 1.1),      
                     expand = expansion(mult = c(0, 0))) +
  
  labs(title = "Gráfica No 1: Distribución Anual de Accidentes por año",
       x = "Año", y = "Cantidad de Accidentes") +
  theme_classic() +
  theme(
  plot.title = element_text(hjust = 0.5, face = "bold", size = 13),
    plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
    axis.text.x = element_text(angle = 45, hjust = 1, color = "black"),
    axis.text.y = element_text(color = "black"),
    axis.line = element_line(linewidth = 0.5, color = "black")
  )

print(p_global)

4 Histograma de Cantidad Absoluta Local

A <- 0.9  
max_ni <- max(TDFMagnitudFin$ni) 

p_ni_local <- ggplot(TDFMagnitudFin, aes(x = Magnitud, y = ni)) +
  geom_col(fill = "steelblue", color = "black", alpha = 0.8, width = A, linewidth = 0.5) +
  scale_x_continuous(breaks = TDFMagnitudFin$Magnitud) +
  scale_y_continuous(limits = c(0, max_ni * 1.05),
                     expand = expansion(mult = c(0, 0))) +
  
  labs(title = "Gráfica No 2: Distribución de Accidentes por Intervalos de Tiempo.",
       x = "Año",
       y = "Cantidad") +
  
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 13),
    plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
    axis.text.x = element_text(angle = 45, hjust = 1, color = "black"),
    axis.text.y = element_text(color = "black"),
    axis.line = element_line(linewidth = 0.5, color = "black")
  )

print(p_ni_local)

5 Histograma de Cantidad Relativa Global

library(ggplot2)
total_hi <- sum(TDFMagnitudFin$hi) 
A <- 0.9
p_hi_global <- ggplot(TDFMagnitudFin, aes(x = Magnitud, y = hi)) +
  geom_col(fill = "steelblue", color = "black", alpha = 0.8, width = A, linewidth = 0.5) +
  
  scale_x_continuous(breaks = TDFMagnitudFin$Magnitud) + 
  scale_y_continuous(limits = c(0, total_hi * 1.1),      
                     expand = expansion(mult = c(0, 0))) +
  labs(title = "Gráfica No 3:Participación Porcentual de Accidentes por Año",
       x = "Año", 
       y = "Porcentaje (%)") +
  
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
    axis.text.x = element_text(angle = 45, hjust = 1, color = "black"),
    axis.line = element_line(linewidth = 0.5, color = "black")
  )

print(p_hi_global)

6 Histograma de Cantidad Relativa Local

#Histograma_localhi
library(ggplot2)
max_hi <- max(TDFMagnitudFin$hi)
A <- 0.9

p_hi_local <- ggplot(TDFMagnitudFin, aes(x = Magnitud, y = hi)) +
  # Barras
  geom_col(fill = "steelblue", color = "black", alpha = 0.8, width = A, linewidth = 0.5) +
  scale_x_continuous(breaks = TDFMagnitudFin$Magnitud) +
  scale_y_continuous(limits = c(0, max_hi * 1.1),
                     expand = expansion(mult = c(0, 0))) +
  labs(title = "Gráfica No 4: Análisis de Incidencia Relativa de accidentes",
       x = "Año",
       y = "Porcentaje (%)") +
  
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 13),
    plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
    axis.text.x = element_text(angle = 45, hjust = 1, color = "black"),
    axis.text.y = element_text(color = "black"),
    axis.line = element_line(linewidth = 0.5, color = "black")
  )

print(p_hi_local)

7 Ojiva de Cantidad Absoluta

library(ggplot2)
total_n <- max(TDFMagnitudFin$Ni_asc)
p_ojiva_ni <- ggplot(TDFMagnitudFin, aes(x = Magnitud)) +
  geom_line(aes(y = Ni_asc, color = "Ni Ascendente"), linewidth = 1) +
  geom_point(aes(y = Ni_asc, color = "Ni Ascendente"), size = 2.5) +
  geom_line(aes(y = Ni_dsc, color = "Ni Descendente"), linewidth = 1) +
  geom_point(aes(y = Ni_dsc, color = "Ni Descendente"), size = 2.5) +
  scale_color_manual(name = "Tipo de Acumulado",
                     values = c("Ni Ascendente" = "steelblue", 
                                "Ni Descendente" = "firebrick")) +
  scale_x_continuous(breaks = TDFMagnitudFin$Magnitud) +
  scale_y_continuous(limits = c(0, total_n * 1.05), # Un 5% extra arriba
                     expand = expansion(mult = c(0, 0))) +
  labs(title = "Gráfica No 5: Comportamiento de la cantidad Acumulada de Accidentes.",
       x = "Año",
       y = "Cantidad Acumulada") +
  
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
    axis.text.x = element_text(angle = 45, hjust = 1, color = "black"),
    legend.position = "bottom", # Leyenda en la parte inferior
    axis.line = element_line(linewidth = 0.5, color = "black")
  )

print(p_ojiva_ni)

#La Gráfica No. 5 muestra la acumulación absoluta de accidentes ($N_i$), donde la curva azul asciende progresivamente hasta alcanzar un total cercano a los 2800 eventos en 2016, mientras la roja desciende desde esa misma cifra. El cruce de ambas líneas, ocurrido poco después de 2013 y alrededor de los 1400 casos, marca visualmente la mediana, indicando el punto donde se registró la mitad del total de siniestros.

8 Ojiva de Cantidad Relativas

library(ggplot2)
ymax <- 105 

p_ojiva_hi <- ggplot(TDFMagnitudFin, aes(x = Magnitud)) +
  geom_line(aes(y = Hi_asc, color = "Hi Ascendente"), linewidth = 1) +
  geom_point(aes(y = Hi_asc, color = "Hi Ascendente"), size = 2.5) +
  geom_line(aes(y = Hi_dsc, color = "Hi Descendente"), linewidth = 1) +
  geom_point(aes(y = Hi_dsc, color = "Hi Descendente"), size = 2.5) +
  scale_color_manual(name = "Tipo de Acumulado",
                     values = c("Hi Ascendente" = "steelblue", 
                                "Hi Descendente" = "firebrick")) +
  scale_x_continuous(breaks = TDFMagnitudFin$Magnitud) +
  scale_y_continuous(limits = c(0, ymax), 
                     expand = expansion(mult = c(0, 0))) +
  labs(title = "Gráfica No 6: Comportamiento de la cantidad Relativa de Accidentes.",
       x = "Año",
       y = "Porcentaje Acumulado") +
  
  theme_classic() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
    axis.text.x = element_text(angle = 45, hjust = 1, color = "black"),
    legend.position = "bottom", # Leyenda abajo
    axis.line = element_line(linewidth = 0.5, color = "black")
  )

print(p_ojiva_hi)

#Esta gráfica presenta las curvas de frecuencia acumulada (ojivas) de accidentes ocurridos entre 2010 y 2016, contrastando la acumulación progresiva (línea azul ascendente) frente al porcentaje restante (línea roja descendente). Mientras la curva azul crece hasta completar el 100% de los casos al final del periodo, la roja desciende desde la totalidad inicial, cruzándose ambas líneas poco después del año 2013; este punto de intersección es clave, ya que visualiza la mediana de la distribución temporal, indicando el momento aproximado en el que se había registrado la mitad de los accidentes totales.

9 Diagrama de cajas

library(ggplot2)
par(mar = c(5, 2, 4, 2)) 
boxplot(anios_limpios, 
        horizontal = TRUE, 
        col = "skyblue",            
        main = "Gráfica 7: Distribución de Años (Boxplot)",
        xlab = "Año",
        xaxt = "n",                  
        outline = TRUE,             
        pch = 19,                    
        outcol = "red")             
axis(1, 
     at = sort(unique(anios_limpios)), 
     labels = sort(unique(anios_limpios)), 
     las = 2,  
     cex.axis = 0.8) 
grid(nx = NULL, ny = NA, col = "lightgray", lty = "dotted")

#Esta gráfica de caja muestra la distribución temporal de un conjunto de datos que abarca desde el año 2010 hasta el 2016. Se observa que el 50% central de la información (la caja azul) está concentrado entre los años 2012 y 2015, con una mediana situada exactamente en 2013 que divide la muestra en dos partes iguales. La longitud desigual de las secciones de la caja sugiere que los datos están más dispersos en los años recientes (entre 2013 y 2015) en comparación con el periodo inicial, indicando una variabilidad ligeramente mayor hacia el final del rango temporal analizado.

10 Indicadores estadísticos

library(e1071) 

# 1. Rango (Mínimo y Máximo)
ri <- min(anios_limpios, na.rm = TRUE)
rs <- max(anios_limpios, na.rm = TRUE)
print(ri)
## [1] 2010
print(rs)
## [1] 2016
# 2. Mediana
mediana <- median(anios_limpios, na.rm = TRUE)
print(mediana)
## [1] 2013
# 3. Media Aritmética
media_aritmetica <- mean(anios_limpios, na.rm = TRUE)
print(media_aritmetica)
## [1] 2013.144
# 4. Moda (Calculada como el valor más frecuente)
t <- table(anios_limpios)
Mo <- as.numeric(names(t)[which.max(t)]) 
print(Mo)
## [1] 2015
# 5. Desviación Estándar
# Aquí es directo, el resultado es en "años"
desviacion_estandar <- sd(anios_limpios, na.rm = TRUE)
print(paste(round(desviacion_estandar, 2), "años"))
## [1] "1.92 años"
# 6. Coeficiente de Variabilidad
coeficiente_variabilidad <- (desviacion_estandar / media_aritmetica) * 100
print(coeficiente_variabilidad)
## [1] 0.09543073
# 7. Asimetría (Skewness)
As <- skewness(anios_limpios, na.rm = TRUE)
print(As)
## [1] -0.1947063
# 8. Curtosis
curtosis_val <- kurtosis(anios_limpios, na.rm = TRUE)
print(curtosis_val)
## [1] -1.180577

11 Tabla de Indicadores

library(knitr)

# Preparamos los textos para la tabla
Variable <- "Accident Year"

Tabla_indicadores <- data.frame(
  Variable,
  ri,                               # Mínimo
  rs,                               # Máximo
  round(media_aritmetica, 2),       # Media
  mediana,                          # Mediana
  Mo,                               # Moda
  round(desviacion_estandar, 2),    # S (Desviación)
  round(coeficiente_variabilidad, 2), 
  round(As, 2), 
  round(curtosis_val, 2)
)

colnames(Tabla_indicadores) <- c("Variable","Mínimo","Máximo","x","Me","Mo","S (años)","Cv (%)","As","K")

# Imprimir Tabla
kable(Tabla_indicadores, format = "markdown", align = "c", 
      caption = "Tabla No. 1: Indicadores estadísticos de la variable Accident Year.")
Tabla No. 1: Indicadores estadísticos de la variable Accident Year.
Variable Mínimo Máximo x Me Mo S (años) Cv (%) As K
Accident Year 2010 2016 2013.14 2013 2015 1.92 0.1 -0.19 -1.18

12 Valores atípicos

# Usamos boxplot.stats sobre los años
stats_outliers <- boxplot.stats(anios_limpios)$out

# Contar los valores atípicos
num_outliers <- length(stats_outliers)
print(paste("Número de outliers:", num_outliers))
## [1] "Número de outliers: 0"
# Obtener Mínimo y Máximo Outlier (si existen)
minimooutliers <- if(num_outliers > 0) min(stats_outliers) else NA
maximooutliers <- if(num_outliers > 0) max(stats_outliers) else NA

# Imprimir resultados
if(num_outliers > 0){
  print(paste("Outlier más bajo:", minimooutliers))
  print(paste("Outlier más alto:", maximooutliers))
} else {
  print("No existen valores atípicos.")
}
## [1] "No existen valores atípicos."

13 Conclusiones

## El análisis de la variable 'Accident Year' abarca el periodo entre 2010 y 2016, evidenciando una tendencia central en torno al año 2013, siendo el 2015 el año con mayor frecuencia de siniestros. Los datos presentan una desviación estándar de 1.92 años respecto al promedio. La distribución muestra un coeficiente de asimetría de -0.19, indicando una mayor concentración de eventos en los años más recientes (sesgo negativo), y una curtosis de -1.18, lo que sugiere un comportamiento de tipo platicúrtica (datos dispersos). Finalmente, el diagrama de cajas descartó la existencia de valores atípicos, demostrando que la ocurrencia de accidentes se ha mantenido mayoritariamente dentro de los rangos estadísticos esperados.