Regresion Lineal Multiple

Introduccion

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>

Analisis exploratorio de los datos

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.

Transformacion de variables

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.

Creacion de modelos multivariados

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.

Validacion de supuestos

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

Validacion cruzada

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

Conclusiones y usos practicos

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.