# Cargar librerías
library(readxl)
library(tidyverse)
library(ggplot2)
library(corrplot)
library(readxl)
# Leer el archivo Excel
df <- read_excel("~/Mazda 2.xlsx", sheet = "Sheet1")
# Limpiar la columna Precio (quitar "$" y ".")
df$Precio <- as.numeric(gsub("[$,.]", "", df$Precio))
# Limpiar la columna Kilometraje (quitar " Km" y ".")
df$Kmt <- as.numeric(gsub("[^0-9]", "", df$Kmt))
# Convertir modelo a numérico
df$Modelo <- as.numeric(df$Modelo)
# Revisar estructura de los datos
str(df)
## tibble [712 × 6] (S3: tbl_df/tbl/data.frame)
## $ web-scraper-order : chr [1:712] "1740515144-1" "1740515144-2" "1740515144-3" "1740515144-4" ...
## $ web-scraper-start-url: chr [1:712] "https://www.carroya.com/automoviles-y-camionetas/mazda/2?page=1" "https://www.carroya.com/automoviles-y-camionetas/mazda/2?page=1" "https://www.carroya.com/automoviles-y-camionetas/mazda/2?page=1" "https://www.carroya.com/automoviles-y-camionetas/mazda/2?page=1" ...
## $ Precio : num [1:712] 72000000 40000000 58000000 53000000 86000000 76000000 32500000 77000000 64500000 58000000 ...
## $ Kmt : num [1:712] 20000 132000 66400 123000 15982 ...
## $ Modelo : num [1:712] 2022 2015 2019 2017 2024 ...
## $ Ciudad : chr [1:712] "Bogota" "Palmira" "Cali" "Bogota" ...
# Resumen estadístico de las variables numéricas
summary(df)
## web-scraper-order web-scraper-start-url Precio Kmt
## Length:712 Length:712 Min. : 6000000 Min. : 100
## Class :character Class :character 1st Qu.: 39997500 1st Qu.: 36925
## Mode :character Mode :character Median : 58945000 Median : 63950
## Mean : 55901640 Mean : 77429
## 3rd Qu.: 67000000 3rd Qu.: 95125
## Max. :120000000 Max. :6500000
## Modelo Ciudad
## Min. :1993 Length:712
## 1st Qu.:2014 Class :character
## Median :2018 Mode :character
## Mean :2017
## 3rd Qu.:2020
## Max. :2025
# Matriz de correlación
cor_matrix <- cor(df %>% select(Precio, Kmt, Modelo), use = "complete.obs")
# Visualizar la matriz de correlación
corrplot(cor_matrix, method = "color", addCoef.col = "black", tl.col = "black")
La matriz de correlación muestra que el Precio está altamente correlacionado con el Modelo (0.93), indicando que los autos más nuevos tienen precios más altos.
La relación entre Precio y Kilometraje es negativa pero débil (−0.18), lo que sugiere que un mayor kilometraje tiende a reducir el precio, aunque no de forma determinante. Asimismo, Kilometraje y Modelo tienen una relación negativa leve (−0.20), confirmando que los modelos más nuevos suelen tener menos kilometraje.
# Histogramas de las variables numéricas
ggplot(df, aes(x = Precio)) +
geom_histogram(bins = 30, fill = "blue", color = "black") +
ggtitle("Distribución del Precio") + theme_minimal()
ggplot(df, aes(x = Kmt)) +
geom_histogram(bins = 30, fill = "green", color = "black") +
ggtitle("Distribución del Kilometraje") + theme_minimal()
ggplot(df, aes(x = Modelo)) +
geom_histogram(bins = 30, fill = "orange", color = "black") +
ggtitle("Distribución del Modelo") + theme_minimal()
Distribución del modelo: La mayoría de los vehículos corresponden a modelos recientes (posteriores a 2010), con mayor concentración entre 2015 y 2023.
Distribución del kilometraje: Existe un valor extremo muy alto, pero en general, la mayoría de los autos tienen un kilometraje relativamente bajo.
Distribución del precio: El precio muestra una distribución bimodal, lo que podría indicar diferencias en versiones o características dentro del mismo modelo de Mazda 2.
# Cargar paquetes necesarios
library(ggplot2)
# Función para eliminar valores atípicos usando IQR
remove_outliers <- function(data, column) {
Q1 <- quantile(data[[column]], 0.25, na.rm = TRUE)
Q3 <- quantile(data[[column]], 0.75, na.rm = TRUE)
IQR_value <- Q3 - Q1
lower_bound <- Q1 - 1.5 * IQR_value
upper_bound <- Q3 + 1.5 * IQR_value
data_clean <- data[data[[column]] >= lower_bound & data[[column]] <= upper_bound, ]
return(data_clean)
}
# Verificar si el dataset 'df' existe
if (!exists("df")) {
stop("El dataset 'df' no está definido. Asegúrate de cargarlo antes de ejecutar este script.")
}
# Aplicar la limpieza de datos
df_clean <- remove_outliers(df, "Precio")
df_clean <- remove_outliers(df_clean, "Kmt")
df_clean <- remove_outliers(df_clean, "Modelo") # Eliminamos atípicos en Modelo también
# Gráfico de dispersión Precio vs. Kilometraje (sin atípicos)
ggplot(df_clean, aes(x = Kmt, y = Precio)) +
geom_point(alpha = 0.5, color = "blue") +
geom_smooth(method = "lm", color = "red", se = TRUE) +
ggtitle("Relación entre Precio y Kilometraje (Sin Atípicos)") +
xlab("Kilometraje (Km)") +
ylab("Precio (COP)") +
theme_minimal()
# Gráfico de dispersión Precio vs. Modelo (sin atípicos)
ggplot(df_clean, aes(x = Modelo, y = Precio)) +
geom_point(alpha = 0.5, color = "red") +
ggtitle("Relación entre Precio y Modelo (Sin Atípicos)") +
xlab("Modelo (Año)") +
ylab("Precio (COP)") +
theme_minimal()
# Ajustar modelo de regresión lineal múltiple
modelo_lm <- lm(Precio ~ Kmt + Modelo, data = df)
# Resumen del modelo
summary(modelo_lm)
##
## Call:
## lm(formula = Precio ~ Kmt + Modelo, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -18095159 -3570733 6770 2956810 71531775
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7.297e+09 1.128e+08 -64.718 <2e-16 ***
## Kmt 2.363e-01 9.394e-01 0.252 0.801
## Modelo 3.645e+06 5.589e+04 65.222 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 6007000 on 709 degrees of freedom
## Multiple R-squared: 0.8617, Adjusted R-squared: 0.8614
## F-statistic: 2210 on 2 and 709 DF, p-value: < 2.2e-16
Intercepto: Es el valor del Precio cuando todas las demás variables son cero. Beta de Kilometraje: Indica cuánto varía el Precio por cada aumento de 1 km. Si es negativo, significa que a más kilometraje, menor precio.
Beta de Modelo: Muestra cuánto varía el Precio por cada año adicional del modelo.
R²: Indica qué porcentaje de la variabilidad del Precio es explicada por el modelo.
p-valores: Si son menores a 0.05, las variables son estadísticamente significativas en la predicción del precio.
# Instalar y cargar el paquete caret si no está instalado
if (!requireNamespace("caret", quietly = TRUE)) {
install.packages("caret")
}
library(caret)
# Configurar la validación con Bootstrapping (1000 réplicas)
control_boot <- trainControl(method = "boot", number = 1000)
# Ajustar el modelo con validación por Bootstrapping
modelo_boot <- train(
Precio ~ Kmt + Modelo, # Variables predictoras
data = df, # Datos
method = "lm", # Regresión lineal
trControl = control_boot # Validación con Bootstrapping
)
# Mostrar resumen del modelo
print(modelo_boot)
## Linear Regression
##
## 712 samples
## 2 predictor
##
## No pre-processing
## Resampling: Bootstrapped (1000 reps)
## Summary of sample sizes: 712, 712, 712, 712, 712, 712, ...
## Resampling results:
##
## RMSE Rsquared MAE
## 12582077 0.6562874 4708313
##
## Tuning parameter 'intercept' was held constant at a value of TRUE
# Extraer métricas del modelo
modelo_boot$resample %>%
summarise(
RMSE_Promedio = mean(RMSE),
R2_Promedio = mean(Rsquared)
)
## RMSE_Promedio R2_Promedio
## 1 12582077 0.6562874
Seguros y Financiamiento: Empresas aseguradoras o entidades financieras pueden utilizar el modelo para determinar valores de cobertura, calcular depreciación y ajustar tasas de financiamiento en función del kilometraje del auto.
Inversión y Flotas de Vehículos: Empresas que manejan flotas pueden predecir la depreciación y planificar mejor la renovación de sus activos, optimizando su rentabilidad.
Publicidad: Sitios web de análisis de autos pueden usar el modelo para generar informes personalizados y monetizarlos a través de suscripciones, anuncios o venta de datos a empresas automotrices.