En este trabajo se usa el web scraping para obtener un dataset de las caracteristicas de carros Nissan Versa, que estan publicados en olx, se ultilizan modelos de regresion multivariada y transformacion de variables para generar un modelo predictivo de la variable precio.
En primer lugar se importan los datos del excel “versa”
library(readxl)
datos_versa = read_excel("C:/Users/migue/Desktop/versa.xlsx")
datos_versa
## # A tibble: 225 × 9
## `web-scraper-order` `web-scraper-start-url` link `link-href` precio modelo
## <chr> <chr> <chr> <chr> <dbl> <dbl>
## 1 1685546728-1 https://www.olx.com.co/i… $ 45… https://ww… 4.59e7 2018
## 2 1685546731-2 https://www.olx.com.co/i… $ 45… https://ww… 4.50e7 2017
## 3 1685546734-3 https://www.olx.com.co/i… $ 52… https://ww… 5.20e7 2019
## 4 1685546741-5 https://www.olx.com.co/i… $ 57… https://ww… 5.75e7 2021
## 5 1685546744-6 https://www.olx.com.co/i… $ 39… https://ww… 3.95e7 2015
## 6 1685546747-7 https://www.olx.com.co/i… $ 63… https://ww… 6.30e7 2022
## 7 1685546750-8 https://www.olx.com.co/i… $ 41… https://ww… 4.1 e7 2014
## 8 1685546753-9 https://www.olx.com.co/i… $ 75… https://ww… 7.55e7 2022
## 9 1685546757-10 https://www.olx.com.co/i… $ 49… https://ww… 4.9 e7 2019
## 10 1685546760-11 https://www.olx.com.co/i… $ 45… https://ww… 4.59e7 2018
## # ℹ 215 more rows
## # ℹ 3 more variables: kilometraje <dbl>, combustible <chr>, transmision <chr>
se crea un boxplot para visualizar la diferencia segun el tipo de transmision
boxplot(datos_versa$precio~datos_versa$transmision,col="gray", main = "Comparacion de precios segun tipo de transmision", xlab = "transmision", ylab = "Precio")
el boxplot muestra una ligera diferencia en el precio segun el tipo de transmision. Siendo los carros automaticos mas caros que los mecanicos.
se definen las variables independientes: modelo, kilometraje y transmision
cualitativas: modelo y kilometraje cuantitativas: transmision
se define como variable dependiente el precio
se grafican las relaciones entre las variables cuantitativas
y = datos_versa$precio
x1 = datos_versa$modelo
x2 = datos_versa$kilometraje
x3 = datos_versa$transmision
plot(x1,y, main = "Modelo vs Precio", xlab = "Modelo", ylab = "Precio")
plot(x2,y, main = "Kilometraje vs Precio", xlab = "Kilometraje", ylab = "Precio")
En ambos casos se nota que la grafica muestra una relacion que no es estrictamente lineal.
Se proponen transformaciones de las variables, con las cuales se crearan modelos para las variables originales y las variables transformadas, con el fin de comparar que modelo predice mejor.
x4 = log(1/x2)
y2 = log(y)
plot(x1,y2, main = "Modelo vs Precio (transformada)", xlab = "Modelo", ylab = "ln(Precio)")
plot(x4,y2, main = "Kilometraje vs Precio (transformada)", xlab = "ln(1/Kilometraje)", ylab = "ln(Precio)")
en ambos casos se aprecia mejor la relacion lineal que hay etre las variables transformadas, lo cual es importante para el modelo de regresion lineal.
cor(datos_versa[,5:7])
## precio modelo kilometraje
## precio 1.0000000 0.8422275 -0.5068846
## modelo 0.8422275 1.0000000 -0.5860580
## kilometraje -0.5068846 -0.5860580 1.0000000
cor(y2,x1)
## [1] 0.902148
cor(y2,x4)
## [1] 0.7512372
se muestran las correlaciones entre las variables y se observa una mejora de correlacion de las variables transformadas respecto a las originales.
en ambos casos podemos ver una alta correlacion positiva entre las variables precio y modelo, pero en el caso de las variables originales, el kilometraje no muestra una correlacion alta con el precio.
se genera el modelo multivariado para identificar la significancia de cada variable.
# Modelo con variables originales
mod_muliple1=lm(y~x1+x2)
summary(mod_muliple1)
##
## Call:
## lm(formula = y ~ x1 + x2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -12023878 -4901108 -1021856 3065650 69183663
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -8.147e+09 4.412e+08 -18.467 <2e-16 ***
## x1 4.064e+06 2.185e+05 18.603 <2e-16 ***
## x2 -5.930e+00 1.308e+01 -0.454 0.651
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8051000 on 222 degrees of freedom
## Multiple R-squared: 0.7096, Adjusted R-squared: 0.707
## F-statistic: 271.3 on 2 and 222 DF, p-value: < 2.2e-16
este modelo muestra que la variable kilometraje no tiene la suficiente significancia para ser tenida en cuenta. Este modelo explica en un 70.7% la variable precio.
Se genera el modelo con variables transformadas
# Modelo con variables originales
mod_trans = lm(log(y)~x1+log(1/x2))
summary(mod_trans)
##
## Call:
## lm(formula = log(y) ~ x1 + log(1/x2))
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.22491 -0.06599 -0.00743 0.04864 0.84536
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.192e+02 7.663e+00 -15.553 < 2e-16 ***
## x1 6.817e-02 3.737e-03 18.244 < 2e-16 ***
## log(1/x2) 5.895e-02 1.519e-02 3.881 0.000137 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1117 on 222 degrees of freedom
## Multiple R-squared: 0.8257, Adjusted R-squared: 0.8241
## F-statistic: 525.8 on 2 and 222 DF, p-value: < 2.2e-16
este modelo muestra que ambas variables son significantes para predecir el precio y ademas, brinda una explicacion del 82.4% de la variable dependiente, lo cual es una mejora considerable respecto al modelo con variables originales.
se le añade la variable categorica al modelo para comparar si sus caracteristicas mejoran
mod_trans2 = lm(log(y)~x1+log(1/x2)+x3)
summary(mod_trans2)
##
## Call:
## lm(formula = log(y) ~ x1 + log(1/x2) + x3)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.24404 -0.06182 -0.00413 0.05155 0.85977
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -119.78451 7.60886 -15.743 < 2e-16 ***
## x1 0.06847 0.00371 18.453 < 2e-16 ***
## log(1/x2) 0.05631 0.01512 3.723 0.00025 ***
## x3mecanica -0.03188 0.01507 -2.115 0.03557 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.1109 on 221 degrees of freedom
## Multiple R-squared: 0.8292, Adjusted R-squared: 0.8268
## F-statistic: 357.5 on 3 and 221 DF, p-value: < 2.2e-16
se observa que la variable transmision mecanica tiene un pequeño grado de significancia, ademas el modelo explica un 82.7% la variable precio, lo cual es una mejora respecto al modelo anterior pero muy minima.
se grafica para validar los supuestos de el modelo
par(mfrow=c(2,2))
plot(mod_trans2)
se verifica que hay varianza constante por la grafica 1, la cual muestra que los residuos son consistentes a lo largo de los datos.
se verifica normalidad ya que los datos se ajustan al qqplot.
la media cero se cumple por defecto y la independencia no se tiene en cuenta
Se realiza validación cruzada para evaluar la predictividad del modelo. se usa el 80% de los datos para predecir y el 20% restante para validar
# Segmentar los Datos
id_modelar=sample(1:225,size = 180)
versa_modelar=datos_versa[id_modelar,]
versa_validar=datos_versa[-id_modelar,]
# Estimar el Modelo Set de Modelar
mod_modelar=lm(log(precio)~modelo+log(1/kilometraje)+transmision,data=versa_modelar)
# Predeccir Set de Validación
precio_pred=predict(mod_modelar,list(modelo=versa_validar$modelo, kilometraje=versa_validar$kilometraje, transmision=versa_validar$transmision))
# Debido a la transformada se debe calcular la funcion inversa
# Se obtienen los datos de la prediccion y los reales
precio_pred=exp(precio_pred)
precio_real=versa_validar$precio
# Se calcula el error
error=precio_real-precio_pred
res=data.frame(precio_real,precio_pred,error)
# Calcular Indicador de Evaluación de la Predicción - Mean Absolute Error
MAE=mean(abs(error))
MAE
## [1] 3306589
Se obtiene un error de prediccion de aproximadamente 3 millones de pesos
Este modelo de regresion puede predecir cual seria el precio de un carro segun sus caracteristicas, tener esta informacion puede ser muy util para saber en comparacion, que tan bueno o malo es el precio de los vehiculos que estan en venta o proximamente saldran a la venta, conociendo sus caracteristicas, de esta manera se podria saber si un vehiculo esta “barato” segun sus condiciones (modelo, kilometraje y transmision) y de ser asi habria una buena oportunidad de compra, ya sea por interes en el vehiculo y para darle uso, o para sacarle provecho monetario vendiendolo a un precio mas elevado.