#Originalmente, la variable Accident.State que identifica los estados se presentaba con una naturaleza cualitativa nominal, sirviendo únicamente como una etiqueta geográfica. Sin embargo, se optó por una transformación a variable cualitativa ordinal (Accidentes por nivel de riesgo en los estados) .Esta reclasificación se fundamenta en la densidad de accidentes acumulada, permitiendo establecer una jerarquía. Al categorizar los estados en siete niveles (desde "Muy bajo" hasta "Muy alto"), la variable adquiere un valor predictivo y comparativo, transformando datos de ubicación en un indicador de riesgo

1 cargar datos, librerias y Diccionario de estados

library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(knitr)
library(kableExtra)
## 
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
datos <- read.csv("database (1).csv", header = TRUE, sep = ",", dec = ".")

## diccionario de estados 

estado_nombre <- c(
  "AL"="Alabama","AK"="Alaska","AZ"="Arizona","AR"="Arkansas",
  "CA"="California","CO"="Colorado","CT"="Connecticut",
  "DE"="Delaware","FL"="Florida","GA"="Georgia","HI"="Hawaii",
  "ID"="Idaho","IL"="Illinois","IN"="Indiana","IA"="Iowa",
  "KS"="Kansas","KY"="Kentucky","LA"="Louisiana","ME"="Maine",
  "MD"="Maryland","MA"="Massachusetts","MI"="Michigan",
  "MN"="Minnesota","MS"="Mississippi","MO"="Missouri",
  "MT"="Montana","NE"="Nebraska","NV"="Nevada",
  "NH"="New Hampshire","NJ"="New Jersey","NM"="New Mexico",
  "NY"="New York","NC"="North Carolina","ND"="North Dakota",
  "OH"="Ohio","OK"="Oklahoma","OR"="Oregon",
  "PA"="Pennsylvania","RI"="Rhode Island","SC"="South Carolina",
  "SD"="South Dakota","TN"="Tennessee","TX"="Texas",
  "UT"="Utah","VT"="Vermont","VA"="Virginia",
  "WA"="Washington","WV"="West Virginia","WI"="Wisconsin",
  "WY"="Wyoming"
)

2 Tabla de frecuencia

freq_estado <- datos %>%
  mutate(Estado = estado_nombre[Accident.State]) %>%
  filter(!is.na(Estado)) %>%
  count(Estado, name = "ni")

freq_estado <- freq_estado %>%
  mutate(
    Nivel_Riesgo = ntile(ni, 7),
    Nivel_Riesgo = factor(
      Nivel_Riesgo,
      levels = 1:7,
      labels = c("Muy bajo", "Bajo", "Medio-bajo", "Medio",
                 "Medio-alto", "Alto", "Muy alto"),
      ordered = TRUE
    )
  )

tabla_final <- freq_estado %>%
  group_by(Nivel_Riesgo) %>%
  summarise(
    Estados = paste(sort(Estado), collapse = ", "),
    ni = sum(ni),
    .groups = "drop"
  ) %>%
  mutate(
    hi = round((ni / sum(ni)) * 100, 2)
  )

fila_total <- data.frame(
  Nivel_Riesgo = "TOTAL",
  Estados = "—",
  ni = sum(tabla_final$ni),
  hi = 100
)

tabla_resumen <- bind_rows(
  tabla_final %>% mutate(Nivel_Riesgo = as.character(Nivel_Riesgo)),
  fila_total
)
kable(
  tabla_resumen,
  col.names = c("Nivel de Riesgo", "Estados incluidos",
                "Frecuencia absoluta (ni)", "Frecuencia relativa (%)"),
  align = "clcc",
  caption = "Tabla 1. Frecuencia de accidentes por nivel de riesgo"
) %>%
  kable_styling(
    full_width = FALSE,
    position = "center",
    bootstrap_options = c("striped", "hover", "condensed")
  ) %>%
  row_spec(nrow(tabla_resumen), bold = TRUE)
Tabla 1. Frecuencia de accidentes por nivel de riesgo
Nivel de Riesgo Estados incluidos Frecuencia absoluta (ni) Frecuencia relativa (%)
Muy bajo Connecticut, Hawaii, Idaho, Maine, Massachusetts, Nevada, West Virginia 15 0.54
Bajo Florida, Maryland, Oregon, South Dakota, Tennessee, Utah, Washington 51 1.83
Medio-bajo Alaska, Arkansas, Georgia, Kentucky, New York, North Carolina, South Carolina 100 3.59
Medio Alabama, Colorado, Michigan, Nebraska, Virginia, Wisconsin 143 5.14
Medio-alto Iowa, Mississippi, Missouri, Montana, North Dakota, Pennsylvania 244 8.77
Alto Indiana, Minnesota, New Jersey, New Mexico, Ohio, Wyoming 409 14.70
Muy alto California, Illinois, Kansas, Louisiana, Oklahoma, Texas 1820 65.42
TOTAL 2782 100.00

3 Graficas

3.1 Gráfica N1: Distribución de accidentes por nivel de riesgo

datos_n1 <- tabla_final %>%
  filter(Nivel_Riesgo != "TOTAL")

ggplot(datos_n1, aes(x = reorder(Nivel_Riesgo, -ni), y = ni)) +
  geom_bar(stat = "identity", width = 0.7, fill = "#AED6F1", color = "black") +
  labs(
    title = "Gráfica N1. Clasificación de los accidentes por nivel de riesgo",
    x = "Nivel de riesgo",
    y = "cantidad"
  ) +
  theme_classic() +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.text = element_text(color = "black")
  ) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.1)))

3.2 Gráfica N2: Clasificación Global de Accidentes por Nivel de Riesgo

ggplot(datos_n1, aes(x = reorder(Nivel_Riesgo, -ni), y = ni)) +
  geom_bar(stat = "identity", width = 0.7, fill = "#AED6F1", color = "black") +
  labs(
    title = "Gráfica N2. Distribución global de accidentes según nivel de riesgo",
    x = "Nivel de riesgo",
    y = "Cantidad"
  ) +
  scale_y_continuous(
    limits = c(0, 3000),
    breaks = seq(0, 3000, 500),  # marcas cada 500 (opcional, recomendado)
    expand = c(0, 0)
  ) +
  theme_classic() +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.text = element_text(color = "black")
  )

3.3 Gráfica N3: Porcentaje global de accidentes por nivel de riesgo

datos_n3 <- tabla_final %>%
  filter(Nivel_Riesgo != "TOTAL")

ggplot(datos_n3, aes(x = reorder(Nivel_Riesgo, -hi), y = hi)) +
  geom_bar(stat = "identity", width = 0.7, fill = "#AED6F1", color = "black") +
  labs(
    title = "Gráfica N3. Distribución porcentual de los accidentes por nivel de riesgo",
    x = "Nivel de riesgo",
    y = "Porcentaje (%)"
  ) +
  scale_y_continuous(
    limits = c(0, 100),
    breaks = seq(0, 100, 20),
    expand = c(0, 0)
  ) +
  theme_classic() +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.text = element_text(color = "black")
  )

3.4 Gráfica N4: Porcentaje local de accidentes por nivel de riesgo

ggplot(datos_n3, aes(x = reorder(Nivel_Riesgo, -hi), y = hi)) +
  geom_bar(stat = "identity", width = 0.7, fill = "#AED6F1", color = "black") +
  labs(
    title = "Gráfica N4. Distribución porcentual de los accidentes por nivel de riesgo",
    x = "Nivel de riesgo",
    y = "Porcentaje (%)"
  ) +
  scale_y_continuous(
    limits = c(0, 70),
    breaks = seq(0, 70, 10),
    expand = c(0, 0)
  ) +
  theme_classic() +
  theme(
    plot.title = element_text(face = "bold", hjust = 0.5),
    axis.text = element_text(color = "black")
  )

4 Diagrama circular

4.1 Grafica N5: Diagrama circular de accidentes por nivel de riesgo

datos_pie <- tabla_final %>%
  filter(Nivel_Riesgo != "TOTAL") %>%
  arrange(desc(hi)) %>%
  mutate(
    Leyenda_Pct = factor(
      paste0(Nivel_Riesgo, " (", round(hi, 1), "%)"),
      levels = paste0(Nivel_Riesgo, " (", round(hi, 1), "%)")
    )
  )

colores_suaves <- c(
  "#2E86C1", "#3498DB", "#5DADE2",
  "#85C1E9", "#AED6F1", "#D6EAF8", "#EBF5FB"
)[seq_len(nlevels(datos_pie$Leyenda_Pct))]

ggplot(datos_pie, aes(x = 1, y = hi, fill = Leyenda_Pct)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  coord_polar(theta = "y") +
  scale_fill_manual(values = colores_suaves) +
  labs(
    title = "Gráfica N5: Distribución porcentual de accidentes  por nivel de riesgo",
    fill = "Nivel de riesgo"
  ) +
  theme_void() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold", size = 14),
    legend.text = element_text(size = 10)
  )

5 Indicadores estadísticos

# 1. Preparar datos para el cálculo 
datos_stats <- tabla_final %>%
  filter(Nivel_Riesgo != "TOTAL") %>%
  mutate(
    Nivel_Riesgo = factor(Nivel_Riesgo, 
                          levels = c("Muy bajo", "Bajo", "Medio-bajo", "Medio", 
                                     "Medio-alto", "Alto", "Muy alto"), 
                          ordered = TRUE),
    Hi_acum = cumsum(hi) # Frecuencia relativa acumulada para la Mediana
  )

# 2. CÁLCULO DE LA MODA

moda_valor <- datos_stats %>%
  slice_max(ni, n = 1) %>%
  pull(Nivel_Riesgo)

# 3. CÁLCULO DE LA MEDIANA
mediana_valor <- datos_stats %>%
  filter(Hi_acum >= 50) %>%
  slice(1) %>%
  pull(Nivel_Riesgo)

# 4. Mostrar resultados
stats_table <- data.frame(
  Indicador = c("Moda", "Mediana"),
  Valor = c(as.character(moda_valor), as.character(mediana_valor))
)

kable(stats_table, 
      caption = "Tabla de indicadores",
      align = "lc") %>%
  kable_styling(full_width = FALSE, bootstrap_options = c("striped", "bordered"))
Tabla de indicadores
Indicador Valor
Moda Muy alto
Mediana Muy alto

6 Conclusiones

El análisis estadístico revela que la Moda para la variable de niveles de riesgo es ‘Muy alto’, con un total de 1,818 registros. Esto representa el 65.04% de los accidentes totales, lo que evidencia una alta concentración de accidentes en los estados de California, Illinois, Kansas, Louisiana, Oklahoma, Texas . Asimismo, la Mediana de la distribución se ubica en el nivel ‘Muy alto’. Esto indica que al menos el 50% de los datos se encuentran en la categoría máxima de la escala.