Este informe analiza 2.120 comparendos de tránsito de Barranquilla
(Atlántico) cometidos entre el 12/04/2010 y el 27/05/2010. El objetivo
es describir la base de datos, medir cómo se distribuyen las
infracciones y señalar patrones útiles para el control vial. El análisis
se hizo con el lenguaje R, usando las librerías readxl,
dplyr, ggplot2 y scales.
La base es BD Comparendos OK - TAD. Cada registro es un comparendo que llegó a mandamiento de pago, por lo que no incluye todos los comparendos impuestos en esos meses, solo los que pasaron a cobro coactivo. Esto limita las conclusiones.
Por cada comparendo la base registra quién lo recibió (nombre y género), la infracción, la fecha, la placa, el tipo de vehículo y el valor de la multa. Con esos datos el informe revisa la calidad de la base, describe los comparendos por tiempo, género, vehículo e infracción, calcula el recaudo y analiza la reincidencia de personas y empresas.
“readxl”: Lee el archivo de Excel desde R.
“dplyr”: Ordena y transforma los datos (filtrar, contar, sumar, agrupar).
“ggplot2”: Crea los gráficos.
“scales”: Da formato a los números y textos de los gráficos, como los puntos de miles y el ajuste de los nombres largos.
## [1] "No. MANDAMIENTO DE PAGO" "FECHA MANDAMIENTO DE PAGO"
## [3] "EJECUTADO" "TIPO DE IDENTIFICACION"
## [5] "#TIPO DE IDENTIFICACION" "No. IDENTIFICACION"
## [7] "GENERO" "#GENERO"
## [9] "COD. INFRACCION" "#COD. INFRACCION"
## [11] "NOM INFRACCION" "#NOM INFRACCION"
## [13] "COMPARENDO" "FECHA DE COMPARENDO"
## [15] "DIA" "NOM DIA"
## [17] "#NOM DIA" "MES"
## [19] "NOM MES" "#NOM MES"
## [21] "AÑO" "PLACA DE VEHICULO"
## [23] "VEHICULO" "#VEHICULO"
## [25] "COSTO COMPARENDO"
# Paso 1: Contar cuántos comparendos hay en cada fecha
por_fecha <- d %>% count(fecha, dia, es_fin, name = "Comparendos")
# Paso 2: Graficar los comparendos por día (fines de semana en rojo)
ggplot(por_fecha, aes(x = fecha, y = Comparendos, fill = es_fin)) +
geom_col() +
scale_fill_manual(values = c("FALSE" = "grey70", "TRUE" = "brown4"),
labels = c("Lunes a viernes", "Sábado o domingo"), name = NULL) +
labs(title = "Comparendos por día", x = "Fecha", y = "Cantidad") +
theme_minimal()# Paso 3: Mostrar la tabla de comparendos por mes y día de la semana
d %>%
count(mes, dia, name = "Comparendos") %>%
mutate(mes = factor(mes, levels = c("Abril", "Mayo"))) %>%
arrange(mes, dia) %>%
rename(Mes = mes, Día = dia) %>%
knitr::kable()| Mes | Día | Comparendos |
|---|---|---|
| Abril | Lunes | 99 |
| Abril | Martes | 110 |
| Abril | Miércoles | 106 |
| Abril | Jueves | 89 |
| Abril | Viernes | 128 |
| Abril | Sábado | 88 |
| Abril | Domingo | 92 |
| Mayo | Lunes | 196 |
| Mayo | Martes | 154 |
| Mayo | Miércoles | 167 |
| Mayo | Jueves | 167 |
| Mayo | Viernes | 136 |
| Mayo | Sábado | 284 |
| Mayo | Domingo | 304 |
Se registraron entre 18 y 89 comparendos por día, con un promedio de 46,1. Los días más altos coinciden con sábados y domingos.
# Paso 1: Contar cuántas veces aparece cada día de la semana en el calendario del periodo
calendario <- tibble(fecha = seq(min(d$fecha), max(d$fecha), by = "day")) %>%
mutate(wd = as.POSIXlt(fecha)$wday) %>% count(wd, name = "dias")
# Paso 2: Contar los comparendos por día de la semana y calcular el promedio por día
por_dia <- d %>% count(wd, dia, name = "Comparendos") %>%
left_join(calendario, by = "wd") %>%
mutate(promedio = Comparendos / dias)
# Paso 3: Graficar el promedio de comparendos por día de la semana
ggplot(por_dia, aes(x = dia, y = promedio)) +
geom_col(fill = "brown4", color = "black") +
geom_text(aes(label = round(promedio, 1)), vjust = -0.4) +
labs(title = "Promedio de comparendos por día de la semana", x = "Día", y = "Promedio por día") +
theme_minimal()Los sábados y domingos suman 36,2 % de los comparendos, aunque son 2 de cada 7 días.
# Paso 1: Resumir por mes: total de comparendos, días con registro y promedio diario
d %>% group_by(mes) %>%
summarise(comparendos = n(), dias_con_registro = n_distinct(fecha),
promedio_diario = round(n() / n_distinct(fecha), 1)) %>%
knitr::kable()| mes | comparendos | dias_con_registro | promedio_diario |
|---|---|---|---|
| Abril | 712 | 19 | 37.5 |
| Mayo | 1408 | 27 | 52.1 |
# Paso 2: Graficar el total de comparendos por mes
d %>% count(mes, name = "Comparendos") %>%
ggplot(aes(x = mes, y = Comparendos)) + geom_col(fill = "brown4", color = "black") +
geom_text(aes(label = Comparendos), vjust = -0.4) +
labs(title = "Comparendos por mes", x = "Mes", y = "Cantidad") + theme_minimal()Como abril solo cubre del 12 al 30 y mayo del 1 al 27, conviene comparar los meses por el promedio diario y no solo por el total.
# Paso 1: Contar los comparendos por género, calcular el porcentaje y mostrar la tabla
d %>% count(genero, name = "Comparendos") %>%
mutate(porcentaje = round(100 * Comparendos / sum(Comparendos), 1)) %>%
arrange(desc(Comparendos)) %>% knitr::kable()| genero | Comparendos | porcentaje |
|---|---|---|
| MUJER | 970 | 45.8 |
| HOMBRE | 683 | 32.2 |
| EMPRESA | 467 | 22.0 |
# Paso 2: Graficar los comparendos por género
d %>% count(genero, name = "Comparendos") %>%
ggplot(aes(x = reorder(genero, -Comparendos), y = Comparendos)) +
geom_col(fill = "brown4", color = "black") +
geom_text(aes(label = Comparendos), vjust = -0.4) +
labs(title = "Comparendos por género", x = "Género", y = "Cantidad") + theme_minimal()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.
# Paso 1: Contar los comparendos por tipo de vehículo, calcular el porcentaje y mostrar la tabla
d %>% count(vehiculo, name = "Comparendos") %>%
mutate(porcentaje = round(100 * Comparendos / sum(Comparendos), 1)) %>%
arrange(desc(Comparendos)) %>% knitr::kable()| vehiculo | Comparendos | porcentaje |
|---|---|---|
| AUTO | 1938 | 91.4 |
| MOTO | 182 | 8.6 |
# Paso 2: Graficar los comparendos por tipo de vehículo
d %>% count(vehiculo, name = "Comparendos") %>%
ggplot(aes(x = reorder(vehiculo, -Comparendos), y = Comparendos)) +
geom_col(fill = "brown4", color = "black") +
geom_text(aes(label = Comparendos), vjust = -0.4) +
labs(title = "Comparendos por tipo de vehículo", x = "Vehículo", y = "Cantidad") + theme_minimal()# Paso 1: Contar los comparendos por infracción, calcular el porcentaje y mostrar la tabla
d %>% count(infraccion, name = "Comparendos") %>%
mutate(porcentaje = round(100 * Comparendos / sum(Comparendos), 1)) %>%
arrange(desc(Comparendos)) %>% knitr::kable()| infraccion | Comparendos | porcentaje |
|---|---|---|
| Conducir un vehículo a velocidad superior a la máxima permitida. | 1626 | 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 2: Graficar los comparendos por infracción (barras horizontales)
d %>% count(infraccion, name = "Comparendos") %>%
ggplot(aes(x = reorder(infraccion, Comparendos), y = Comparendos)) +
geom_col(fill = "brown4", color = "black") +
geom_text(aes(label = Comparendos), hjust = -0.3) +
coord_flip() + scale_x_discrete(labels = label_wrap(35)) +
scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +
labs(title = "Comparendos por infracción", x = "Infracción", y = "Cantidad") + theme_minimal()# Paso 1: Calcular cuántos comparendos y cuánto recaudo hay por infracción
rec <- d %>% group_by(infraccion) %>%
summarise(comparendos = n(), recaudo = sum(costo, na.rm = TRUE)) %>%
arrange(desc(recaudo))
# Paso 2: Graficar el recaudo por infracción
ggplot(rec, aes(x = reorder(infraccion, recaudo), y = recaudo)) +
geom_col(fill = "brown4", color = "black") +
scale_x_discrete(labels = label_wrap(35)) +
scale_y_continuous(labels = label_comma(big.mark = ".", decimal.mark = ",")) +
labs(title = "Recaudo por infracción", x = "Infracción", y = "Total ($)") + theme_minimal()# Paso 3: Armar la tabla con valor de la multa, comparendos y recaudo por infracción
por_inf <- d %>%
group_by(infraccion) %>%
summarise(`Valor de la multa` = max(costo, na.rm = TRUE),
Comparendos = n(),
Recaudo = sum(costo, na.rm = TRUE), .groups = "drop") %>%
arrange(desc(Recaudo)) %>%
rename(Infracción = infraccion)
# Paso 4: Dejar vacías las celdas sin dato en la tabla
options(knitr.kable.NA = "")
# Paso 5: Agregar la fila de totales y mostrar la tabla final
bind_rows(
por_inf,
tibble(Infracción = "Total",
Comparendos = sum(por_inf$Comparendos),
Recaudo = sum(por_inf$Recaudo))
) %>%
knitr::kable(format.args = list(big.mark = ".", decimal.mark = ","))| Infracción | Valor de la multa | Comparendos | Recaudo |
|---|---|---|---|
| Conducir un vehículo a velocidad superior a la máxima permitida. | 257.500 | 1.626 | 418.695.000 |
| No detenerse ante una luz roja o amarilla de semáforo | 515.000 | 385 | 198.275.000 |
| No respetar el paso de peatones | 257.500 | 105 | 27.037.500 |
| Transitar en sentido contrario al estipulado para la vía | 515.000 | 4 | 2.060.000 |
| Total | 2.120 | 646.067.500 |
El recaudo total es de $ 646.067.500.
# Paso 1: Quitar las empresas, contar los comparendos por persona y quedarse con las 15 primeras
top_personas <- d %>% filter(genero != "EMPRESA") %>%
count(ejecutado, sort = TRUE, name = "Comparendos") %>%
slice_max(Comparendos, n = 15, with_ties = TRUE)
# Paso 2: Mostrar la tabla
knitr::kable(top_personas)| ejecutado | Comparendos |
|---|---|
| LILIANA ROZO PINZON | 27 |
| ELVIRA DEL CARMEN GARRIDO AREVALO | 10 |
| MIGUEL HERNANDO GARAY CALLE | 9 |
| IRIS DEL CARMEN OVIEDO CANTILLO | 8 |
| JOSE ANTONIO TOVAR PUCCINI | 8 |
| ENRIQUE JESUS ARRIETA JIMENEZ | 7 |
| HEYDI MARGARITA DE MOYA GUTIERREZ | 7 |
| KELLY PAOLA ENSUNCHO CASTRO | 7 |
| LEONOR SUESCUN RODRIGUEZ | 7 |
| EDWIN ALBERTO SALCEDO CANO | 6 |
| JONATHAN BARRIOS MANCO | 6 |
| LUZ M BASTIDAS ALVAREZ | 6 |
| MARIO ANDRES VARON LOZANO | 6 |
| MERY BEATRIZ ANAYA VALENCIA | 6 |
| MILENA ROSA CAICEDO VILLA | 6 |
# Paso 3: Graficar las personas con más comparendos
ggplot(top_personas, aes(x = reorder(ejecutado, Comparendos), y = Comparendos)) +
geom_col(fill = "brown4", color = "black") + coord_flip() +
geom_text(aes(label = Comparendos), hjust = -0.3) +
scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +
labs(title = "Personas con más comparendos", x = "Nombre", y = "Cantidad") + theme_minimal()# Paso 1: Dejar solo las empresas, contar sus comparendos y quedarse con las 10 primeras
top_empresas <- d %>% filter(genero == "EMPRESA") %>%
count(ejecutado, sort = TRUE, name = "Comparendos") %>%
slice_max(Comparendos, n = 10, with_ties = TRUE)
# Paso 2: Mostrar la tabla
knitr::kable(top_empresas)| ejecutado | Comparendos |
|---|---|
| LEASING BANCOLOMBIAA SA CF | 61 |
| FINANCIERA INTERNACIONAL SA | 32 |
| TRANSPORTES MST Y CIA SENC | 31 |
| LEASING DE OCCIDENTE SA CF | 28 |
| GMAC FINANCIERA DE COLOMBIA | 21 |
| LEASING DE CREDITO SA | 21 |
| TRANSPORTES MST Y CIA S EN C | 17 |
| UINON FAMILIAR CHARRIS SEN C | 13 |
| BENEMOTORS SAS | 8 |
| FRANCISCO COLLAVINI CIA LTDA | 8 |
| TRANSURBAR LTDA | 8 |
-Se analizaron 2.120 comparendos de Barranquilla entre el 12 de abril y el 27 de mayo de 2010. El exceso de velocidad domina con el 76,7 %, seguido de semáforo en rojo o amarillo (18,2 %) y paso de peatones (5,0 %). Los fines de semana concentran el 36,2 % de los comparendos, aunque son el 28,6 % de los días. Los autos son el 91,4 % y las motos el 8,6 %.
El recaudo total es de $ 646.067.500: el 64,8 % viene de velocidad y el 30,7 % de semáforo, que aporta más de lo que le tocaría por cantidad porque su multa es el doble. La reincidencia está repartida entre muchas personas (el 26 % tiene más de un comparendo), con un solo caso extremo de 27. Las empresas con más comparendos son entidades de leasing y financieras, probablemente por ser propietarias de vehículos arrendados.
Recomendaciones: reforzar los controles de velocidad en fines de semana, revisar con las entidades de leasing quién responde por los comparendos de vehículos arrendados y hacer seguimiento a los infractores reincidentes.
Limitaciones: la base solo incluye comparendos con mandamiento de pago y cubre 46 días. Además, hay números de comparendo repetidos.