Pada kesempatan kali ini kita akan melakukan Analisis Regresi menggunakan data HousePricing yang didapatkan melalui Kagle. Data tersebut berisikan variabel yang dapat mempengaruhi harga rumah


1. Load Dataset

house <- read.csv("C:/Users/ADAM/Downloads/Compressed/archive/HousePrices_HalfMil.csv")

2. Eksploratory Data Analysis

str(house)
## 'data.frame':    500000 obs. of  16 variables:
##  $ Area         : int  164 84 190 75 148 124 58 249 243 242 ...
##  $ Garage       : int  2 2 2 2 1 3 1 2 1 1 ...
##  $ FirePlace    : int  0 0 4 4 4 3 0 1 0 2 ...
##  $ Baths        : int  2 4 4 4 2 3 2 1 2 4 ...
##  $ White.Marble : int  0 0 1 0 1 0 0 1 0 0 ...
##  $ Black.Marble : int  1 0 0 0 0 1 0 0 0 0 ...
##  $ Indian.Marble: int  0 1 0 1 0 0 1 0 1 1 ...
##  $ Floors       : int  0 1 0 1 1 1 0 1 1 0 ...
##  $ City         : int  3 2 2 1 2 1 3 1 1 2 ...
##  $ Solar        : int  1 0 0 1 1 0 0 0 0 1 ...
##  $ Electric     : int  1 0 0 1 0 0 1 1 0 0 ...
##  $ Fiber        : int  1 0 1 1 0 1 1 0 0 0 ...
##  $ Glass.Doors  : int  1 1 0 1 1 1 1 1 0 0 ...
##  $ Swiming.Pool : int  0 1 0 1 1 1 0 1 1 1 ...
##  $ Garden       : int  0 1 0 1 1 1 1 0 0 0 ...
##  $ Prices       : int  43800 37550 49500 50075 52400 54300 34400 50425 29575 22300 ...

Berikut adalah penjelasan dari setiap variable nya
Area: Luas tanah pada bangunan
Garage: Type garasi
FirePlace: Type perapian dalam rumah
Baths: Type Kamar mandi
White.Marble: Type marmer putih dalam rumah
Black.Marble: Type marmer hitam dalam rumah
Indian.Marble: Type marmer india dalam rumah
Floors: Type lantai
City: Kota lokasi rumah
Solar: Tenaga surya / tidak
Electric: Terdapat aliran listrik / tidak
Fiber: Atap fiber / tidak
Glass.Doors: Pintu yang terbuat dari kaca / tidak
Swiming.Pool: Terdapat kolam renang / tidak
Garden: Terdapat taman / tidak
Prices: Harga rumah

#cek missing value
anyNA(house)
## [1] FALSE
#melihat korelasi antar variable
library(GGally)
ggcorr(house, label = T, label_size = 2, hjust = 1, layout.exp = 2)

Terlihat pada gambar tersebut jika lantai rumah (Floors) sangat berpengaruh terhadap harga rumah (Prices)


3. Pembentukan Model Regresi

Pada tahap ini kita akan mencoba membuat model regresi antar variabel Prices dengan Floors, dikarenakan korelasi yang cukup tinggi antar kedua variable


Dikarenakan ada beberapa variable yang seharusnya bertipe kategori namun masih bertype numeric, maka kita harus mengubah tipe data tersebut kedalam kategori

#lihat daftar nama variabel yang akan dirubah
names(house)[2:15]
##  [1] "Garage"        "FirePlace"     "Baths"         "White.Marble" 
##  [5] "Black.Marble"  "Indian.Marble" "Floors"        "City"         
##  [9] "Solar"         "Electric"      "Fiber"         "Glass.Doors"  
## [13] "Swiming.Pool"  "Garden"
house[names(house)[2:15]] = lapply(house[names(house)[2:15]], as.factor)

str(house)
## 'data.frame':    500000 obs. of  16 variables:
##  $ Area         : int  164 84 190 75 148 124 58 249 243 242 ...
##  $ Garage       : Factor w/ 3 levels "1","2","3": 2 2 2 2 1 3 1 2 1 1 ...
##  $ FirePlace    : Factor w/ 5 levels "0","1","2","3",..: 1 1 5 5 5 4 1 2 1 3 ...
##  $ Baths        : Factor w/ 5 levels "1","2","3","4",..: 2 4 4 4 2 3 2 1 2 4 ...
##  $ White.Marble : Factor w/ 2 levels "0","1": 1 1 2 1 2 1 1 2 1 1 ...
##  $ Black.Marble : Factor w/ 2 levels "0","1": 2 1 1 1 1 2 1 1 1 1 ...
##  $ Indian.Marble: Factor w/ 2 levels "0","1": 1 2 1 2 1 1 2 1 2 2 ...
##  $ Floors       : Factor w/ 2 levels "0","1": 1 2 1 2 2 2 1 2 2 1 ...
##  $ City         : Factor w/ 3 levels "1","2","3": 3 2 2 1 2 1 3 1 1 2 ...
##  $ Solar        : Factor w/ 2 levels "0","1": 2 1 1 2 2 1 1 1 1 2 ...
##  $ Electric     : Factor w/ 2 levels "0","1": 2 1 1 2 1 1 2 2 1 1 ...
##  $ Fiber        : Factor w/ 2 levels "0","1": 2 1 2 2 1 2 2 1 1 1 ...
##  $ Glass.Doors  : Factor w/ 2 levels "0","1": 2 2 1 2 2 2 2 2 1 1 ...
##  $ Swiming.Pool : Factor w/ 2 levels "0","1": 1 2 1 2 2 2 1 2 2 2 ...
##  $ Garden       : Factor w/ 2 levels "0","1": 1 2 1 2 2 2 2 1 1 1 ...
##  $ Prices       : int  43800 37550 49500 50075 52400 54300 34400 50425 29575 22300 ...
#pembuatan model
mod1 <- lm(Prices ~ Floors, data = house)
mod1
## 
## Call:
## lm(formula = Prices ~ Floors, data = house)
## 
## Coefficients:
## (Intercept)      Floors1  
##       34558        15003
summary(mod1)
## 
## Call:
## lm(formula = Prices ~ Floors, data = house)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -27211  -6986    -11   6592  28542 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 34557.66      19.00    1819   <2e-16 ***
## Floors1     15003.39      26.89     558   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 9507 on 499998 degrees of freedom
## Multiple R-squared:  0.3837, Adjusted R-squared:  0.3837 
## F-statistic: 3.113e+05 on 1 and 499998 DF,  p-value: < 2.2e-16

Jika dilihat dari Multiple R-squared nya, model ini masih sangat lemah dikarenakan variable prediktor yang digunakan bertipe kategorikal. Selanjutnya kita akan coba menggunakan seluruh variable yang akan diseleksi otomatis dengan teknik stepwise regresion

mod2 <- lm(Prices ~., data = house)
mod2_back <- step(mod2, direction = "backward",trace = 0)

Berdasarkan kedua model tersebut, dimana model tersebut menggunakan metode stepwise backward untuk memilih variabel agar memberi nilai AIC terkecil, terdapat indikasi terjadi model overfitted, hal ini dapat dilihat dari nilai Adjusted R Squared yang sempurna = 1


4. Evaluasi Asumsi Model

Normalitas

hist(mod2_back$residuals, breaks = 20)

Jika dilihat persebarannya, model dari backward stepwise terbukti tidak terdistribusi dengan baik, karena terlalu berkumpul di angka 0


Uji Shapiro

tryCatch({
shapiro.test(mod2_back$residuals)
}, 
warning = 
  function(w) {message("sample size must be between 3 and 5000")},
error = 
  function(e) {message("sample size must be between 3 and 5000")})
## sample size must be between 3 and 5000
head(mod2_back$residuals)
##             1             2             3             4             5 
## -8.344602e-05  5.049946e-07 -3.748786e-07  1.851977e-09  1.199718e-08 
##             6 
## -8.005082e-08

Berdasarkan eror dari Uji Shapiro model tersebut tidak bisa dilakukan uji Shapiro Test dikarenakan terdapat nilai nilai sample yang dibawah 3 atau nilai negatif. Sedangkan untuk Uji Shapiro sendiri, nilai sample harus berkisar dari 3 - 5000


Heteroscedasticity

library(lmtest)
bptest(mod2_back)
## 
##  studentized Breusch-Pagan test
## 
## data:  mod2_back
## BP = 19.34, df = 20, p-value = 0.4998

Berdasarkan uji Heteroscedasticity model yang dibentuk dengan teknik stepwise backward tidak memiliki pola (Heteroscedasticity) P-value > 0.05 dimana semua pola yang ada sudah berhasil ditangkap oleh model yang dibuat.


Variance Inflation Factor (Multicollinearity)

library(car)
vif(mod2_back)
##                  GVIF Df GVIF^(1/(2*Df))
## Area         1.000034  1        1.000017
## Garage       1.000096  2        1.000024
## FirePlace    1.000095  4        1.000012
## Baths        1.000142  4        1.000018
## White.Marble 1.331413  1        1.153869
## Black.Marble 1.331420  1        1.153872
## Floors       1.000030  1        1.000015
## City         1.000098  2        1.000025
## Solar        1.000027  1        1.000014
## Electric     1.000024  1        1.000012
## Fiber        1.000029  1        1.000015
## Glass.Doors  1.000033  1        1.000017

Berdasarkan uji Variance Inflation Factor, model tersebut tidak memiliki variable yang berindikasi multicolinearity dikarenakan nilai Vif tidak ada yang melebihi angka 10

5. Simpulan & Saran

Berdasarkan beberapa Asumsi Uji Statistik diatas dan beberapa pertimbangan lainnya, data HousePricing ini tidak cocok apabila dijadikan model menggunakan metode Multiple Linear regresi, dikarenakan banyak variable yang terdiri dari tipe kategorikal.


Namun apabila menggunakan Linear Regresi biasa yang hanya terdiri dari 2 variabel, model tersebut masih cocok dan mungkin dapat digunakan untuk kedepannya