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(ggplot2)

alcance_operador <- datos %>%
  group_by(Operator.ID) %>%
  summarise(Num_Estados = n_distinct(Accident.State))

alcance_operador <- alcance_operador %>%
  mutate(
    Alcance_Categoria = case_when(
      Num_Estados == 1 ~ "Operador Local (1 Estado)",
      Num_Estados >= 2 & Num_Estados <= 5 ~ "Operador Regional (2-5 Estados)",
      Num_Estados > 5 ~ "Operador Nacional (>5 Estados)",
      TRUE ~ "FALTANTE"
    )
  )

datos_final <- datos %>%
  left_join(alcance_operador, by = "Operator.ID")

conteo_alcance <- datos_final %>%
  group_by(Alcance_Categoria) %>%
  summarise(ni = n()) %>%
  ungroup() %>%
  mutate(
    porcentaje = ni / sum(ni),
    etiqueta = paste0(round(porcentaje * 100, 2), "%") 
  )
conteo_alcance$Alcance_Categoria <- factor(conteo_alcance$Alcance_Categoria, 
                                           levels = c("Operador Local (1 Estado)", 
                                                      "Operador Regional (2-5 Estados)", 
                                                      "Operador Nacional (>5 Estados)"))

ggplot(conteo_alcance, aes(x = "", y = porcentaje, fill = Alcance_Categoria)) +
  geom_bar(stat = "identity", width = 1, color = "white") +
  
  coord_polar("y", start = 0) +
  geom_text(aes(label = etiqueta), 
            position = position_stack(vjust = 0.5), 
            color = "black", 
            size = 4,
            fontface = "bold") + # Negrita para que se lea mejor
  
  labs(
    title = "Accidentes por Alcance del Operador",
    fill = "Tipo de Operador" 
  ) +
  
  theme_void() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"),
        legend.position = "right") +
  scale_fill_brewer(palette = "Blues", direction = 1)

#Table de frecuencia
library(knitr)
library(kableExtra)
## 
## Adjuntando el paquete: 'kableExtra'
## The following object is masked from 'package:dplyr':
## 
##     group_rows
library(dplyr)
alcance_operador <- datos %>%
  group_by(Operator.ID) %>%
  summarise(Num_Estados = n_distinct(Accident.State))

alcance_operador <- alcance_operador %>%
  mutate(
    Alcance_Categoria = case_when(
      Num_Estados == 1 ~ "Operador Local (1 Estado)",
      Num_Estados >= 2 & Num_Estados <= 5 ~ "Operador Regional (2-5 Estados)",
      Num_Estados > 5 ~ "Operador Nacional (>5 Estados)",
      TRUE ~ "FALTANTE"
    )
  )

datos_final <- datos %>%
  left_join(alcance_operador, by = "Operator.ID")

tabla_resumen <- datos_final %>%
  group_by(Alcance_Categoria) %>%
  summarise(ni = n()) 
total_accidentes <- sum(tabla_resumen$ni)

tabla_calculada <- tabla_resumen %>%
  mutate(
    hi_num = (ni / total_accidentes) * 100,
    hi = sprintf("%.2f", hi_num)
  ) %>%
  select(Alcance_Categoria, ni, hi)
orden_alcance <- c("Operador Nacional (>5 Estados)", 
                   "Operador Regional (2-5 Estados)", 
                   "Operador Local (1 Estado)")

tabla_ordenada <- tabla_calculada %>%
  mutate(Alcance_Categoria = factor(Alcance_Categoria, levels = orden_alcance)) %>%
  arrange(Alcance_Categoria)
fila_total <- data.frame(
  Alcance_Categoria = "TOTAL",
  ni = total_accidentes,
  hi = "100.00"
)

tabla_final <- bind_rows(tabla_ordenada, fila_total)
colnames(tabla_final) <- c("Alcance del Operador", "ni (Accidentes)", "hi (%)")

kable(tabla_final, align = 'c', 
      caption = "Gráfico 1 Accidentes según el Operador") %>%
  kable_styling(full_width = FALSE, position = "center", 
                bootstrap_options = c("striped", "hover", "condensed")) %>%
  row_spec(nrow(tabla_final), bold = TRUE, background = "#f2f2f2")
Gráfico 1 Accidentes según el Operador
Alcance del Operador ni (Accidentes) hi (%)
Operador Nacional (>5 Estados) 1371 49.05
Operador Regional (2-5 Estados) 1026 36.71
Operador Local (1 Estado) 398 14.24
TOTAL 2795 100.00
#Gráfico de barras
library(ggplot2)
library(dplyr)
library(stringr) 

tabla_ordenada <- tabla_ordenada %>%
  mutate(Alcance_Categoria = reorder(Alcance_Categoria, ni))
ggplot(tabla_ordenada, aes(x = Alcance_Categoria, y = ni, fill = Alcance_Categoria)) +
  
  geom_bar(stat = "identity", width = 0.6, color = "black", alpha = 0.5) +

  scale_fill_brewer(palette = "Blues", direction = -1) +
  
  theme_minimal() +
  
  theme(
    legend.position = "none",
    axis.text.x = element_text(size = 7, face = "bold") 
  ) +
  
  # Mantenemos el ajuste de texto en dos líneas
  scale_x_discrete(labels = function(x) str_wrap(x, width = 15)) +
  
  labs(
    title = "Gráfica 2 Accidentes por Alcance del Operador",
    x = "Alcance del Operador",
    y = "Número de Accidentes"
  )

#Gráfico de barras
library(ggplot2)
library(dplyr)
library(stringr)

fila_total_grafico <- data.frame(
  Alcance_Categoria = "TOTAL",
  ni = total_accidentes
)
datos_general_grafico <- bind_rows(tabla_ordenada, fila_total_grafico) %>%
  mutate(
    Tipo = ifelse(Alcance_Categoria == "TOTAL", "Total General", "Causa Específica"),
    Alcance_Categoria = factor(Alcance_Categoria, levels = c(levels(tabla_ordenada$Alcance_Categoria), "TOTAL"))
  )

ggplot(datos_general_grafico, aes(x = Alcance_Categoria, y = ni, fill = Tipo)) +
  
  geom_bar(stat = "identity", width = 0.6, color = "black", alpha = 0.5) +
  scale_fill_manual(values = c("Causa Específica" = "blue", "Total General" = "darkred")) +
  
  theme_minimal() +
  
  theme(
    legend.position = "bottom", 
    legend.title = element_blank(),
    axis.text.x = element_text(size = 7, face = "bold") 
  ) +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 15)) +
  scale_y_continuous(limits = c(0, 5000), expand = expansion(mult = c(0, 0.05))) +
  
  labs(
    title = "Gráfico 3 Accidentes Generales por operadores",
    x = "Alcance del Operador",
    y = "Número de Accidentes"
  )