Periodo analizado: 12/04/2010 al 27/05/2010 · 2.120 registros

Introducción

Resumen ejecutivo

  • Registros analizados: 2.120 comparendos entre el 12/04/2010 y el 27/05/2010.
  • Ritmo diario: en promedio, 46,1 registros por día. El día con más registros fue el 01/05/2010, con 89.
  • Infracción más frecuente: “Velocidad superior a la máxima permitida”, con 76,7% de los registros.
  • Vehículo con más registros: Carro, con 91,4% de los registros.
  • Alcance: los datos corresponden solo a comparendos que llegaron a mandamiento de pago. No representan todos los comparendos de la ciudad.

Este informe describe una base de comparendos de tránsito asociados a mandamiento de pago en Barranquilla. Presenta su comportamiento por día de la semana en abril y mayo, tipo de infracción, tipo de vehículo, mes y titular.

Se excluyeron 0 filas sin número de comparendo o sin fecha válida. Los registros repetidos no se eliminaron automáticamente, por lo que deben revisarse antes de tomar decisiones.

Cómo usar los gráficos: pasa el mouse sobre una línea o una barra para ver sus valores. Con las herramientas de cada gráfico puedes acercar, alejar o restablecer la vista.

Librerías usadas

El análisis se realizó en el lenguaje R. Estas son las librerías empleadas y su función dentro del informe.

Librería Para qué se usa en este informe
tidyverse Conjunto de paquetes para manipular y graficar datos: dplyr para filtrar y resumir, ggplot2 para los gráficos y tidyr para completar los días sin registros.
readxl Lee las hojas del archivo Excel sin convertirlo previamente.
lubridate Maneja fechas: convierte textos a fecha y obtiene el día de la semana.
knitr Genera el documento final y las tablas del informe.
plotly Convierte los gráficos en versiones interactivas con datos al pasar el mouse.
scales Da formato a números y porcentajes con punto de miles y coma decimal.

Cifras generales

2.120
Registros analizados
1.251
Titulares identificados
1.457
Placas distintas
46,1
Promedio diario de registros
$ 930.468.000
Valor a pagar (pesos)

Datos generales completos

Indicador Dato
Filas leídas del Excel 2.120
Filas excluidas (sin comparendo o sin fecha válida) 0
Registros analizados 2.120
Titulares identificados 1.251
Placas distintas 1.457
Primer día del periodo 12/04/2010
Último día del periodo 27/05/2010
Días calendario del periodo 46
Días sin registros 0
Promedio diario de registros 46,1
Día con más registros 01/05/2010 (89 registros)
Valor total a pagar (pesos) $ 930.468.000

Importante: el valor a pagar no equivale necesariamente al dinero recaudado. Además, la suma incluye solo los registros con valor disponible.

Análisis de comparendos

1. Días de la semana en abril y mayo

# ---- GRÁFICO 1: PROMEDIO POR DÍA DE LA SEMANA, ABRIL Y MAYO ----
# echo=TRUE para que aparezca botón Ver / Ocultar código solo en gráficos

# Datos de abril, con el día como texto para que el eje respete el orden
datos_abril <- resumen_mes_dia %>%
  filter(mes_nombre == "Abril") %>%
  mutate(dia_txt = as.character(dia_semana))

# Datos de mayo, con el mismo tratamiento
datos_mayo <- resumen_mes_dia %>%
  filter(mes_nombre == "Mayo") %>%
  mutate(dia_txt = as.character(dia_semana))

# Vector con el promedio general repetido una vez por día (para la línea punteada)
linea_general <- rep(promedio_diario, length(dias_semana))

# Figura base de altura fija; las capas se agregan con add_trace()
g1 <- plot_ly(height = 430) %>%
  # Capa 1: línea de abril (naranja), con etiqueta debajo de cada punto
  add_trace(
    data = datos_abril,
    x = ~dia_txt,
    y = ~promedio,
    type = "scatter",
    mode = "lines+markers+text",       # línea, puntos y texto
    name = "Abril",
    text = ~lab_prom,                  # número sobre cada punto
    textposition = "bottom center",    # abril: etiqueta debajo
    textfont = list(color = colores_mes[["Abril"]], size = 12),
    hoverinfo = "text",
    hovertext = ~etiqueta,             # contenido del tooltip
    line = list(color = colores_mes[["Abril"]], width = 3),
    marker = list(color = colores_mes[["Abril"]], size = 9)
  ) %>%
  # Capa 2: línea de mayo (azul), con etiqueta encima de cada punto
  add_trace(
    data = datos_mayo,
    x = ~dia_txt,
    y = ~promedio,
    type = "scatter",
    mode = "lines+markers+text",
    name = "Mayo",
    text = ~lab_prom,
    textposition = "top center",       # mayo: etiqueta encima
    textfont = list(color = colores_mes[["Mayo"]], size = 12),
    hoverinfo = "text",
    hovertext = ~etiqueta,
    line = list(color = colores_mes[["Mayo"]], width = 3),
    marker = list(color = colores_mes[["Mayo"]], size = 9)
  ) %>%
  # Capa 3: línea punteada del promedio general
  add_trace(
    x = dias_semana,
    y = linea_general,
    type = "scatter",
    mode = "lines",                    # solo línea, sin puntos
    name = paste0(
      "Línea punteada: promedio general (",
      formato_numero(promedio_diario, 0.1), ")"
    ),
    line = list(color = paleta[["gris"]], width = 2, dash = "dash"),
    hoverinfo = "skip"                 # no muestra tooltip
  ) %>%
  # Diseño general: títulos, ejes, anotación, leyenda y márgenes
  layout(
    title = list(
      text = "<b>Promedio de registros por día de la semana: abril y mayo</b>",
      x = 0.02
    ),
    xaxis = list(
      title = "Día de la semana",
      categoryorder = "array",         # respeta el orden de los días
      categoryarray = dias_semana
    ),
    yaxis = list(
      title = "Promedio de registros por día",
      rangemode = "tozero"             # el eje empieza en cero
    ),
    # Texto "Promedio general" ubicado en el jueves, encima de la línea
    annotations = list(
      list(
        x = "Jueves",
        y = promedio_diario,
        text = paste0(
          "<b>Promedio general: ",
          formato_numero(promedio_diario, 0.1),
          "</b>"
        ),
        showarrow = FALSE,
        yshift = 16,                   # separa el texto de la línea
        font = list(color = paleta[["gris"]], size = 13)
      )
    ),
    # Leyenda dentro del gráfico, arriba a la izquierda
    legend = list(
      x = 0.01,
      y = 0.99,
      xanchor = "left",
      yanchor = "top",
      bgcolor = "rgba(255,255,255,0.92)",
      bordercolor = "#CFD8DC",
      borderwidth = 1
    ),
    margin = list(t = 70, b = 60),
    hovermode = "closest"              # muestra el tooltip del punto más cercano
  ) %>%
  plotly::config(
    displaylogo = FALSE,
    responsive = TRUE
  )

# Muestra el gráfico en el documento
g1

Qué muestra: el promedio de registros de cada día de la semana, por separado para abril y mayo.

Cómo leerlo: cada punto es un promedio y el número junto a él es su valor exacto. La leyenda, dentro del gráfico (arriba a la izquierda), indica que el naranja corresponde a abril, el azul a mayo y la línea punteada al promedio general por día (46,1 registros). Un punto por encima de esa línea indica un día que, en promedio, superó el promedio general.

Mayor promedio: Domingo de mayo, con 76,0 registros por día.

Precaución: cada promedio se calcula con entre 2 y 4 días observados. Con tan pocos días, una diferencia pequeña puede deberse a la variación natural del periodo. En este periodo no hubo días sin registros.

2. Distribución por tipo de infracción

# ---- GRÁFICO 2: COMPARENDOS POR TIPO DE INFRACCIÓN (BARRAS HORIZONTALES) ----
# echo=TRUE para botón Ver / Ocultar

# Agrega etiquetas: dentro de la barra si es grande, fuera si es pequeña
datos_g3 <- etiquetas_barras(
  tabla_infracciones,
  "cantidad",
  horizontal = TRUE
)

# Gráfico ggplot que luego se vuelve interactivo
g3 <- ggplot(
  datos_g3,
  aes(
    x = reorder(infraccion, cantidad),  # ordena las barras por cantidad
    y = cantidad,
    text = etiqueta,                    # texto del tooltip
    fill = color_barra                  # color de cada barra
  )
) +
  geom_col(width = 0.7) +               # barras
  # Etiquetas numéricas sobre o dentro de cada barra
  geom_text(
    aes(
      y = pos_y,
      label = txt_lab,
      hjust = txt_h,
      vjust = txt_v,
      color = txt_col
    ),
    fontface = "bold",
    size = 3.6,
    show.legend = FALSE
  ) +
  coord_flip() +                        # gira el gráfico para barras horizontales
  # Corta los nombres largos de infracción en varias líneas
  scale_x_discrete(labels = function(x) stringr::str_wrap(x, 28)) +
  scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +  # espacio para las etiquetas
  scale_fill_identity(guide = "none") +  # usa los colores tal cual, sin leyenda
  scale_color_identity(guide = "none") +
  labs(
    title = "Comparendos por tipo de infracción",
    x = "Infracción",
    y = "Registros"
  ) +
  tema

# Convierte a gráfico interactivo con altura de 420 píxeles
grafico_interactivo(g3, alto = 420)

Qué muestra: cuántos registros corresponden a cada código de infracción.

Cómo leerlo: la barra roja es la infracción más frecuente de la base: “Velocidad superior a la máxima permitida”, con 76,7% de los registros.

Precaución: las descripciones de los códigos son provisionales. Deben verificarse con la fuente oficial antes de usarlas en decisiones.

3. Comparendos según tipo de vehículo

# ---- GRÁFICO 3: COMPARENDOS POR TIPO DE VEHÍCULO (BARRAS VERTICALES) ----
# echo=TRUE para botón Ver / Ocultar

# Agrega etiquetas numéricas adaptadas al tamaño de cada barra
datos_g4 <- etiquetas_barras(
  tabla_vehiculos,
  "cantidad"
)

# Gráfico ggplot de barras verticales
g4 <- ggplot(
  datos_g4,
  aes(
    x = reorder(tipo_vehiculo, -cantidad),  # de mayor a menor
    y = cantidad,
    text = etiqueta,
    fill = color_barra
  )
) +
  geom_col(width = 0.6) +
  # Etiquetas numéricas dentro o fuera de cada barra
  geom_text(
    aes(
      y = pos_y,
      label = txt_lab,
      hjust = txt_h,
      vjust = txt_v,
      color = txt_col
    ),
    fontface = "bold",
    size = 3.6,
    show.legend = FALSE
  ) +
  scale_fill_identity(guide = "none") +
  scale_color_identity(guide = "none") +
  scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
  labs(
    title = "Comparendos por tipo de vehículo",
    x = "Tipo de vehículo",
    y = "Registros"
  ) +
  tema

# Versión interactiva con altura de 360 píxeles
grafico_interactivo(g4, alto = 360)

Qué muestra: cuántos registros aparecen para cada tipo de vehículo.

Cómo leerlo: el tipo “Carro” concentra 91,4% de los registros.

Precaución: el gráfico muestra cantidades, no tasas. No indica qué proporción de vehículos de cada tipo circula en la ciudad.

4. Comparación mensual

# ---- GRÁFICO 4: REGISTROS TOTALES POR MES ----
# echo=TRUE para botón Ver / Ocultar

# Agrega etiquetas numéricas adaptadas al tamaño de cada barra
datos_g5 <- etiquetas_barras(
  tabla_meses,
  "cantidad"
)

# Barras verticales, una por mes, con color fijo por mes
g5 <- ggplot(
  datos_g5,
  aes(
    x = mes_nombre,
    y = cantidad,
    text = etiqueta,
    fill = mes_nombre
  )
) +
  geom_col(width = 0.55) +
  geom_text(
    aes(
      y = pos_y,
      label = txt_lab,
      hjust = txt_h,
      vjust = txt_v,
      color = txt_col
    ),
    fontface = "bold",
    size = 3.6,
    show.legend = FALSE
  ) +
  scale_fill_manual(values = colores_mes) +   # abril naranja, mayo azul
  scale_color_identity(guide = "none") +
  scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
  labs(
    title = "Registros por mes",
    x = "Mes",
    y = "Registros"
  ) +
  tema

# Versión interactiva con altura de 360 píxeles
grafico_interactivo(g5, alto = 360)
Mes Días en el periodo Registros Promedio diario
Abril 19 712 712
Mayo 27 1408 1408

Qué muestra: el total de registros por mes.

Cómo leerlo: la tabla incluye el promedio diario. Compara los meses con esa columna, porque un mes con más días en el periodo puede acumular más registros sin tener un promedio mayor.

Precaución: un total mayor no significa necesariamente un mayor promedio diario.

5. Titulares con mayor número de registros

Un titular es la persona natural o la empresa a cuyo documento está asociado el comparendo. En este gráfico cada titular aparece con un alias para proteger su identidad. Se muestran hasta diez titulares con más registros.

# ---- GRÁFICO 5: TOP 10 TITULARES (CON ALIAS) ----
# echo=TRUE para botón Ver / Ocultar

# Si no hay identificaciones, se muestra un aviso en lugar del gráfico
if (nrow(top_titulares) == 0) {
  cat("No hay identificaciones disponibles para esta consulta.\n")
} else {
  # Etiquetas numéricas adaptadas al tamaño de cada barra
  datos_g6 <- top_titulares %>%
    select(alias, cantidad, etiqueta) %>%
    etiquetas_barras("cantidad", horizontal = TRUE)

  # Barras horizontales: un alias por barra
  g6 <- ggplot(
    datos_g6,
    aes(
      x = reorder(alias, cantidad),  # ordena de menor a mayor para mostrar el mayor arriba
      y = cantidad,
      text = etiqueta
    )
  ) +
    geom_col(fill = paleta[["cafe"]], width = 0.7) +
    geom_text(
      aes(
        y = pos_y,
        label = txt_lab,
        hjust = txt_h,
        vjust = txt_v,
        color = txt_col
      ),
      fontface = "bold",
      size = 3.6,
      show.legend = FALSE
    ) +
    coord_flip() +                       # barras horizontales
    scale_color_identity(guide = "none") +
    scale_y_continuous(expand = expansion(mult = c(0, 0.2))) +
    labs(
      title = "Titulares con mayor número de registros",
      x = "Titular (alias)",
      y = "Registros"
    ) +
    tema

  # Versión interactiva con altura de 440 píxeles
  grafico_interactivo(g6, alto = 440)
}

Qué es un titular: la persona natural o empresa a cuyo documento está asociado el comparendo. Un mismo titular puede tener varios registros.

Qué muestra: los titulares con más registros en la base. Cada número indica cuántos registros aparecen a nombre de ese titular.

Cómo leerlo: el titular con más registros aparece 61 veces en el archivo.

Precaución: varios registros no equivalen por sí solos a reincidencia en sentido legal. Tampoco permiten identificar a una persona o empresa con certeza desde este informe.

Conclusiones

Se analizaron 2.120 registros en 46 días calendario, con un promedio de 46,1 registros por día. El día con más registros fue el 01/05/2010, con 89 registros. La infracción más frecuente fue Velocidad superior a la máxima permitida, con 76,7% de los registros, y el tipo de vehículo con más registros fue Carro, con 91,4% de los registros. Los resultados describen únicamente este archivo; no permiten conocer todas las infracciones de la ciudad ni explicar sus causas.

Dashboard interactivo

Explorar los datos con más detalle

Abrir el dashboard interactivo de comparendos

El dashboard permite consultar los gráficos y seleccionar un tipo de vehículo para observar su comportamiento en el tiempo.

Para que el enlace funcione, genera primero dashboard_interactivo.html y mantenlo en la misma carpeta que este informe.