Data berikut merupakan data harga mobil bekas dengan brand “TOYOTA” beserta atribut-atribut yang akan digunakan untuk mempelajari cara menggunakan linear reggresion model untuk memprediksi harga mobil berdasar atributnya, kita ingin tahu hubungan antara harga mobil dengan variabel lain.
Set up chunk di awal untuk mengatur format chunk pada markdown
options(scipen = 9999)
rm(list=ls())
Setup library yang akan digunakan
library(GGally)
library(tidyverse)
library(ggplot2)
library(car)
library(lmtest)
library(MLmetrics)
Impor data dari dataset Car Price, dalam melakukan impor data, kita set stringAsFactors = T agar data dengan typedata character bisa langsung diubah menjadi factor.
car <- read.csv('toyota.csv', stringsAsFactors = T)
Inspect Data
dim(car)
## [1] 6738 9
head(car)
anyNA(car)
## [1] FALSE
str(car)
## 'data.frame': 6738 obs. of 9 variables:
## $ model : Factor w/ 18 levels " Auris"," Avensis",..: 7 7 7 7 7 7 7 7 7 7 ...
## $ year : int 2016 2017 2015 2017 2017 2017 2017 2017 2020 2016 ...
## $ price : int 16000 15995 13998 18998 17498 15998 18522 18995 27998 13990 ...
## $ transmission: Factor w/ 4 levels "Automatic","Manual",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ mileage : int 24089 18615 27469 14736 36284 26919 10456 12340 516 37999 ...
## $ fuelType : Factor w/ 4 levels "Diesel","Hybrid",..: 4 4 4 4 4 4 4 4 4 4 ...
## $ tax : int 265 145 265 150 145 260 145 145 150 265 ...
## $ mpg : num 36.2 36.2 36.2 36.2 36.2 36.2 36.2 36.2 33.2 36.2 ...
## $ engineSize : num 2 2 2 2 2 2 2 2 2 2 ...
Dari inspect diatas dapat kita lihat data memiliki 6.738 baris dan 9 kolom dan tidak ada missing value. Deskripsi Data :
-Model : Model Mobil
-Year: Tahun Produksi mobil tersebut
-price: Harga Jual mobil yang akan menjadi target variabel
-transmission: Jenis transmisi mobil
-mileage: Sudah berapa km mobil tersebut berjalan
-fuelType: Jenis bahan bakar
-tax: Pajak tahunan mobil tersebut
-mpg: konsumsi bahan bakar mobil tersebut
-engineSize : jumlah cylinder mesin mobil tersebut
ggcorr(car, label = TRUE, label_size = 2.9, hjust = 1, layout.exp = 2)
## Warning in ggcorr(car, label = TRUE, label_size = 2.9, hjust = 1, layout.exp =
## 2): data in column(s) 'model', 'transmission', 'fuelType' are not numeric and
## were ignored
Grafik diatas menunjukkan beberapa variabel memiliki korelasi dengan price
Selanjutnya dapat dibuat model regresi linear dengan mengambil semua variabel prediktor lalu di step backward.
model_h <- lm(price~., car)
model_step <- step(model_h, direction = "backward")
## Start: AIC=100315.1
## price ~ model + year + transmission + mileage + fuelType + tax +
## mpg + engineSize
##
## Df Sum of Sq RSS AIC
## <none> 19523157874 100315
## - mpg 1 61818487 19584976361 100334
## - tax 1 314188673 19837346547 100421
## - transmission 3 871930781 20395088654 100603
## - engineSize 1 906313665 20429471538 100619
## - fuelType 3 1231347475 20754505349 100721
## - mileage 1 3951785149 23474943022 101555
## - year 1 8390222949 27913380823 102722
## - model 17 37952828457 57475986331 107557
summary(model_step)
##
## Call:
## lm(formula = price ~ model + year + transmission + mileage +
## fuelType + tax + mpg + engineSize, data = car)
##
## Residuals:
## Min 1Q Median 3Q Max
## -15669.1 -826.3 -169.0 602.7 17990.7
##
## Coefficients:
## Estimate Std. Error t value
## (Intercept) -1566301.788193 29325.469733 -53.411
## model Avensis 1323.670604 195.964624 6.755
## model Aygo -2694.224186 122.790752 -21.942
## model C-HR 5558.792814 105.180573 52.850
## model Camry 6846.596981 534.879208 12.800
## model Corolla 5001.151177 128.792680 38.831
## model GT86 6184.838540 234.174057 26.411
## model Hilux 8351.718624 293.405360 28.465
## model IQ -309.255607 614.386469 -0.503
## model Land Cruiser 22754.063165 377.966423 60.201
## model Prius 4987.375882 138.730024 35.950
## model PROACE VERSO 13582.500984 476.805195 28.486
## model RAV4 4907.700899 157.718946 31.117
## model Supra 30367.394129 566.343835 53.620
## model Urban Cruiser -6.856346 858.536817 -0.008
## model Verso 1204.048631 186.212115 6.466
## model Verso-S 253.611270 989.228006 0.256
## model Yaris -1557.254274 83.582828 -18.631
## year 781.050868 14.545837 53.696
## transmissionManual -1221.036803 84.628315 -14.428
## transmissionOther 892.731867 1707.296176 0.523
## transmissionSemi-Auto 73.221063 138.233901 0.530
## mileage -0.062332 0.001691 -36.851
## fuelTypeHybrid 3239.982302 158.998006 20.378
## fuelTypeOther 2940.666820 225.309015 13.052
## fuelTypePetrol 1587.377493 129.462884 12.261
## tax -3.779540 0.363739 -10.391
## mpg -9.590706 2.080834 -4.609
## engineSize 2996.606946 169.799597 17.648
## Pr(>|t|)
## (Intercept) < 0.0000000000000002 ***
## model Avensis 0.0000000000155 ***
## model Aygo < 0.0000000000000002 ***
## model C-HR < 0.0000000000000002 ***
## model Camry < 0.0000000000000002 ***
## model Corolla < 0.0000000000000002 ***
## model GT86 < 0.0000000000000002 ***
## model Hilux < 0.0000000000000002 ***
## model IQ 0.615
## model Land Cruiser < 0.0000000000000002 ***
## model Prius < 0.0000000000000002 ***
## model PROACE VERSO < 0.0000000000000002 ***
## model RAV4 < 0.0000000000000002 ***
## model Supra < 0.0000000000000002 ***
## model Urban Cruiser 0.994
## model Verso 0.0000000001077 ***
## model Verso-S 0.798
## model Yaris < 0.0000000000000002 ***
## year < 0.0000000000000002 ***
## transmissionManual < 0.0000000000000002 ***
## transmissionOther 0.601
## transmissionSemi-Auto 0.596
## mileage < 0.0000000000000002 ***
## fuelTypeHybrid < 0.0000000000000002 ***
## fuelTypeOther < 0.0000000000000002 ***
## fuelTypePetrol < 0.0000000000000002 ***
## tax < 0.0000000000000002 ***
## mpg 0.0000041196389 ***
## engineSize < 0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1706 on 6709 degrees of freedom
## Multiple R-squared: 0.928, Adjusted R-squared: 0.9277
## F-statistic: 3089 on 28 and 6709 DF, p-value: < 0.00000000000000022
Dari summary model diatas, didapat adjusted R-Squared 0.9277 yang berarti bisa menjelaskan 92.77% variance di target variable (Price).
Performa model dapat dihitung dengan menggunakan RMSE (root mean squared error) \[
RMSE = \sqrt{\frac{1}{n} \sum (\hat y - y)^2}
\] Sebelum melakukan RMSE, kita lakukan prediksi model_step terhadap data awalnya menggunakan fungsi predict. Lalu hasil prediksi di assign ke variabel baru agar bisa dilakukan perbanding terhadap data aktual.
pred <- predict(model_step, newdata = car)
modelnew <- car %>%
mutate(prediksi = pred,
prediksi = as.integer(prediksi))
Setelah dilakukan prediksi, uji RMSE dengan menggunakan fungsi RMSE()
RMSE(y_pred = modelnew$prediksi,modelnew$price)
## [1] 1702.177
Lalu, untuk mengetahui besar error dari prediksi, dapat digunakan MAPE. MAPE menunjukkan seberapa besar penyimpangannya dalam bentuk persentase.
\[ MAPE = \frac{1}{n} \sum\frac{|\hat y - y|}{y} \]
MAPE(y_pred = modelnew$prediksi,modelnew$price)
## [1] 0.1072995
Dari hasil MAPE, ditemukan bahwa model memprediksi harga mobil dengan kemungkinan melenceng sebesar 10% dari nilai aktualnya
Model regresi linier mengasumsikan bahwa ada hubungan garis lurus antara prediktor dan target. Jika hubungan sebenarnya jauh dari linier, maka hampir semua kesimpulan yang kita tarik dari prediksi itu patut dicurigai. Selain itu, akurasi prediksi model dapat dikurangi secara signifikan.
data.frame(prediksi = model_step$fitted.values,
error = model_step$residuals) %>%
ggplot(aes(x = prediksi, y = error)) +
geom_hline(yintercept = 0, lty = "dashed") +
geom_point() +
geom_smooth()
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
Dari hasil uji linearity, mayoritas data sudah berada disekitar garis 0 yang berarti data prediktor sudah linear dengan target variable
Uji normalitas dapat dilakukan dengan menggunakan plot density, apabila plot berada disekitar angka 0, maka bisa dibilang data sudah berdistribusi normal.
plot(density(model_step$residuals))
Dari hasil plot, dapat dilihat bahwa data sudah berdistribusi normal.
Model regression model_step mendapatkan adjusted R-squared 0.9277 yang berarti bisa menjelaskan 92.77% variance di target variable (Price) dan dari hasil uji RMSE dan MAPE, data ditemukan melenceng sebesar 10% atau sebanyak 1702.177 secara rata-rata. Selain itu setelah dilakukan uji analisis, model memiliki kriteria yang sudah baik.