Se realizó el proceso de web Scrapping previamente, se descargó la base de datos de precios de vehiculos mazda 2 para Colombia del portal olx https://www.olx.com.co/, con las variables: precio, kilometraje, modelo, transmición y ciudad. Se realizó previamente un trabajo de limpieza de la base de datos.

library(readxl)
mazda2_col <- read_excel("C:/Users/asus/Desktop/tallerOXL/mazda2_col.xlsx")
View(mazda2_col)

1 ANÁLISIS EXPLORATORIO

summary((mazda2_col))
##  web-scraper-order  web-scraper-start-url     link            link-href        
##  Length:318         Length:318            Length:318         Length:318        
##  Class :character   Class :character      Class :character   Class :character  
##  Mode  :character   Mode  :character      Mode  :character   Mode  :character  
##                                                                                
##                                                                                
##                                                                                
##      precio           kilometraje     transmision          modelo_ano  
##  Min.   :  6800000   Min.   :     0   Length:318         Min.   :1995  
##  1st Qu.: 35000000   1st Qu.: 39125   Class :character   1st Qu.:2011  
##  Median : 42000000   Median : 79000   Mode  :character   Median :2015  
##  Mean   : 50357547   Mean   : 75207                      Mean   :2015  
##  3rd Qu.: 63000000   3rd Qu.:107875                      3rd Qu.:2018  
##  Max.   :169800000   Max.   :280000                      Max.   :2022  
##     color              ciudad             Depto          
##  Length:318         Length:318         Length:318        
##  Class :character   Class :character   Class :character  
##  Mode  :character   Mode  :character   Mode  :character  
##                                                          
##                                                          
## 

De las variables cuantitativas es posible identificar que el promedio del precio de los vehiculos Mazda 2 para Colombia es de 50.357.547$ , el precio mínimo es de 6.800.000 (puede ser un valor atìpico) y el máximo de 169.800.000 millones. Frente al kilometraje el promedio es de 75.000 kilometros, mientras que frente al modelo, el promedio se ubica en el modelo 2015.

Realizamos Boxplot y histograa de variables precio y kms

par(mfrow = c(2,2))
boxplot(mazda2_col$precio, horizontal = TRUE, main = "Boxplot Precio Vehiculo Mazda 2",col="#A6CEE3" )
hist(mazda2_col$precio,main = "Histograma Precio Vehiculo Mazda 2" , ylab = "Frecuencia" , xlab = "Millones de pesos",col="#A6CEE3")
boxplot(mazda2_col$kilometraje, horizontal = TRUE, main = "Boxplot Kms recorridos",col="#A6CEE3" )
hist(mazda2_col$kilometraje,main = "Histograma Kms recorridos" , ylab = "Frecuencia" , xlab = "m2",col="#A6CEE3")

1 ANÁLISIS BIVARIADO

#Relación entre precio y kilometraje

library(ggplot2)
g1= ggplot(mapping = aes(x = mazda2_col$kilometraje, y = mazda2_col$precio)) + geom_point() + 
  ylab('Precio') + xlab('Kilometraje') + ggtitle(label = 'Análisis Precio vs Kilometraje') +
  theme(plot.title = element_text(hjust = 0.5))
g1

Es posible observar una relación inversa entre el precio y el kilometraje, lo que nos dice que cuando uno aumenta el otro disminuye; en este caso si el kilometraje aumenta el precio disminuye.

#Relación entre precio y año

g2=ggplot(mazda2_col, aes(x = mazda2_col$kilometraje, y = mazda2_col$precio)) + 
  geom_point(aes(color = mazda2_col$modelo_ano), size = 2, alpha = 0.7) +
  xlab('Precio') + 
  ylab('kilometraje') +
  ggtitle('Precio en relación con kilometraje y modelo') + 
  theme_minimal()
g2
## Warning: Use of `mazda2_col$modelo_ano` is discouraged. Use `modelo_ano`
## instead.
## Warning: Use of `mazda2_col$kilometraje` is discouraged. Use `kilometraje`
## instead.
## Warning: Use of `mazda2_col$precio` is discouraged. Use `precio` instead.

Según la gráfica, se puede observar que a medida que va aumentando el modelo (año) del Mazda 2, el precio va incrementando. Es posible obervar entonces que si el modelo es mas nuevo es probable que este tenga menor kilometraje y su precio sera mucho mayor. Por otro lado, si el modelo es mas antiguo, la probabilidad de que el kilometraje sea mucho mayor es alta, lo que haria que su precio fuera menor.

#Relación entre presio, kilometraje y transmisión

g3=ggplot(mazda2_col, aes(x = mazda2_col$kilometraje, y = mazda2_col$precio)) + 
  geom_point(aes(color = mazda2_col$transmision), size = 2, alpha = 0.7) +
  geom_smooth(aes(color = mazda2_col$transmision), fill = NA) +
  xlab('precio') + 
  ylab('kilometraje') +
  ggtitle('Relación eentre el precio y el kilometraje por tipo de transmisión') + 
  theme_minimal() 
g3
## Warning: Use of `mazda2_col$transmision` is discouraged. Use `transmision`
## instead.
## Warning: Use of `mazda2_col$kilometraje` is discouraged. Use `kilometraje`
## instead.
## Warning: Use of `mazda2_col$precio` is discouraged. Use `precio` instead.
## Warning: Use of `mazda2_col$transmision` is discouraged. Use `transmision`
## instead.
## Warning: Use of `mazda2_col$kilometraje` is discouraged. Use `kilometraje`
## instead.
## Warning: Use of `mazda2_col$precio` is discouraged. Use `precio` instead.
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric =
## parametric, : span too small. fewer data values than degrees of freedom.
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric =
## parametric, : pseudoinverse used at 32515
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric =
## parametric, : neighborhood radius 76485
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric =
## parametric, : reciprocal condition number 0
## Warning in simpleLoess(y, x, w, span, degree = degree, parametric =
## parametric, : There are other near singularities as well. 1.2592e+09
## Warning in predLoess(object$y, object$x, newx = if
## (is.null(newdata)) object$x else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : span too small. fewer
## data values than degrees of freedom.
## Warning in predLoess(object$y, object$x, newx = if
## (is.null(newdata)) object$x else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : pseudoinverse used at
## 32515
## Warning in predLoess(object$y, object$x, newx = if
## (is.null(newdata)) object$x else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : neighborhood radius
## 76485
## Warning in predLoess(object$y, object$x, newx = if
## (is.null(newdata)) object$x else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : reciprocal condition
## number 0
## Warning in predLoess(object$y, object$x, newx = if
## (is.null(newdata)) object$x else if (is.data.frame(newdata))
## as.matrix(model.frame(delete.response(terms(object)), : There are other near
## singularities as well. 1.2592e+09
## Warning in max(ids, na.rm = TRUE): ningun argumento finito para max; retornando
## -Inf

Posteriormente, para aplicar el modelo de regresión múltiple debemos segmentar los datos 80-20, 80% de los datos para realizar el modelamiento y el 20% para validar dicho modelo.

muestra = sample(1:318, 254)
df_mod = mazda2_col[muestra, ]
df_val = mazda2_col[-muestra, ]

2. Proponer un modelo de regresión lineal múltiple e interpretar los resultados (betas)

Luego de realizar la división de datos para la modelación y para la validación, entonces, planteamos los distintos modelos.

Modelo 1

mod_1 = lm(precio ~ kilometraje, data = df_mod)
summary(mod_1)
## 
## Call:
## lm(formula = precio ~ kilometraje, data = df_mod)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -59894919  -7287427   -798893   7044739 108358225 
## 
## Coefficients:
##               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  7.149e+07  1.979e+06   36.12   <2e-16 ***
## kilometraje -2.790e+02  2.231e+01  -12.51   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 16650000 on 252 degrees of freedom
## Multiple R-squared:  0.383,  Adjusted R-squared:  0.3805 
## F-statistic: 156.4 on 1 and 252 DF,  p-value: < 2.2e-16

Modelo 2

mod_2 = lm(precio ~ kilometraje + transmision, data = df_mod)
summary(mod_2)
## 
## Call:
## lm(formula = precio ~ kilometraje + transmision, data = df_mod)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -53106836  -7113386    145555   7045293 106674002 
## 
## Coefficients:
##                                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                       7.221e+07  2.180e+06  33.118  < 2e-16 ***
## kilometraje                      -2.522e+02  2.206e+01 -11.434  < 2e-16 ***
## transmisionAutomática Secuencial  9.282e+06  3.625e+06   2.561 0.011042 *  
## transmisionMecánica              -7.968e+06  2.135e+06  -3.732 0.000235 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 15940000 on 247 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.4442, Adjusted R-squared:  0.4375 
## F-statistic:  65.8 on 3 and 247 DF,  p-value: < 2.2e-16

Modelo 3

mod_3 = lm(precio ~ kilometraje + transmision + modelo_ano, data = df_mod)
summary(mod_3)
## 
## Call:
## lm(formula = precio ~ kilometraje + transmision + modelo_ano, 
##     data = df_mod)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -67099652  -4160626  -1083399   2828466 101366301 
## 
## Coefficients:
##                                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                      -6.847e+09  5.212e+08 -13.136  < 2e-16 ***
## kilometraje                      -3.575e+01  2.347e+01  -1.524 0.128868    
## transmisionAutomática Secuencial  3.006e+06  2.812e+06   1.069 0.286130    
## transmisionMecánica              -5.485e+06  1.643e+06  -3.337 0.000977 ***
## modelo_ano                        3.426e+06  2.581e+05  13.275  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 12190000 on 246 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.6762, Adjusted R-squared:  0.6709 
## F-statistic: 128.4 on 4 and 246 DF,  p-value: < 2.2e-16

Tras ver el resultado de los sitintos modelos el mejor modelo de regresión lineal múltiple para calcular el precios de vehículos Mazda 2, el mejor modelo que representa al dataset es el número 3; en donde obtuvimos un R-squared de 0,73

validación de supuestos

par(mfrow=c(2,2))
plot(mod_3)

shapiro.test(mod_3$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  mod_3$residuals
## W = 0.58896, p-value < 2.2e-16

Se cumple con la normalidad

library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
bptest(mod_3)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod_3
## BP = 2.9242, df = 4, p-value = 0.5706

Cumple con heterocedasticidad

dwtest( mod_3, 
        alternative = "two.sided", 
        data = mazda2_col)
## 
##  Durbin-Watson test
## 
## data:  mod_3
## DW = 2.1169, p-value = 0.3461
## alternative hypothesis: true autocorrelation is not 0

Cumple con indepencia en los residuos

Validación cruzada a partir del 20% de los datos

data_val = predict(mod_3, newdata = df_val)

error = (df_val$precio - data_val)
res = data.frame('Precio Real' = df_val$precio, 'Precio Calculado' = data_val, 'Error' = error)
head(res)
##   Precio.Real Precio.Calculado       Error
## 1    26400000         41736552 -15336551.9
## 2    42500000         45511978  -3011978.2
## 3    35900000         42272876  -6372875.7
## 4    40900000         45698690  -4798690.4
## 5    41000000         41450512   -450512.5
## 6    98500000         79998893  18501107.1

MAE

MAE = mean(abs(res$Error))
MAE
## [1] NA

RMSE

RMSE = sqrt(sum(res$Error^2)/length(res$Error))
RMSE
## [1] NA
porc_error_mae = MAE / (mean(df_val$precio))
porc_error_mae
## [1] NA
porc_error_rmse = RMSE / (mean(df_val$precio))
porc_error_rmse
## [1] NA

El modelo nos permite predecir el precio de un vehículo Mazda 2 de acuerdo a las variables kilometraje, transmisión y modelo.

A partir de este modelo podemos predecir el precio en un ~73%, con un MAE de ~5,8 millones y un RMSE de 11,2 millones, lo cuál corresponde a errores del 11% y 22% respectivamente; este resultado no se considera aceptable para la predicción del valor de este tipo de vehículo, debido al alto porcentaje de error en el MAE y del RMSE. Se concluye que el modelo no tiene capacidad de predicción.

USOS DEL MODELO

El uso de modelos de regresión lineal es bastante amplio, para este caso de ejemplo, el modelo permite predecir o tomar decisiones relacionadas con la compra-venta de automóviles maximizando las ganancias y minimizando riesgo al momento de comprar un auto.

```