---
title: "Dashboard de Comparendos"
author: "Harold Velasquez"
output:
flexdashboard::flex_dashboard:
orientation: columns
social: menu
source_code: embed
---
```{r setup, include=FALSE}
library(flexdashboard)
library(highcharter)
library(dplyr)
library(viridisLite)
library(tidyr)
library(lubridate)
library(forecast)
library(knitr)
library(DT)
# Tema personalizado para los gráficos
thm <- hc_theme(
colors = c("#1a6ecc", "#434348", "#90ed7d"),
chart = list(
backgroundColor = "transparent",
style = list(fontFamily = "Source Sans Pro")
),
xAxis = list(
gridLineWidth = 1
)
)
# Cargar los datos
load("data_V2024.RData")
# Preparar datos para las series de tiempo y pronóstico
comparendos_tiempo <- data_V2024 %>%
mutate(fecha = as.Date(`Fecha Comparendo`)) %>%
group_by(fecha) %>%
summarise(total = n()) %>%
arrange(fecha)
# Crear serie de tiempo y pronóstico más robusto
ts_comparendos <- ts(comparendos_tiempo$total,
frequency = 7, # Frecuencia semanal
start = c(year(min(comparendos_tiempo$fecha)),
week(min(comparendos_tiempo$fecha))))
# Usar modelo más apropiado para datos diarios
modelo_forecast <- stlf(ts_comparendos,
h = 30, # Pronóstico para 30 días
method = "arima")
# Preparar datos por localidad
comparendos_localidad <- data_V2024 %>%
group_by(Localidad) %>%
summarise(
total = n(),
valor_total = sum(`Valor Nominal`, na.rm = TRUE),
recaudo = sum(`Valor Recaudo`, na.rm = TRUE),
pagados = sum(Pagado == "SI", na.rm = TRUE)
) %>%
arrange(desc(total))
# Preparar datos para medio de imposición
medios_imposicion <- data_V2024 %>%
group_by(`Medio de imposicion`) %>%
summarise(
num_comparendos = n(),
comparendos_pagados = sum(Pagado == "SI", na.rm = TRUE),
valor_nominal = sum(`Valor Nominal`, na.rm = TRUE),
valor_recaudado = sum(`Valor Recaudo`, na.rm = TRUE)
) %>%
arrange(desc(num_comparendos)) %>%
mutate(
valor_nominal = format(valor_nominal, big.mark = ","),
valor_recaudado = format(valor_recaudado, big.mark = ",")
)
```
Column {data-width=600}
-----------------------------------------------------------------------
### Tendencia de Comparendos y Pronóstico
```{r}
# Combinar datos reales y pronóstico
fechas_pronostico <- seq(max(comparendos_tiempo$fecha),
by = "day",
length.out = 30)
highchart() %>%
hc_add_series(data = comparendos_tiempo,
type = "line",
hcaes(x = fecha, y = total),
name = "Datos históricos") %>%
hc_add_series(data = data.frame(
fecha = fechas_pronostico,
total = modelo_forecast$mean),
type = "line",
hcaes(x = fecha, y = total),
name = "Pronóstico",
dashStyle = "Dash",
color = "#434348") %>%
hc_add_theme(thm) %>%
hc_title(text = "Evolución Temporal de Comparendos con Pronóstico") %>%
hc_xAxis(type = "datetime",
title = list(text = "Fecha"),
dateTimeLabelFormats = list(
day = '%e de %b, %Y',
week = '%e de %b, %Y',
month = '%b %Y',
year = '%Y'
)) %>%
hc_yAxis(title = list(text = "Número de Comparendos")) %>%
hc_tooltip(dateTimeLabelFormats = list(day = '%e de %b, %Y'))
```
### Distribución por Infracción
```{r}
data_V2024 %>%
group_by(Infraccion) %>%
summarise(total = n()) %>%
mutate(porcentaje = total / sum(total) * 100) %>%
arrange(desc(porcentaje)) %>%
hchart("treemap",
hcaes(x = Infraccion, value = porcentaje, color = porcentaje),
name = "Porcentaje",
dataLabels = list(format = "{point.name}<br>{point.value:.1f}%")) %>%
hc_add_theme(thm) %>%
hc_title(text = "Distribución Porcentual por Tipo de Infracción")
```
Column {.tabset data-width=400}
-----------------------------------------------------------------------
### Comparendos por Localidad
```{r}
hchart(comparendos_localidad, "bar",
hcaes(x = Localidad, y = total),
name = "Total Comparendos") %>%
hc_add_theme(thm) %>%
hc_xAxis(title = list(text = "Localidad")) %>%
hc_yAxis(title = list(text = "Número de Comparendos")) %>%
hc_plotOptions(bar = list(dataLabels = list(enabled = TRUE)))
```
### Estadísticas por Medio de Imposición
```{r}
DT::datatable(
medios_imposicion,
colnames = c(
"Medio de Imposición",
"Número de Comparendos",
"Comparendos Pagados",
"Valor Nominal",
"Valor Recaudado"
),
options = list(
pageLength = 10,
dom = 'Bfrtip',
buttons = c('copy', 'csv', 'excel', 'pdf', 'print'),
order = list(list(1, 'desc'))
),
rownames = FALSE
) %>%
formatStyle(
columns = 1:5,
backgroundColor = 'white',
color = 'black'
)
```
### Distribución por Clase de Vehículo (%)
```{r}
data_V2024 %>%
group_by(`Clase Vehiculo`) %>%
summarise(total = n()) %>%
mutate(porcentaje = total / sum(total) * 100) %>%
arrange(desc(porcentaje)) %>%
hchart("treemap",
hcaes(x = `Clase Vehiculo`, value = porcentaje, color = porcentaje),
name = "Porcentaje",
dataLabels = list(format = "{point.name}<br>{point.value:.1f}%")) %>%
hc_add_theme(thm) %>%
hc_title(text = "Distribución Porcentual por Tipo de Vehículo")
```
### Valor Recaudado vs Nominal
```{r}
comparendos_localidad %>%
select(Localidad, valor_total, recaudo) %>%
gather(tipo, valor, -Localidad) %>%
mutate(
tipo = ifelse(tipo == "valor_total", "Valor Nominal", "Valor Recaudado"),
Localidad = factor(Localidad, levels = comparendos_localidad$Localidad)
) %>%
hchart("bar",
hcaes(x = Localidad, y = valor, group = tipo),
name = "Valores") %>%
hc_add_theme(thm) %>%
hc_chart(inverted = TRUE) %>%
hc_xAxis(title = list(text = "Localidad")) %>%
hc_yAxis(title = list(text = "Valor en Pesos")) %>%
hc_plotOptions(bar = list(dataLabels = list(enabled = TRUE, format = "{point.y:,.0f}"))) %>%
hc_xAxis(labels = list(rotation = 0))
```