Informe - Regresión Lineal Multiple WebScrapin

Caso: Autos Mazda 2 en Colombia OLX

1. Datos conseguidos despues de relizar el Web - Scraping.

Cargar Datos

library(tidyverse)
library(dplyr)
library(ggplot2)
library(plotly)
library(psych)
library(GGally)
library(ggthemes)
library(ggpubr)

library(readr)
olxMazda2 <- read_delim("~/Unidad2/webScraping/olxMazda2.csv", 
    delim = ";", escape_double = FALSE, col_types = cols(transmision = col_character()), 
    trim_ws = TRUE)
olxMazda2
## # A tibble: 321 × 7
##    `link-href`                        precio kilom…¹ modelo   ano trans…² ciudad
##    <chr>                               <dbl>   <dbl> <chr>  <dbl> <chr>   <chr> 
##  1 https://www.olx.com.co/item/hermo… 4.5 e7   83000 2 HAT…  2015 Mecáni… Piede…
##  2 https://www.olx.com.co/item/vendo… 3.98e7   92540 2 HAT…  2015 Mecáni… San J…
##  3 https://www.olx.com.co/item/mazda… 6.1 e7   61000 2 SED…  2020 Mecáni… Rione…
##  4 https://www.olx.com.co/item/se-ve… 5.65e7   53000 2       2016 Automá… Bogotá
##  5 https://www.olx.com.co/item/mazda… 4   e7   70000 2 HAT…  2015 Mecáni… Bogotá
##  6 https://www.olx.com.co/item/se-ve… 3.15e7  103000 2       2011 Mecáni… Cali  
##  7 https://www.olx.com.co/item/mazda… 4.5 e7   92000 2       2015 Automá… Medel…
##  8 https://www.olx.com.co/item/mazda… 3.18e7   83000 2       2011 Mecáni… Medel…
##  9 https://www.olx.com.co/item/vendo… 5.5 e7   59000 2 HAT…  2017 Mecáni… Neiva 
## 10 https://www.olx.com.co/item/mazda… 2.8 e7  138000 2       2008 Automá… Bogotá
## # … with 311 more rows, and abbreviated variable names ¹​kilometraje,
## #   ²​transmision

2. Análisis exploratorio

#Es importante definir la variable molusco y concentración del agua como variables categoricas antes de realizar la regresion lineal.
olxMazda2$modelo=as.factor(olxMazda2$modelo)
olxMazda2$transmision=as.factor(olxMazda2$transmision)
olxMazda2$ciudad=as.factor(olxMazda2$ciudad)

Empecemos realizando un análisis de la variable precio en función del año y del modelo para detectar posibles valores atipicos

caja<-ggplot(olxMazda2, aes(x = ano, y = precio, fill = modelo)) + 
  stat_boxplot(geom = "errorbar", width = 0.25) + geom_boxplot() + scale_fill_hue(labels = c("Moslusco A", "Molusco B"))+ theme (text = element_text(size=8)) + ggtitle ("Distribución de Precios - Mazda 2") + theme (plot.title = element_text(family="Comic Sans MS",
                                  size=rel(2), vjust=2, face="bold", color="black",lineheight=1.5)) + labs(x = "Año",y = "Precio") + theme(axis.title = element_text(face="italic", colour="black", size=rel(1.5))) + theme(axis.title.x = element_text(face="bold", vjust=-0.5, colour="black", size=rel(1.5))) +
    theme(axis.title.y = element_text(face="bold", vjust=1.5, colour="black", size=rel(1.5)))
  
caja<-ggplotly(caja)
caja

Se consiguen tres categorias para el modelo 2, 2 HATCHBANK y 2 SEDAN. No se encuentran valores atipicos. Y claramente es visible el echo que al aumentar el año del modelo aumenta el precio.

Para las diferentes variables númericas pordemos obtener un ajuste de correlación.

ggpairs(select_if(olxMazda2, is.numeric), lower = list(continuous = "smooth"),diag = list(continuous = "barDiag"), axisLabels = "none")+theme_economist()

Donde el precio esta fuertemente correlacionado con el año del modelo del veiculo y con una correlación positiva, es decir a modelos mas recientes tenemos precios mas elevados. Por otra parte se observa que existe una correlación fuerte negativa con el kilometraje, a mayor kilometraje es menor el precio del vehiculo.

3. Modelo de regresión lineal múltiple

Construyendo un modelo de regresión lineal múltiple conseguimos.

Aplicando un escenario 80-20, 80% de los datos para realizar el modelamiento y el 20% para validar dicho modelo. Iniciamos segementando los datos:

muestra = sample(1:256)
olx_modelo = olxMazda2[muestra,]
olx_validacion = olxMazda2[-muestra, ]

Generamos el modelo

#Hacemos la regresión lineal.
modelo_vehiculo=lm(precio~kilometraje+modelo+ciudad+transmision+ano, data=olx_modelo)
summary(modelo_vehiculo)
## 
## Call:
## lm(formula = precio ~ kilometraje + modelo + ciudad + transmision + 
##     ano, data = olx_modelo)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -12944822  -2846349         0   2671721  15735122 
## 
## Coefficients:
##                                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                      -7.525e+09  2.971e+08 -25.329  < 2e-16 ***
## kilometraje                      -2.601e+01  1.384e+01  -1.880   0.0616 .  
## modelo2 HATCHBACK                -3.455e+05  8.010e+05  -0.431   0.6666    
## modelo2 SEDAN                     1.655e+06  1.094e+06   1.513   0.1318    
## ciudadAntioquia                  -6.053e+05  6.593e+06  -0.092   0.9269    
## ciudadArmenia                     4.111e+06  5.693e+06   0.722   0.4711    
## ciudadBarrancabermeja             3.534e+06  6.452e+06   0.548   0.5845    
## ciudadBarranquilla                1.899e+06  5.689e+06   0.334   0.7388    
## ciudadBello                       4.918e+06  5.745e+06   0.856   0.3930    
## ciudadBogotá                      1.421e+06  5.423e+06   0.262   0.7936    
## ciudadBucaramanga                 2.341e+06  5.702e+06   0.411   0.6818    
## ciudadCali                        3.746e+06  5.464e+06   0.686   0.4937    
## ciudadCartago                     3.588e+06  6.549e+06   0.548   0.5844    
## ciudadChapinero                   7.557e+06  7.408e+06   1.020   0.3088    
## ciudadChía                        2.813e+06  6.223e+06   0.452   0.6517    
## ciudadCúcuta                      1.035e+06  5.905e+06   0.175   0.8611    
## ciudadEngativá                    1.750e+06  7.571e+06   0.231   0.8175    
## ciudadEnvigado                    3.501e+06  6.035e+06   0.580   0.5624    
## ciudadFloridablanca               2.617e+06  5.711e+06   0.458   0.6472    
## ciudadFunza                       5.455e+06  7.451e+06   0.732   0.4650    
## ciudadFusagasugá                  3.796e+06  6.653e+06   0.570   0.5690    
## ciudadGirardot                    8.923e+06  7.488e+06   1.192   0.2348    
## ciudadGirón                       1.104e+06  7.414e+06   0.149   0.8817    
## ciudadIbagué                      9.692e+05  5.927e+06   0.164   0.8703    
## ciudadItagüí                      1.096e+06  6.364e+06   0.172   0.8634    
## ciudadLa Ceja                     9.041e+06  7.353e+06   1.230   0.2202    
## ciudadManizales                   3.201e+06  5.560e+06   0.576   0.5654    
## ciudadMedellín                    4.215e+06  5.458e+06   0.772   0.4409    
## ciudadNeiva                       1.363e+06  5.859e+06   0.233   0.8163    
## ciudadPalestina                  -2.169e+06  7.559e+06  -0.287   0.7745    
## ciudadPalmira                     8.091e+05  7.576e+06   0.107   0.9151    
## ciudadPereira                     2.833e+06  5.731e+06   0.494   0.6215    
## ciudadPiedecuesta                 2.226e+05  7.514e+06   0.030   0.9764    
## ciudadPitalito                    7.672e+06  7.519e+06   1.020   0.3088    
## ciudadPopayán                     5.462e+06  7.410e+06   0.737   0.4619    
## ciudadRionegro                   -1.388e+06  6.598e+06  -0.210   0.8336    
## ciudadSabaneta                    1.932e+06  5.984e+06   0.323   0.7472    
## ciudadSan Gil                     2.545e+06  6.482e+06   0.393   0.6950    
## ciudadSan Juan de Pasto          -3.829e+06  6.569e+06  -0.583   0.5606    
## ciudadSincelejo                  -3.190e+06  7.449e+06  -0.428   0.6690    
## ciudadSuba                        5.588e+06  6.189e+06   0.903   0.3677    
## ciudadTuluá                       9.992e+05  6.615e+06   0.151   0.8801    
## ciudadValledupar                  7.285e+06  7.525e+06   0.968   0.3341    
## ciudadVilla Rica                  5.675e+05  7.426e+06   0.076   0.9392    
## ciudadVillavicencio               2.983e+06  6.012e+06   0.496   0.6203    
## ciudadYopal                       5.745e+06  7.397e+06   0.777   0.4383    
## ciudadYumbo                       5.724e+06  6.557e+06   0.873   0.3837    
## ciudadZipaquirá                   5.476e+06  7.525e+06   0.728   0.4676    
## transmisionAutomática Secuencial  2.610e+06  1.285e+06   2.031   0.0435 *  
## transmisionMecánica              -3.295e+06  7.843e+05  -4.202 3.97e-05 ***
## ano                               3.760e+06  1.476e+05  25.468  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5182000 on 203 degrees of freedom
##   (2 observations deleted due to missingness)
## Multiple R-squared:  0.9308, Adjusted R-squared:  0.9137 
## F-statistic: 54.59 on 50 and 203 DF,  p-value: < 2.2e-16

En el modelo se encuentra que las variables predictoras con un valor de significacncia mas alto son el kilometraje, la transmisión y el año del modelo del vehiculo. Al parecer la ciudad no tiene una correlación muy elevada con el precio del vehiculo.

Se obtiene un p-value: 2.2e-16 que muestra claramente una alta significacia para el modelo desarrollado.

Validación de Supuestos

Al realizar la validación de supuestos nos encontramos con unos buenos resultados para respaldarla inferencia que hemos construido aquí.

ei=modelo_vehiculo$residuals
par(mfrow=c(2,2))
plot(modelo_vehiculo)

shapiro.test(ei)
## 
##  Shapiro-Wilk normality test
## 
## data:  ei
## W = 0.98581, p-value = 0.01277

4. Validar el poder predictivo del Modelo con Validación Cruzada

datos_validados = predict(modelo_vehiculo, newdata = olx_validacion)

error = (olx_validacion$precio - datos_validados)
respuesta = data.frame('Precio Real' = olx_validacion$precio, 'Precio Calculado' = datos_validados, 'Error' = error)
head(respuesta)
##   Precio.Real Precio.Calculado      Error
## 1    33000000         23713276  9286724.4
## 2    64000000         59496450  4503549.7
## 3    39000000         38546935   453065.4
## 4    37500000         35759232  1740768.1
## 5    28000000         19890124  8109875.6
## 6    40500000         42152219 -1652218.6
MAE = mean(abs(respuesta$Error))
MAE
## [1] 3325422
RMSE = sqrt(sum(respuesta$Error^2)/length(respuesta$Error))
RMSE
## [1] 4173300
porc_error_mae = MAE / (mean(olx_validacion$precio))
porc_error_mae
## [1] 0.0604859
porc_error_rmse = RMSE / (mean(olx_validacion$precio))
porc_error_rmse
## [1] 0.07590792

Este modelo permite predecir el precio de un vehículo de acuerdo a las variables predictoras encontradas con mayor valor de significacnia. Lo que se convierte en una herramienta que ayuda a estimar si el precio estipulado por un vendedor para el modelo se ajusta al precio del mercado previniendo un precio sobrevalorado o alertando de un precio muy por debajo de la tendencia.

De acuerdo con el coeficiente de ajuste conseguido es evidente que el precio se predice con un 93%, y un error general que se encuentra entre uns 3 y 4 millones, un porcentaje de error de entre el 6,6% y 7,7%.