1 Introducción

Este informe aplica funciones estadísticas básicas con el lenguaje R al análisis de una base de datos de comparendos de tránsito registrados en la ciudad de Barranquilla entre el 12 de abril y el 27 de mayo de 2010. A través de tablas y gráficos se explora, describe y visualiza la información, con el fin de identificar patrones, tendencias y relaciones relevantes en las infracciones registradas.

1.1 Descripción general

La base de datos contiene los comparendos aplicados a conductores y propietarios de vehículos en Barranquilla (Atlántico). Cada registro incluye información del infractor (nombre, tipo y número de identificación y género), el código y el nombre de la infracción, la fecha del comparendo (completa y desglosada en año, mes, día, nombre del mes y nombre del día), la placa y el tipo de vehículo. En total, la base tiene 2.120 registros y 18 columnas; la última columna, costo_comparendo, fue agregada para este trabajo.

2 Aplicación de medidas y análisis

2.1 Comparendos por día de la semana

comparendos |>
  count(nom_dia, name = "cantidad") |>                # Cuenta los comparendos de cada día de la semana
  ggplot(aes(x = reorder(nom_dia, cantidad),          # Ordena los días de menor a mayor cantidad
             y = cantidad,
             fill = cantidad)) +                      # El color de cada barra depende de su cantidad
  geom_col() +                                        # Dibuja las barras
  geom_text(aes(label = cantidad),                    # Escribe el valor de cada barra...
            hjust = -0.2, size = 4) +                 # ...un poco a la derecha del final de la barra
  scale_fill_gradientn(colors = c(col_gris, col_ambar, col_rojo)) +  # Degradado tipo semáforo: de menos a más
  scale_y_continuous(expand = expansion(mult = c(0, 0.12))) +  # Deja espacio a la derecha para los números
  coord_flip() +                                      # Gira el gráfico: barras horizontales
  labs(title = "COMPARENDOS POR DÍA DE LA SEMANA",
       x = "DÍA", y = "CANTIDAD DE COMPARENDOS")      # (se quitó fill = "CANTIDAD" porque ya no hay leyenda)

El domingo (396) y el sábado (372) son los días con más comparendos: entre los dos suman 768, es decir, el 36,2 % del total. Entre semana, el lunes es el día con más comparendos (295) y el jueves el que menos tiene (256).

2.2 Comparendos por género

Se cuenta la cantidad de comparendos según el género registrado del infractor, que incluye la categoría EMPRESA para las personas jurídicas.

comparendos |>
  count(genero, name = "cantidad") |>                 # Cuenta los comparendos por género
  mutate(porcentaje = cantidad / sum(cantidad) * 100) |>   # Calcula qué porcentaje del total es cada género
  ggplot(aes(x = "", y = cantidad, group = genero)) + # Base del gráfico de torta (un solo grupo en X)
  geom_col(aes(fill = genero), width = 1) +           # Dibuja una barra apilada, coloreada por género
  coord_polar(theta = "y") +                          # Convierte la barra en un círculo (torta)
  geom_label(aes(label = paste0(format(round(porcentaje, 1), decimal.mark = ","), " %")),
             position = position_stack(vjust = 0.5),  # Lo centra dentro de cada porción
             fill = col_oscuro, color = col_crema) +  # Etiqueta oscura con letra crema
  scale_fill_manual(values = c("MUJER" = col_rojo,    # Elige el color de cada porción
                               "HOMBRE" = col_ambar,
                               "EMPRESA" = col_gris)) +
  labs(title = "COMPARENDOS POR GÉNERO",
       fill = "GÉNERO") +                             # Título de la leyenda (aquí sí se deja: sirve para saber qué color es qué)
  theme_void() +                                      # Quita ejes y fondo (ideal para tortas)
  theme(plot.title = element_text(hjust = 0.5,        # Centra el título
                                  face = "bold",      # En negrita
                                  color = col_oscuro))

Las mujeres figuran en 970 comparendos (45,8 %), los hombres en 683 (32,2 %) y las empresas en 467 (22,0 %). Este resultado describe quiénes aparecen en los comparendos, pero no permite afirmar que las mujeres cometan más infracciones, porque la base no dice cuántos conductores de cada género circulan. Por otro lado, la participación de las empresas es considerable, lo que sugiere reforzar los controles sobre las flotas de vehículos corporativos.

2.3 Recaudo total por tipo de infracción

Se suma el costo de los comparendos agrupados por tipo de infracción. Se trata del valor de los comparendos impuestos, no necesariamente del dinero que ya fue pagado.

recaudo <- comparendos |>                             # Guarda el resultado en una tabla llamada "recaudo"
  group_by(nom_infraccion) |>                         # Agrupa los comparendos por tipo de infracción
  summarise(cantidad = n(),                           # Por cada grupo: cuántos comparendos hay...
            total = sum(costo_comparendo, na.rm = TRUE)) |>   # ...y cuánto suman en pesos (ignorando vacíos)
  arrange(desc(total)) |>                             # Ordena de mayor a menor valor
  mutate(porcentaje = round(total / sum(total) * 100, 1))   # Calcula el % que representa cada infracción

knitr::kable(recaudo,                                 # Muestra la tabla con buena presentación
             col.names = c("Infracción", "Comparendos", "Valor total ($)", "% del valor"),   # Nombres de las columnas
             format.args = list(big.mark = ".", decimal.mark = ","))   # Puntos para miles y coma para decimales
Infracción Comparendos Valor total ($) % del valor
velocidad superior a la maxima permitida 1.626 418.695.000 64,8
No detenerse ante una luz roja o amarilla 385 198.275.000 30,7
No respetar el paso de peatones 105 27.037.500 4,2
Transitar en sentido contrario 4 2.060.000 0,3
recaudo |>
  mutate(etiqueta = scales::number(total / 1e6,       # Convierte el total a millones y le da formato de texto
                                   accuracy = 0.1,    # Un decimal
                                   prefix = "$",      # Signo peso al inicio
                                   suffix = " M",     # "M" de millones al final
                                   big.mark = ".", decimal.mark = ",")) |>
  ggplot(aes(x = reorder(nom_infraccion, total),      # Ordena las infracciones por valor
             y = total, fill = total)) +              # El color depende del valor
  geom_col() +                                        # Dibuja las barras
  geom_text(aes(label = etiqueta), hjust = -0.1, size = 4) +   # Escribe el valor al final de cada barra
  scale_fill_gradientn(colors = c(col_gris, col_ambar, col_rojo)) +   # Degradado tipo semáforo
  scale_x_discrete(labels = scales::label_wrap(30)) + # Parte los nombres largos en varias líneas
  scale_y_continuous(expand = expansion(mult = c(0, 0.3)),   # Deja espacio a la derecha para las etiquetas
                     labels = scales::label_number(scale = 1e-6, suffix = " M",
                                                   big.mark = ".", decimal.mark = ",")) +  # Eje Y en millones
  coord_flip() +                                      # Barras horizontales
  labs(title = "VALOR TOTAL DE LOS COMPARENDOS POR INFRACCIÓN",
       x = "INFRACCIÓN", y = "VALOR TOTAL (MILLONES DE PESOS)")

El valor total de los comparendos de la base es de $646.067.500. La velocidad superior a la máxima permitida concentra el mayor valor ($418.695.000, el 64,8 %), seguida de no detenerse ante una luz roja o amarilla ($198.275.000, el 30,7 %). Estas dos infracciones suman el 95,5 % del valor total. No respetar el paso de peatones aporta el 4,2 % ($27.037.500) y transitar en sentido contrario apenas el 0,3 % ($2.060.000), con solo 4 comparendos.

2.4 Comparendos por tipo de vehículo

comparendos |>
  count(vehiculo, name = "cantidad") |>                  # Cuenta los comparendos por tipo de vehículo
  mutate(porcentaje = round(cantidad / sum(cantidad) * 100, 1),  # Porcentaje de cada tipo
         etiqueta = paste0(cantidad, " (", format(porcentaje, decimal.mark = ","), " %)")) |> # Texto que se mostrará: cantidad (porcentaje %)
  ggplot(aes(x = reorder(vehiculo, cantidad), y = cantidad, fill = cantidad)) +
  geom_col() +                                           # Barras
  geom_text(aes(label = etiqueta), hjust = -0.1, size = 4) + # Etiqueta al final de cada barra
  scale_fill_gradientn(colors = c(col_gris, col_ambar, col_rojo)) + # Degradado tipo semáforo
  scale_y_continuous(expand = expansion(mult = c(0, 0.3))) + # Más espacio a la derecha para que no se corte la etiqueta
  coord_flip() +                                         # Barras horizontales
  labs(title = "COMPARENDOS POR TIPO DE VEHÍCULO",
       x = "TIPO DE VEHÍCULO", y = "CANTIDAD DE COMPARENDOS")

Los automóviles concentran 1.938 comparendos (91,4 %) y las motos 182 (8,6 %). Es probable que esto se relacione con la mayor cantidad de automóviles en circulación, aunque la base no permite comprobarlo.

2.5 Comparendos por mes

comparendos |>
  count(mes, nom_mes, name = "cantidad") |>           # Cuenta por mes (número y nombre del mes)
  ggplot(aes(x = reorder(nom_mes, mes),               # Ordena los meses cronológicamente (abril, mayo)
             y = cantidad, fill = nom_mes)) +         # Cada mes con su propio color
  geom_col(width = 0.6) +                             # Barras un poco más delgadas
  geom_label(aes(label = cantidad), vjust = -0.3,     # Etiqueta con el valor encima de cada barra
             fill = col_oscuro, color = col_crema) +  # Fondo oscuro y letra crema
  scale_fill_manual(values = c("ABRIL" = col_ambar,   # Color de cada mes
                               "MAYO" = col_rojo)) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +   # Espacio arriba para las etiquetas
  labs(title = "COMPARENDOS POR MES",
       x = "MES (2010)", y = "CANTIDAD DE COMPARENDOS")   # La leyenda ya queda oculta por el estilo general

Como la base empieza el 12 de abril y termina el 27 de mayo, los dos meses no tienen la misma cantidad de días, así que conviene comparar también el promedio diario:

comparendos |>
  group_by(nom_mes) |>                                # Agrupa por mes
  summarise(comparendos = n(),                        # Total de comparendos del mes
            dias_con_registro = n_distinct(fecha),    # Cuántos días distintos tienen registros
            promedio_diario = round(n() / n_distinct(fecha), 1)) |>   # Total dividido entre los días
  arrange(nom_mes) |>                                 # Ordena alfabéticamente (abril, mayo)
  knitr::kable(col.names = c("Mes", "Comparendos", "Días con registro", "Promedio diario"),
               format.args = list(big.mark = ".", decimal.mark = ","))
Mes Comparendos Días con registro Promedio diario
ABRIL 712 19 37,5
MAYO 1.408 27 52,1

En mayo se registraron 1.408 comparendos y en abril 712, es decir, casi el doble (un 98 % más). Pero abril solo cubre 19 días y mayo 27; por promedio diario la diferencia es de 37,5 comparendos por día en abril contra 52,1 en mayo, un aumento cercano al 39 %.

2.6 Top 10 personas con más comparendos

Se identifican las 10 personas (sin contar empresas) con más comparendos. Como la base contiene nombres y números de identificación de personas reales, en el gráfico se muestran como “Persona 1”, “Persona 2”, etc., y solo importa cuántos comparendos tiene cada una.

top_personas <- comparendos |>
  filter(genero != "EMPRESA") |>                      # Quita las empresas: solo personas
  count(ejecutado, name = "comparendos", sort = TRUE) |>   # Cuenta los comparendos de cada persona, de mayor a menor
  slice_max(comparendos, n = 10, with_ties = FALSE) |>     # Se queda con las 10 que más tienen
  mutate(persona = paste("Persona", row_number()))    # Cambia el nombre real por "Persona 1", "Persona 2"...

ggplot(top_personas, aes(x = reorder(persona, comparendos),   # Ordena de menor a mayor
                         y = comparendos,
                         fill = comparendos)) +
  geom_col() +                                        # Barras
  geom_text(aes(label = comparendos), hjust = -0.2, size = 4) +   # Valor al final de cada barra
  scale_fill_gradientn(colors = c(col_gris, col_ambar, col_rojo)) +   # Degradado tipo semáforo
  scale_y_continuous(expand = expansion(mult = c(0, 0.12))) +   # Espacio para los números
  coord_flip() +                                      # Barras horizontales
  labs(title = "TOP 10 PERSONAS CON MÁS COMPARENDOS",
       x = NULL,                                      # Sin título en el eje X
       y = "CANTIDAD DE COMPARENDOS")

La persona con más comparendos acumula 27, casi tres veces más que la segunda (10). Las diez personas del ranking suman 95 comparendos (4,5 % del total), con entre 6 y 27 comparendos cada una. Esto muestra que existen conductores reincidentes, para quienes podrían diseñarse intervenciones educativas y sancionatorias más precisas.

Entre las empresas, 130 figuran con comparendos. Estas son las cinco con más:

comparendos |>
  filter(genero == "EMPRESA") |>                      # Deja solo las empresas
  count(ejecutado, sort = TRUE) |>                    # Cuenta los comparendos de cada empresa, de mayor a menor
  slice_head(n = 5) |>                                # Se queda con las 5 primeras
  knitr::kable(col.names = c("Empresa", "Comparendos"))   # Las muestra en una tabla
Empresa Comparendos
LEASING BANCOLOMBIA S.A. C.F. 61
TRANSPORTES MST Y CIA S EN C 48
FINANCIERA INTERNACIONAL S.A. 32
LEASING DE OCCIDENTE S.A. C.F. 28
LEASING DE CREDITO S.A. 21

Estas cinco empresas suman 190 comparendos (40,7 % de los 467 de empresas); varias son entidades financieras o de leasing, que probablemente figuran como propietarias de los vehículos.

3 Conclusión

Entre el 12 de abril y el 27 de mayo de 2010 la base registra 2.120 comparendos por un valor total de $646.067.500. Dos infracciones dominan el panorama: el exceso de velocidad (76,7 % de los comparendos y 64,8 % del valor) y no detenerse ante una luz roja o amarilla (18,2 % de los comparendos y 30,7 % del valor). En conjunto explican el 95,5 % del valor, de modo que los controles de velocidad y de semáforos son los que más inciden en el problema.

Los comparendos se concentran en los fines de semana (36,2 % del total entre sábado y domingo) y los tres días con más registros (1, 9 y 16 de mayo) fueron sábado o domingo. Por tipo de vehículo, el 91,4 % corresponde a automóviles. Por género, las mujeres figuran en el 45,8 % de los comparendos, los hombres en el 32,2 % y las empresas en el 22,0 %. Además, se identificaron conductores reincidentes (hasta 27 comparendos en una sola persona) y empresas con muchos comparendos, entre ellas varias entidades de leasing.

Estos resultados respaldan la idea de basar las políticas de tránsito en datos: operativos y controles en los días y las infracciones de mayor incidencia, campañas educativas dirigidas a los reincidentes y mayor control sobre las flotas. La gestión de los comparendos no debe limitarse a sancionar, sino también prevenir y orientar los hábitos de conducción.

Limitaciones. La base cubre solo unas seis semanas de 2010. El valor calculado corresponde a los comparendos impuestos, no al dinero efectivamente recaudado. La base no incluye datos de circulación, por lo que no se pueden comparar tasas entre géneros o tipos de vehículo. Además, 18 números de comparendo aparecen en dos filas (con la misma persona, placa y fecha), un posible doble registro que no se eliminó y que afecta a menos del 1 % de los datos.

4 Referencias

  • Secretaría de Tránsito de Barranquilla. Base de datos de comparendos 2010.
  • Congreso de Colombia. Ley 769 de 2002, Código Nacional de Tránsito Terrestre, artículo 131, modificado por el artículo 21 de la Ley 1383 de 2010.
  • Gobierno de Colombia. Decreto 5053 de 2009, que fijó el salario mínimo legal mensual vigente de 2010 en $515.000.