El control del cumplimiento de las normas de tránsito es una de las principales herramientas con que cuentan las autoridades municipales para regular el comportamiento vial de conductores, peatones y demás actores que hacen uso de las vías. La imposición de comparendos busca desincentivar conductas que ponen en riesgo la seguridad vial, al tiempo que constituye una fuente de información valiosa para identificar los tipos de infracción más frecuentes, los periodos de mayor actividad sancionatoria y los patrones de reincidencia de los infractores.
En este contexto se inscribe el presente informe, centrado en el análisis de los comparendos de tránsito impuestos en Barranquilla en 2010, a partir de una base de datos de 2.120 comparendos distribuidos en cuatro códigos de infracción (64, 67, 76 y 77). El código 64 concentra el 76,7 % del total de registros (1.626 casos), seguido por el código 77 con 18,2 % (385 casos), el código 67 con 5,0 % (105 casos) y el código 76, con una incidencia marginal del 0,2 % (4 casos). Esta concentración evidencia que una sola conducta infractora explica la gran mayoría de los comparendos impuestos en el periodo analizado.
En términos económicos, el recaudo asociado a estas infracciones asciende a $646.067.500, de los cuales el código 64 aporta el 64,81 % ($418.695.000), el código 77 el 30,68 % ($198.275.000), el código 67 el 4,18 % ($27.037.500) y el código 76 apenas el 0,32 % ($2.060.000). En este caso, la participación en el recaudo guarda una relación cercana con la participación en número de casos, dado que los códigos 64 y 67 comparten el mismo costo unitario ($257.500), al igual que los códigos 76 y 77 ($515.000).
El presente documento desarrolla este análisis mediante consultas construidas sobre la base de datos de comparendos, que permiten examinar la distribución de infracciones por código, por género del infractor, por mes y día de la semana, el recaudo estimado por tipo de infracción y la reincidencia de los diez infractores con mayor número de comparendos registrados. En conjunto, estos resultados buscan aportar elementos de juicio a las autoridades de tránsito de Barranquilla para orientar sus estrategias de control, pedagogía vial y proyección fiscal.
2.120
Total comparendos
$646.067.500
Recaudo estimado
BD 2010
Código 64
Código más frecuente
76,7%
46 días
Periodo analizado
12 abr – 27 may 2010
En Barranquilla, las infracciones de tránsito representan un problema persistente que afecta la movilidad y la seguridad vial de la ciudad. La información obtenida de la base de datos de comparendos ha sido analizada para proporcionar una visión más clara sobre cómo varían los casos reportados en términos de género, código de infracción, día, mes y reincidencia del infractor. Este análisis es crucial para identificar los tipos de infracción con mayor incidencia y para proyectar el recaudo económico esperado derivado de la aplicación de las sanciones vigentes.
Los datos utilizados en este estudio corresponden a la base de datos oficial de comparendos de tránsito de Barranquilla. Se han analizado varias dimensiones de los datos:
📊 Distribución por Código de Infracción: se calculó la cantidad total de comparendos registrados por cada código de infracción (64, 67, 76 y 77), visualizada mediante gráficos de barras interactivos. El código 64 concentra el 76,7% del total de registros, consolidándose como la infracción más frecuente.
🚻 Distribución por Género: se determinó la cantidad de comparendos según el género del infractor, reflejando la proporción de hombres, mujeres y empresas sancionadas. El grupo MUJER representa el 45,8% del total de comparendos impuestos.
💰 Recaudo Estimado: se proyectó el valor económico que representará cada código de infracción, aplicando los costos de referencia vigentes. El código 64 concentra el 64,8% del recaudo total estimado.
📅 Tendencias por Mes y Día: se analizó la cantidad de comparendos reportados en cada mes y día de la semana. El mes de MAYO concentra el 66,4% de los registros, mientras que el día DOMINGO acumula el 18,7% del total.
🏆 Reincidencia de Infractores: se identificaron las 10 personas con mayor número de comparendos registrados. En conjunto, estos 10 infractores representan el 6,8% del total de personas sancionadas (excluyendo empresas), evidenciando un nivel de reincidencia puntual pero relevante.
colnames()## [1] "No. MANDAMIENTO DE PAGO" "FECHA MANDAMIENTO DE PAGO"
## [3] "EJECUTADO" "TIPO DE IDENTIFICACION"
## [5] "No. IDENTIFICACION" "GENERO"
## [7] "COD. INFRACCION" "NOM.INFRACCION"
## [9] "COMPARENDO" "FECHA DE COMPARENDO"
## [11] "AÑO" "MES"
## [13] "NOM MES" "DIA"
## [15] "NOM DIA" "PLACA DE VEHICULO"
## [17] "VEHICULO" "COSTO_2010"
## No. MANDAMIENTO DE PAGO FECHA MANDAMIENTO DE PAGO EJECUTADO
## Length :2120 Length :2120 Length :2120
## N.unique :2119 N.unique : 1 N.unique :1248
## N.blank : 0 N.blank : 0 N.blank : 0
## Min.nchar: 9 Min.nchar: 10 Min.nchar: 7
## Max.nchar: 9 Max.nchar: 10 Max.nchar: 47
##
## TIPO DE IDENTIFICACION No. IDENTIFICACION GENERO COD. INFRACCION
## Length :2120 Min. :2.358e+05 Length :2120 Min. :64.00
## N.unique : 3 1st Qu.:3.273e+07 N.unique : 3 1st Qu.:64.00
## N.blank : 0 Median :7.214e+07 N.blank : 0 Median :64.00
## Min.nchar: 3 Mean :7.646e+08 Min.nchar: 5 Mean :66.53
## Max.nchar: 20 3rd Qu.:8.001e+08 Max.nchar: 7 3rd Qu.:64.00
## Max. :9.003e+09 Max. :77.00
## NOM.INFRACCION COMPARENDO FECHA DE COMPARENDO AÑO
## Length :2120 Length :2120 Min. :2010-04-12 00:00:00 Min. :2010
## N.unique : 4 N.unique :2102 1st Qu.:2010-04-27 00:00:00 1st Qu.:2010
## N.blank : 0 N.blank : 0 Median :2010-05-06 00:00:00 Median :2010
## Min.nchar: 30 Min.nchar: 8 Mean :2010-05-05 16:27:37 Mean :2010
## Max.nchar: 41 Max.nchar: 9 3rd Qu.:2010-05-16 00:00:00 3rd Qu.:2010
## Max. :2010-05-27 00:00:00 Max. :2010
## MES NOM MES DIA NOM DIA
## Min. :4.000 Length :2120 Min. : 1.00 Length :2120
## 1st Qu.:4.000 N.unique : 2 1st Qu.: 9.00 N.unique : 7
## Median :5.000 N.blank : 0 Median :16.00 N.blank : 0
## Mean :4.664 Min.nchar: 4 Mean :15.76 Min.nchar: 5
## 3rd Qu.:5.000 Max.nchar: 5 3rd Qu.:23.00 Max.nchar: 9
## Max. :5.000 Max. :30.00
## PLACA DE VEHICULO VEHICULO COSTO_2010
## Length :2120 Length :2120 Min. :257500
## N.unique :1457 N.unique : 2 1st Qu.:257500
## N.blank : 0 N.blank : 0 Median :257500
## Min.nchar: 5 Min.nchar: 4 Mean :304749
## Max.nchar: 6 Max.nchar: 4 3rd Qu.:257500
## Max. :515000
Se construyó la columna COSTO_2010, la cual asigna un
valor económico de referencia según el código de infracción registrado:
los códigos 64 y 67 corresponden a un valor de $257.500, mientras que
los códigos 76 y 77 corresponden a un valor de $515.000.
| Código Infracción | Costo Asignado | Cantidad |
|---|---|---|
| 64 | $257.500 | 1626 |
| 67 | $257.500 | 105 |
| 76 | $515.000 | 4 |
| 77 | $515.000 | 385 |
💡 Todos los gráficos a continuación son interactivos. Pasa el cursor sobre las barras para ver los valores exactos (cantidad y monto); cada barra muestra además su porcentaje directamente.
# --- Preparación de los datos ---
datos_p1 <- comparendo %>%
filter(`COD. INFRACCION` %in% c(64, 67, 76, 77)) %>% # Deja únicamente los registros de los códigos 64, 67, 76 y 77
count(`COD. INFRACCION`) %>% # Cuenta cuántos comparendos hay por cada código (crea la columna "n")
mutate(pct = n / sum(n), #Calcula el porcentaje en decimales
label_y = n + max(n) * 0.06) # Define la altura de la etiqueta:un 6% por encima de cada barra
# --- Construcción del gráfico ---
p1 <- datos_p1 %>%
ggplot(aes(x = factor(`COD. INFRACCION`), # Eje X: código de infracción tratado como categoría (texto)
y = n, # Eje Y: cantidad de comparendos contados
fill = factor(`COD. INFRACCION`), # Colorea cada barra según su código (un color distinto por barra)
text = paste0("Código: ", `COD. INFRACCION`, # Arma el texto del tooltip interactivo (cursor)
"<br>Registros: ", comma(n), # Salto de línea(Que no slaga el texto pegado+(coma))
"<br>Porcentaje: ", formato_pct(pct)))) + # Salto de línea + coma decimal
geom_col(width = 0.6, show.legend = FALSE) + # Dibuja las barras (ancho 60%) sin mostrar la leyenda
geom_text(aes(y = label_y, label = formato_pct(pct)), # Coloca el porcentaje como etiqueta sobre cada barra
size = 4.5, # Tamaño del texto de la etiqueta
color = "#0d3b66", # Color azul oscuro institucional
fontface = "bold") + # Etiqueta en negrita
scale_fill_manual(values = paleta_informe) + # Aplica la paleta de colores propia del informe
scale_y_continuous(labels = comma, # Muestra los números del eje Y con separador de miles
expand = expansion(mult = c(0, 0.35))) + # Deja 35% de espacio extra arriba para que las etiquetas no se corten
labs(title = "Registros por Código de Infracción", # Título del gráfico
x = "Código de Infracción", # Título del eje X
y = "Cantidad de Comparendos") + # Título del eje Y
tema_informe # Aplica el tema visual del informe (títulos, ejes y textos en negrita)
# --- Conversión a gráfico interactivo ---
estilo_plotly(ggplotly(p1, tooltip = "text")) # Convierte el gráfico de ggplot a plotly usando la columna "text" como tooltip, y aplica márgenes y barra de herramientas simplificadaLos comparendos se concentran predominantemente en el código 64, que representa el 76,7% de los registros, lo que supera de forma drástica a los demás códigos: el 77 con 18,2 %, el 67 con 5,0 % y el 76 con apenas 0,2 %.
# --- Preparación de los datos ---
datos_p2 <- comparendo %>%
count(GENERO) %>% # Cuenta cuántos comparendos hay por cada categoría de género (HOMBRE, MUJER, EMPRESA...)
mutate(pct = n / sum(n), # Proporción de cada género sobre el total
label_y = n + max(n) * 0.06) # Altura de la etiqueta: 6% por encima de cada barra
# --- Construcción del gráfico ---
p2 <- datos_p2 %>%
ggplot(aes(x = reorder(GENERO, -n), # Eje X: género ordenado de mayor a menor (el signo - invierte el orden)
y = n, # Eje Y: cantidad de comparendos
fill = GENERO, # Un color distinto por categoría de género
text = paste0("Género: ", GENERO, # Tooltip: nombre del género
"<br>Registros: ", comma(n), # Cantidad con separador de miles
"<br>Porcentaje: ", formato_pct(pct)))) + # Porcentaje con coma decimal
geom_col(width = 0.6) + # Dibuja las barras
geom_text(aes(y = label_y, label = formato_pct(pct)), # Etiqueta de porcentaje sobre cada barra
size = 4.5, color = "#0d3b66", fontface = "bold") + # Texto grande, azul oscuro y en negrita
scale_fill_manual(values = paleta_informe) + # Paleta de colores del informe
scale_y_continuous(labels = comma, # Separador de miles en el eje Y
expand = expansion(mult = c(0, 0.35))) + # Espacio extra arriba para las etiquetas
labs(title = "Distribución de Comparendos por Género", # Título del gráfico
x = "Género", # Título del eje X
y = "Cantidad") + # Título del eje Y
tema_informe + # Tema del informe
theme(legend.position = "none") # Oculta la leyenda (las categorías ya se identifican en el eje X)
# --- Conversión a interactivo ---
estilo_plotly(ggplotly(p2, tooltip = "text")) # Versión interactiva con tooltips personalizadosLas sanciones recaen principalmente sobre el grupo MUJER, con el 45,8% de los comparendos, seguido por los hombres con 32,2 % y las empresas con 22,0 %. Como el ejecutado es el titular del vehículo, el resultado indica a quién se sanciona y no necesariamente quién conducía.
# --- Preparación de los datos ---
datos_p4 <- comparendo %>% # Parte de la base completa de comparendos y guarda el resultado en "datos_p4"
filter(!is.na(COSTO_2010)) %>% # Descarta los registros sin costo asignado (solo deja los códigos 64, 67, 76 y 77)
group_by(`COD. INFRACCION`, NOM.INFRACCION) %>% # Agrupa por código de infracción y su nombre, para sumar el recaudo de cada uno
summarise(Total = sum(COSTO_2010, na.rm = TRUE), .groups = "drop") %>% # Suma el recaudo total de cada código; ".groups = drop" suelta la agrupación al terminar
arrange(desc(Total)) %>% # Ordena de mayor a menor recaudo, para que el código 64 se dibuje primero
mutate(
pct = Total / sum(Total), # Participación porcentual de cada código (ej. 0.648 = 64,8%)
pct_label = formato_pct(pct), # Convierte el decimal en texto con coma decimal (ej. "64,8 %"), igual que en el resto del informe
total_label = dollar(Total, prefix = "$", big.mark = "."), # Monto COMPLETO con separador de miles (ej. "$418.695.000"), sin abreviar a "M"
descripcion = str_to_sentence(NOM.INFRACCION), # Pone solo la primera letra en mayúscula (ej. "Velocidad superior...")
etiqueta_leyenda = paste0( # Arma el texto completo que se verá en la leyenda de cada porción
"<b>Cód. ", `COD. INFRACCION`, "</b> — ", # Código en negrita seguido de un guion largo
descripcion, " (", total_label, ")" # Nombre de la infracción + monto completo entre paréntesis
)
)
colores_p4 <- paleta_informe[1:nrow(datos_p4)] # Toma los primeros 4 colores de la paleta del informe, uno por cada código
# --- Construcción del gráfico ---
p4 <- plot_ly(
datos_p4, # Fuente de datos: la tabla resumida que acabamos de crear
labels = ~etiqueta_leyenda, # Texto de cada porción en la leyenda ("Cód. 64 — Descripción ($monto completo)"); el "~" indica "toma esta columna"
values = ~Total, # Tamaño de cada porción: el recaudo total de cada código
type = "pie", # Tipo de gráfico: pastel (el "hole" de abajo lo convierte en donut)
hole = 0.55, # Agujero central del 55% del radio: donut más ancho y moderno
sort = FALSE, # No reordena las porciones automáticamente: respeta el orden de mayor a menor ya calculado
text = ~pct_label, # Texto visible junto a cada porción: el porcentaje ya formateado con coma decimal
textinfo = "text", # Le dice a Plotly que use exactamente lo que pusimos en "text" (y no su porcentaje nativo con punto)
textposition = "outside", # Coloca TODAS las etiquetas fuera del donut, con una línea guía hacia su porción (así el 0,3% sí se ve)
outsidetextfont = list( # Estilo del texto que queda por fuera de las porciones
size = 15, # Tamaño de la etiqueta
color = colores_p4, # Cada porcentaje toma el MISMO color que su porción
family = "Montserrat" # Misma tipografía del informe
),
marker = list( # Configura el relleno y borde de las porciones
colors = colores_p4, # Colores de la paleta institucional para cada porción
line = list(color = "#ffffff", width = 2) # Borde blanco de 2px que separa visualmente cada porción
),
pull = 0.01, # Separa ligeramente todas las porciones del centro (1% de despegue sutil entre ellas)
hovertemplate = ~paste0( # Contenido del tooltip al pasar el cursor sobre cada porción
"<b>", descripcion, "</b>", # Nombre de la infracción en negrita
"<br>Recaudo: ", total_label, # Salto de línea + monto COMPLETO con separador de miles
"<br>Participación: ", pct_label, # Salto de línea + porcentaje con coma decimal
"<extra></extra>" # Elimina el recuadro secundario que Plotly agrega por defecto al tooltip
)
) %>%
layout( # Ajustes generales de apariencia del gráfico
title = list( # Configuración del título
text = "<b>Infracciones con Mayor Recaudo</b>", # Texto del título en negrita
x = 0.5, xanchor = "center", y = 0.97, # Lo centra horizontalmente y lo ubica casi en el borde superior
font = list(size = 17, color = "#0d3b66") # Tamaño 17 y color azul institucional
),
showlegend = TRUE, # Muestra la leyenda con los nombres de las infracciones
legend = list( # Configuración de la leyenda
orientation = "h", # Leyenda horizontal (en vez de vertical a la derecha)
x = 0.5, xanchor = "center", # Centrada horizontalmente
y = -0.15, # Ubicada debajo del donut (valores negativos la sacan del área del gráfico)
font = list(size = 12, color = "#2c3e50"), # Texto pequeño en gris oscuro
itemsizing = "constant" # Todos los íconos de color de la leyenda con el mismo tamaño, sin importar el valor que representan
),
margin = list(t = 60, b = 90, l = 60, r = 60) # Márgenes en píxeles: arriba, abajo (amplio por la leyenda), izquierda y derecha
) %>%
config( # Personaliza la barra de herramientas interactiva
displaylogo = FALSE, # Oculta el logo de Plotly
modeBarButtonsToRemove = list( # Elimina los botones que no sirven en un gráfico circular
"pan2d", "select2d", "lasso2d", # Quitar paneo y selección de área
"zoomIn2d", "zoomOut2d", # Quitar zoom por botones
"autoScale2d", "resetScale2d", # Quitar escalado automático y reinicio de ejes
"hoverClosestCartesian", "hoverCompareCartesian", # Quitar modos de comparación del cursor
"toggleSpikelines" # Quitar las líneas guía al pasar el cursor
)
)
p4 # Imprime el gráfico interactivo en el informeEl código 64 aporta la mayor parte del valor económico estimado, con el 64,8% del total, seguido por el código 77 con 30,7 %. Este último pesa más en valor que en casos (18,2 %) porque su sanción de $515.000 duplica la del código 64 ($257.500).
# --- Preparación de los datos ---
datos_p5 <- comparendo %>%
count(`NOM MES`) %>% # Cuenta cuántos comparendos hubo en cada mes
mutate(pct = n / sum(n), # Proporción de cada mes sobre el total
label_y = n + max(n) * 0.06) # Altura de la etiqueta: 6% por encima de cada barra
# --- Construcción del gráfico ---
p5 <- datos_p5 %>%
ggplot(aes(x = reorder(`NOM MES`, -n), # Meses ordenados de mayor a menor cantidad de comparendos
y = n, # Cantidad de comparendos
fill = n, # Intensidad del color según la cantidad (más comparendos = color más oscuro)
text = paste0("Mes: ", `NOM MES`, # Tooltip: nombre del mes
"<br>Registros: ", comma(n), # Cantidad formateada con miles
"<br>Porcentaje: ", formato_pct(pct)))) + # Porcentaje con coma decimal
geom_col(width = 0.6) + # Dibuja las barras
geom_text(aes(y = label_y, label = formato_pct(pct)), # Etiqueta de porcentaje sobre cada barra
size = 3.8, color = "#0d3b66", fontface = "bold") + # Texto ligeramente menor (hay 12 meses), azul y negrita
scale_fill_gradient(low = gradiente_bajo, high = gradiente_alto) + # Gradiente de color: celeste (menos) → azul oscuro (más)
scale_y_continuous(labels = comma, # Miles en el eje Y
expand = expansion(mult = c(0, 0.35))) + # Espacio extra arriba para las etiquetas
labs(title = "Comparendos por Mes", x = "Mes", y = "Cantidad") + # Título y etiquetas de ejes
tema_informe + # Tema del informe
theme(legend.position = "none", # Sin leyenda (el gradiente ya codifica la información)
axis.text.x = element_text(angle = 45, hjust = 1, face = "bold")) # Rota los nombres de los meses 45° para que no se encimen
# --- Conversión a interactivo ---
estilo_plotly(ggplotly(p5, tooltip = "text"), # Versión interactiva
margen = list(t = 50, r = 40, b = 90, l = 60)) # Margen inferior amplio por las etiquetas rotadasEl mes de MAYO concentra el 66,4% de los comparendos frente al 33,6 % de abril; sin embargo, la base cubre 19 días de abril y 27 de mayo, por lo que el aumento diario real es de 39 % (de 37,5 a 52,1 comparendos por día) y no el doble que sugieren las barras.
# --- Definición del orden cronológico de los días ---
orden_dias <- c("LUNES", "MARTES", "MIÉRCOLES", # Vector con los días de la semana...
"JUEVES", "VIERNES", "SÁBADO", "DOMINGO") # ...en orden cronológico, para que el eje X empiece en lunes y termine en domingo
# --- Preparación de los datos ---
datos_p6 <- comparendo %>%
count(`NOM DIA`) %>% # Cuenta los comparendos por cada día de la semana
mutate(pct = n / sum(n), # Proporción de cada día sobre el total
`NOM DIA` = factor(`NOM DIA`, levels = orden_dias)) %>% # Convierte el día en factor respetando el orden lunes→domingo (evita el orden alfabético)
arrange(`NOM DIA`) # Ordena las filas de la tabla según ese orden cronológico
# --- Construcción del gráfico ---
p6 <- datos_p6 %>%
ggplot(aes(x = `NOM DIA`, # Eje X: día de la semana (en orden lunes→domingo)
y = n, # Eje Y: cantidad de comparendos
group = 1, # Indica que todos los puntos pertenecen a una sola línea continua
text = paste0("Día: ", `NOM DIA`, # Tooltip: día
"<br>Registros: ", comma(n), # Cantidad con miles
"<br>Porcentaje: ", formato_pct(pct)))) + # Porcentaje
geom_line(color = "#0d3b66", size = 1.8) + # Línea que conecta los días, azul oscuro, grosor 1.8
geom_point(color = "#0d3b66", size = 4) + # Punto visible en cada día, mismo color, tamaño 4
geom_text(aes(y = n + max(n) * 0.08, label = formato_pct(pct)), # Etiqueta de porcentaje un 8% arriba de cada punto
size = 4, color = "#0d3b66", fontface = "bold") + # Etiqueta en negrita y color institucional
scale_y_continuous(labels = comma, # Miles en el eje Y
expand = expansion(mult = c(0, 0.35))) + # Espacio superior para que las etiquetas no se corten
labs(title = "Comparendos por Día", x = "Día", y = "Cantidad") + # Título y ejes
tema_informe + # Tema del informe
theme(legend.position = "none", # Sin leyenda
axis.text.x = element_text(angle = 45, hjust = 1, face = "bold")) # Días rotados 45° y en negrita
# --- Conversión a interactivo ---
estilo_plotly(ggplotly(p6, tooltip = "text"), # Versión interactiva
margen = list(t = 50, r = 40, b = 90, l = 60)) # Márgenes ajustados por las etiquetas rotadasEl día DOMINGO registra la mayor actividad con el 18,7% de los comparendos, y junto con el sábado (17,5 %) reúne el 36,2 % de los casos en solo 12 de los 46 días del periodo, mientras que el jueves es el de menor actividad con 12,1 %.
# --- Dato auxiliar ---
total_personas <- comparendo %>% filter(GENERO != "EMPRESA") %>% nrow() # Cuenta cuántas personas naturales (sin empresas) hay en la base, para calcular porcentajes individuales
# --- Preparación de los datos ---
datos_p7 <- comparendo %>%
filter(GENERO != "EMPRESA") %>% # Excluye a las empresas: solo personas naturales
count(EJECUTADO, sort = TRUE) %>% # Cuenta comparendos por persona (columna EJECUTADO) y ordena de mayor a menor
top_n(10, n) %>% # Se queda con las 10 personas con más comparendos
mutate(pct = n / total_personas, # Cada persona como porcentaje del total de personas sancionadas
EJECUTADO = str_wrap(EJECUTADO, width = 28), # Corta los nombres largos en líneas de máx. 28 caracteres para que quepan en el eje
label_x = n + max(n) * 0.2) # Posición de la etiqueta: 20% a la derecha del final de cada barra
# --- Construcción del gráfico ---
p7 <- datos_p7 %>%
ggplot(aes(x = reorder(EJECUTADO, n), # Nombres en el eje, ordenados de menor a mayor (la barra más larga queda arriba tras girar)
y = n, # Cantidad de comparendos (será el eje horizontal con coord_flip)
fill = n, # Color según cantidad: gradiente celeste → azul oscuro
text = paste0("Nombre: ", EJECUTADO, # Tooltip: nombre
"<br>Comparendos: ", comma(n), # Cantidad
"<br>Porcentaje del total: ", formato_pct(pct)))) + # Porcentaje sobre el total de personas
geom_col(width = 0.65) + # Dibuja las barras
geom_text(aes(y = label_x, label = formato_pct(pct)), # Etiqueta de porcentaje fuera de la barra
hjust = 0, # Alinea el texto hacia la derecha, iniciando en label_x
size = 4.5, color = "#0d3b66", fontface = "bold") + # Texto grande, azul y en negrita
coord_flip(clip = "off") + # Intercambia los ejes (barras horizontales); "clip = off" evita que el texto sobresaliente se recorte
scale_fill_gradient(low = gradiente_bajo, high = gradiente_alto) + # Gradiente de color según la cantidad
scale_y_continuous(labels = comma, # Miles en el eje de cantidades
limits = c(0, max(datos_p7$n) * 1.6), # Amplía el rango del eje al 160% para dar espacio a la etiqueta más larga
expand = expansion(mult = c(0, 0.45))) + # Espacio adicional al final del eje
labs(title = "Top 10 Personas con Más Comparendos", x = "Nombre", y = "Cantidad") + # Título y ejes
tema_informe + # Tema del informe
theme(legend.position = "none") # Sin leyenda
# --- Conversión a interactivo ---
estilo_plotly(ggplotly(p7, tooltip = "text") %>% # Convierte el gráfico a interactivo
plotly::style(cliponaxis = FALSE), # Evita que plotly recorte las etiquetas que sobresalen del área del eje
margen = list(t = 50, r = 110, b = 60, l = 200)) # Margen izquierdo amplio por los nombres largosUn solo infractor acumula 27 comparendos, 2,7 veces más que el segundo (10), y el grupo de personas mostrado equivale al 6,8% de los comparendos a personas naturales, lo que evidencia una reincidencia concentrada en casos puntuales. Por un empate en 6 comparendos, el gráfico incluye 13 personas en lugar de 10.
El análisis de 2.120 comparendos impuestos en Barranquilla entre el 12 de abril y el 27 de mayo de 2010 (46 días) muestra tres patrones: una infracción domina el volumen, la actividad se intensifica los fines de semana y un grupo reducido de infractores acumula una parte desproporcionada de las sanciones.
Concentración por infracción. El código 64 (velocidad superior a la máxima permitida) suma 1.626 registros (76,7 %), seguido por el 77 (no detenerse ante luz roja o amarilla) con 385 (18,2 %), el 67 (no respetar el paso de peatones) con 105 (5,0 %) y el 76 (transitar en sentido contrario) con 4 (0,2 %). Los códigos 64 y 77 reúnen el 94,9 % de los casos: dos conductas, ambas de alto riesgo vial, explican casi toda la actividad sancionatoria.
Género. Las mujeres concentran 970 comparendos (45,8 %), los hombres 683 (32,2 %) y las empresas 467 (22,0 %); es decir, a mujeres se les impusieron 1,4 veces más comparendos que a hombres. El código 64 predomina en los tres grupos (entre 74,7 % y 79,2 % de cada uno), por lo que la diferencia está en el volumen y no en el tipo de infracción. Como el ejecutado es el titular registrado, este resultado describe a quién se sanciona y no necesariamente a quién conducía.
Valor económico estimado. Aplicando los valores de referencia por código, el total asciende a $646.067.500: código 64, $418.695.000 (64,8 %); 77, $198.275.000 (30,7 %); 67, $27.037.500 (4,2 %); y 76, $2.060.000 (0,3 %). Los códigos 64 y 77 aportan el 95,5 %. El 77 genera el 30,7 % del valor con solo el 18,2 % de los casos, porque su sanción ($515.000) duplica la del 64 ($257.500). Es un valor potencial según la sanción, no recaudo efectivo.
Tendencias temporales. Abril registra 712 comparendos (33,6 %) y mayo 1.408 (66,4 %). Como la base cubre 19 días de abril y 27 de mayo, la diferencia real es de 37,5 frente a 52,1 comparendos diarios (+39 %). Por día de la semana, el domingo (396; 18,7 %) y el sábado (372; 17,5 %) suman el 36,2 % de los casos en solo 12 de los 46 días: un día de fin de semana promedia 64 comparendos frente a 39,8 de un día hábil (1,6 veces). El jueves es el de menor actividad (256; 12,1 %). Con solo seis semanas de datos no se puede afirmar un comportamiento estacional anual.
Reincidencia. Las personas con más comparendos son 13 (empate en 6 comparendos) y acumulan 113: 6,8 % de los comparendos a personas naturales (1.653) y 5,3 % del total. Un solo infractor suma 27 comparendos (23 por velocidad), 2,7 veces más que el segundo (10). La reincidencia es más amplia de lo que muestra el top: 290 de las 1.118 personas distintas (25,9 %) tienen dos o más comparendos y concentran 825 (49,9 %) de los comparendos a personas naturales.
Síntesis y recomendaciones. La velocidad (76,7 % de los casos y 64,8 % del valor estimado) es la prioridad de control; le sigue el cruce de semáforos en rojo, que por su mayor sanción pesa el doble por caso. Se recomienda reforzar los operativos los fines de semana, aplicar seguimiento individualizado y sanciones progresivas a los reincidentes, y ampliar el periodo de análisis antes de proyectar tendencias anuales.
Secretaría de Tránsito — Base de Datos de Comparendos.