1. Introducción

La base de datos BD_Comparendos contiene información sobre las infracciones de tránsito registradas en la ciudad de Barranquilla durante los meses de abril y mayo de 2010. En ella se documentan los comparendos impuestos a conductores de automóviles, motocicletas y empresas que incumplieron las normas de tránsito vigentes.

Las infracciones registradas incluyen conductas como conducir a velocidad superior a la permitida, no detenerse ante un semáforo en rojo o amarillo, no respetar el paso de peatones y transitar en sentido contrario. El objetivo de este informe es identificar patrones en las infracciones cometidas, el perfil de los infractores, los tipos de vehículos involucrados y los costos económicos que generaron las multas durante el período analizado.


2. Carga de librerías y datos

library(readxl)
library(dplyr)
library(ggplot2)
library(knitr)
library(scales)
df <- read_excel("BD_Comparendos_OK__-_TAD__1__jaider___2_.xlsx",
                 sheet = "Data Original (2)")
names(df) <- c("mandamiento", "fecha_mandamiento", "ejecutado",
               "tipo_id", "num_id", "genero", "cod_infraccion",
               "nom_infraccion", "comparendo", "fecha_comparendo",
               "dia", "nom_dia", "mes", "nom_mes", "anio",
               "placa", "vehiculo_raw", "costo",
               "extra1", "extra2", "extra3", "extra4", "extra5", "extra6")
df <- df %>%
  mutate(
    vehiculo = case_when(
      grepl("[A-Za-z]$", trimws(placa)) ~ "Moto",
      grepl("[0-9]$", trimws(placa))    ~ "Auto",
      TRUE ~ "Desconocido"
    ),
    nom_mes = case_when(
      mes == 4 ~ "Abril",
      mes == 5 ~ "Mayo",
      TRUE ~ as.character(mes)
    ),
    costo = as.numeric(costo)
  ) %>%
  filter(!is.na(comparendo), !is.na(genero))

3. Vista general del dataset

La base de datos cuenta con 2.120 registros y 18 variables. A continuación se muestra una muestra de los primeros registros para conocer la estructura de la información.

cat("Total de registros:", nrow(df), "\n")
## Total de registros: 2120
cat("Variables:", ncol(df), "\n")
## Variables: 19
df %>%
  select(ejecutado, genero, nom_infraccion, nom_mes, vehiculo, costo) %>%
  head(8) %>%
  kable(caption = "Primeros registros de la base de datos")
Primeros registros de la base de datos
ejecutado genero nom_infraccion nom_mes vehiculo costo
AARON JOSE SANTIAGO DULCE HOMBRE Conducir un vehículo a velocidad superior a la máxima permitida. Abril Auto 257500
AARON JOSE SANTIAGO DULCE HOMBRE Conducir un vehículo a velocidad superior a la máxima permitida. Mayo Auto 257500
ACADEMIA DE CONDUCCION DEL LIT EMPRESA Conducir un vehículo a velocidad superior a la máxima permitida. Abril Auto 257500
ACADEMIA DE CONDUCCION DEL LIT EMPRESA Conducir un vehículo a velocidad superior a la máxima permitida. Mayo Auto 257500
ACGUTIERREZ Y CIA SCA EMPRESA Conducir un vehículo a velocidad superior a la máxima permitida. Mayo Auto 257500
ACOLCHADOS Y LENCERIAS DE LA EMPRESA Conducir un vehículo a velocidad superior a la máxima permitida. Mayo Auto 257500
ADA MARIA RUIZ MARIN MUJER Conducir un vehículo a velocidad superior a la máxima permitida. Mayo Auto 257500
ADA MARIA RUIZ MARIN MUJER Conducir un vehículo a velocidad superior a la máxima permitida. Mayo Auto 257500

4. Análisis de infracciones

En esta sección se identifican los tipos de infracciones más cometidas. La tabla y el gráfico muestran que la infracción predominante es conducir a velocidad superior a la máxima permitida, representando más del 76% de los comparendos registrados, seguida por no detenerse ante un semáforo en rojo o amarillo.

4.1 Tipos de infracción

df %>%
  # count() cuenta cuántos comparendos hay por cada tipo de infracción.
  # sort = TRUE los ordena de mayor a menor cantidad.
  count(nom_infraccion, sort = TRUE) %>%
  # rename() cambia los nombres de las columnas para la tabla.
  rename(Infracción = nom_infraccion, Cantidad = n) %>%
  # kable() convierte el resultado en una tabla HTML dentro del informe.
  kable(caption = "Cantidad de comparendos por tipo de infracción")
Cantidad de comparendos por tipo de infracción
Infracción Cantidad
Conducir un vehículo a velocidad superior a la máxima permitida. 1626
No detenerse ante una luz roja o amarilla de semáforo 385
No respetar el paso de peatones 105
Transitar en sentido contrario al estipulado para la vía 4
df %>%
  # Cuenta los comparendos agrupados por tipo de infracción.
  count(nom_infraccion, sort = TRUE) %>%
  # reorder() ordena las barras de menor a mayor para que se lean mejor.
  # fill asigna un color distinto a cada tipo de infracción.
  ggplot(aes(x = reorder(nom_infraccion, n), y = n, fill = nom_infraccion)) +
  # geom_col() dibuja las barras con la altura igual a la cantidad (n).
  geom_col(show.legend = FALSE) +
  # geom_text() escribe el número exacto al final de cada barra.
  # hjust = -0.3 lo desplaza ligeramente hacia afuera para que no tape la barra.
  geom_text(aes(label = n), hjust = -0.3, size = 3.5) +
  # expansion() agrega espacio extra en el extremo derecho para las etiquetas.
  scale_y_continuous(expand = expansion(mult = c(0, 0.12))) +
  # coord_flip() voltea el gráfico para que las barras queden horizontales.
  coord_flip() +
  # scale_fill_brewer() aplica una paleta de colores predefinida de RColorBrewer.
  scale_fill_brewer(palette = "Dark2") +
  labs(title = "Comparendos por tipo de infracción",
       x = NULL, y = "Cantidad") +
  theme_minimal()


5. Análisis por género

Se analiza la distribución de comparendos según el género del infractor. Los resultados muestran que las mujeres concentran el mayor número de infracciones entre los infractores individuales, seguidas por los hombres. Las empresas también representan una parte significativa de los registros, ya que los vehículos a su nombre acumularon varias multas.

df %>%
  # Cuenta los comparendos registrados para cada categoría de género.
  count(genero, sort = TRUE) %>%
  # mutate() agrega una nueva columna con el porcentaje de cada género.
  # round(..., 1) deja un decimal; paste0() le añade el símbolo % al final.
  mutate(Porcentaje = paste0(round(n / sum(n) * 100, 1), "%")) %>%
  # Cambia los nombres de las columnas para presentar la tabla.
  rename(Género = genero, Cantidad = n) %>%
  kable(caption = "Comparendos por género del infractor")
Comparendos por género del infractor
Género Cantidad Porcentaje
MUJER 970 45.8%
HOMBRE 683 32.2%
EMPRESA 467 22%
df %>%
  # Cuenta los registros de cada categoría de género.
  count(genero) %>%
  # x = "" crea una sola barra apilada que luego se convierte en torta.
  ggplot(aes(x = "", y = n, fill = genero)) +
  # geom_col() apila los segmentos uno sobre otro con altura proporcional.
  geom_col(width = 1) +
  # geom_text() escribe la cantidad en el centro de cada segmento.
  # position_stack(vjust = 0.5) centra verticalmente cada etiqueta.
  geom_text(aes(label = n), position = position_stack(vjust = 0.5), size = 4) +
  # coord_polar() convierte la barra apilada en un gráfico de torta.
  coord_polar(theta = "y") +
  # Asigna un color específico a cada categoría de género.
  scale_fill_manual(values = c("HOMBRE" = "#264653",
                               "MUJER"  = "#E76F51",
                               "EMPRESA"= "#2A9D8F")) +
  labs(title = "Comparendos por género", fill = "Género") +
  # theme_void() elimina ejes y fondo para que solo se vea la torta.
  theme_void()


6. Análisis por tipo de vehículo

El gráfico refleja que la mayoría de las infracciones fueron cometidas por conductores de automóviles, lo cual es coherente con la mayor proporción de este tipo de vehículo en circulación. Las motocicletas representan una minoría dentro de los registros.

df %>%
  # Cuenta cuántos comparendos corresponden a cada tipo de vehículo.
  count(vehiculo) %>%
  # Calcula el porcentaje de cada tipo sobre el total de comparendos.
  mutate(Porcentaje = paste0(round(n / sum(n) * 100, 1), "%")) %>%
  # Renombra las columnas para que la tabla sea más legible.
  rename(Vehículo = vehiculo, Cantidad = n) %>%
  kable(caption = "Comparendos por tipo de vehículo")
Comparendos por tipo de vehículo
Vehículo Cantidad Porcentaje
Auto 1939 91.5%
Moto 181 8.5%
df %>%
  # Cuenta los registros de cada categoría de vehículo.
  count(vehiculo) %>%
  # x = vehiculo coloca cada tipo en el eje horizontal; y = n la cantidad.
  ggplot(aes(x = vehiculo, y = n, fill = vehiculo)) +
  # width = 0.5 hace las barras más delgadas para mejor presentación visual.
  # show.legend = FALSE oculta la leyenda porque el eje ya identifica cada barra.
  geom_col(width = 0.5, show.legend = FALSE) +
  # vjust = -0.5 coloca la etiqueta justo encima de cada barra.
  geom_text(aes(label = n), vjust = -0.5, size = 4) +
  # Deja espacio en la parte superior para que las etiquetas no queden cortadas.
  scale_y_continuous(expand = expansion(mult = c(0, 0.12))) +
  # Asigna azul a los autos y naranja a las motos.
  scale_fill_manual(values = c("Auto" = "#3A5A98", "Moto" = "#F4A261")) +
  labs(title = "Comparendos por tipo de vehículo",
       x = "Tipo de vehículo", y = "Cantidad") +
  theme_minimal()


7. Análisis por mes

Al comparar los dos meses registrados, se observa que mayo concentra un mayor número de comparendos que abril. Esto puede deberse a que el período de registro en mayo abarca más días dentro de la base de datos.

df %>%
  # Cuenta cuántos comparendos se registraron en cada mes.
  count(nom_mes) %>%
  # Renombra las columnas para presentar la tabla de forma clara.
  rename(Mes = nom_mes, Cantidad = n) %>%
  kable(caption = "Comparendos por mes")
Comparendos por mes
Mes Cantidad
Abril 712
Mayo 1408
df %>%
  # Cuenta los comparendos de cada mes para construir el gráfico.
  count(nom_mes) %>%
  # fill = nom_mes asigna un color diferente a cada mes.
  ggplot(aes(x = nom_mes, y = n, fill = nom_mes)) +
  # width = 0.6 hace las barras un poco más angostas que el valor por defecto.
  # show.legend = FALSE oculta la leyenda porque el eje ya indica el mes.
  geom_col(width = 0.6, show.legend = FALSE) +
  # Escribe la cantidad exacta encima de cada barra.
  geom_text(aes(label = n), vjust = -0.5, size = 4) +
  # Aplica morado claro para Abril y morado oscuro para Mayo.
  scale_fill_manual(values = c("Abril" = "#B8A1D9", "Mayo" = "#7353A6")) +
  # Deja espacio superior para que los números no queden cortados.
  scale_y_continuous(expand = expansion(mult = c(0, 0.12))) +
  labs(title = "Comparendos por mes",
       x = "Mes", y = "Cantidad") +
  theme_minimal()


8. Análisis de costos

Se analizan los valores económicos de las multas impuestas. Existen únicamente dos valores posibles: $257.500 para infracciones de menor gravedad como exceso de velocidad y no respetar el paso de peatones, y $515.000 para infracciones graves como saltarse un semáforo. El gráfico de distribución confirma que la mayoría de las multas corresponden al valor menor, en línea con la infracción más frecuente.

8.1 Resumen estadístico

df %>%
  # summarise() colapsa todo el dataframe en una sola fila con los resúmenes.
  summarise(
    # min() obtiene el costo más bajo; na.rm = TRUE ignora valores vacíos.
    # dollar() formatea el número como moneda con el símbolo $.
    `Mínimo`  = dollar(min(costo, na.rm = TRUE), prefix = "$"),
    # max() obtiene el costo más alto registrado.
    `Máximo`  = dollar(max(costo, na.rm = TRUE), prefix = "$"),
    # mean() calcula el promedio de todos los costos.
    `Promedio`= dollar(mean(costo, na.rm = TRUE), prefix = "$"),
    # sum() suma todos los costos para obtener el total acumulado.
    `Total`   = dollar(sum(costo, na.rm = TRUE), prefix = "$")
  ) %>%
  kable(caption = "Resumen de costos de comparendos")
Resumen de costos de comparendos
Mínimo Máximo Promedio Total
$257,500 $515,000 $304,749 $646,067,500

8.2 Costo promedio por tipo de infracción

df %>%
  # group_by() agrupa los datos por tipo de infracción.
  # Los cálculos de summarise() se aplican dentro de cada grupo.
  group_by(nom_infraccion) %>%
  summarise(
    # n() cuenta cuántos comparendos hay en cada grupo.
    Cantidad = n(),
    # Calcula el costo promedio dentro de cada tipo de infracción.
    `Costo promedio` = dollar(mean(costo, na.rm = TRUE), prefix = "$"),
    # Suma los costos de cada tipo para obtener el total por infracción.
    `Costo total`    = dollar(sum(costo, na.rm = TRUE), prefix = "$")
  ) %>%
  # arrange(desc()) ordena la tabla de mayor a menor cantidad de comparendos.
  arrange(desc(Cantidad)) %>%
  kable(caption = "Costos por tipo de infracción")
Costos por tipo de infracción
nom_infraccion Cantidad Costo promedio Costo total
Conducir un vehículo a velocidad superior a la máxima permitida. 1626 $257,500 $418,695,000
No detenerse ante una luz roja o amarilla de semáforo 385 $515,000 $198,275,000
No respetar el paso de peatones 105 $257,500 $27,037,500
Transitar en sentido contrario al estipulado para la vía 4 $515,000 $2,060,000

8.3 Distribución de costos

df %>%
  # Cuenta cuántas multas hay para cada valor de costo.
  count(costo) %>%
  # factor(costo) trata los valores numéricos como categorías en el eje x.
  ggplot(aes(x = factor(costo), y = n, fill = factor(costo))) +
  # Dibuja las barras; show.legend = FALSE elimina la leyenda redundante.
  geom_col(show.legend = FALSE) +
  # Escribe la cantidad exacta encima de cada barra.
  geom_text(aes(label = n), vjust = -0.5, size = 4) +
  # Asigna verde azulado al valor menor y coral al valor mayor.
  scale_fill_manual(values = c("257500" = "#2A9D8F", "515000" = "#E76F51")) +
  # Deja espacio en la parte superior para las etiquetas de cantidad.
  scale_y_continuous(expand = expansion(mult = c(0, 0.12))) +
  # scale_x_discrete() reemplaza los números por etiquetas con formato de moneda.
  scale_x_discrete(labels = c("257500" = "$257.500", "515000" = "$515.000")) +
  labs(title = "Distribución de valores de comparendos",
       x = "Valor del comparendo", y = "Cantidad") +
  theme_minimal()


9. Infractores más frecuentes

La tabla muestra los 10 infractores con mayor número de comparendos acumulados. Se destacan tanto personas naturales como empresas que acumularon múltiples multas durante el período analizado, lo que sugiere una reincidencia en el incumplimiento de las normas de tránsito.

df %>%
  # count() cuenta los comparendos por nombre del infractor.
  # sort = TRUE los ordena de mayor a menor número de comparendos.
  count(ejecutado, sort = TRUE) %>%
  # head(10) conserva únicamente los diez primeros del listado.
  head(10) %>%
  # Renombra las columnas para que la tabla sea más comprensible.
  rename(`Nombre` = ejecutado, `N° comparendos` = n) %>%
  kable(caption = "Top 10 infractores con más comparendos")
Top 10 infractores con más comparendos
Nombre N° comparendos
LEASING BANCOLOMBIAA SA CF 61
FINANCIERA INTERNACIONAL SA 32
TRANSPORTES MST Y CIA SENC 31
LEASING DE OCCIDENTE SA CF 28
LILIANA ROZO PINZON 27
GMAC FINANCIERA DE COLOMBIA 21
LEASING DE CREDITO SA 21
TRANSPORTES MST Y CIA S EN C 17
UINON FAMILIAR CHARRIS SEN C 13
ELVIRA DEL CARMEN GARRIDO AREVALO 10

10. Conclusiones

  • La infracción más común es el exceso de velocidad, presente en más del 76% de los casos.

  • Los automóviles son el tipo de vehículo con más comparendos.

  • Mayo registró más infracciones que abril.

  • Las multas se concentran en el valor de $257.500, correspondiente a infracciones de menor gravedad.

  • Algunos infractores acumularon varios comparendos, evidenciando reincidencia en las infracciones.

  • La infracción más frecuente es exceder la velocidad máxima permitida (más del 76% de los casos).

  • Las mujeres representan el mayor grupo de infractores individuales, seguidas por hombres y empresas.

  • La gran mayoría de los comparendos corresponden a automóviles.

  • El mes de mayo concentra más comparendos que abril.

  • Existen dos valores de multa: $257.500 (infracciones leves) y $515.000 (más graves como semáforo en rojo).