Procesamiento de Datos
El preprocesamiento de datos es un paso crucial para garantizar que
los datos estén limpios y listos para el análisis. A continuación, se
detallan los pasos tomados para limpiar y preparar los datos
Carga Librerias
Se cargan las librerías necesarias para la manipulación de datos,
visualización y modelado, como dplyr, stringr, caret, corrplot, xgboost,
entre otras.
# Cargar librerías necesarias
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(stringr)
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
library(corrplot)
## corrplot 0.92 loaded
library(xgboost)
##
## Attaching package: 'xgboost'
## The following object is masked from 'package:dplyr':
##
## slice
library(factoextra)
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
library(kableExtra)
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
library(summarytools)
library(httr)
##
## Attaching package: 'httr'
## The following object is masked from 'package:caret':
##
## progress
library(zoo)
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(ggcorrplot)
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
library(gridExtra)
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
library(grid)
library(rlang)
Cargas funciones y base de datos
Se cargan funciones específicas desde un archivo de GitHub y los
datos de permisos de circulación desde un CSV en GitHub.
# Enlace raw al archivo de funciones en GitHub
source("https://raw.githubusercontent.com/jkcrs1/R/main/funciones.R")
# Permisos circulación pagados en la municipalidad de calbuco
url3 <- "https://github.com/jkcrs1/R/raw/main/permiso_circulacion_calbuco.csv"
# Prueba con diferentes codificaciones
permiso <- read.csv(url3, sep = ";", fileEncoding = "ISO-8859-1")
Tipos de Variables
Se utiliza el paquete summarytools para generar un resumen detallado
de las variables del dataframe.
# Obtener un resumen de los datos utilizando summarytools y renderizar en HTML
dfSummary(permiso) %>%
print(method = 'render')
Normalización de las Variables
Se normalizan y limpian las variables del conjunto de datos,
recodificando variables categóricas, reemplazando valores nulos y
transformando datos según sea necesario.
# Convertir permiso a data.frame (por si no lo es)
permiso <- data.frame(permiso)
# Cambio de nombres de columnas: reemplazar puntos por guiones bajos y convertir a minúsculas
colnames(permiso) <- colnames(permiso) %>% str_replace_all("\\.", "_") %>% tolower()
# Mapas de recodificación
tipo_vehiculo_mapeo <- c(
"AMBULANCIA" = "AMBULANCIA", "AUTOMOVIL" = "AUTOMOVIL", "BUS" = "BUS",
"Cabriolet" = "AUTOMOVIL", "CAMION" = "CAMION", "CAMIONETA" = "CAMIONETA",
"CARRO ARRASTRE A" = "REMOLQUE", "CARRO BOMBA" = "CARRO BOMBA",
"CASA RODANTE" = "CASA RODANTE", "Comercial" = "COMERCIAL", "CUATRIMOTO" = "CUATRIMOTO",
"FURGON" = "FURGON", "GRUA" = "MAQUINA PESADA", "Hatchback" = "AUTOMOVIL",
"JEEP" = "AUTOMOVIL", "MAQUINA INDUSTRIAL" = "MAQUINA INDUSTRIAL",
"MINIBUS" = "MINIBUS", "MINIBUS ESCOLAR" = "MINIBUS", "MINIBUS PARTICULAR" = "MINIBUS",
"MINIBUS PRIVADO" = "MINIBUS", "MINIBUS TURISMO" = "MINIBUS", "MOTO" = "MOTOCICLETA",
"MOTOCICLETA" = "MOTOCICLETA", "OTROS" = "OTROS", "REMOLQUE A" = "REMOLQUE",
"REMOLQUE B" = "REMOLQUE", "RETROEXCAVADORA" = "MAQUINA PESADA", "Sedan" = "AUTOMOVIL",
"SEMI REMOLQUE" = "REMOLQUE", "STATION WAGON" = "AUTOMOVIL", "SUV" = "SUV",
"TAXI EJECUTIVO" = "TAXI", "TAXI BASICO" = "TAXI", "TAXI COLECTIVO" = "TAXI",
"TRACTOCAMION" = "CAMION", "TRACTOR" = "TRACTOR", "VAN" = "VAN"
)
tipo_combustible_mapeo <- c(
"Benc" = "Bencina", "Dies" = "Diesel", "NULL" = "NULL",
"DUAL" = "Hibrido", "Hibr" = "Hibrido", "Elec" = "Electrico"
)
transmision_mapeo <- c(
"Mec" = "Mecanica", "Aut" = "Automatica", "NULL" = "NULL",
"CVT" = "Automatica", "DCT" = "Automatica"
)
# Mostrar la cantidad de registros iniciales
cat("La cantidad de registros:", nrow(permiso), "\n")
## La cantidad de registros: 63886
# Aplicar todas las transformaciones y normalizaciones
permiso <- permiso %>%
mutate(
# Recodificar las variables categóricas
tipo_vehiculo = recode(tipo_vehiculo, !!!tipo_vehiculo_mapeo),
tipo_combustible = recode(tipo_combustible, !!!tipo_combustible_mapeo),
transmision = recode(transmision, !!!transmision_mapeo),
# Reemplazar nulos en todas las variables
across(everything(), reemplazar_nulos),
# Convertir a título en variables específicas
across(c(municipalidad, grupo_vehiculo, placa, digito, codigo_sii,
forma_pago, tipo_vehiculo, marca, modelo, color,
transmision, tipo_combustible, equipamiento), str_to_title),
# Quitar las "," y "." de los campos de valores
across(c(valor_neto, valor_ipc, valor_multa, valor_pagado),
~ as.numeric(gsub("[,\\.]", "", .))),
# Convertir tipos de datos
ano_vehiculo = as.integer(ano_vehiculo),
fecha_pago = as.Date(fecha_pago, format = "%d-%m-%y"),
ano_pago = as.integer(year(fecha_pago)),
mes = month(fecha_pago, label = TRUE),
mes_pago = as.integer(month(fecha_pago)),
# Crear la variable Ano_Mes_Pago
ano_mes_pago = paste(sprintf("%02d", mes_pago), substr(ano_pago, 3, 4), sep = "-")
) %>%
# Filtrar y eliminar duplicados
filter(!is.na(valor_pagado) & !is.na(fecha_pago) & valor_pagado > 0) %>%
distinct()
# Mostrar la cantidad de registros válidos
cat("La cantidad de registros válidos:", nrow(permiso), "\n")
## La cantidad de registros válidos: 56566
Análisis Exploratorio de Datos (EDA)
Seleccionar variables relevantes
Se seleccionan las variables relevantes para el análisis.
permiso_relevante <- permiso %>%
select(grupo_vehiculo, ano_vehiculo, tipo_de_pago, fecha_pago, ano_pago, mes, mes_pago, ano_mes_pago, valor_neto, valor_ipc, valor_multa, valor_pagado, forma_pago, tipo_vehiculo, marca)
Muestreo
Se realiza un muestreo estratificado para asegurar una representación
adecuada de cada grupo en los datos.
# Calcular la muestra aleatoria según Desviación Estándar
cant <- nrow(permiso_relevante)
sd <- sd(permiso_relevante$valor_pagado)
n <- tam.muestra(alfa = 0.05, epsilon = 1200, s = sd, N = cant)
set.seed(2)
cant <- sample(nrow(permiso_relevante), n)
permiso_muestra <- permiso_relevante[cant, ]
cat("La cantidad de registros de muestra es:", nrow(permiso_muestra))
## La cantidad de registros de muestra es: 13043
Distribucion de Pagos por Año y Meses
Se analiza la distribución de pagos de permisos de circulación por
año y mes.
# Preparar los datos para el gráfico de área
area_data <- permiso_muestra %>%
group_by(ano_pago, mes) %>%
summarise(count = n(), .groups = 'drop')
grafico1 <- grafico_histograma(permiso_muestra, "ano_pago")
grafico2 <- grafico_area(area_data, "mes", "count", "ano_pago")
mostrar_graficos(grafico1, grafico2, ncol = 2)
La distribución general muestra una tendencia creciente en la cantidad
de pagos de un año a otro. Cabe destacar que por la pandimia, no se
realizaron pagos de permisos de circulación durante los años 2020 -
2021.
Como era de esperar, existe un fuerte patrón estacional en los pagos
de permisos de circulación, con la mayoría de los pagos concentrados en
los primeros meses del año, particularmente en marzo y abril.
Variable: Grupo Vehículo.
Se crean gráficos para analizar la distribución de pagos por tipo de
vehículo.
# Crear gráficos individuales
grafico1 <- grafico_anillo(permiso_muestra,"grupo_vehiculo")
grafico2 <- grafico_barras(permiso_muestra,"tipo_vehiculo")
# Mostrar los gráficos juntos
mostrar_graficos(grafico1, grafico2, ncol = 2)

El 90% de los permisos de circulación son pagados por vehiculos
livianos,concentrándose, en su mayoría, en Automóvil y Camioneta.
Valor Pago por Categoria
vehiculo_liviano_dataset <- permiso_muestra %>% filter(`grupo_vehiculo` == "Vehiculo Liviano")
transporte_publico_dataset <- permiso_muestra %>% filter(`grupo_vehiculo` == "Transporte Publico")
carga_dataset <- permiso_muestra %>% filter(`grupo_vehiculo` == "Carga")
# Crear gráficos individuales
grafico1 <- grafico_boxplot(vehiculo_liviano_dataset, "valor_pagado","Vehiculo Liviano")
grafico2 <- grafico_boxplot(transporte_publico_dataset, "valor_pagado","Transporte Publico")
grafico3 <- grafico_boxplot(carga_dataset, "valor_pagado","Carga")
# Mostrar los gráficos juntos
mostrar_graficos(grafico1, grafico2,grafico3, ncol = 3)

BoxPlot por tipo de Vehiculo
grafico1 <- grafico_barras(vehiculo_liviano_dataset,"tipo_vehiculo")
grafico2 <- grafico_boxplot_dos_var(vehiculo_liviano_dataset, "tipo_vehiculo","valor_pagado")
# Mostrar los gráficos juntos
mostrar_graficos(grafico1, grafico2, ncol = 2)
## Selecionar Dataset de Automoviles y Camionetas
Debido a que concentran gran parte de los permisos de circulación que
son pagados, en análisis se centrará en Automoviles y Camionetas.
vehiculo_dataset <- vehiculo_liviano_dataset %>%
filter(tipo_vehiculo == "Automovil" | tipo_vehiculo == "Camioneta")
grafico_anillo(vehiculo_dataset,"tipo_vehiculo")

Tratamiento de Outliers
Se identifican y eliminan outliers de los datos para asegurar un
análisis más preciso.
automovil_dataset <- vehiculo_liviano_dataset %>%
filter(tipo_vehiculo == "Automovil")
camioneta_dataset <- vehiculo_liviano_dataset %>%
filter(tipo_vehiculo == "Camioneta")
resultado1 <- eliminar_outliers(automovil_dataset, "valor_pagado")
resultado2 <- eliminar_outliers(camioneta_dataset, "valor_pagado")
dataset_sin_outliers1 <- resultado1$dataset_sin_outliers
dataset_sin_outliers2 <- resultado2$dataset_sin_outliers
vehiculo_sin_outliers <- bind_rows(dataset_sin_outliers1, dataset_sin_outliers2)
cat("Número de registros originales:", nrow(vehiculo_dataset), "\n")
## Número de registros originales: 11030
cat("Número de registros sin outliers:", nrow(vehiculo_sin_outliers), "\n")
## Número de registros sin outliers: 10048
vehiculo_dataset<- vehiculo_sin_outliers
Boxplot por tipo de vehiculo
automovil_dataset <- vehiculo_dataset %>% filter(`tipo_vehiculo` == "Automovil")
camioneta_dataset <- vehiculo_dataset %>% filter(`tipo_vehiculo` == "Camioneta")
# Crear gráficos individuales
grafico1 <- grafico_boxplot(automovil_dataset, "valor_pagado","Automovil")
grafico2 <- grafico_boxplot(camioneta_dataset, "valor_pagado","Camioneta")
# Mostrar los gráficos juntos
mostrar_graficos(grafico1, grafico2, ncol = 2)

Matriz de correlacion
Se analiza la correlación entre las variables del conjunto de
datos.
# Crear gráficos individuales
grafico1 <- grafico_matriz_correlacion( vehiculo_dataset)
grafico2 <- grafico_dispersion(vehiculo_dataset, "ano_vehiculo","valor_pagado")
# Mostrar los gráficos juntos
mostrar_graficos(grafico1, grafico2, ncol = 2)

Distribución de Pagos en Grupos de Vehículos por Meses
Relativos
Se genera un resumen de las variables normalizadas utilizando
summarytools.
# Filtrar y transformar los datos
vehiculo_dataset <- vehiculo_dataset %>%
arrange(fecha_pago) %>%
group_by(tipo_vehiculo) %>%
mutate(
fecha_relativa = as.yearmon(fecha_pago),
mes_relativo = as.integer((min(fecha_relativa) - fecha_relativa) * 12)*-1
) %>%
ungroup()
# Resumir los datos por mes relativo y grupo de vehículo
pagos_por_mes_relativo <- vehiculo_dataset %>%
group_by(tipo_vehiculo, mes_relativo) %>%
summarise(Cantidad_Pagos = n(), .groups = 'drop')
grafico_lineas(pagos_por_mes_relativo, "mes_relativo", "Cantidad_Pagos", "tipo_vehiculo")
Se observa una tendencia proporcionada entre ambos tipos de vehículos,
donde ambos tienen un comportamiento similar.
Descripcion de Variables normalizadas
# Obtener un resumen de los datos utilizando summarytools y renderizar en HTML
dfSummary(vehiculo_dataset) %>%
print(method = 'render')