Del ejercicio de web scraping se obtuvieron 88 registros que cumplen con los criterios de ser marca Mazda y referencia Mazada 2, para diferentes ciudades de Colombia.
library(readxl)
mazda2_MCD <- read_excel("C:/Users/PACHO/Downloads/mazda2_MCD.xlsx",
col_types = c("numeric",
"numeric", "numeric", "text", "text"))
df=mazda2_MCD
head(df,5)
## # A tibble: 5 x 5
## precio kilometraje modelo transmision Ciudad
## <dbl> <dbl> <dbl> <chr> <chr>
## 1 44500000 87500 2015 Mecánica Floridablanca
## 2 42500000 102222 2013 Automática Itagüí
## 3 31500000 100000 2011 Automática Bogotá
## 4 67000000 61997 2017 Automática Medellín
## 5 45000000 92000 2015 Automática Medellín
summary(df)
## precio kilometraje modelo transmision
## Min. :22000000 Min. : 0 Min. :2008 Length:88
## 1st Qu.:34000000 1st Qu.: 48750 1st Qu.:2011 Class :character
## Median :40700000 Median : 90750 Median :2013 Mode :character
## Mean :46268750 Mean : 83716 Mean :2014
## 3rd Qu.:55000000 3rd Qu.:110000 3rd Qu.:2017
## Max. :95000000 Max. :370000 Max. :2022
## Ciudad
## Length:88
## Class :character
## Mode :character
##
##
##
require(ggplot2)
ggplot(mapping = aes(x = df$kilometraje, y = df$precio)) + geom_point() +
ylab('Precio') + xlab('Kilometraje') + ggtitle(label = 'Relación entre precio y kilometraje') +
theme(plot.title = element_text(hjust = 0.5))
cor(df$precio,df$kilometraje)
## [1] -0.4682872
require(ggplot2)
ggplot(mapping = aes(x = df$modelo, y = df$precio)) + geom_point() +
ylab('Precio') + xlab('modelo') + ggtitle(label = 'Relación entre precio y modelo') +
theme(plot.title = element_text(hjust = 0.5))
ggplot(df,aes(x= transmision, y=precio, fill=transmision))+
geom_boxplot()+
theme_bw()
Análisis
Del gráfico entre la relación del precio y el kilometraje, se observa una tendencia a que mayor sea el kilometraje del vehiculo, el valor del precio disminuira y se puede corroborar con el coeficiente de correlación entre estas dos variables que es de -0.4682, lo que indica una relación negativa. Asi mismo, de la relación entre el el precio y el modelo se observa que los modelos más recientes tienen un precio mas eleveado en comparación con los modelos antiguos. Por último, con base en la transmisión del vehiculo y la relación con el precio, se observa que los vehiculos mas costosos son los de transmisión secuencial, y los de transmisiones automática y mecánica tienen precios similares.
En un primer momento se propone un moodelo de regresión lineal con todas las variables (kilometraje, modelo y transmisión) que nos indica un r2 de 0.9192.
mod_mazda= lm(precio~kilometraje+modelo+transmision, data=df)
summary(mod_mazda)
##
## Call:
## lm(formula = precio ~ kilometraje + modelo + transmision, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10141381 -3829781 -146546 2959352 17384908
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7.246e+09 3.065e+08 -23.643 < 2e-16 ***
## kilometraje -2.142e+01 1.071e+01 -2.001 0.04872 *
## modelo 3.622e+06 1.520e+05 23.821 < 2e-16 ***
## transmisionAutomática Secuencial 6.153e+06 2.261e+06 2.721 0.00793 **
## transmisionMecánica -2.238e+06 1.105e+06 -2.025 0.04612 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4947000 on 83 degrees of freedom
## Multiple R-squared: 0.9229, Adjusted R-squared: 0.9192
## F-statistic: 248.4 on 4 and 83 DF, p-value: < 2.2e-16
A continuación utilizamos la función step para identificar cuál es el mejor modelo para aplicar y coincide con el modelo planteado anteriormente.
mod_mazdafinal = step(mod_mazda,direction='both')
## Start: AIC=2717.76
## precio ~ kilometraje + modelo + transmision
##
## Df Sum of Sq RSS AIC
## <none> 2.0311e+15 2717.8
## - kilometraje 1 9.7935e+13 2.1291e+15 2719.9
## - transmision 2 3.5914e+14 2.3903e+15 2728.1
## - modelo 1 1.3886e+16 1.5917e+16 2896.9
summary(mod_mazdafinal)
##
## Call:
## lm(formula = precio ~ kilometraje + modelo + transmision, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10141381 -3829781 -146546 2959352 17384908
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7.246e+09 3.065e+08 -23.643 < 2e-16 ***
## kilometraje -2.142e+01 1.071e+01 -2.001 0.04872 *
## modelo 3.622e+06 1.520e+05 23.821 < 2e-16 ***
## transmisionAutomática Secuencial 6.153e+06 2.261e+06 2.721 0.00793 **
## transmisionMecánica -2.238e+06 1.105e+06 -2.025 0.04612 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4947000 on 83 degrees of freedom
## Multiple R-squared: 0.9229, Adjusted R-squared: 0.9192
## F-statistic: 248.4 on 4 and 83 DF, p-value: < 2.2e-16
# Conjunto de 88 datos (80% para modelar y 20% para validar):
modelar= sample(1:88, size=70)
modelar
## [1] 28 12 61 53 18 8 29 1 79 85 86 71 44 74 42 88 37 56 54 81 62 59 49 26 38
## [26] 52 9 60 55 27 46 58 80 84 73 33 83 47 45 11 34 41 5 6 13 2 48 19 39 63
## [51] 68 22 3 51 67 23 14 36 35 65 17 20 7 4 87 77 40 82 25 50
# data set con 70 datos para modelar:
df_modelar= df[modelar,]
head(df_modelar)
## # A tibble: 6 x 5
## precio kilometraje modelo transmision Ciudad
## <dbl> <dbl> <dbl> <chr> <chr>
## 1 23500000 136000 2008 Automática Bogotá
## 2 41000000 120000 2012 Automática Medellín
## 3 70000000 35000 2020 Mecánica Neiva
## 4 73500000 39500 2021 Automática Secuencial Envigado
## 5 35000000 96700 2010 Mecánica Armenia
## 6 53000000 57000 2016 Mecánica Santander
# data set con 18 datos para validar:
df_validar= df[-modelar,]
head(df_validar)
## # A tibble: 6 x 5
## precio kilometraje modelo transmision Ciudad
## <dbl> <dbl> <dbl> <chr> <chr>
## 1 69000000 42000 2018 Automática Barranquilla
## 2 36000000 183 2011 Mecánica Medellín
## 3 42000000 101832 2014 Automática Caldas
## 4 41900000 94000 2014 Mecánica Manizales
## 5 70000000 70000 2019 Automática Secuencial Villavicencio
## 6 35500000 121800 2013 Mecánica Pereira
mod_mazda_modelar = lm(formula = precio ~ kilometraje + modelo + transmision, data = df)
summary(mod_mazda_modelar)
##
## Call:
## lm(formula = precio ~ kilometraje + modelo + transmision, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -10141381 -3829781 -146546 2959352 17384908
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -7.246e+09 3.065e+08 -23.643 < 2e-16 ***
## kilometraje -2.142e+01 1.071e+01 -2.001 0.04872 *
## modelo 3.622e+06 1.520e+05 23.821 < 2e-16 ***
## transmisionAutomática Secuencial 6.153e+06 2.261e+06 2.721 0.00793 **
## transmisionMecánica -2.238e+06 1.105e+06 -2.025 0.04612 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 4947000 on 83 degrees of freedom
## Multiple R-squared: 0.9229, Adjusted R-squared: 0.9192
## F-statistic: 248.4 on 4 and 83 DF, p-value: < 2.2e-16
Se procede a obtener los valores del precio con base en el modelo:
predict_precio = predict(mod_mazda_modelar, list(modelo=df_validar$modelo, transmision=df_validar$transmision, kilometraje=df_validar$kilometraje))
predict_precio
## 1 2 3 4 5 6 7 8
## 62228178 35533488 46459290 44389299 71402963 40171993 29559322 37424145
## 9 10 11 12 13 14 15 16
## 50420234 65849989 25811922 69640188 35633098 69030856 40831750 21099005
## 17 18
## 38826496 52964440
Identificación del error con base en el precio real del vehiculo.
precio_real = df_validar$precio
error = precio_real-predict_precio
resultado = data.frame(precio_real, predict_precio, error)
head(resultado, 5)
## precio_real predict_precio error
## 1 69000000 62228178 6771822.5
## 2 36000000 35533488 466512.4
## 3 42000000 46459290 -4459290.1
## 4 41900000 44389299 -2489299.2
## 5 70000000 71402963 -1402962.9
MAE=mean(abs(error))
MAE
## [1] 3499109
El MAE indica que la diferencia entre el precio real vs el precio predicho en promedio es de 4158692 de pesos.
Como herramienta práctica, el presente modelo se podria incorporar en la página de OLX para que el usuario final pueda ingresar los valores de las variables identificadas, y que se puede brindar un precio estimado del vehiculo con las características que se desea, y así poder tener una aproximación a lo que puede costar un vehiculo y sea un apoyo para la toma de decisión.