Column

Tendencia de Comparendos y Pronóstico

Distribución por Infracción

Column

Comparendos por Localidad

Estadísticas por Medio de Imposición

Distribución por Clase de Vehículo (%)

Valor Recaudado vs Nominal

---
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))
```