El tránsito vehicular y el cumplimiento de las normas que lo regulan constituyen un aspecto central de la movilidad. Su incumplimiento se traduce en comparendos, que representan tanto un riesgo para la seguridad vial como una carga económica para los infractores. Un comparendo es la orden formal que la autoridad de tránsito notifica a una persona o empresa por una presunta infracción; cuando no se paga a tiempo, la entidad inicia el cobro coactivo y emite un mandamiento de pago.
Este informe examina una base de datos de 2.120 comparendos de tránsito de 2010, tomada de la hoja BD Comparendos Limpia de un libro de Excel, correspondientes a infracciones cometidas entre el 12/04/2010 y el 27/05/2010, por un valor acumulado de $646.067.500. El análisis se realiza con el lenguaje R dentro de un documento R Markdown, de modo que el código, las tablas, los gráficos y las conclusiones quedan reunidos en un solo archivo.
A partir de la base se construyeron seis gráficos independientes, cada uno enfocado en una dimensión distinta del fenómeno: la cantidad de infracciones por tipo de vehículo, infracción y mes; los comparendos de ciudadanos extranjeros; el gasto acumulado por los quince mayores infractores; las infracciones de fin de semana por género; el valor de los comparendos por día de la semana; y las personas reincidentes. A través del análisis de cada gráfico se busca no solo describir los datos, sino interpretar las tendencias y señalar patrones que aporten a comprender el comportamiento de los infractores de tránsito en el período evaluado.
En cifras, la base reúne 2.120 comparendos impuestos a 1.248 personas o entidades distintas durante 46 días con registros, lo que equivale a un promedio de 46,1 comparendos por día y a un valor medio de $304.749 por comparendo. Abril aporta 712 comparendos (33,6 %) y mayo 1.408 (66,4 %). Los automóviles concentran el 91,4 % de los casos, el exceso de velocidad el 76,7 % y los fines de semana el 36,2 %; las mujeres titulares encabezan la base con el 45,8 %, seguidas por los hombres (32,2 %) y las empresas (22 %).
Comparendos de tránsito
Abril y Mayo 2010 · Barranquilla · Resumen de indicadores clave
Para este trabajo se emplearon las siguientes librerías de R:
| Librería | Función en el informe |
|---|---|
| readxl | Lectura de la base de datos desde el archivo de Excel (.xlsx) |
| dplyr | Filtrado, agrupación, conteo y resumen de los datos |
| tidyr | Reorganización de tablas (pivot_wider,
complete) |
| ggplot2 | Construcción de todos los gráficos del informe |
| scales | Formato de números (miles, pesos, porcentajes) y ajuste de etiquetas |
| knitr | Generación del documento y de las tablas con
kable() |
| plotly | Tooltips al pasar el cursor |
| htmltools | Dashboard embebido |
# Carga de las librerías usadas en el informe (ya están instaladas; si no, use install.packages("nombre"))
library(readxl) # lee archivos de Excel
library(dplyr) # manipula y resume datos
library(tidyr) # reorganiza tablas
library(ggplot2) # construye los gráficos
library(scales) # da formato a números y etiquetas
library(knitr) # genera el documento y las tablas
library(htmltools) # dashboard embebido
library(plotly) # tooltips al pasar el cursorEl presente informe tiene como propósito analizar, mediante el lenguaje R, la base de datos de comparendos de tránsito correspondiente a los meses de abril y mayo del año 2010, con el fin de identificar patrones de comportamiento en las infracciones registradas según el tipo de infracción, el tipo de vehículo, el género del infractor, el día de la semana y el valor del comparendo. Estos patrones permiten comprender la dinámica de las sanciones de tránsito en el período estudiado y sirven como insumo para la toma de decisiones o la formulación de estrategias de control vial.
A partir de la base de datos en Excel, se elaboraron seis consultas que permiten explorar y visualizar la información desde diferentes perspectivas. Para cada una, se presenta su respectivo gráfico, elaborado en R, junto con un análisis de los resultados obtenidos, con el fin de identificar tendencias, patrones y aspectos relevantes presentes en los datos.
El gráfico compara, mediante columnas apiladas, el volumen de infracciones cometidas en automóvil y en motocicleta según el tipo de infracción, en abril y en mayo.
# CONSULTA 1 – Infracciones × vehículo × mes
c1 <- df %>% count(mes_f, infraccion, vehiculo) # cuenta comparendos por mes, infracción y vehículo
# Tabla equivalente a la tabla dinámica de Excel
tab1 <- c1 %>% complete(mes_f, infraccion, vehiculo, fill = list(n = 0)) %>% # incluye con valor 0 las combinaciones sin casos
pivot_wider(names_from = vehiculo, values_from = n) %>% # AUTO y MOTO pasan a ser columnas
mutate(Total = AUTO + MOTO) %>% # total por mes e infracción
arrange(mes_f, infraccion) # ordena por mes e infracción
kable(tab1, col.names = c("Mes", "Infracción", "Auto", "Moto", "Total"), # muestra la tabla con nombres claros
caption = "Comparendos por mes, infracción y tipo de vehículo")| Mes | Infracción | Auto | Moto | Total |
|---|---|---|---|---|
| ABRIL | Exceso de velocidad | 465 | 66 | 531 |
| ABRIL | Luz roja o amarilla | 126 | 8 | 134 |
| ABRIL | Paso de peatones | 43 | 0 | 43 |
| ABRIL | Sentido contrario | 2 | 2 | 4 |
| MAYO | Exceso de velocidad | 1002 | 93 | 1095 |
| MAYO | Luz roja o amarilla | 238 | 13 | 251 |
| MAYO | Paso de peatones | 62 | 0 | 62 |
| MAYO | Sentido contrario | 0 | 0 | 0 |
# Columnas con muy pocos casos (menos de 40): se rotula su total encima, con el detalle por vehículo
c1_pocos <- c1 %>% complete(mes_f, infraccion, vehiculo, fill = list(n = 0)) %>% # incluye con 0 las combinaciones sin casos
group_by(mes_f, infraccion) %>% summarise(total = sum(n), auto = sum(n[vehiculo == "AUTO"]),
moto = sum(n[vehiculo == "MOTO"]), .groups = "drop") %>% filter(total < 40) %>% # solo las columnas que no caben con rótulo adentro
mutate(etiqueta = ifelse(total == 0, "0\n(sin casos)", # sin casos: lo dice explícitamente
paste0(total, "\n", auto, " auto\n", moto, " moto")))
ggplot(c1, aes(infraccion, n, fill = vehiculo)) + # eje x: infracción; color según vehículo
geom_col(width = 0.7, color = azul, linewidth = 0.25) + # columnas apiladas con borde azul oscuro
geom_text(data = filter(c1, n >= 40), # solo rotula las columnas con 40 casos o más
aes(label = n, color = vehiculo), # el color del texto depende del vehículo
position = position_stack(vjust = 0.5), size = 3.3) + # texto centrado dentro de cada segmento
geom_text(data = c1_pocos, aes(infraccion, total, label = etiqueta), # total encima de las columnas con pocos casos
inherit.aes = FALSE, vjust = -0.3, size = 3.2, lineheight = 0.9, color = azul) +
scale_color_manual(values = c(AUTO = "white", MOTO = azul), # texto blanco sobre rojo, azul sobre azul claro
guide = "none") + # sin leyenda para el color del texto
facet_wrap(~ mes_f) + # un panel para abril y otro para mayo
scale_x_discrete(labels = label_wrap(12)) + # divide los nombres largos en varias líneas
scale_fill_manual(values = col_veh, name = "Vehículo") + # rojo para auto, azul claro para moto
labs(title = "Cantidad de infracciones por tipo de vehículo, infracción y mes",
x = NULL, y = "Cantidad de comparendos")Cifras principales:
Los carros concentran de forma abrumadora el volumen de infracciones frente a las motocicletas, y el incremento entre abril y mayo es considerablemente más pronunciado entre los conductores de auto. Por eso la mezcla cambia: las motos pasan de representar el 10,7 % de los comparendos en abril al 7,5 % en mayo.
El gráfico toma el número de comparendos atribuidos a ciudadanos con cédula de extranjería, agrupados por persona y por mes.
# CONSULTA 2 – Extranjeros (cédula de extranjería)
c2 <- df %>% filter(grepl("^Cedula de Ext", tipo_identificacion)) %>% # se queda con los documentos que empiezan por "Cedula de Ext"
count(mes_f, ejecutado) # cuenta comparendos por mes y persona
kable(df %>% filter(grepl("^Cedula de Ext", tipo_identificacion)) %>% # tabla con el detalle de cada comparendo
select(Persona = ejecutado, Fecha = fecha_comparendo, Infraccion = infraccion, # selecciona y renombra columnas
Vehiculo = vehiculo, Valor = costo) %>% arrange(Fecha) %>% # ordena por fecha
mutate(Valor = pesos(Valor), Fecha = format(Fecha, "%d/%m/%Y")), # da formato a valor y fecha
caption = "Comparendos de personas con cédula de extranjería")| Persona | Fecha | Infraccion | Vehiculo | Valor |
|---|---|---|---|---|
| LESDER RAMON BEJERANO | 21/04/2010 | Exceso de velocidad | AUTO | $257.500 |
| JOANN VITEK | 26/04/2010 | Exceso de velocidad | AUTO | $257.500 |
| ALOIS THUNKER | 06/05/2010 | Exceso de velocidad | AUTO | $257.500 |
| FADI DAOUD BASSAM | 16/05/2010 | Exceso de velocidad | AUTO | $257.500 |
| FADI DAOUD BASSAM | 18/05/2010 | Exceso de velocidad | AUTO | $257.500 |
| MICHAEL FREDERICK SMITH | 20/05/2010 | Luz roja o amarilla | AUTO | $515.000 |
ggplot(c2, aes(ejecutado, n, fill = mes_f)) + geom_col(width = 0.55, color = azul, linewidth = 0.25) + # eje x: persona; color según el mes
geom_text(aes(label = n), vjust = -0.4, size = 3.8, color = azul) +
scale_x_discrete(labels = label_wrap(14)) + # nombres en varias líneas
scale_y_continuous(breaks = 0:3, expand = expansion(mult = c(0, 0.18))) + # eje y solo con enteros de 0 a 3
scale_fill_manual(values = col_mes, name = "Mes") + labs(title = "Extranjeros con comparendos por mes", # azul claro para abril, rojo para mayo
x = NULL, y = "Cantidad de comparendos")Cifras principales:
Por su tamaño, este grupo es irrelevante para el valor total, pero muestra que la base incluye infractores de otros países y respalda campañas informativas en otros idiomas.
El gráfico circular distribuye el gasto acumulado en comparendos entre los quince titulares que más dinero acumulan.
# CONSULTA 3 – Top 15 por valor acumulado
top15 <- df %>% group_by(ejecutado) %>% # agrupa por persona o entidad
summarise(comparendos = n(), # cantidad de comparendos
total = sum(costo), # valor acumulado
genero = first(genero), .groups = "drop") %>% # género o tipo de titular (persona o empresa)
slice_max(total, n = 15, with_ties = FALSE) %>% mutate( # se queda con los 15 de mayor valor
p_top = total / sum(total), # % dentro del top 15
p_base = total / sum(df$costo) # % dentro de toda la base
)
kable(top15 %>% # tabla del top 15
select(-genero) %>% mutate(total = pesos(total), p_top = pct(p_top), p_base = pct(p_base)), # quita la columna de género (solo se usa para clasificar)
col.names = c("Persona o entidad", "Comparendos", "Valor total",
"% del top 15", "% de toda la base"),
caption = "Las 15 personas o entidades con mayor valor en comparendos")| Persona o entidad | Comparendos | Valor total | % del top 15 | % de toda la base |
|---|---|---|---|---|
| LEASING BANCOLOMBIA S.A. C.F. | 61 | $19.827.500 | 21,3 % | 3,1 % |
| TRANSPORTES MST Y CIA S EN C | 48 | $13.905.000 | 14,9 % | 2,2 % |
| FINANCIERA INTERNACIONAL S.A. | 32 | $10.557.500 | 11,3 % | 1,6 % |
| LEASING DE OCCIDENTE S.A. C.F. | 28 | $9.527.500 | 10,2 % | 1,5 % |
| LILIANA ROZO PINZON | 27 | $7.467.500 | 8,0 % | 1,2 % |
| LEASING DE CREDITO S.A. | 21 | $5.922.500 | 6,4 % | 0,9 % |
| UINON FAMILIAR CHARRIS S.EN C | 13 | $4.120.000 | 4,4 % | 0,6 % |
| G.M.A.C. FINANCIERA DE COLOMBI | 14 | $3.605.000 | 3,9 % | 0,6 % |
| ENRIQUE JESUS ARRIETA JIMENEZ | 7 | $2.832.500 | 3,0 % | 0,4 % |
| Benemotors S A S | 8 | $2.575.000 | 2,8 % | 0,4 % |
| ELVIRA DEL CARMEN GARRIDO AREVALO | 10 | $2.575.000 | 2,8 % | 0,4 % |
| FRANCISCO COLLAVINI CIA LTDA | 8 | $2.575.000 | 2,8 % | 0,4 % |
| GMAC FINANCIERA DE COLOMBI | 7 | $2.575.000 | 2,8 % | 0,4 % |
| MARIO ANDRES VARON LOZANO | 6 | $2.575.000 | 2,8 % | 0,4 % |
| MIGUEL HERNANDO GARAY CALLE | 9 | $2.575.000 | 2,8 % | 0,4 % |
ggplot(top15, aes("", total, fill = reorder(ejecutado, -total))) + # una sola barra apilada que luego se vuelve circular
geom_col(width = 1, color = azul, linewidth = 0.3) + # porciones con borde azul oscuro
geom_text(aes(label = ifelse(p_top >= 0.05, pct(p_top, 0), "")), # porciones del 5 % o más: porcentaje dentro de la porción
position = position_stack(vjust = 0.5), color = "white", size = 3.3) +
geom_text(aes(x = 1.62, label = ifelse(p_top < 0.05, pct(p_top, 0), "")), # porciones menores al 5 %: porcentaje afuera de la rueda
position = position_stack(vjust = 0.5), color = azul, size = 3.1) +
coord_polar(theta = "y") + # convierte la barra en gráfico circular
scale_fill_manual(values = rango_colores(nrow(top15))) + # de rojo oscuro (mayor valor) a crema (menor valor)
theme_void() + # quita ejes y fondo
theme(legend.position = "right", legend.text = element_text(size = 8, color = azul), # leyenda a la derecha
plot.title = element_text(face = "bold", size = 14, color = azul)) +
labs(title = "Las 15 personas con mayores gastos en comparendos", fill = NULL)| Tipo | Cantidad | Suma | % del top 15 |
|---|---|---|---|
| Empresas (NIT) | 10 | $75.190.000 | 80,7 % |
| Personas naturales | 5 | $18.025.000 | 19,3 % |
Cifras principales:
Las empresas concentran 80,7 % del gasto del top 15, encabezadas por las entidades de leasing. Entre los 8 primeros puestos hay 5 entidades de leasing o financieras, que probablemente son propietarias de vehículos conducidos por otras personas: el comparendo le llega al titular del vehículo, no necesariamente al conductor. Entre las personas naturales hay una mezcla equilibrada de género (55,7 % mujeres y 44,3 % hombres del valor de ese subgrupo), pero el protagonismo real del ranking corresponde a empresas de leasing y financieras, probablemente por flotas con alto volumen de circulación.
Dos observaciones sobre la calidad del ranking:
G.M.A.C. FINANCIERA DE COLOMBI ($3.605.000) y
GMAC FINANCIERA DE COLOMBI ($2.575.000) son la misma
entidad. Unificadas sumarían $6.180.000 y quedarían por
encima de Leasing de Crédito. Conviene agrupar por número de
identificación.El gráfico muestra, mediante columnas agrupadas, cuántos comparendos se impusieron el sábado y el domingo a cada tipo de titular (mujeres, hombres y empresas), separados por tipo de infracción. El tipo de vehículo se resume en una tabla aparte para mantener el gráfico legible.
# CONSULTA 4 – Fin de semana × infracción × género × día
c4 <- df %>% filter(dow >= 6) %>% # solo sábados (6) y domingos (7)
mutate(dia_fin = ifelse(dow == 6, "Sábado", "Domingo"), # nombre del día de fin de semana
genero = factor(genero, levels = names(col_gen))) %>% # ordena los géneros: mujer, hombre, empresa
count(infraccion, genero, dia_fin) %>% # cuenta comparendos por infracción, género y día
complete(infraccion, genero, dia_fin, fill = list(n = 0)) # rellena con 0 las combinaciones sin datos
# Tabla de totales por infracción y día
tab4 <- c4 %>% group_by(infraccion, dia_fin) %>% # agrupa por infracción y día
summarise(total = sum(n), .groups = "drop") %>% # suma los comparendos
pivot_wider(names_from = dia_fin, values_from = total) %>% # sábado y domingo pasan a ser columnas
mutate(Total = rowSums(across(where(is.numeric)))) # suma de ambos días
kable(tab4, col.names = c("Infracción", names(tab4)[-1]), # muestra la tabla con bordes
caption = "Comparendos de fin de semana por infracción y día")| Infracción | Domingo | Sábado | Total |
|---|---|---|---|
| Exceso de velocidad | 314 | 300 | 614 |
| Luz roja o amarilla | 57 | 56 | 113 |
| Paso de peatones | 25 | 15 | 40 |
| Sentido contrario | 0 | 1 | 1 |
# Tabla de totales por vehículo y género
tab4b <- df %>% filter(dow >= 6) %>% # solo fin de semana
count(vehiculo, genero) %>% # cuenta por vehículo y género
pivot_wider(names_from = genero, values_from = n, values_fill = 0) %>% # los géneros pasan a ser columnas
mutate(Total = rowSums(across(where(is.numeric)))) # total por vehículo
kable(tab4b, col.names = c("Vehículo", names(tab4b)[-1]),
caption = "Comparendos de fin de semana por vehículo y género")| Vehículo | EMPRESA | HOMBRE | MUJER | Total |
|---|---|---|---|---|
| AUTO | 139 | 220 | 346 | 705 |
| MOTO | 5 | 35 | 23 | 63 |
ggplot(c4, aes(genero, n, fill = dia_fin)) + # eje x: género; color según el día
geom_col(aes(colour = n > 0), position = "dodge", width = 0.7, linewidth = 0.25) + # columnas lado a lado (sábado y domingo)
scale_colour_manual(values = c("TRUE" = azul, "FALSE" = "transparent"), guide = "none") + # borde solo en las columnas con datos (los ceros no se dibujan)
geom_text(aes(label = ifelse(n > 0, n, "")), position = position_dodge(width = 0.7), # escribe la cantidad (no escribe los ceros)
vjust = -0.4, size = 3.3, color = azul) + facet_wrap(~ infraccion, scales = "free_y") + # un panel por infracción, con eje y propio
scale_fill_manual(values = c(Sábado = mint, Domingo = pear), name = "Día") + # rojo para domingo (más casos), azul claro para sábado
scale_y_continuous(breaks = function(l) { b <- pretty(c(0, ceiling(max(l)))); b[abs(b - round(b)) < 1e-8] }, # el eje solo muestra números enteros (no hay 0,3 comparendos)
expand = expansion(mult = c(0, 0.15))) + # espacio superior para los textos
labs(title = "Comparendos de fin de semana por género e infracción",
x = NULL, y = "Cantidad de comparendos")Cifras principales:
Una posible explicación del predominio de la velocidad es que, con menos tráfico en sábado y domingo, aumenta la velocidad de circulación, aunque la base no permite confirmarlo.
Mediante un gráfico de líneas se compara, día por día, el valor total de los comparendos entre abril y mayo.
# CONSULTA 5 – Valor total por día de la semana y mes
c5 <- df %>% group_by(dia_f, mes_f) %>% # agrupa por día de la semana y mes
summarise(total = sum(costo), .groups = "drop") # suma el valor de los comparendos
# Tabla equivalente a la tabla dinámica
tab5 <- c5 %>% pivot_wider(names_from = mes_f, values_from = total) %>% # abril y mayo pasan a ser columnas
mutate(Total = ABRIL + MAYO) # suma de ambos meses
kable(tab5 %>% mutate(across(-dia_f, pesos)), col.names = c("Día", "Abril", "Mayo", "Total")) # da formato de pesos a todas las columnas menos el día| Día | Abril | Mayo | Total |
|---|---|---|---|
| LUNES | $30.127.500 | $58.710.000 | $88.837.500 |
| MARTES | $35.020.000 | $47.895.000 | $82.915.000 |
| MIÉRCOLES | $33.217.500 | $53.817.500 | $87.035.000 |
| JUEVES | $26.780.000 | $51.500.000 | $78.280.000 |
| VIERNES | $38.625.000 | $43.260.000 | $81.885.000 |
| SÁBADO | $26.780.000 | $83.687.500 | $110.467.500 |
| DOMINGO | $28.325.000 | $88.322.500 | $116.647.500 |
g5 <- ggplot(c5, aes(dia_f, total, color = mes_f, group = mes_f,
text = paste0(mes_f, " · ", dia_f, ": ", pesos(total)))) +
geom_line(linewidth = 1.15) + geom_point(size = 3) +
geom_text(aes(label = millon(total)), vjust = -1.2, size = 3.2, show.legend = FALSE) +
scale_color_manual(values = col_mes, name = "Mes") +
scale_y_continuous(labels = millon, limits = c(0, NA), expand = expansion(mult = c(0, 0.2))) +
labs(title = "Valor de los comparendos por día de la semana y mes",
x = NULL, y = "Valor total de los comparendos")
p5 <- ggplotly(g5, tooltip = "text")
for (i in seq_along(p5$x$data)) { # recorre las capas del gráfico
if (identical(p5$x$data[[i]]$mode, "text")) { # solo las capas de etiquetas de datos
p5$x$data[[i]]$textposition <- ifelse(identical(p5$x$data[[i]]$name, "MAYO"), "top center", # mayo (línea de arriba): etiqueta hacia arriba
"bottom center") # abril (línea de abajo): etiqueta hacia abajo
p5$x$data[[i]]$textfont$color <- azul # texto oscuro para que se lea
}
}
p5 %>% layout(hovermode = "closest", margin = list(t = 50, b = 90),
legend = list(title = list(text = "Mes", side = "top"))) # el título "Mes" va arriba de la leyendaCifras principales:
El crecimiento de mayo no se reparte de manera uniforme: se explica sobre todo por los fines de semana, y el día de mayor valor cambia de viernes (abril) a domingo (mayo), un desplazamiento que coincide con lo observado en la Consulta 4. Además, abril cubre menos días que mayo (19 frente a 27), así que parte de la distancia entre las dos líneas se debe al período observado y no solo a un cambio de comportamiento.
El gráfico de barras horizontales muestra los diez titulares con más comparendos entre quienes tienen cinco o más, separados por tipo de infracción. Se limita a diez para que el gráfico sea legible; la tabla siguiente da el detalle exacto.
# CONSULTA 6 – Reincidentes (≥ 5 comparendos)
reincidentes <- df %>% count(ejecutado, name = "total") %>% # comparendos por persona o entidad
filter(total >= 5) # se queda con quienes tienen 5 o más
top_reinc <- reincidentes %>% slice_max(total, n = 10, with_ties = FALSE) # los 10 reincidentes con más comparendos (de mayor a menor)
c6 <- df %>% filter(ejecutado %in% top_reinc$ejecutado) %>% # solo esos 10 titulares
count(ejecutado, infraccion) %>% # comparendos por titular e infracción
mutate(ejecutado = factor(ejecutado, levels = rev(top_reinc$ejecutado))) # fija el orden para que el mayor quede arriba
etiq6 <- top_reinc %>% # total de cada titular, para escribirlo al final de la barra
mutate(ejecutado = factor(ejecutado, levels = levels(c6$ejecutado))) # con el mismo orden de c6
g6 <- ggplot(c6, aes(ejecutado, n, fill = infraccion,
text = paste0(ejecutado, "\n", infraccion, ": ", n, " comparendos"))) +
geom_col(width = 0.7, color = azul, linewidth = 0.25) +
geom_text(data = etiq6, aes(ejecutado, total, label = total),
inherit.aes = FALSE, hjust = -0.3, size = 3.5, color = azul) + coord_flip() +
scale_x_discrete(labels = label_wrap(30)) + scale_y_continuous(expand = expansion(mult = c(0, 0.12))) +
scale_fill_manual(values = col_inf, name = "Infracción") +
labs(title = "Los 10 titulares con más comparendos", x = NULL, y = "Cantidad de comparendos") +
theme(legend.position = "bottom")
p6 <- ggplotly(g6, tooltip = "text")
for (i in seq_along(p6$x$data)) { # recorre las capas del gráfico
if (identical(p6$x$data[[i]]$mode, "text")) { # solo la capa con los totales
p6$x$data[[i]]$textposition <- "middle right" # el número queda a la derecha, al final de la barra
p6$x$data[[i]]$cliponaxis <- FALSE # que no se corte en el borde del gráfico
p6$x$data[[i]]$textfont$color <- azul # texto oscuro para que se lea
}
}
p6 %>% layout(hovermode = "closest", legend = list(orientation = "h", y = -0.2,
title = list(text = "Infracción", side = "top")), # el título "Infracción" va arriba de la leyenda
margin = list(t = 50, b = 120, l = 130, r = 40))# Tabla de los 10 reincidentes con más comparendos
top10_reinc <- df %>% filter(ejecutado %in% reincidentes$ejecutado) %>% # solo los reincidentes
count(ejecutado, infraccion) %>% # comparendos por persona e infracción
complete(ejecutado, infraccion, fill = list(n = 0)) %>% # rellena con 0
pivot_wider(names_from = infraccion, values_from = n) %>% # cada infracción pasa a ser una columna
mutate(Total = rowSums(across(where(is.numeric)))) %>% # suma de todas las infracciones por persona
arrange(desc(Total)) %>% # de mayor a menor
slice_head(n = 10) # los 10 primeros
kable(top10_reinc, col.names = c("Persona o entidad", levels(df$infraccion), "Total"),
caption = "Las 10 personas o entidades con más comparendos")| Persona o entidad | Exceso de velocidad | Luz roja o amarilla | Paso de peatones | Sentido contrario | Total |
|---|---|---|---|---|---|
| LEASING BANCOLOMBIA S.A. C.F. | 42 | 16 | 3 | 0 | 61 |
| TRANSPORTES MST Y CIA S EN C | 41 | 6 | 1 | 0 | 48 |
| FINANCIERA INTERNACIONAL S.A. | 21 | 9 | 2 | 0 | 32 |
| LEASING DE OCCIDENTE S.A. C.F. | 17 | 9 | 2 | 0 | 28 |
| LILIANA ROZO PINZON | 23 | 2 | 2 | 0 | 27 |
| LEASING DE CREDITO S.A. | 16 | 2 | 3 | 0 | 21 |
| G.M.A.C. FINANCIERA DE COLOMBI | 14 | 0 | 0 | 0 | 14 |
| UINON FAMILIAR CHARRIS S.EN C | 8 | 3 | 2 | 0 | 13 |
| ELVIRA DEL CARMEN GARRIDO AREVALO | 10 | 0 | 0 | 0 | 10 |
| MIGUEL HERNANDO GARAY CALLE | 8 | 0 | 0 | 1 | 9 |
Cifras principales:
El exceso de velocidad sigue siendo la infracción abrumadoramente dominante (alrededor de 3 de cada 4 casos), sin importar si el análisis se hace por género, por vehículo o por reincidencia. Aunque las personas naturales son más numerosas entre los titulares reincidentes, las empresas de transporte y de leasing concentran los valores individuales más altos. Que muchos reincidentes repitan siempre el mismo tipo de infracción sugiere una conducta persistente y no un descuido ocasional.
El análisis conjunto de los gráficos y de los resultados generales permite identificar patrones consistentes en toda la base. En primer lugar, entre abril y mayo hay un crecimiento generalizado, tanto en la cantidad de comparendos (de 712 a 1.408) como en su valor, impulsado principalmente por los fines de semana; sin embargo, como abril solo tiene 19 días en la base, el aumento real del promedio diario es de 39 %. En segundo lugar, el exceso de velocidad se mantiene como la conducta predominante en todas las divisiones analizadas (por vehículo, género, fin de semana y reincidencia), con el 76,7 % de los comparendos y el 64,8 % del valor; no detenerse ante una luz roja o amarilla pesa más en dinero (30,7 %) que en cantidad (18,2 %), porque cuesta el doble. En tercer lugar, los automóviles concentran la abrumadora mayoría de las infracciones frente a las motocicletas (91,4 %, una proporción cercana a 10,6 a 1), y los comparendos se concentran en sábado y domingo (36,2 % de los casos y 35,2 % del valor).
En cifras, los 2.120 comparendos suman $646.067.500, un promedio de $304.749 por comparendo y de 46,1 comparendos por día. Mayo concentra el 66,4 % de los comparendos y el 66,1 % del valor, frente al 33,6 % y el 33,9 % de abril. Los fines de semana pasaron de representar el 25 % de los comparendos en abril al 42 % en mayo. Por vehículo, los automóviles suman 1.938 comparendos y las motocicletas 182 (8,6 %); por titular, las mujeres reúnen el 45,8 %, los hombres el 32,2 % y las empresas el 22 %. Las quince personas o entidades con mayor valor acumulan $93.215.000, el 14,4 % del valor de toda la base.
Asimismo, las empresas de transporte y de leasing, más que las personas naturales, concentran los mayores montos individuales tanto en el gasto acumulado como en la reincidencia, lo que sugiere que el uso intensivo de flotas vehiculares incide directamente en la frecuencia de las sanciones. Una minoría de titulares (3,5 %) acumula el 21,8 % de los comparendos, mientras que los extranjeros representan una participación marginal (6 comparendos, 0,3 % de la base). Además, 898 titulares (72 %) tienen un único comparendo. Finalmente, la base registra al titular del vehículo y no al conductor, por lo que no permite calcular tasas de infracción. En conjunto, estos hallazgos evidencian la necesidad de dirigir los esfuerzos de control y sensibilización especialmente hacia el exceso de velocidad y hacia los operadores de flotas vehiculares, dado su peso significativo dentro del total de comparendos registrados.
bd_comparendoa_jariunasudea.xlsx, hoja BD Comparendos
Limpia (consultas 1 a 6 en las hojas Consulta 1 a
Consulta 6).dplyr, tidyr,
ggplot2, readxl y scales.