1. Introducción

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 %).

2. Dashboard de indicadores

Comparendos de tránsito

Abril y Mayo 2010 · Barranquilla · Resumen de indicadores clave

Total comparendos
2.120
Abril + Mayo
Valor total
$646.067.500
Suma de costos
Fin de semana
36,2 %
768 casos
Promedio diario
46,1
46 días
Automóviles
91,4 %
1.938 de 2.120
Exceso de velocidad
76,7 %
1.626 casos

Distribución por infracción

Comparendos por mes

2.1. Librerías utilizadas

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 cursor

3. Objetivo

El 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.

4. Análisis de las consultas

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.

4.1. Infracciones por tipo de vehículo, infracción y mes

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

  • Autos: 1.938 infracciones (636 en abril y 1.302 en mayo). Motos: 182 (76 en abril y 106 en mayo). Proporción AUTO:MOTO de aproximadamente 10,6 a 1, es decir, 91,4 % frente a 8,6 %.
  • Exceso de velocidad: primera causa en ambos vehículos y en ambos meses, con 531 casos en abril y 1.095 en mayo.
  • Motos: las infracciones se concentran en exceso de velocidad (66 en abril y 93 en mayo) y luz roja (8 y 13). No respetar el paso de peatones solo se registra en autos (43 en abril y 62 en mayo).
  • Sentido contrario: 4 casos en total (2 en auto y 2 en moto), todos en abril.
  • Variación entre meses: los autos aumentan 104,7 % (de 636 a 1.302) y las motos 39,5 % (de 76 a 106).

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.

4.2. Extranjeros con comparendos por mes

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

  • 6 comparendos entre 5 personas distintas (0,3 % de la base): 2 en abril y 4 en mayo.
  • Una sola persona tiene dos comparendos, ambos en mayo y con apenas dos días de diferencia; las demás tienen uno.
  • 5 de los 6 comparendos son por exceso de velocidad ($257.500 cada uno) y 1 por no detenerse ante una luz roja o amarilla ($515.000). En conjunto aportan $1.802.500.
  • Todos los infractores son hombres y se movilizaban en automóvil.

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.

4.3. Las 15 personas con mayor valor en comparendos

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

Top 15: empresas frente a personas naturales
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 15 personas o entidades suman $93.215.000, el 14,4 % del valor de toda la base. El resto del dinero está repartido entre más de 1.200 titulares con pocos comparendos cada uno.
  • LEASING BANCOLOMBIA S.A. C.F.: $19.827.500 (21,3 % del top 15), con 61 comparendos; es el mayor pagador.
  • TRANSPORTES MST Y CIA S EN C: $13.905.000 (14,9 %).
  • FINANCIERA INTERNACIONAL S.A.: $10.557.500 (11,3 %).
  • LEASING DE OCCIDENTE S.A. C.F.: $9.527.500 (10,2 %).
  • LILIANA ROZO PINZON: $7.467.500 (8 %), la primera persona natural del ranking.
  • Los puestos restantes se reparten entre $2.575.000 y $5.922.500 cada uno.

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:

  • Está fragmentado por la forma de escribir los nombres: 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.
  • Los últimos seis puestos están empatados en $2.575.000, por lo que el orden entre ellos es arbitrario.

4.4. Infracciones de fin de semana por género, vehículo e infracció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")
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")
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:

  • En fin de semana se registraron 768 comparendos (36,2 % de la base): 396 en domingo y 372 en sábado.
  • Exceso de velocidad: 614 casos (79,9 %), por encima de su peso en toda la base (76,7 %). Le sigue no detenerse ante luz roja o amarilla (113 casos); sentido contrario registra un único caso, en sábado.
  • Por género: las mujeres son el grupo con más comparendos (369, el 48 % del total), por encima de los hombres y de las empresas.
  • Por vehículo: los autos concentran casi todos los casos; las motos suman solo 63 comparendos de fin de semana (35 hombres, 23 mujeres y 5 empresas).
  • Sábado frente a domingo (exceso de velocidad): el domingo hay más comparendos de mujeres y hombres (147 y 96) que el sábado (125 y 89); en las empresas ocurre lo contrario.
  • Paso de peatones: más frecuente en domingo (25) que en sábado (15).

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.

4.5. Valor de los comparendos por día de la semana y mes

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 leyenda

Cifras principales:

  • Los comparendos suman $646.067.500: $218.875.000 en abril y $427.192.500 en mayo, es decir, el gasto prácticamente se duplicó (+95,2 %).
  • DOMINGO es el día de mayor valor ($116.647.500, 18,1 % del total), seguido de SÁBADO ($110.467.500). Entre los dos reúnen el 35,2 % del dinero.
  • Abril: la línea es casi plana, entre 26,8 y 38,6 millones por día; el viernes es el más alto (38,6 millones) y el sábado y el jueves los más bajos (26,8 millones).
  • Mayo: el valor se dispara el sábado (83,7 millones) y el domingo (88,3 millones), mientras que de lunes a viernes oscila entre 43,3 y 58,7 millones.
  • Variación: sábado y domingo crecen +212 % entre abril y mayo; el viernes apenas +12 %.

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.

4.6. Personas con cinco o más comparendos

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

  • Solo 44 de las 1.248 personas o entidades (3,5 %) tienen cinco o más comparendos, pero acumulan 463 comparendos, el 21,8 % de la base.
  • De esos titulares reincidentes, 17 son empresas y 27 son personas naturales.
  • LEASING BANCOLOMBIA S.A. C.F. es el titular con más comparendos (61), seguido de TRANSPORTES MST Y CIA S EN C (48) y FINANCIERA INTERNACIONAL S.A. (32).
  • LILIANA ROZO PINZON es la persona natural con más comparendos: 23 de sus 27 son por exceso de velocidad.
  • 12 de los 44 reincidentes tienen todos sus comparendos en un único tipo de infracción (en 12 de ellos, exceso de velocidad).
  • En el otro extremo, 898 titulares (72 %) tienen un único comparendo, que equivalen al 42,4 % de la base; los 350 titulares con más de un comparendo acumulan el 57,6 % restante.

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.

5. Conclusiones

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.

6. Referencias

  • Base de datos de comparendos: libro bd_comparendoa_jariunasudea.xlsx, hoja BD Comparendos Limpia (consultas 1 a 6 en las hojas Consulta 1 a Consulta 6).
  • R Core Team. R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing.
  • Wickham, H. et al. Paquetes dplyr, tidyr, ggplot2, readxl y scales.
  • Xie, Y. knitr y rmarkdown: generación de informes dinámicos en R.