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]
#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 Frecuencias: Accident Year",
      align = "c", 
      col.names = c("Año", "ni", "hi (%)", "Ni Asc", "Ni Dsc", "Hi Asc", "Hi Dsc"))
Tabla de Frecuencias: Accident Year
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
#Histograma global ni
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) +
  geom_text(aes(label = ni), 
            vjust = -0.5, color = "black", fontface = "bold", size = 3.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 Temporal Global",
       subtitle = paste("Frecuencia respecto al Total Acumulado (N =", total_ni, ")"),
       x = "Año", y = "Cantidad de Accidentes") +
  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")
  )
p_local <- ggplot(TDFMagnitudFin, aes(x = Magnitud, y = ni)) +
  geom_col(fill = "forestgreen", color = "black", alpha = 0.7, width = A, linewidth = 0.5) +
  geom_text(aes(label = ni), vjust = -0.5, color = "black", fontface = "bold", size = 3.5) +

  scale_x_continuous(breaks = TDFMagnitudFin$Magnitud) +
  scale_y_continuous(limits = c(0, max_ni * 1.15), 
                     expand = expansion(mult = c(0, 0))) +
  
  labs(title = "Gráfica No 2: Distribución Temporal Local",
       subtitle = "Detalle de Frecuencias por Año",
       x = "Año", y = "Cantidad de Accidentes") +
  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")
  )

print(p_global)

#Histograma local ni
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 Temporal Local",
       subtitle = "Frecuencia Absoluta (ni) por Año",
       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)

#Histograma global hi
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: Distribución Temporal Global",
       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)

#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: Distribución Temporal Local (%)",
       subtitle = "Frecuencia Relativa (hi) por Año",
       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)

#Ojivas combinadas de la frecuencia Ni
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: Ojivas Combinadas (Ni)",
       subtitle = "Frecuencias Acumuladas Ascendente y Descendente",
       x = "Año",
       y = "Cantidad Acumulada (Ni)") +
  
  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)

#Ojivas combinadas de la frecuencia hi
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: Ojivas Combinadas (Hi)",
       subtitle = "Frecuencias Relativas Acumuladas (%)",
       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)

#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")

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
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
# 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."
## 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.