Periodo analizado: 12/04/2010 al 27/05/2010 · 2.120 registros
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.
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. |
| 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.
# ---- 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.
# ---- 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.
# ---- 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.
# ---- 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.
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.
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.
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.