Informe de Aplicación de Regresión Lineal Multiple
MAESTRÍA EN CIENCIA DE DATOS UNIVERSIDAD JAVERIANA DE CALI
MÉTODOS ESTADÍSTICOS PARA LA TOMA DE DECISIONES
Carolina Galindres Bernal, Adrian Rodriguez Amaya
APLICACIÓN DE REGRESIÓN LINEAL MÚLTIPLE
El presente informe se ha elaborado a partir de los datos descargados a través de una herramienta de web scraping para la página OLX, puntualmente se han descargado todas las publicaciones referente al modelo de auto Mazda 2 para toda Colombia. A continuación, presentamos los datos obtenidos:
head(data)
## # A tibble: 6 × 6
## precio kilometraje modelo transmision ciudad departamento
## <dbl> <dbl> <dbl> <chr> <chr> <chr>
## 1 51900000 30300 2016 Mecánica Manizales Caldas
## 2 33900000 103000 2011 Automática Usaquén Bogotá
## 3 33500000 124000 2011 Mecánica Floridablanca Santander
## 4 90000000 13471 2022 Automática Medellín Antioquia
## 5 34000000 119700 2009 Mecánica Manizales Caldas
## 6 78500000 21000 2021 <NA> Cali Valle del Cauca
Una vez cargados los datos, procedemos a realizar una exploración de estos, con la finalidad de obtener el tipo de dato y otra información relevante relacionada. Así:
summary(data)
## precio kilometraje modelo transmision
## Min. :22000000 Min. : 5000 Min. :2007 Length:80
## 1st Qu.:36225000 1st Qu.: 42000 1st Qu.:2011 Class :character
## Median :44250000 Median : 77942 Median :2015 Mode :character
## Mean :49762875 Mean : 75372 Mean :2015
## 3rd Qu.:62625000 3rd Qu.:102250 3rd Qu.:2018
## Max. :90000000 Max. :148000 Max. :2022
## ciudad departamento
## Length:80 Length:80
## Class :character Class :character
## Mode :character Mode :character
##
##
##
Como podemos observar, las variables modelo, transmisión, ciudad y departamento son de tipo “character”, por tanto, es necesario modificar el tipo de dato a “factor”.
data$modelo = as.factor(data$modelo)
data$transmision = as.factor(data$transmision)
data$ciudad = as.factor(data$ciudad)
data$departamento = as.factor(data$departamento)
summary(data)
## precio kilometraje modelo transmision
## Min. :22000000 Min. : 5000 2011 : 9 Automática :36
## 1st Qu.:36225000 1st Qu.: 42000 2015 : 8 Automática Secuencial: 4
## Median :44250000 Median : 77942 2019 : 8 Mecánica :37
## Mean :49762875 Mean : 75372 2010 : 6 NA's : 3
## 3rd Qu.:62625000 3rd Qu.:102250 2014 : 6
## Max. :90000000 Max. :148000 2016 : 6
## (Other):37
## ciudad departamento
## Medellín :15 Antioquia :21
## Cali :12 Valle del Cauca:12
## Manizales : 7 Bogotá :11
## Bucaramanga: 4 Caldas : 7
## Ibagué : 4 Santander : 7
## Suba : 4 Colombia : 6
## (Other) :34 (Other) :16
Ahora, para la variable transmisión observamos que contiene algunos valores faltantes; estos valores deben ser eliminados, ya que al reemplazarlos por la moda pudieran generar información impresisa al comprador.
df = data[!(is.na(data$transmision)), ]
summary(df)
## precio kilometraje modelo transmision
## Min. :22000000 Min. : 5000 2011 : 9 Automática :36
## 1st Qu.:36000000 1st Qu.: 42000 2019 : 8 Automática Secuencial: 4
## Median :44500000 Median : 76885 2015 : 7 Mecánica :37
## Mean :49630260 Mean : 75386 2010 : 6
## 3rd Qu.:62500000 3rd Qu.:102000 2016 : 6
## Max. :90000000 Max. :148000 2017 : 6
## (Other):35
## ciudad departamento
## Medellín :15 Antioquia :21
## Cali :11 Bogotá :11
## Manizales : 6 Valle del Cauca:11
## Bucaramanga: 4 Santander : 7
## Ibagué : 4 Caldas : 6
## Suba : 4 Colombia : 5
## (Other) :33 (Other) :16
En este punto contamos con el dataset correcto para iniciar con el análisis exploratorio entre el precio y las demás variables dentro del conjunto de datos. Así:
plt_precio_km = ggplot(mapping = aes(x = df$kilometraje, y = df$precio)) + geom_point() +
ylab('Precio') + xlab('Kilometraje') + ggtitle(label = 'Análisis Precio vs Kilometraje') +
theme(plot.title = element_text(hjust = 0.5))
plt_precio_modelo = ggplot(mapping = aes(x = df$modelo, y = df$precio, fill = df$modelo)) + geom_boxplot() +
ylab('Precio') + xlab('Modelo') + ggtitle(label = 'Análisis Precio vs Modelo') +
theme(plot.title = element_text(hjust = 0.5), axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + theme(legend.position="none") + labs(fill = element_blank())
plt_precio_transmision = ggplot(mapping = aes(x = df$transmision, y = df$precio, fill = df$transmision)) + geom_boxplot() +
ylab('Precio') + xlab('Transmisión') + ggtitle(label = 'Análisis Precio vs Transmisión') +
theme(plot.title = element_text(hjust = 0.5)) + theme(legend.position="none") + labs(fill = '')
plt_precio_depto = ggplot(mapping = aes(x = df$departamento, y = df$precio, fill = df$departamento)) + geom_boxplot() +
ylab('Precio') + xlab('Departamento') + ggtitle(label = 'Análisis Precio vs Departamento') +
theme(plot.title = element_text(hjust = 0.5), axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + theme(legend.position="none") + labs(fill = element_blank())
plt_precio_km
De acuerdo con la gráfica entre el “Precio vs Kilometraje” podemos apreciar que a medida que el kilometraje del vehículo es menor, su precio de venta aumenta; lo contrario sucede cuando el kilometraje es mayor, el precio tiende a disminuir.
ggplotly(plt_precio_modelo)
Con respeco a la gráfica entre el “Precio vs Modelo” podemos evidenciar que los modelos más recientes tienden a tener un precio mayor, lo que es lógico; mientras que modelos mucho más antiguos su precio disminuye considerablemente.
ggplotly(plt_precio_transmision)
Ahora, la gráfica entre el “Precio vs Transmisión” nos ilustra que los modelos de autos con transmisión automática la media del precio de vehículos de este tipo es la mayor; sucede lo contrario con los vehículos transmisión mecánica, su media es menor. Los autos con transmisión Automática Secuencial mantienen su media de precio entre ambos extremos.
ggplotly(plt_precio_depto)
En esta última gráfica del “Precio vs Departamento” podemos observar que algunos departamentos manejan un precio medio inferior al de los demás departamentos; este es el caso para Antioquia, Caldas, Nariño y Bogotá D.C.
Una vez realizada la exploración de los datos, procederemos a plantear un modelo de regresión lineal múltiple que nos permita calcular el precio de acuerdo con ciertas variables como modelo, kilometraje, transmisión, entre otros que se definan.
Partiremos aplicando un escenario 80-20, 80% de los datos para realizar el modelamiento y el 20% para validar dicho modelo. Iniciamos segementando los datos objeto del estudio:
muestra = sample(1:77, 61)
df_mod = df[muestra, ]
df_val = df[-muestra, ]
Luego de definir los datos que se usarán para el modelamiento y los que se utilizarán para la validación, plantaremos algunas combinaciones para encontrar el modelo que mejor se ajuste a nuestra necesidades. A continuación modelos observar los resultados para cada uno de los 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
## -18342163 -5027160 -590244 4963463 18365425
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 7.758e+07 2.110e+06 36.76 <2e-16 ***
## kilometraje -3.717e+02 2.494e+01 -14.90 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7381000 on 59 degrees of freedom
## Multiple R-squared: 0.7901, Adjusted R-squared: 0.7865
## F-statistic: 222 on 1 and 59 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
## -16383658 -4930628 58261 5193362 16521804
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 78714307.0 2178017.9 36.140 <2e-16 ***
## kilometraje -358.8 25.0 -14.355 <2e-16 ***
## transmisionAutomática Secuencial 1102182.9 4388640.9 0.251 0.8026
## transmisionMecánica -4123577.5 1950608.3 -2.114 0.0389 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7197000 on 57 degrees of freedom
## Multiple R-squared: 0.8072, Adjusted R-squared: 0.797
## F-statistic: 79.53 on 3 and 57 DF, p-value: < 2.2e-16
Modelo 3
mod_3 = lm(precio ~ kilometraje + transmision + modelo, data = df_mod)
summary(mod_3)
##
## Call:
## lm(formula = precio ~ kilometraje + transmision + modelo, data = df_mod)
##
## Residuals:
## Min 1Q Median 3Q Max
## -9492438 -1789618 0 1651297 10395921
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.096e+07 6.898e+06 5.938 4.88e-07 ***
## kilometraje -2.659e+01 3.739e+01 -0.711 0.480911
## transmisionAutomática Secuencial -3.343e+05 2.474e+06 -0.135 0.893163
## transmisionMecánica -2.024e+06 1.117e+06 -1.812 0.077062 .
## modelo2008 -7.618e+06 4.342e+06 -1.754 0.086644 .
## modelo2009 -1.753e+06 5.510e+06 -0.318 0.752000
## modelo2010 -3.875e+06 4.634e+06 -0.836 0.407738
## modelo2011 -1.165e+06 4.317e+06 -0.270 0.788618
## modelo2012 -1.457e+06 4.762e+06 -0.306 0.761127
## modelo2013 2.646e+06 4.812e+06 0.550 0.585260
## modelo2014 3.285e+06 4.811e+06 0.683 0.498450
## modelo2015 7.382e+06 4.926e+06 1.499 0.141458
## modelo2016 1.641e+07 5.372e+06 3.055 0.003900 **
## modelo2017 2.115e+07 5.688e+06 3.718 0.000589 ***
## modelo2018 2.605e+07 5.943e+06 4.383 7.66e-05 ***
## modelo2019 2.561e+07 5.698e+06 4.494 5.40e-05 ***
## modelo2020 2.678e+07 6.805e+06 3.936 0.000306 ***
## modelo2021 3.261e+07 6.570e+06 4.964 1.20e-05 ***
## modelo2022 4.754e+07 7.150e+06 6.648 4.64e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 3823000 on 42 degrees of freedom
## Multiple R-squared: 0.9599, Adjusted R-squared: 0.9427
## F-statistic: 55.86 on 18 and 42 DF, p-value: < 2.2e-16
Modelo 4
df_mod2 = df_mod[!df_mod$transmision == 'Automática Secuencial', ]
mod_4 = lm(precio ~ kilometraje + transmision, data = df_mod2)
summary(mod_4)
##
## Call:
## lm(formula = precio ~ kilometraje + transmision, data = df_mod2)
##
## Residuals:
## Min 1Q Median 3Q Max
## -16370233 -4843291 142769 4834984 16560288
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 78489425.6 2142111.5 36.641 <2e-16 ***
## kilometraje -355.4 24.7 -14.390 <2e-16 ***
## transmisionMecánica -4183244.9 1907070.4 -2.194 0.0325 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 7033000 on 55 degrees of freedom
## Multiple R-squared: 0.8127, Adjusted R-squared: 0.8059
## F-statistic: 119.3 on 2 and 55 DF, p-value: < 2.2e-16
Una vez evaluadas algunas combinaciones para el mejor modelo de regresión lineal múltiple para calcular el precios de vehículos Mazda 2, concluimos el mejor modelo que representa al dataset es el número 3; en donde obtuvimos un R-squared de ~0.93.
A partir del modelo calculado, realizaremos una validación cruzada con respecto a los datos de validación (20%). Así:
#df_val2 = df_val[!df_val$transmision == 'Automática Secuencial', ]
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 33900000 37055532 -3155532
## 2 64900000 60270372 4629628
## 3 31900000 36535061 -4635061
## 4 41500000 44548668 -3048668
## 5 64000000 58804983 5195017
## 6 57500000 58630012 -1130012
MAE = mean(abs(res$Error))
MAE
## [1] 3346927
RMSE = sqrt(sum(res$Error^2)/length(res$Error))
RMSE
## [1] 4057747
porc_error_mae = MAE / (mean(df_val$precio))
porc_error_mae
## [1] 0.0665848
porc_error_rmse = RMSE / (mean(df_val$precio))
porc_error_rmse
## [1] 0.08072608
Se concluye que el modelo nos permite predecir el precio de un vehículo Mazda 2 de acuerdo a las variables predictoras: Kilometraje, Transmisión y Modelo. Esto nos ayuda a estimar si el precio propuesto para un modelo en particular se ajusta al precio del mercado y que no se encuentra sub o sobre valorado.
A partir de este modelo podemos representar el precio en un ~93%, con un MAE de ~3,3 millones y un RMSE de ~3,8 millones, lo cuál corresponde a errores del 6,6% y 7,7% respectivamente; este resultado se considera aceptable para estimar el valor de este tipo de vehículo.