Prediksi harga beli mobil saat ini

knitr::include_graphics("Beli-mobil.jpg")

menggunakan linear regression analysis, akan dibuat suatu model untuk memprediksi faktor-faktor yang menjadikan harga beli mobil

1 load dataset

car <- read.csv("data_car.csv")

2 Explanatory Data Analysis

glimpse(car)
## Rows: 301
## Columns: 9
## $ Car_Name      <chr> "ritz", "sx4", "ciaz", "wagon r", "swift", "vitara brezz~
## $ Year          <int> 2014, 2013, 2017, 2011, 2014, 2018, 2015, 2015, 2016, 20~
## $ Selling_Price <dbl> 3.35, 4.75, 7.25, 2.85, 4.60, 9.25, 6.75, 6.50, 8.75, 7.~
## $ Present_Price <dbl> 5.59, 9.54, 9.85, 4.15, 6.87, 9.83, 8.12, 8.61, 8.89, 8.~
## $ Kms_Driven    <int> 27000, 43000, 6900, 5200, 42450, 2071, 18796, 33429, 202~
## $ Fuel_Type     <chr> "Petrol", "Diesel", "Petrol", "Petrol", "Diesel", "Diese~
## $ Seller_Type   <chr> "Dealer", "Dealer", "Dealer", "Dealer", "Dealer", "Deale~
## $ Transmission  <chr> "Manual", "Manual", "Manual", "Manual", "Manual", "Manua~
## $ Owner         <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,~

Keterangan di setiap kolom:

  • Car_Name: Nama/model dari mobil
  • Year: Tahun produksi/pembuatan
  • Selling_Price: Harga jual mobil
  • Present_Price: Harga beli mobil saat ini
  • Kms_Driven: Jumlah kilometer yang sudah ditempuh
  • Fuel_Type: Jenis bahan bakar
  • Seller_Type: Jenis penjual
  • Transmission: Jenis transmisi mobil
  • Owner: Status sebagai pemilik (1 = yes, 0 = no)

2.1 Change data

df_car <- car %>% 
  mutate_if(is.character, as.factor)

2.2 check missing value

cek jumlah missing value (NA) dari tiap kolom

colSums(is.na(df_car))
##      Car_Name          Year Selling_Price Present_Price    Kms_Driven 
##             0             0             0             0             0 
##     Fuel_Type   Seller_Type  Transmission         Owner 
##             0             0             0             0

2.3 correlation

ggcorr(df_car, label = T)
## Warning in ggcorr(df_car, label = T): data in column(s) 'Car_Name', 'Fuel_Type',
## 'Seller_Type', 'Transmission' are not numeric and were ignored

Pada grafik korelasi, terlihat bahwa semua variabel memiliki pengaruh positif dan negative terhadap Present_Price dimana faktor Selling_Price memiliki korelasi positif yang paling tinggi dibandingkan faktor-faktor lain.

2.4 cek distribusi target variabel (Present Price)

boxplot(df_car$Present_Price)

2.5 Hubungan tahun dangan present price

plot(df_car$Year, df_car$Present_Price)

2.6 rata-rata present price tiap car name

df_car %>% 
  group_by(Car_Name) %>% 
  summarise(Present_Price= mean(Present_Price),
            freq = n()) %>% 
  arrange(desc(Present_Price))

untuk harga termahal jenis mobil land cruiser dan mobil paling banyak yang beli jenis city

3 Pembuatan Model Regresi Linear

Selanjutnya dapat dibuat model regresi linear dengan menggunakan model penuh, terhadap variabel target present price dan mem filter nama dari mobil

model_car <-  lm(formula = Present_Price ~ ., data = df_car %>%  select(-Car_Name))
summary(model_car)
## 
## Call:
## lm(formula = Present_Price ~ ., data = df_car %>% select(-Car_Name))
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -13.990  -1.473   0.124   1.107  32.908 
## 
## Coefficients:
##                         Estimate Std. Error t value Pr(>|t|)    
## (Intercept)            1.403e+03  1.716e+02   8.176 9.07e-15 ***
## Year                  -6.969e-01  8.521e-02  -8.179 8.89e-15 ***
## Selling_Price          1.645e+00  6.015e-02  27.355  < 2e-16 ***
## Kms_Driven             1.335e-05  6.267e-06   2.130    0.034 *  
## Fuel_TypeDiesel       -1.772e+00  2.493e+00  -0.711    0.478    
## Fuel_TypePetrol       -5.780e-01  2.443e+00  -0.237    0.813    
## Seller_TypeIndividual -1.417e-01  5.136e-01  -0.276    0.783    
## TransmissionManual     3.416e-01  6.567e-01   0.520    0.603    
## Owner                  1.551e+00  8.185e-01   1.895    0.059 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.425 on 292 degrees of freedom
## Multiple R-squared:  0.8472, Adjusted R-squared:  0.843 
## F-statistic: 202.4 on 8 and 292 DF,  p-value: < 2.2e-16
plot(df_car$Selling_Price, df_car$Present_Price)
abline(df_car)

interprestasi lm model_car :

  • Adjusted R-square: 77.18% => model menjelaskan 77% variasi dari Present price,
  • p-value dari Selling price dan year berpengaruh besar terhadap present price
  • estimate klo (-) harga turun , lihat di atas
  • jika fuel type = petrol & Diesel, harganya turun karena estimate bernilain negatif (-)
  • jika seller = individual, harganya turun karena estimate nilainya negatif (-)

3.1 model evaluation

prediksi data baru

test_car <- read.csv("car_test.csv")
test_car
pred_test <- predict(model_car, newdata = test_car)

head(pred_test)
##         1         2         3         4         5         6 
## 10.063413  5.456176  7.925281  7.639385 10.282011 35.613828

Cek Error Model

mean Absolute Error

MAE(pred_test, test_car$Present_Price)
## [1] 2.591223

Mean Absolute precentage Error

MAPE(pred_test, test_car$Present_Price)
## [1] 1.130904

Root Mean Square Error

RMSE(pred_test, test_car$Present_Price)
## [1] 5.003974

4 Uji Asumsi

4.1 Multikolinearitas

syarat terpenuhin semua variabel VIF < 10, VIF = variance influance factor , ingin cek apakah ada prediktor yang berhubungan dengan prediktor lain.

vif(model_car)
##                   GVIF Df GVIF^(1/(2*Df))
## Year          1.552555  1        1.246016
## Selling_Price 2.390371  1        1.546083
## Kms_Driven    1.518826  1        1.232407
## Fuel_Type     1.551123  2        1.115993
## Seller_Type   1.544114  1        1.242624
## Transmission  1.275007  1        1.129162
## Owner         1.052988  1        1.026152

4.2 Error Berdistribusi Normal

plot(density(model_car$residuals))

shapiro.test(model_car$residuals)
## 
##  Shapiro-Wilk normality test
## 
## data:  model_car$residuals
## W = 0.76888, p-value < 2.2e-16

karena p-value < 0.05, maka residual/error tidak berdistribusi normal

qqPlot(model_car$residuals)

## [1] 87 65

5 SHeteroskesdaticity / Unequal Variance

bptest(model_car)
## 
##  studentized Breusch-Pagan test
## 
## data:  model_car
## BP = 108.6, df = 8, p-value < 2.2e-16

syarat terpenuhi : p-value > 0.05

Dari plot juga terbentuk pola sehingga syarat tidak terpenuhi

plot(model_car$fitted.values, model_car$residuals)
abline(h = 0, col = "red")

5.1 Linearity

Dari plot juga terbentuk pola sihingga syarat tidak terpenuhi

data.frame(prediksi = model_car$fitted.values, error = model_car$residuals) %>% 
  ggplot(aes(prediksi,error))+
  geom_hline(yintercept = 0)+ #garis lurus di sumbu y = 0
  geom_point()+
  geom_smooth()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

6 Simpulan dan Saran

pada uji Multikolinearitas, tidak ada nilai sama dengan atau lebih dari 10 sehingga tidak Multikolinearitas antar variabel Berdasarkan model ini, harga beli mobil berkorelasi besar pada harga pembelian mobil dan tahun pembuatan mobil tersebut