1 Introducción

El presente trabajo tiene como objetivo analizar una base de datos de comparendos de tránsito de Barranquilla correspondientes al año 2010, específicamente la hoja “BD Comparendos OK” del archivo de Excel. Esta contiene un total de 2.120 comparendos, registrados entre el 12 de abril y el 27 de mayo, con un valor económico acumulado de $646.067.500.

A través del lenguaje de programación R, se realiza la limpieza, organización y análisis de los datos, teniendo en cuenta variables como el tipo de infracción, los vehículos, el género de los responsables, las fechas y los valores de las multas. Entre los resultados se busca identificar las infracciones más frecuentes, destacando el exceso de velocidad, que representa el 76,7 % de los casos.

También se analiza el tipo de vehículo involucrado, donde los automóviles representan el 91,4 % de los comparendos, mientras que las motocicletas corresponden al 8,6 %. De igual manera, se identifican 1.243 responsables diferentes y 1.457 vehículos, lo que permite conocer mejor la distribución de las infracciones.

Por otra parte, se estudia el comportamiento de los comparendos según los días de la semana, encontrando que el 36,2 % de los casos se presentó durante los fines de semana. Además, se realiza una comparación entre los meses de abril y mayo, en los cuales se registraron 712 y 1.408 comparendos, respectivamente.

Finalmente, mediante tablas, gráficos y consultas, se pretende identificar los principales comportamientos y patrones presentes en los registros, facilitando la interpretación de la información y permitiendo comprender mejor la situación de las infracciones de tránsito durante el periodo estudiado.

2 Preparación del entorno

2.1 Cargar las librerías

# tidyverse: incluye dplyr (manipular datos), ggplot2 (gráficos), stringr, lubridate, etc.
library(tidyverse)
# readxl: permite leer archivos de Excel (.xlsx)
library(readxl)
# knitr: se usa para mostrar tablas bonitas y para insertar imágenes
library(knitr)
# Carpeta de Descargas del usuario (en Windows: C:/Users/TU_USUARIO/Downloads)
carpeta <- file.path(Sys.getenv("USERPROFILE"), "Downloads")

# Nombre del archivo de Excel (tal como aparece en la carpeta)
archivo <- "BD comparendo Luis.xlsx"

# Ruta completa = carpeta + archivo
ruta <- file.path(carpeta, archivo)

# Hoja del Excel con la que vamos a trabajar
hoja <- "BD Comparendos OK"

# Si tu carpeta se llama "Descargas" en vez de "Downloads", usa esta línea:
# ruta <- file.path(Sys.getenv("USERPROFILE"), "Descargas", archivo)

# Comprobamos que el archivo exista (si no, el informe se detiene con un mensaje claro)
stopifnot("No se encontró el archivo: revisa la ruta" = file.exists(ruta))
ruta
## [1] "C:\\Users\\HP/Downloads/BD comparendo Luis.xlsx"

3 Lectura de los datos

# Leemos únicamente la hoja "BD Comparendos OK"
datos_raw <- read_excel(path = ruta, sheet = hoja)

# Dimensiones de la tabla: filas x columnas
dim(datos_raw)
## [1] 2120   25

La hoja original tiene 2120 filas y 25 columnas.

# Mostramos las primeras 5 filas y las primeras 8 columnas tal como vienen del Excel
kable(head(datos_raw[, 1:8], 5), caption = "Vista previa de los datos originales")
Vista previa de los datos originales
No. MANDAMIENTO DE PAGO FECHA MANDAMIENTO DE PAGO EJECUTADO TIPO DE IDENTIFICACION #TIPO DE IDENTIFICACION No. IDENTIFICACION GENERO #GENERO
F00001478 19/08/2010 ZULLY PATRICIA IBARRA DONADO Cedula de Ciudadanía 1 22617126 MUJER 1
F00002105 19/08/2010 ZULIMA DEL CARMEN HENNESSEY CLAVIJO Cedula de Ciudadanía 1 32770170 MUJER 1
F00003509 19/08/2010 ZOOCRIADERO COLOMBIAN CROCO LI Nit 1 800120048 EMPRESA 1
F00003510 19/08/2010 ZOOCRIADERO COLOMBIAN CROCO LI Nit 1 800120048 EMPRESA 1
F00003511 19/08/2010 ZOOCRIADERO COLOMBIAN CROCO LI Nit 1 800120048 EMPRESA 1
# Función que convierte un número en pesos colombianos: 257500 -> "$ 257.500"
pesos <- scales::label_number(prefix = "$ ", big.mark = ".", decimal.mark = ",")

# Paleta de colores usada en todo el informe
colores <- c("#1E3A5F", "#E67E22", "#C0392B", "#F1C40F", "#2C3E50")

4 Limpieza y preparación

La hoja trae columnas auxiliares que empiezan por # (todas valen 1, sirven solo para conteos en las tablas dinámicas de Excel). Las eliminamos, renombramos las columnas con nombres cortos y corregimos tipos de datos y textos.

datos <- datos_raw %>%
  # 1. Quitamos espacios sobrantes en los nombres de columna (ej. "No. MANDAMIENTO DE PAGO ")
  rename_with(~ str_squish(.x)) %>%
  # 2. Eliminamos las columnas auxiliares que empiezan por "#"
  select(-starts_with("#")) %>%
  # 3. Renombramos las columnas con nombres más cortos y fáciles de usar
  rename(
    mandamiento       = `No. MANDAMIENTO DE PAGO`,
    fecha_mandamiento = `FECHA MANDAMIENTO DE PAGO`,
    ejecutado         = EJECUTADO,
    tipo_id           = `TIPO DE IDENTIFICACION`,
    identificacion    = `No. IDENTIFICACION`,
    genero            = GENERO,
    cod_infraccion    = `COD. INFRACCION`,
    infraccion        = NOM.INFRACCION,
    comparendo        = COMPARENDO,
    fecha_comparendo  = `FECHA DE COMPARENDO`,
    año              = AÑO,
    mes               = MES,
    nom_mes           = `NOM MES`,
    dia               = DIA,
    nom_dia           = `NOM DIA`,
    placa             = `PLACA DE VEHICULO`,
    vehiculo          = VEHICULO,
    costo             = `COSTO COMPARENDO`
  ) %>%
  mutate(
    # 4. Fechas: la fecha del mandamiento viene como texto "19/08/2010"
    fecha_mandamiento = if (is.character(fecha_mandamiento)) dmy(fecha_mandamiento)
                        else as.Date(fecha_mandamiento),
    fecha_comparendo  = as.Date(fecha_comparendo),
    # 5. Corregimos el error de digitación "Extanjería" y dejamos el texto presentable
    tipo_id    = str_replace(tipo_id, "Extanjer", "Extranjer"),
    genero     = str_to_title(genero),
    infraccion = str_to_sentence(infraccion),
    vehiculo   = str_to_title(vehiculo),
    # 6. Los días y meses los convertimos a factor para que se ordenen correctamente
    nom_dia = factor(nom_dia,
                     levels = c("LUNES", "MARTES", "MIÉRCOLES", "JUEVES",
                                "VIERNES", "SÁBADO", "DOMINGO")),
    nom_mes = factor(nom_mes, levels = c("ABRIL", "MAYO"))
  )

# glimpse() muestra cada columna con su tipo de dato
glimpse(datos)
## Rows: 2,120
## Columns: 18
## $ mandamiento       <chr> "F00001478", "F00002105", "F00003509", "F00003510", …
## $ fecha_mandamiento <date> 2010-08-19, 2010-08-19, 2010-08-19, 2010-08-19, 201…
## $ ejecutado         <chr> "ZULLY PATRICIA IBARRA DONADO", "ZULIMA DEL CARMEN H…
## $ tipo_id           <chr> "Cedula de Ciudadanía", "Cedula de Ciudadanía", "Nit…
## $ identificacion    <dbl> 22617126, 32770170, 800120048, 800120048, 800120048,…
## $ genero            <chr> "Mujer", "Mujer", "Empresa", "Empresa", "Empresa", "…
## $ cod_infraccion    <dbl> 64, 67, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 77, …
## $ infraccion        <chr> "Velocidad superior a la maxima permitida", "No resp…
## $ comparendo        <chr> "F00014049", "F00014095", "F00013652", "F00009388", …
## $ fecha_comparendo  <date> 2010-05-22, 2010-05-22, 2010-05-20, 2010-05-08, 201…
## $ año               <dbl> 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010…
## $ mes               <dbl> 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 5, 5, 5, 5, 5, 4…
## $ nom_mes           <fct> MAYO, MAYO, MAYO, MAYO, MAYO, MAYO, MAYO, MAYO, MAYO…
## $ dia               <dbl> 22, 22, 20, 8, 12, 3, 23, 2, 27, 18, 23, 29, 11, 11,…
## $ nom_dia           <fct> SÁBADO, SÁBADO, JUEVES, SÁBADO, MIÉRCOLES, LUNES, DO…
## $ placa             <chr> "UZD459", "UYM861", "QHI400", "QHI400", "QHI400", "Q…
## $ vehiculo          <chr> "Auto", "Auto", "Auto", "Auto", "Auto", "Auto", "Mot…
## $ costo             <dbl> 257500, 257500, 257500, 257500, 257500, 257500, 2575…

4.1 Calidad de los datos

# Valores faltantes por columna (0 significa que la columna está completa)
faltantes <- colSums(is.na(datos))

# Mandamientos de pago repetidos
duplicados <- sum(duplicated(datos$mandamiento))

# Tabla resumen de calidad
tibble(
  Revisión = c("Filas", "Columnas", "Valores faltantes (total)", "Mandamientos repetidos"),
  Resultado = c(nrow(datos), ncol(datos), sum(faltantes), duplicados)
) %>%
  kable(caption = "Revisión de calidad de la base de datos")
Revisión de calidad de la base de datos
Revisión Resultado
Filas 2120
Columnas 18
Valores faltantes (total) 0
Mandamientos repetidos 1
# Calculamos los indicadores principales con summarise()
resumen <- datos %>%
  summarise(
    total_comparendos = n(),                           # número de comparendos
    deuda_total       = sum(costo),                    # suma de los valores
    ejecutados_unicos = n_distinct(identificacion),    # personas/empresas distintas
    placas_unicas     = n_distinct(placa),             # vehículos distintos
    primera_fecha     = min(fecha_comparendo),         # primer comparendo
    ultima_fecha      = max(fecha_comparendo)          # último comparendo
  )

resumen
  • Total de comparendos: 2.120
  • Valor total de los comparendos: $ 646.067.500
  • Personas o empresas distintas: 1.243
  • Vehículos distintos (placas): 1.457

5 Análisis de las infracciones

5.1 Comparendos tipos de infracción

# Contamos cuántos comparendos hay por infracción y calculamos el porcentaje
tabla_infr <- datos %>%
  count(infraccion, sort = TRUE) %>%                    # conteo ordenado de mayor a menor
  mutate(porcentaje = round(n / sum(n) * 100, 1))       # porcentaje sobre el total

kable(tabla_infr, col.names = c("Infracción", "Comparendos", "% del total"),
      caption = "Comparendos por tipo de infracción")
Comparendos por tipo de infracción
Infracción Comparendos % del total
Velocidad superior a la maxima permitida 1626 76.7
No detenerse ante una luz roja o amarilla 385 18.2
No respetar el paso de peatones 105 5.0
Transitar en sentido contrario 4 0.2
# Gráfico de barras horizontales: una barra por infracción
ggplot(tabla_infr, aes(x = reorder(infraccion, n), y = n)) +
  geom_col(fill = colores[1]) +                                   # barras
  geom_text(aes(label = paste0(n, " (", porcentaje, "%)")),       # etiqueta con cantidad y %
            hjust = -0.1, size = 3.8) +
  coord_flip() +                                                  # barras horizontales
  scale_y_continuous(expand = expansion(mult = c(0, 0.25))) +     # espacio para las etiquetas
  labs(title = "Comparendos por tipo de infracción",
       x = NULL, y = "Número de comparendos") +
  theme_minimal(base_size = 12)

En esta gráfica podemos observar los comparendos clasificados por tipo de infracción. La infracción que más se presenta es exceder la velocidad máxima permitida, con 1.626 comparendos, que representan el 76,7 % del total. Le sigue no detenerse ante una luz roja o amarilla con 385 casos. En cambio, transitar en sentido contrario es la infracción que menos aparece, con solo 4 casos.

5.2 Infracciones según el tipo de vehículo

# Contamos por infracción y tipo de vehículo, y graficamos barras agrupadas
datos %>%
  count(infraccion, vehiculo) %>%
  ggplot(aes(x = reorder(infraccion, n), y = n, fill = vehiculo)) +
  geom_col(position = position_dodge(width = 0.9)) +   # barras una al lado de la otra
  geom_text(aes(label = n),                            # cantidad al final de cada barra
            position = position_dodge(width = 0.9),    # misma separación que las barras
            hjust = -0.2, size = 3.8) +
  coord_flip() +
  scale_fill_manual(values = colores[1:2]) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.12))) +  # espacio para las etiquetas
  labs(title = "Infracciones por tipo de vehículo",
       x = NULL, y = "Número de comparendos", fill = "Vehículo") +
  theme_minimal(base_size = 12)

En esta gráfica podemos observar que la infracción que más se repite es exceder la velocidad máxima permitida. Los automóviles tienen 1.467 comparendos por esta causa, mientras que las motos tienen 159. También podemos ver que los automóviles presentan más comparendos que las motos en todas las infracciones mostradas. La infracción menos frecuente es transitar en sentido contrario, con solamente 2 casos para cada tipo de vehículo.

5.3 Tipo de vehículo

# Conteo de comparendos por tipo de vehículo (Auto / Moto)
datos %>%
  count(vehiculo) %>%
  ggplot(aes(x = vehiculo, y = n, fill = vehiculo)) +
  geom_col(show.legend = FALSE, width = 0.6) +
  geom_text(aes(label = n), vjust = -0.4) +                # solo la cantidad (sin porcentaje)
  scale_fill_manual(values = colores[1:2]) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.12))) +
  labs(title = "Comparendos por tipo de vehículo", x = NULL, y = "Comparendos") +
  theme_minimal(base_size = 12)

En esta grafica se puede observar que los autos son los vehiculos que mas cometen infracciones.

5.4 Género y tipo de ejecutado

# La columna "genero" incluye la categoría "Empresa" (personas jurídicas con NIT)
datos %>%
  count(genero) %>%
  ggplot(aes(x = reorder(genero, -n), y = n, fill = genero)) +
  geom_col(show.legend = FALSE, width = 0.6) +
  geom_text(aes(label = n), vjust = -0.4) +
  scale_fill_manual(values = colores[1:3]) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.12))) +
  labs(title = "Comparendos por género",
       x = NULL, y = " Cantidad de comparendos") +
  theme_minimal(base_size = 12)

En esta gráfica podemos observar los comparendos clasificados por género o tipo de responsable. La categoría con mayor cantidad de comparendos es Mujer, con 970 casos, seguida de Hombre con 683 y Empresa con 467. Esto significa que, dentro de nuestra base de datos, los registros asociados a mujeres son los más numerosos.

5.5 Ejecutados con más comparendos

# Top 10 de personas o empresas con más comparendos
top_ejecutados <- datos %>%
  count(ejecutado, sort = TRUE) %>%
  slice_head(n = 10)

ggplot(top_ejecutados, aes(x = reorder(ejecutado, n), y = n)) +
  geom_col(fill = colores[2]) +
  geom_text(aes(label = n), hjust = -0.2) +
  coord_flip() +
  scale_y_continuous(expand = expansion(mult = c(0, 0.12))) +
  labs(title = "Top 10 de ejecutados con más comparendos",
       x = NULL, y = "Cantidad de comparendos") +
  theme_minimal(base_size = 12)

Esta gráfica muestra los 10 ejecutados que tienen más comparendos. El primer lugar lo ocupa Leasing Bancolombia con 61 comparendos, seguido por Transportes MST con 48 y Financiera Internacional con 32. A medida que avanzamos en la gráfica, la cantidad de comparendos va disminuyendo, hasta llegar a Miguel Hernando Garay Calle, que tiene 9. Lo más destacado es la diferencia entre el primer y segundo lugar, ya que existe una diferencia de 13 comparendos.

5.6 Por mes y por día de la semana

# Comparendos por mes (el periodo abarca abril y mayo de 2010)
datos %>%
  count(nom_mes) %>%
  ggplot(aes(x = nom_mes, y = n, fill = nom_mes)) +
  geom_col(show.legend = FALSE, width = 0.5) +
  geom_text(aes(label = n), vjust = -0.4) +
  scale_fill_manual(values = colores[1:2]) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.12))) +
  labs(title = "Comparendos por mes", x = NULL, y = "Comparendos") +
  theme_minimal(base_size = 12)

En esta gráfica se observa que mayo es el mes con más comparendos, con 1.408 casos, frente a 712 en abril. Es decir, mayo casi duplica a abril.

6 Conclusiones

La base reúne 2.120 comparendos entre el 12 de abril y el 27 de mayo de 2010, por un valor total de $646.067.500, correspondientes a 1.243 personas o empresas y 1.457 vehículos.

La infracción más frecuente es el exceso de velocidad (76,7 %), seguida de no detenerse ante la luz roja o amarilla (18,2 %) y no respetar el paso peatonal (5 %). Aunque la luz roja representa menos casos, aporta el 30,7 % del valor total debido a su mayor tarifa.

Los automóviles concentran el 91,4 % de los comparendos y las motos el 8,6 %. La distribución entre mujeres, hombres y empresas muestra porcentajes similares de infracciones de mayor valor. Sin embargo, debe tenerse en cuenta que el titular del comparendo no necesariamente era quien conducía y que no se cuenta con información del parque automotor.

En cuanto a la reincidencia, el 28,2 % de los ejecutados registra más de un comparendo y acumula el 57,9 % de los casos. Además, los fines de semana concentran el 36,2 % de las infracciones, especialmente los domingos y sábados. En mayo se registró un aumento diario del 39 % respecto a abril, principalmente durante los fines de semana, aunque no es posible determinar si se debe a más infracciones o a mayores controles.

El exceso de velocidad es el principal problema, seguido de las infracciones por semáforo, con mayor concentración de casos durante los fines de semana. Para realizar un análisis más preciso, sería necesario contar con información sobre horarios, lugares, pagos y parque automotor.