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.
| 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 |
# ---- 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.
# ---- 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.
# ---- 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.
# ---- 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.
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.
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.
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 %.
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:
# ---- 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.
Se cuenta por número de identificación y no por nombre, porque una misma persona o empresa puede estar escrita de varias formas.
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.
# ---- 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.
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.