Por medio de web scraping descargar 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.
library(readxl)
data_mazda2 <- read_excel("D:\\ESTUDIO\\MASTER IN DATA SCIENCE\\Semester 2\\Metodos estadisticos para la toma de decisiones\\MOD2\\Regresion Lineal Multiple\\data_mazda2.xlsx")
head(data_mazda2)
| precio | modelo | kilometros | transmicion | ciudad |
|---|---|---|---|---|
| 45000000 | 2015 | 70000 | Automática | Universidad Pontificia Bolivariana, Medellín, Antioquia |
| 86000000 | 2022 | 5000 | Automática | Villa Julia, Villavicencio, Meta |
| 66000000 | 2020 | 62585 | Automática | San José V Sector, Suba, Bogotá |
| 123456789 | 2019 | 49000 | Automática Secuencial | Avenida Centenario, Armenia, Quindío |
| 84050000 | 2022 | 0 | Automática | Prados del Norte, Cali, Valle del Cauca |
| 44000000 | 2015 | 36800 | Mecánica | Villa Firenze, Floridablanca, Santander |
Nota: Se observa que la columna ciudad en verdad tiene tres ubicaciones (barrio, cuidad, departamento), por lo que se procede a dividir esta columna por el delimitador “,” para obtener únicamente el campo de ciudad:
library(dplyr)
library(tidyr)
library(stringr)
data_ciudad = data.frame(str_split_fixed(data_mazda2$ciudad, ", ", 3))
data_mazda2$ciudad = data_ciudad$X2
head(data_mazda2)
| precio | modelo | kilometros | transmicion | ciudad |
|---|---|---|---|---|
| 45000000 | 2015 | 70000 | Automática | Medellín |
| 86000000 | 2022 | 5000 | Automática | Villavicencio |
| 66000000 | 2020 | 62585 | Automática | Suba |
| 123456789 | 2019 | 49000 | Automática Secuencial | Armenia |
| 84050000 | 2022 | 0 | Automática | Cali |
| 44000000 | 2015 | 36800 | Mecánica | Floridablanca |
Realizar una exploración de datos para evaluar la posible relación entre precio con las demás variables.
summary(data_mazda2)
## precio modelo kilometros transmicion
## Min. : 6000000 Min. :2008 Min. : 0 Length:103
## 1st Qu.: 33200000 1st Qu.:2011 1st Qu.: 40250 Class :character
## Median : 40500000 Median :2013 Median : 88000 Mode :character
## Mean : 47019969 Mean :2014 Mean : 77252
## 3rd Qu.: 56725000 3rd Qu.:2018 3rd Qu.:110000
## Max. :123456789 Max. :2022 Max. :198000
## ciudad
## Length:103
## Class :character
## Mode :character
##
##
##
require(ggplot2)
require(plotly)
graph1= ggplot(data_mazda2,aes( y=precio))+
geom_boxplot()+
theme_bw()
graph2= ggplot(data_mazda2,aes( y=modelo))+
geom_boxplot()+
theme_bw()
graph3= ggplot(data_mazda2,aes( y=kilometros))+
geom_boxplot()+
theme_bw()
library(patchwork)
graph1 + graph2 + graph3
Análisis: En el resumen anterior se nota de manera general que el máximo valor para precio de un vehículo mazda 2 es de “123456789”, valor que está alejado de la media y mediana de los datos ademas puede ser un dato falso que puede afectar el modelo de regresión. Por lo que se decide eliminar ese dato:
data_mazda2 = data_mazda2[!(data_mazda2$precio == 123456789),]
summary(data_mazda2)
## precio modelo kilometros transmicion
## Min. : 6000000 Min. :2008 Min. : 0 Length:102
## 1st Qu.:33050000 1st Qu.:2011 1st Qu.: 39875 Class :character
## Median :40200000 Median :2013 Median : 88725 Mode :character
## Mean :46270588 Mean :2014 Mean : 77529
## 3rd Qu.:56375000 3rd Qu.:2017 3rd Qu.:110000
## Max. :98000000 Max. :2022 Max. :198000
## ciudad
## Length:102
## Class :character
## Mode :character
##
##
##
library(GGally)
library(dplyr)
ggpairs(select_if(data_mazda2, is.numeric), lower = list(continuous = "smooth"),
diag = list(continuous = "barDiag"), axisLabels = "none")
Análisis: El coeficiente de correlación entre las
variables precio y modelo es alto (0.87). El coef de correlación entre
las variables modelo y kilometros es bajo (0.58) por lo que el modelo de
regresón no tiene mayor riesgo de presentar multicolinealidad.
require(ggplot2)
ggplot(data_mazda2,aes(x= transmicion, y=precio, fill=transmicion))+
geom_boxplot()+
theme_bw()
tabla1 = table(data_mazda2$ciudad)
tabla1 = (prop.table(tabla1))
tabla1= data.frame(tabla1)
head(tabla1[order(tabla1$Freq, decreasing = TRUE),])
| Var1 | Freq | |
|---|---|---|
| 18 | Medellín | 0.2352941 |
| 7 | Cali | 0.1568627 |
| 17 | Manizales | 0.0686275 |
| 4 | Bello | 0.0490196 |
| 20 | Pereira | 0.0490196 |
| 3 | Barranquilla | 0.0392157 |
Análisis: En cuanto a las variables cualitativas, se observa que el tipo de trasmisión (Automática Secuencial) presenta valores por encima de las otras categorías en cuanto al precio del vehículo. Por otro lado la ciudad en donde existen más vehículos a la venta es en Medellin con un 23% de los datos.
Proponer un modelo de regresión lineal múltiple e interpretar los resultados (betas)
mod_mazda = lm(formula= precio ~ modelo + kilometros + ciudad + transmicion, data=data_mazda2)
summary(mod_mazda)
##
## Call:
## lm(formula = precio ~ modelo + kilometros + ciudad + transmicion,
## data = data_mazda2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -64813422 -2100906 0 2613456 21519964
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6.497e+09 7.748e+08 -8.386 4.84e-12 ***
## modelo 3.250e+06 3.844e+05 8.454 3.65e-12 ***
## kilometros -3.032e+01 3.014e+01 -1.006 0.3180
## ciudadArmenia 4.780e+06 9.140e+06 0.523 0.6027
## ciudadBarranquilla 9.629e+05 7.734e+06 0.124 0.9013
## ciudadBello 4.612e+06 7.552e+06 0.611 0.5435
## ciudadBucaramanga -2.736e+05 1.158e+07 -0.024 0.9812
## ciudadCaldas -3.325e+06 1.164e+07 -0.286 0.7760
## ciudadCali -3.594e+06 6.314e+06 -0.569 0.5711
## ciudadChapinero -3.930e+06 9.311e+06 -0.422 0.6743
## ciudadCúcuta -4.694e+06 1.016e+07 -0.462 0.6456
## ciudadCundinamarca 2.574e+06 9.326e+06 0.276 0.7834
## ciudadEnvigado 3.204e+06 9.239e+06 0.347 0.7298
## ciudadFloridablanca -1.593e+06 7.699e+06 -0.207 0.8367
## ciudadGirón -1.633e+06 1.135e+07 -0.144 0.8860
## ciudadHuila -3.086e+06 1.146e+07 -0.269 0.7885
## ciudadItagüí 4.374e+05 1.161e+07 0.038 0.9701
## ciudadKennedy -5.034e+06 8.587e+06 -0.586 0.5597
## ciudadManizales 1.601e+06 7.037e+06 0.228 0.8207
## ciudadMedellín 2.066e+06 6.246e+06 0.331 0.7418
## ciudadNeiva 5.971e+06 1.166e+07 0.512 0.6102
## ciudadPereira 1.424e+06 7.252e+06 0.196 0.8449
## ciudadPopayán 1.761e+06 1.137e+07 0.155 0.8774
## ciudadSabaneta -2.393e+06 9.105e+06 -0.263 0.7935
## ciudadSan Juan de Pasto 5.653e+06 1.150e+07 0.492 0.6247
## ciudadSanta Fé 4.180e+06 1.173e+07 0.356 0.7227
## ciudadSanta Marta 6.491e+06 1.179e+07 0.551 0.5837
## ciudadSantander 2.639e+06 1.143e+07 0.231 0.8181
## ciudadSuba -1.555e+04 1.184e+07 -0.001 0.9990
## ciudadValle del Cauca 2.493e+06 9.185e+06 0.271 0.7869
## ciudadValledupar 3.689e+06 1.169e+07 0.316 0.7534
## ciudadVillavicencio 1.988e+06 7.501e+06 0.265 0.7918
## transmicionAutomática Secuencial 8.402e+06 4.121e+06 2.039 0.0454 *
## transmicionMecánica -2.823e+06 2.625e+06 -1.075 0.2860
## transmicionnull -1.025e+06 8.195e+06 -0.125 0.9008
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 9750000 on 67 degrees of freedom
## Multiple R-squared: 0.8187, Adjusted R-squared: 0.7268
## F-statistic: 8.901 on 34 and 67 DF, p-value: 2.627e-14
mod_mazda_mejorado = step(mod_mazda)
## Start: AIC=3310.05
## precio ~ modelo + kilometros + ciudad + transmicion
##
## Df Sum of Sq RSS AIC
## - ciudad 29 8.0644e+14 7.1754e+15 3264.2
## - kilometros 1 9.6238e+13 6.4652e+15 3309.6
## <none> 6.3690e+15 3310.1
## - transmicion 3 6.2698e+14 6.9960e+15 3313.6
## - modelo 1 6.7946e+15 1.3164e+16 3382.1
##
## Step: AIC=3264.22
## precio ~ modelo + kilometros + transmicion
##
## Df Sum of Sq RSS AIC
## - kilometros 1 1.5871e+13 7.1913e+15 3262.4
## <none> 7.1754e+15 3264.2
## - transmicion 3 8.8950e+14 8.0649e+15 3270.1
## - modelo 1 1.1634e+16 1.8809e+16 3360.5
##
## Step: AIC=3262.44
## precio ~ modelo + transmicion
##
## Df Sum of Sq RSS AIC
## <none> 7.1913e+15 3262.4
## - transmicion 3 9.1464e+14 8.1059e+15 3268.7
## - modelo 1 1.5986e+16 2.3177e+16 3379.8
summary(mod_mazda_mejorado)
##
## Call:
## lm(formula = precio ~ modelo + transmicion, data = data_mazda2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -67311899 -2975989 -343145 2880851 24688101
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6.734e+09 4.616e+08 -14.587 < 2e-16 ***
## modelo 3.367e+06 2.293e+05 14.684 < 2e-16 ***
## transmicionAutomática Secuencial 9.267e+06 3.267e+06 2.837 0.00555 **
## transmicionMecánica -2.469e+06 1.839e+06 -1.343 0.18251
## transmicionnull -3.694e+06 6.221e+06 -0.594 0.55397
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8610000 on 97 degrees of freedom
## Multiple R-squared: 0.7953, Adjusted R-squared: 0.7869
## F-statistic: 94.23 on 4 and 97 DF, p-value: < 2.2e-16
Análisis: El modelo inicial toma en cuenta todas las variables tanto cualitativas como cuantitativas que se tienen disponibles, arrojando un r2 de 0.71. En el modelo mejorado se excluyen variables y se dejan únicamente (modelo y transmicion) lo que genera un modelo con un r2 más alto (0.75) por lo que las variables en uso representan el 75% de la variable precio.
Validad el poder predictivo del Modelo con Validación Cruzada.
Para la validación cruzada se toma el 80% de los datos para modelar y el 20% para predecir:
#
# Conjunto de 102 datos (80% para modelar y 20% para validar):
id_modelar= sample(1:102, size=82)
id_modelar
## [1] 17 82 64 20 15 18 32 3 100 77 43 69 70 59 63 25 11 5 10
## [20] 95 80 26 92 84 99 72 39 93 55 86 56 29 4 22 76 50 65 8
## [39] 52 38 78 49 74 48 31 97 67 19 6 75 58 79 2 54 28 61 73
## [58] 91 14 68 88 90 46 9 85 101 44 89 51 87 37 71 83 27 96 34
## [77] 47 24 42 12 30 53
# data set con 72 datos para modelar:
mazda_modelar= data_mazda2[id_modelar,]
head(mazda_modelar)
| precio | modelo | kilometros | transmicion | ciudad |
|---|---|---|---|---|
| 67000000 | 2017 | 61997 | Automática | Medellín |
| 35500000 | 2011 | 125000 | Mecánica | Pereira |
| 31500000 | 2008 | 110000 | Mecánica | Bello |
| 31800000 | 2011 | 83000 | Mecánica | Medellín |
| 56000000 | 2016 | 102000 | Automática | Santa Fé |
| 58500000 | 2017 | 100000 | Automática | Cali |
# data set con 18 datos para validar:
mazda_validar= data_mazda2[-id_modelar,]
head(mazda_validar)
| precio | modelo | kilometros | transmicion | ciudad |
|---|---|---|---|---|
| 45000000 | 2015 | 70000 | Automática | Medellín |
| 56500000 | 2018 | 30000 | Mecánica | Cali |
| 42500000 | 2013 | 102222 | Automática | Itagüí |
| 69000000 | 2018 | 35200 | Automática Secuencial | Pereira |
| 32000000 | 2009 | 127000 | Automática | Valledupar |
| 30000000 | 2008 | 174 | Mecánica | Antioquia |
mod_mazda_modelar = lm(formula = precio ~ modelo + transmicion, data = data_mazda2)
summary(mod_mazda_modelar)
##
## Call:
## lm(formula = precio ~ modelo + transmicion, data = data_mazda2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -67311899 -2975989 -343145 2880851 24688101
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -6.734e+09 4.616e+08 -14.587 < 2e-16 ***
## modelo 3.367e+06 2.293e+05 14.684 < 2e-16 ***
## transmicionAutomática Secuencial 9.267e+06 3.267e+06 2.837 0.00555 **
## transmicionMecánica -2.469e+06 1.839e+06 -1.343 0.18251
## transmicionnull -3.694e+06 6.221e+06 -0.594 0.55397
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 8610000 on 97 degrees of freedom
## Multiple R-squared: 0.7953, Adjusted R-squared: 0.7869
## F-statistic: 94.23 on 4 and 97 DF, p-value: < 2.2e-16
predict_precio = predict(mod_mazda_modelar, list(modelo=mazda_validar$modelo, transmicion=mazda_validar$transmicion))
predict_precio
## 1 2 3 4 5 6 7 8
## 49744677 57375817 43011186 69111941 29544202 23708358 72478687 30441850
## 9 10 11 12 13 14 15 16
## 26177456 37175341 43011186 26177456 47275579 60742563 33808595 46377932
## 17 18 19 20
## 37175341 25849762 64109309 50642325
precio_real = mazda_validar$precio
error = precio_real-predict_precio
resultado = data.frame(precio_real, predict_precio, error)
head(resultado, 5)
| precio_real | predict_precio | error |
|---|---|---|
| 45000000 | 49744677 | -4744677.5 |
| 56500000 | 57375817 | -875816.8 |
| 42500000 | 43011186 | -511185.7 |
| 69000000 | 69111941 | -111941.1 |
| 32000000 | 29544202 | 2455797.9 |
#Mean Absolut Error
MAE = mean(abs(error))
MAE
## [1] 3127118
MAE indica que la diferencia entre el peso real vs el peso predicho en promedio es de 3664746 de pesos.
Discutir potenciales usos del modelo como herramienta practica (como monetizar los resultados de este 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.