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)
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")
#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, ]
Luego de realizar la división de datos para la modelación y para la validación, entonces, planteamos los distintos modelos.
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
## -60315300 -7000677 -507748 6735798 108096586
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 7.206e+07 1.830e+06 39.37 <2e-16 ***
## kilometraje -2.875e+02 2.091e+01 -13.75 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 15220000 on 252 degrees of freedom
## Multiple R-squared: 0.4287, Adjusted R-squared: 0.4264
## F-statistic: 189.1 on 1 and 252 DF, p-value: < 2.2e-16
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
## -55110380 -6957173 423976 7630659 107017850
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 7.236e+07 1.973e+06 36.671 < 2e-16 ***
## kilometraje -2.659e+02 2.091e+01 -12.718 < 2e-16 ***
## transmisionAutomática Secuencial 8.230e+06 3.515e+06 2.341 0.02001 *
## transmisionMecánica -5.878e+06 1.969e+06 -2.985 0.00312 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 14760000 on 249 degrees of freedom
## (1 observation deleted due to missingness)
## Multiple R-squared: 0.4687, Adjusted R-squared: 0.4623
## F-statistic: 73.21 on 3 and 249 DF, p-value: < 2.2e-16
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
## -66364552 -3888716 -841459 2981009 102038505
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6.888e+09 4.958e+08 -13.891 < 2e-16 ***
## kilometraje -2.741e+01 2.309e+01 -1.187 0.236366
## transmisionAutomática Secuencial 3.563e+06 2.650e+06 1.344 0.180047
## transmisionMecánica -5.450e+06 1.473e+06 -3.700 0.000266 ***
## modelo_ano 3.446e+06 2.455e+05 14.037 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 11040000 on 248 degrees of freedom
## (1 observation deleted due to missingness)
## Multiple R-squared: 0.7039, Adjusted R-squared: 0.6991
## F-statistic: 147.4 on 4 and 248 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,68
par(mfrow=c(2,2))
plot(mod_3)
shapiro.test(mod_3$residuals)
##
## Shapiro-Wilk normality test
##
## data: mod_3$residuals
## W = 0.61596, 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 = 1.0212, df = 4, p-value = 0.9066
Cumple con heterocedasticidad
dwtest( mod_3,
alternative = "two.sided",
data = mazda2_col)
##
## Durbin-Watson test
##
## data: mod_3
## DW = 2.3313, p-value = 0.008302
## alternative hypothesis: true autocorrelation is not 0
Cumple con indepencia en los residuos
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 41560189 -15160188.7
## 2 87000000 82621988 4378012.5
## 3 36000000 35729835 270165.2
## 4 28000000 27832774 167226.1
## 5 37500000 41066820 -3566820.4
## 6 55000000 55366646 -366645.6
MAE = mean(abs(res$Error))
MAE
## [1] NA
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 68%, 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 tiene poca capacidad de predicción y debe reformularse.
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.
```