Berikut adalah analysis mengenai harga kendaraan bekas. Data ini berisi tentang informasi tahun, fitur dan status kepemilikan mobil pada saat dijual.

Pada kesempatan kali ini akan dilakukan proses regression model untuk memprediski harga mobil bekas berdasarkan beberapa prediktor seperti tahun, km, jenis bensin, transmisi serta informasi pemilik dan penjual mobil bekas.

1 Load Dataset

car <- read.csv("data/Used Car.csv", stringsAsFactors = T)
head(car)

2 Explanatory Data Analysis

2.1 Cek Type Data

str(car)
#> 'data.frame':    4340 obs. of  8 variables:
#>  $ name         : Factor w/ 1491 levels "Ambassador CLASSIC 1500 DSL AC",..: 774 1040 566 120 278 811 605 1257 391 833 ...
#>  $ year         : int  2007 2007 2012 2017 2014 2007 2016 2014 2015 2017 ...
#>  $ selling_price: int  60000 135000 600000 250000 450000 140000 550000 240000 850000 365000 ...
#>  $ km_driven    : int  70000 50000 100000 46000 141000 125000 25000 60000 25000 78000 ...
#>  $ fuel         : Factor w/ 5 levels "CNG","Diesel",..: 5 5 2 5 2 5 5 5 5 1 ...
#>  $ seller_type  : Factor w/ 3 levels "Dealer","Individual",..: 2 2 2 2 2 2 2 2 2 2 ...
#>  $ transmission : Factor w/ 2 levels "Automatic","Manual": 2 2 2 2 2 2 2 2 2 2 ...
#>  $ owner        : Factor w/ 5 levels "First Owner",..: 1 1 1 1 3 1 1 3 1 1 ...

Berikut ini informasi dari setiap kolom : name : nama mobil tahun : tahun produksi mobil selling_price : harga jual bekas km_driven : jarak tempuh yang sudah dilalui mobil fuel : tipe bahan bakan mobil seller type : type penjual mobil transmisi : Jenis transmisi mobil owner : pemilik keberapa mobil pada saat dijual

car <- car %>% mutate(name = as.character(name))

2.2 Cek Missing Value

colSums(is.na(car))
#>          name          year selling_price     km_driven          fuel 
#>             0             0             0             0             0 
#>   seller_type  transmission         owner 
#>             0             0             0

Tidak terdapat missing value dari setiap kolom

2.3 Cek Informasi setiap Kolom

summary(car)
#>      name                year      selling_price       km_driven     
#>  Length:4340        Min.   :1992   Min.   :  20000   Min.   :     1  
#>  Class :character   1st Qu.:2011   1st Qu.: 208750   1st Qu.: 35000  
#>  Mode  :character   Median :2014   Median : 350000   Median : 60000  
#>                     Mean   :2013   Mean   : 504127   Mean   : 66216  
#>                     3rd Qu.:2016   3rd Qu.: 600000   3rd Qu.: 90000  
#>                     Max.   :2020   Max.   :8900000   Max.   :806599  
#>        fuel                seller_type      transmission 
#>  CNG     :  40   Dealer          : 994   Automatic: 448  
#>  Diesel  :2153   Individual      :3244   Manual   :3892  
#>  Electric:   1   Trustmark Dealer: 102                   
#>  LPG     :  23                                           
#>  Petrol  :2123                                           
#>                                                          
#>                   owner     
#>  First Owner         :2832  
#>  Fourth & Above Owner:  81  
#>  Second Owner        :1106  
#>  Test Drive Car      :  17  
#>  Third Owner         : 304  
#> 

Dari hasil Summary dapat diinformasikan beberapa hal sebagai berikut : - Harga mobil termahal adalah 8900000, rata-rata harga mobil 504127 - year tertua adalah 1992 dengan rata-rata mobil bekas yang terjual adalah tahun 2014

dikarenakan terdapat banyak type mobil yg terjual, yang mana setiap type mobil memiliki pola koefisien tersendiri dalam menentukan harga mobil, maka akan dipilih hanya untuk mobil terlaris

car %>% group_by(name) %>% summarise(count = n()) %>% ungroup() %>% arrange(-count)

mobil terlaris yang terjual adalah Maruti Swift Dzire VDI, mari kita lakukan subsetting

Dzire <- car %>% filter(name == "Maruti Swift Dzire VDI")
head(Dzire)

Terdapat kolom yang hanya memiliki 1 class, kita take out terlebih dahulu

Dzire <- Dzire %>% select(-c(name, fuel, transmission))
head(Dzire)

Sekarang mari kita buat kolom dummy pada kolom dengan type kategori menggunakan fungsi dummy_cols dari library fastDummies

library(fastDummies)

Dzire_dum <- dummy_columns(Dzire,select_columns = c("seller_type","owner"), remove_selected_columns = T, remove_most_frequent_dummy = T)
head(Dzire_dum)

2.4 Korelasi Antar Variable

ggcorr(Dzire_dum, label = TRUE, label_size = 2.9, hjust = 1, layout.exp = 2)

Jika dilihat year memiliki korelasi positif cukup kuat, sedangkan km_driven memiliki korelasi negatif yang tidak terlalu kuat

3 Pembuatan Model Regresi Linear

Pertama mari kita coba membuat model dengan hanya menggunakan prediktor year, yang biasa dijadikan sebagai indikator pertama dalam menentukan harga kendaraan

model <- lm(formula = selling_price ~ year, data = Dzire_dum)
summary(model)
#> 
#> Call:
#> lm(formula = selling_price ~ year, data = Dzire_dum)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -253869  -25933    5195   54067  169067 
#> 
#> Coefficients:
#>               Estimate Std. Error t value Pr(>|t|)    
#> (Intercept) -114245637   11936689  -9.571 3.67e-14 ***
#> year             56936       5922   9.614 3.08e-14 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 91590 on 67 degrees of freedom
#> Multiple R-squared:  0.5797, Adjusted R-squared:  0.5735 
#> F-statistic: 92.43 on 1 and 67 DF,  p-value: 3.083e-14

Kita coba buat model lainnya dengan menggunakan semua prediktor dan dilakukan step backward untuk mendapatkan model terbaik

model2 <- lm(selling_price ~ ., Dzire_dum)
step(model2, direction = "backward")
#> Start:  AIC=1572.92
#> selling_price ~ year + km_driven + seller_type_Dealer + `seller_type_Trustmark Dealer` + 
#>     `owner_Second Owner` + `owner_Third Owner`
#> 
#>                                  Df  Sum of Sq        RSS    AIC
#> - km_driven                       1 1.2911e+08 4.4775e+11 1570.9
#> - `seller_type_Trustmark Dealer`  1 6.3651e+08 4.4825e+11 1571.0
#> <none>                                         4.4762e+11 1572.9
#> - `owner_Second Owner`            1 1.7399e+10 4.6502e+11 1573.6
#> - `owner_Third Owner`             1 3.0032e+10 4.7765e+11 1575.4
#> - seller_type_Dealer              1 3.8407e+10 4.8603e+11 1576.6
#> - year                            1 4.4565e+11 8.9327e+11 1618.6
#> 
#> Step:  AIC=1570.94
#> selling_price ~ year + seller_type_Dealer + `seller_type_Trustmark Dealer` + 
#>     `owner_Second Owner` + `owner_Third Owner`
#> 
#>                                  Df  Sum of Sq        RSS    AIC
#> - `seller_type_Trustmark Dealer`  1 6.0369e+08 4.4835e+11 1569.0
#> <none>                                         4.4775e+11 1570.9
#> - `owner_Second Owner`            1 1.7435e+10 4.6518e+11 1571.6
#> - `owner_Third Owner`             1 3.0865e+10 4.7861e+11 1573.5
#> - seller_type_Dealer              1 3.9344e+10 4.8709e+11 1574.8
#> - year                            1 5.6114e+11 1.0089e+12 1625.0
#> 
#> Step:  AIC=1569.04
#> selling_price ~ year + seller_type_Dealer + `owner_Second Owner` + 
#>     `owner_Third Owner`
#> 
#>                        Df  Sum of Sq        RSS    AIC
#> <none>                               4.4835e+11 1569.0
#> - `owner_Second Owner`  1 1.8915e+10 4.6727e+11 1569.9
#> - `owner_Third Owner`   1 3.2038e+10 4.8039e+11 1571.8
#> - seller_type_Dealer    1 3.8871e+10 4.8722e+11 1572.8
#> - year                  1 5.9867e+11 1.0470e+12 1625.6
#> 
#> Call:
#> lm(formula = selling_price ~ year + seller_type_Dealer + `owner_Second Owner` + 
#>     `owner_Third Owner`, data = Dzire_dum)
#> 
#> Coefficients:
#>          (Intercept)                  year    seller_type_Dealer  
#>           -113431966                 56532                 64125  
#> `owner_Second Owner`   `owner_Third Owner`  
#>               -48925               -109685
summary(model2)
#> 
#> Call:
#> lm(formula = selling_price ~ ., data = Dzire_dum)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -201774  -23806       0   52845  172065 
#> 
#> Coefficients:
#>                                  Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)                    -1.135e+08  1.453e+07  -7.815 8.28e-11 ***
#> year                            5.657e+04  7.201e+03   7.857 7.02e-11 ***
#> km_driven                       4.281e-02  3.201e-01   0.134   0.8940    
#> seller_type_Dealer              6.644e+04  2.881e+04   2.306   0.0244 *  
#> `seller_type_Trustmark Dealer`  9.065e+03  3.053e+04   0.297   0.7675    
#> `owner_Second Owner`           -4.831e+04  3.112e+04  -1.552   0.1257    
#> `owner_Third Owner`            -1.074e+05  5.266e+04  -2.040   0.0457 *  
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 84970 on 62 degrees of freedom
#> Multiple R-squared:  0.6653, Adjusted R-squared:  0.6329 
#> F-statistic: 20.54 on 6 and 62 DF,  p-value: 4.439e-13

Berdasarkan hasil step_backward sebelumnya didapatkan model terbaik dengan prediktor year + seller_type_Dealer + owner_Second Owner + owner_Third Owner, coba kita buat model tersebut dan melihat hasil summarynya

model3 <- lm(formula = selling_price ~ year + seller_type_Dealer + `owner_Second Owner` + 
    `owner_Third Owner`, data = Dzire_dum)
summary(model3)
#> 
#> Call:
#> lm(formula = selling_price ~ year + seller_type_Dealer + `owner_Second Owner` + 
#>     `owner_Third Owner`, data = Dzire_dum)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -204314  -24175    6228   49696  169293 
#> 
#> Coefficients:
#>                        Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)          -113431966   12329911  -9.200 2.54e-13 ***
#> year                      56532       6115   9.244 2.12e-13 ***
#> seller_type_Dealer        64125      27223   2.356   0.0216 *  
#> `owner_Second Owner`     -48925      29774  -1.643   0.1052    
#> `owner_Third Owner`     -109685      51290  -2.139   0.0363 *  
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 83700 on 64 degrees of freedom
#> Multiple R-squared:  0.6647, Adjusted R-squared:  0.6438 
#> F-statistic: 31.72 on 4 and 64 DF,  p-value: 1.446e-14

Berdasarkan 3 model yang telah kita buat sebelumnya didapatkan nilai adjusted R-squared sebagai berikut model : 0.5735 model2 : 0.6329 model3 : 0.6438

Dari ketiga model diatas model dengan adj R-squared terbaik adalah model3

4 Evaluasi Model dan cek Asumsi

Di antara ketiga model tersebut, mana yang performanya paling bagus jika dihitung RMSE-nya?

4.1 Evaluasi Model

library(MLmetrics)
MAE(y_pred = model$fitted.values, y_true = Dzire_dum$selling_price)
#> [1] 61887.78
MAE(y_pred = model2$fitted.values, y_true = Dzire_dum$selling_price)
#> [1] 56190.76
MAE(y_pred = model3$fitted.values, y_true = Dzire_dum$selling_price)
#> [1] 57066.29
range(Dzire_dum$selling_price)
#> [1] 185000 800000

Berdasarkan hasil evaluasi MAE model terbaik dengan MAE terkecil adalah model2, selanjutnya kita akan mengecek apakah model yang dibuat memenuhi asumsi Linearity dan no multicolarity

4.2 Asumsi Linearity

plot(model2, which = 1)

* Plot fitted values vs residual membentuk pola acak. * Garis merah yang terbentuk hampir mendekati bentuk garis lurus. * Dengan demikian, model2 memenuhi asumsi linearity.

4.3 Asumsi no Multicolinearity

vif(model2)
#>                           year                      km_driven 
#>                       1.717669                       1.494566 
#>             seller_type_Dealer `seller_type_Trustmark Dealer` 
#>                       1.282620                       1.193799 
#>           `owner_Second Owner`            `owner_Third Owner` 
#>                       1.240136                       1.102115

VIF untuk semua prediktor < 10, maka model2 memenuhi asumsi no multicolinearity.

5 Kesimpulan dan Saran

  • Dalam melakukan prediksi data harga jual kendaraan bekas pada data ini masih dapat menggunakan model regresi linear dikarenakan masih memenuhi asumsi linearity dan no multicolinearity

  • Berdasarkan nilai Adjusted R-Squared model terbaik merupakan model2 dengan prediktor year + seller_type_Dealer + owner_Second Owner + owner_Third Owner

  • Hasil Evaluasi terbaik berdasarkan perhitungan MAE adalah pada model3 yang menggunakan semua prediktor

  • Dalam membuat model untuk mendapatkan prediksi harga jual mobil yang lebih baik dapat menggunakan model lain yang lebih kompleks