1 Intro

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.

2 Data Preparation

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

3 Exploratory Data Analysis

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

4 Pembuatan Model Regresi Linear

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).

5 Evaluasi Model

5.1 Performa Model

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
  • Model memberikan hasil prediksi yang menyimpang sebanyak 1702.177 secara rata-rata.

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

5.2 Uji Asumsi

5.2.1 Linearity

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

5.2.2 Normality

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.

6 Kesimpulan

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.