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