1. Introducción

Este informe analiza 2.120 comparendos de tránsito de Barranquilla (Atlántico) cometidos entre el 12/04/2010 y el 27/05/2010. Los resultados muestran que 76,7 % son por exceso de velocidad y que 36,2 % ocurren en fin de semana. El análisis se hizo con el lenguaje R.

La base es BD Comparendos OK - TAD. Cada registro es un comparendo que llegó a mandamiento de pago, es decir, que pasó a cobro coactivo. Por eso la base no incluye todos los comparendos impuestos en esos meses, y las conclusiones deben leerse con ese límite.

1.1 Objetivos

  • Describir la base de datos y comprobar su calidad.
  • Medir cómo se distribuyen los comparendos por día, mes, género, tipo de vehículo e infracción.
  • Calcular el valor económico de los comparendos por tipo de infracción.
  • Identificar a los infractores reincidentes.

1.2 Variables utilizadas

Variable Descripción
ejecutado Persona o empresa a la que se le impuso el comparendo
id Número de identificación (cédula o NIT)
genero Mujer, hombre o empresa
infraccion Tipo de infracción cometida
comparendo Número del comparendo
fecha Fecha en que se cometió la infracción
placa, vehiculo Placa y tipo de vehículo (auto o moto)
costo Valor del comparendo en pesos, a valores de 2010

2. Calidad de los datos

# ---- PASO 15: tabla con medidas de calidad de la base ----
data.frame(
  Medida = c("Registros analizados", "Columnas leídas de la hoja (A:Y)", "Primera fecha", "Última fecha",
             "Días con registros", "Valores vacíos en las variables analizadas",
             "Números de comparendo repetidos"),
  Valor = c(fmt(nrow(d), 0), ncol(df), format(min(d$fecha), "%d/%m/%Y"), format(max(d$fecha), "%d/%m/%Y"),
            n_distinct(d$fecha), sum(is.na(d)), sum(duplicated(d$comparendo)))
) %>% knitr::kable()
Medida Valor
Registros analizados 2.120
Columnas leídas de la hoja (A:Y) 25
Primera fecha 12/04/2010
Última fecha 27/05/2010
Días con registros 46
Valores vacíos en las variables analizadas 0
Números de comparendo repetidos 18

No se encontraron valores vacíos. Hay 18 números de comparendo repetidos con la misma persona, fecha, placa e infracción. Se conservaron todos los registros, porque pueden corresponder a mandamientos de pago distintos del mismo comparendo.

3. Resultados

3.1 Comparendos por día

# ---- PASO 16: gráfico de barras por día (valor fijo arriba + hover con día y fecha) ----
# Preparamos el color (fin de semana en verde) y el texto del hover
diario_g <- diario %>%
  mutate(tipo = ifelse(es_fin, "Sábado o domingo", "Lunes a viernes"),
         hover = paste0("<b>", dia, " ", format(fecha, "%d/%m/%Y"), "</b><br>Comparendos: ", n))

plot_ly(diario_g, x = ~fecha, y = ~n, color = ~tipo, height = 460,
        colors = c("Lunes a viernes" = gris, "Sábado o domingo" = verde),
        type = "bar",
        text = ~n, textposition = "outside", cliponaxis = FALSE,   # valor fijo sobre cada barra
        textfont = list(size = 12, color = "#222222"),
        hovertext = ~hover, hoverinfo = "text") %>%                # valor al pasar el mouse
  layout(barmode = "overlay", bargap = 0.25,
         title = list(text = "<b>Los picos de comparendos caen en fin de semana</b>", x = 0.03,
                      xanchor = "left", font = list(size = 18, color = azul_osc)),
         font = list(family = "Poppins, Segoe UI, Arial, sans-serif", color = "#333333"),
         xaxis = list(title = "Fecha (día/mes de 2010)", tickformat = "%d/%m", tickangle = -45,
                      dtick = 7 * 24 * 60 * 60 * 1000),
         yaxis = list(title = "Comparendos por día", range = c(0, max(diario_g$n) * 1.18), zeroline = FALSE),
         legend = list(orientation = "h", x = 0.5, xanchor = "center", y = 1.1),
         margin = list(t = 90), hoverlabel = list(font = list(size = 14))) %>%
  config(displayModeBar = FALSE)

Se registraron entre 18 y 89 comparendos por día, con un promedio de 46,1. El máximo fue el 01/05/2010 y los días más altos coinciden con sábados y domingos.

3.2 Comparendos por día de la semana

# ---- PASO 17: promedio por día de la semana (fin de semana en verde, resto en gris) ----
pd <- por_dia %>% arrange(dia)   # ordenamos de lunes a domingo

grafico_barras(
  x = pd$dia, y = pd$promedio, etiqueta = fmt(pd$promedio),
  hover = paste0("<b>", pd$dia, "</b><br>Promedio: ", fmt(pd$promedio), " comparendos por día",
                 "<br>Total: ", fmt(pd$n, 0), " comparendos<br>Días observados: ", pd$dias),
  titulo = "Sábado y domingo tienen el mayor promedio diario",
  ytitulo = "Promedio de comparendos por día",
  colores = ifelse(pd$wd %in% c(0, 6), verde, gris))

Los sábados y domingos suman 36,2 % de los comparendos, aunque son 2 de cada 7 días. El promedio es de 66,0 los domingos y 62,0 los sábados, frente a 36,6 a 44,0 entre lunes y viernes.

3.3 Comparendos por mes

# ---- PASO 18: tabla resumen por mes ----
por_mes %>%
  transmute(Mes = mes, Comparendos = comparendos, `Días con registro` = dias,
            `Promedio diario` = promedio) %>%
  knitr::kable(digits = 1, format.args = fk)
Mes Comparendos Días con registro Promedio diario
Abril 712 19 37,5
Mayo 1.408 27 52,1
# ---- PASO 19: gráfico de barras por mes ----
grafico_barras(
  x = por_mes$mes, y = por_mes$comparendos, etiqueta = fmt(por_mes$comparendos, 0),
  hover = paste0("<b>", por_mes$mes, "</b><br>Comparendos: ", fmt(por_mes$comparendos, 0),
                 "<br>Días con registro: ", por_mes$dias,
                 "<br>Promedio diario: ", fmt(por_mes$promedio)),
  titulo = "Mayo concentra el doble de comparendos que abril",
  ytitulo = "Comparendos", colores = c(azul_osc, verde))

Mayo tiene 1.408 comparendos y abril 712. Como abril solo cubre del 12 al 30 y mayo del 1 al 27, es más justo comparar el promedio diario: 37,5 en abril y 52,1 en mayo, un aumento de 39 %. Esta base no permite saber si el aumento refleja más infracciones o más controles.

3.4 Comparendos por género

Esta sección muestra cómo se reparten los 2.120 comparendos según el género de quien lo recibió. La base tiene tres grupos: mujer, hombre y empresa (cuando el comparendo está a nombre de una persona jurídica y no de una persona natural). La tabla indica cuántos comparendos tiene cada grupo y qué porcentaje del total representa. En el gráfico de dona cada trozo es un grupo: el número fijo muestra los comparendos y su porcentaje, y al pasar el mouse se ve el detalle.

# ---- PASO 20: tabla por género ----
d %>% count(genero) %>% arrange(desc(n)) %>%
  transmute(Género = genero, Comparendos = n, `% del total` = round(100 * n / sum(n), 1)) %>%
  knitr::kable(format.args = fk)
Género Comparendos % del total
MUJER 970 45,8
HOMBRE 683 32,2
EMPRESA 467 22,0
# ---- PASO 21: gráfico de dona por género ----
gen <- d %>% count(genero) %>% arrange(desc(n))
grafico_dona(gen$genero, gen$n, "Comparendos por género")

Las mujeres aparecen en 45,8 % de los comparendos, los hombres en 32,2 % y las empresas en 22,0 %. La base cuenta infracciones y no conductores: sin saber cuántas mujeres y hombres conducen, no se puede afirmar que un grupo infrinja más que otro.

3.5 Comparendos por tipo de vehículo

Aquí se compara el tipo de vehículo con el que se cometió la infracción, que puede ser auto o moto. La tabla muestra cuántos comparendos corresponden a cada tipo y qué porcentaje del total son. La dona lo representa gráficamente: el número fijo es la cantidad de comparendos con su porcentaje, y al pasar el mouse aparece el detalle. Se cuentan comparendos y no vehículos, porque un mismo vehículo puede tener varios.

# ---- PASO 22: tabla por tipo de vehículo ----
d %>% count(vehiculo) %>% arrange(desc(n)) %>%
  transmute(Vehículo = vehiculo, Comparendos = n, `% del total` = round(100 * n / sum(n), 1)) %>%
  knitr::kable(format.args = fk)
Vehículo Comparendos % del total
AUTO 1.938 91,4
MOTO 182 8,6
# ---- PASO 23: gráfico de dona por tipo de vehículo ----
veh <- d %>% count(vehiculo) %>% arrange(desc(n))
grafico_dona(veh$vehiculo, veh$n, "Casi todos los comparendos son de autos")

Los autos tienen 91,4 % de los comparendos y las motos 8,6 %. Como la base no trae cuántos autos y motos circulan, la diferencia no indica que las motos infrinjan menos.

3.6 Comparendos por tipo de infracción

La base registra 4 tipos de infracción. La tabla los ordena de mayor a menor número de comparendos e indica cuántos tiene cada una y qué porcentaje del total representa. En el gráfico de barras horizontales, la barra más larga es la infracción más frecuente. El número fijo al final de cada barra es la cantidad de comparendos y, al pasar el mouse, se muestra también su porcentaje.

# ---- PASO 24: tabla por tipo de infracción ----
d %>% count(infraccion) %>% arrange(desc(n)) %>%
  transmute(Infracción = infraccion, Comparendos = n, `% del total` = round(100 * n / sum(n), 1)) %>%
  knitr::kable(format.args = fk)
Infracción Comparendos % del total
Conducir un vehículo a velocidad superior a la máxima permitida. 1.626 76,7
No detenerse ante una luz roja o amarilla de semáforo 385 18,2
No respetar el paso de peatones 105 5,0
Transitar en sentido contrario al estipulado para la vía 4 0,2
# ---- PASO 25: barras horizontales por infracción (de menor a mayor, con degradado de color) ----
inf <- d %>% count(infraccion) %>% arrange(n) %>% mutate(porc = 100 * n / sum(n))

grafico_barras(
  x = inf$infraccion, y = inf$n, etiqueta = fmt(inf$n, 0),
  hover = paste0("<b>", inf$infraccion, "</b><br>Comparendos: ", fmt(inf$n, 0),
                 "<br>% del total: ", fmt(inf$porc), " %"),
  titulo = "El exceso de velocidad domina los comparendos", ytitulo = "Comparendos",
  colores = degradado(nrow(inf)), horizontal = TRUE, alto = 520)

El exceso de velocidad suma 76,7 % de los comparendos y no detenerse ante la luz roja 18,2 %. Entre las dos explican 94,9 %.

3.7 Valor de los comparendos por tipo de infracción

El valor de cada comparendo viene de la columna COSTO COMPARENDO de la base, a valores de 2010. Como todos estos comparendos están en mandamiento de pago, el valor representa lo que se les cobra a los infractores, no lo que ya se recaudó.

La tabla siguiente tiene estas columnas:

  • Comparendos: cuántos comparendos hay de ese tipo de infracción.
  • Valor unitario (pesos): lo que cuesta un comparendo de ese tipo.
  • Valor total (pesos): la suma de los valores de todos los comparendos de ese tipo.
  • % del valor total: qué parte del dinero total aporta esa infracción. Las filas suman 100 %.
# ---- PASO 26: tabla de valores por infracción ----
rec %>%
  transmute(Infracción = infraccion, Comparendos = comparendos,
            `Valor unitario (pesos)` = valor_unitario, `Valor total (pesos)` = valor_total,
            `% del valor total` = round(porcentaje, 1)) %>%
  knitr::kable(format.args = fk)
Infracción Comparendos Valor unitario (pesos) Valor total (pesos) % del valor total
Conducir un vehículo a velocidad superior a la máxima permitida. 1.626 257.500 418.695.000 64,8
No detenerse ante una luz roja o amarilla de semáforo 385 515.000 198.275.000 30,7
No respetar el paso de peatones 105 257.500 27.037.500 4,2
Transitar en sentido contrario al estipulado para la vía 4 515.000 2.060.000 0,3
# ---- PASO 27: barras horizontales con el dinero por infracción ----
# Agrupamos y calculamos el valor directamente aquí para evitar que se pierda la variable
rec_grafico <- d %>%
  group_by(infraccion) %>%
  summarise(total_dinero = sum(costo, na.rm = TRUE), comparendos = n(), .groups = "drop") %>%
  arrange(total_dinero)

grafico_barras(
  x = rec_grafico$infraccion,
  y = rec_grafico$total_dinero * 1e-6,                                   # lo pasamos a millones
  etiqueta = paste0("$ ", fmt(rec_grafico$total_dinero * 1e-6, 1), " M"), # valor fijo
  hover = paste0("<b>", rec_grafico$infraccion, "</b><br>Valor total: ", moneda(rec_grafico$total_dinero),
                 "<br>Comparendos: ", fmt(rec_grafico$comparendos, 0)),   # valor al pasar el mouse
  titulo = "Dos infracciones concentran casi todo el valor",
  ytitulo = "Valor total (millones de pesos)",
  colores = degradado(nrow(rec_grafico), c("#F6C7BE", "#E4572E", "#8E1B10")),
  horizontal = TRUE, alto = 520)

El valor total es de $ 646.067.500. La infracción de mayor valor es “Conducir un vehículo a velocidad superior a la máxima permitida.” con 64,8 %. No detenerse ante la luz roja es solo 18,2 % de los comparendos, pero aporta 30,7 % del valor porque cada comparendo cuesta el doble que uno por velocidad.

4. Reincidencia

Se cuenta por número de identificación y no por nombre, porque una misma persona o empresa puede estar escrita de varias formas.

4.1 Personas naturales

De 1.113 personas naturales distintas, 291 (26,1 %) tienen más de un comparendo y las demás tienen uno solo.

# ---- PASO 28: cuántas personas tienen 1, 2, 3 o 4+ comparendos ----
grupos <- por_persona %>%
  mutate(grupo = factor(case_when(comparendos == 1 ~ "1", comparendos == 2 ~ "2",
                                  comparendos == 3 ~ "3", TRUE ~ "4 o más"),
                        levels = c("1", "2", "3", "4 o más"))) %>%
  count(grupo)

grafico_barras(
  x = grupos$grupo, y = grupos$n, etiqueta = fmt(grupos$n, 0),
  hover = paste0("<b>", grupos$grupo, " comparendo(s)</b><br>Personas: ", fmt(grupos$n, 0),
                 "<br>% de las personas: ", fmt(100 * grupos$n / sum(grupos$n)), " %"),
  titulo = "La mayoría de las personas tiene un solo comparendo",
  xtitulo = "Comparendos por persona", ytitulo = "Personas",
  colores = degradado(nrow(grupos)))
# ---- PASO 29: top 10 de personas con más comparendos (tabla + gráfico) ----
top_personas <- por_persona %>%
  arrange(desc(comparendos), persona) %>%
  slice_head(n = 10) %>%
  mutate(persona = if (anonimizar) paste("Persona", row_number()) else persona)

knitr::kable(top_personas %>% transmute(Puesto = row_number(), Persona = persona, Comparendos = comparendos))
Puesto Persona Comparendos
1 Persona 1 26
2 Persona 2 10
3 Persona 3 9
4 Persona 4 8
5 Persona 5 8
6 Persona 6 7
7 Persona 7 7
8 Persona 8 7
9 Persona 9 7
10 Persona 10 6
# Invertimos el orden para que el puesto 1 quede arriba en el gráfico
tp <- top_personas[nrow(top_personas):1, ]

grafico_barras(
  x = tp$persona, y = tp$comparendos, etiqueta = as.character(tp$comparendos),
  hover = paste0("<b>", tp$persona, "</b><br>Comparendos: ", tp$comparendos),
  titulo = "Las 10 personas con más comparendos", ytitulo = "Comparendos",
  colores = degradado(nrow(tp)), horizontal = TRUE)

La persona con más comparendos tiene 26, casi 3 veces más que la siguiente. En caso de empate en el puesto 10 se muestra el orden alfabético.

4.2 Empresas

# ---- PASO 30: top 10 de empresas con más comparendos (tabla + gráfico) ----
top_empresas <- por_empresa %>% arrange(desc(comparendos), empresa) %>% slice_head(n = 10)

knitr::kable(top_empresas %>% transmute(Puesto = row_number(), Empresa = empresa, Comparendos = comparendos))
Puesto Empresa Comparendos
1 LEASING BANCOLOMBIAA SA CF 61
2 TRANSPORTES MST Y CIA SENC 31
3 FINANCIERA INTERNACIONAL SA 29
4 GMAC FINANCIERA DE COLOMBIA 21
5 LEASING DE OCCIDENTE SA CF 21
6 LEASING DE CREDITO SA 17
7 TRANSPORTES MST Y CIA S EN C 17
8 UINON FAMILIAR CHARRIS SEN C 13
9 BENEMOTORS SAS 8
10 FRANCISCO COLLAVINI CIA LTDA 8
te <- top_empresas[nrow(top_empresas):1, ]

grafico_barras(
  x = te$empresa, y = te$comparendos, etiqueta = as.character(te$comparendos),
  hover = paste0("<b>", te$empresa, "</b><br>Comparendos: ", te$comparendos),
  titulo = "Las 10 empresas con más comparendos", ytitulo = "Comparendos",
  colores = degradado(nrow(te)), horizontal = TRUE, alto = 500)

Las 137 empresas de la base suman 467 comparendos y las 5 primeras concentran 34,9 %. Varias son entidades de leasing y financieras, que podrían figurar como propietarias de vehículos arrendados. Esto es una hipótesis, porque la base no indica quién conducía.

5. Conclusiones y recomendaciones

  • Velocidad y luz roja dominan. Entre las dos suman 94,9 % de los comparendos y casi todo el valor económico.
  • El fin de semana pesa. Sábados y domingos concentran 36,2 % de los comparendos, con promedios diarios muy superiores a los de entre semana.
  • Mayo creció. El promedio diario subió 39 % frente a abril, aunque la base no explica si fue por más infracciones o más controles.
  • Autos y empresas. Los autos son 91,4 % de los comparendos y las empresas aparecen en 22,0 %.
  • Reincidencia concentrada. 26,1 % de las personas naturales tiene más de un comparendo, y un solo caso supera ampliamente al resto.
  • Valor económico. Los comparendos suman $ 646.067.500 a valores de 2010.

Recomendaciones: reforzar los controles de velocidad los sábados y domingos; revisar con las entidades de leasing quién responde por los comparendos de vehículos arrendados; y hacer seguimiento a los infractores con tres o más comparendos.

Limitaciones: la base solo incluye comparendos con mandamiento de pago, cubre 46 días, no trae cuántos conductores hay por grupo y tiene 18 números de comparendo repetidos.

6. Referencias

  • Base de datos BD Comparendos OK - TAD (Excel entregado en el curso), comparendos de Barranquilla, abril y mayo de 2010.
Informe elaborado por Kevin Rodríguez · Ficha TAD-13 · SENA · Barranquilla