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