1. Latar Belakang

Berikut ini merupakan data harga rumah beserta fitur-fitur yang ada pada rumah tersebut.

Tujuan saya menggunakan data ini adalah untuk menganalisis dan melihat fitur-fitur apa saja yang menjadi penting dalam menentukan sebuah harga rumah. Karena banyak dari kita ingin membeli/menjual rumah tetapi tidak tahu apa saja fitur yang bisa mempengaruhi harga dari sebuah rumah. Jadi dengan analisis yang akan dibuat ini diharapkan dapat membantu pembeli/penjual rumah dalam mengetahui harga rumah yang sesuai.

Deskripsi Data:

-Area : Nomor wilayah
-Garage : Garasi
-Baths : Kamar mandi
-White Marble : Marmer Putih
-Black Marble : Marmer Hitam
-Floors : Jumlah lantai
-City : Nomor kota
-Solar : Pencahayaan
-Electric : Listrik
-Fiber : Kabel Listrik
-Glass Door : Pintu kaca
-Swiming Pool : Kolam renang
-Garden : Halaman
-Price : Harga Rumah

2. Set Up

Aktifkan library

library(ggplot2) #membuat plot
library(tidyverse) #wrangling data
library(lmtest) #cek asumsi
library(car) #cek fungsi vif
library(MLmetrics) #menghitung eror
library(GGally) #cek korelasi
library(rsample) #sampling data

options(scipen = 999, max.print = 1e+06) #Panjang angka dibelakang koma

Import Data

house <- read.csv("HousePrices_HalfMil.csv", sep=",", na.strings = c("N/A"))
house

3. Inspeksi Data

Mengecek tipe data

glimpse(house)
## Rows: 500,000
## Columns: 16
## $ Area          <int> 164, 84, 190, 75, 148, 124, 58, 249, 243, 242, 61, 18...
## $ Garage        <int> 2, 2, 2, 2, 1, 3, 1, 2, 1, 1, 2, 2, 2, 3, 3, 3, 1, 3,...
## $ FirePlace     <int> 0, 0, 4, 4, 4, 3, 0, 1, 0, 2, 4, 0, 0, 3, 3, 4, 0, 3,...
## $ Baths         <int> 2, 4, 4, 4, 2, 3, 2, 1, 2, 4, 5, 4, 2, 3, 1, 1, 5, 3,...
## $ White.Marble  <int> 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0,...
## $ Black.Marble  <int> 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1,...
## $ Indian.Marble <int> 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0,...
## $ Floors        <int> 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1,...
## $ City          <int> 3, 2, 2, 1, 2, 1, 3, 1, 1, 2, 1, 2, 1, 3, 3, 1, 3, 1,...
## $ Solar         <int> 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1,...
## $ Electric      <int> 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0,...
## $ Fiber         <int> 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1,...
## $ Glass.Doors   <int> 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0,...
## $ Swiming.Pool  <int> 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0,...
## $ Garden        <int> 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0,...
## $ Prices        <int> 43800, 37550, 49500, 50075, 52400, 54300, 34400, 5042...

Tipe data yang ada pada setiap variabel sudah sesuai, yaitu bertipe data numerik atau integer.

Mengecek data yang missing

colSums(is.na(house))
##          Area        Garage     FirePlace         Baths  White.Marble 
##             0             0             0             0             0 
##  Black.Marble Indian.Marble        Floors          City         Solar 
##             0             0             0             0             0 
##      Electric         Fiber   Glass.Doors  Swiming.Pool        Garden 
##             0             0             0             0             0 
##        Prices 
##             0

Masing-masing variabel tidak mempunyai data kosong atau tidak terdapat missing value.

4. Exploratory Data Analysis

Mengecek korelasi antar variabel

ggcorr(house, label = T, label_size = 3.5, hjust=1, layout.exp = 2)

Bisa dilihat bahwa 3 variabel yg mempunyai korelasi tertinggi dengan Prices adalah Floor, Fiber dan White Marble. Sedangkan variabel yg mempunyai korelasi terendah dengan Prices adalah Indian Marble.

Mengecek distribusi untuk masing-masing variabel

Variabel Area dipisah karena mempunyai isi nilai yg tinggi atau berbeda dengan variabel lainnya.

#Variabel Area
house %>% 
  select(Area) %>% 
  boxplot()

#Variabel Selain Area
house %>% 
  select(-c(Prices,Area)) %>% 
  boxplot()

Dari hasil visualisasi boxplot, tidak ditemukan outlier pada masing-masing variabel, sehingga data tersebut sudah dapat dianalisis lebih lanjut.

5. Pembuatan Model Regresi

Pembuatan data test menggunakan random sampling

RNGkind(sample.kind = "Rounding")
set.seed(1616)
init <- initial_split(house,
                      prop = 0.8, #proporsi data sebanyak 0.8 (80%)
                      strata = Prices) #strata = target variable 
house_train <- training(init) #membuat model
house_test <- testing(init) #mengetest model

5.1 Model Regresi berdasarkan nilai korelasi

Dikarnakan variabel Floor, Fiber dan White Marble merupakan variabel dengan nilai korelasi tertinggi dengan Prices, maka varibel-variabel tersebut kita jadikan sebagai variabel prediktor dalam membuat model regresi linear.

Membuat dan melihat summary dari model regresi

model_house1 <- lm(Prices~Floors+Fiber+White.Marble,house_train)
summary(model_house1)
## 
## Call:
## lm(formula = Prices ~ Floors + Fiber + White.Marble, data = house_train)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -17540.9  -3596.8      9.1   3586.5  17500.7 
## 
## Coefficients:
##              Estimate Std. Error t value            Pr(>|t|)    
## (Intercept)  24865.90      15.25  1630.5 <0.0000000000000002 ***
## Floors       14983.38      16.31   918.8 <0.0000000000000002 ***
## Fiber        11716.58      16.31   718.5 <0.0000000000000002 ***
## White.Marble 11522.57      17.29   666.3 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5157 on 399998 degrees of freedom
## Multiple R-squared:  0.8185, Adjusted R-squared:  0.8185 
## F-statistic: 6.014e+05 on 3 and 399998 DF,  p-value: < 0.00000000000000022

Dari hasil Summary model_house1 diatas didapat informasi yaitu:

1. Nilai Adjusted R-Squared adalah 0.8185 atau 81.8% model tersebut dapat menjelaskan variasi nilai dari Prices.

2. Nilai p-value dari dari masing-masing varibel prediktor kurang dari 0.05 (p-value < 0.05), maka bisa dianggap masing-masing variabel prediktor (Floor, Fiber, White.Marble) signifikan atau berpengaruh terhadap variabel target (Prices)

3. Setiap variabel mempunyai nilai tambah untuk target variabel, untuk lebih lengkapnya bisa dilihat pada formula berikut ini

\[ Prices = 24865.90 + (14983.38\times Floors) + (11716.58\times Fiber) + (11522.57\times White\ Marble) \]

5.2 Model Regresi berdasarkan stepwise regression

Selain menentukan variabel prediktor menggunakan nilai korelasi, penentuan variabel prediktor juga dapat menggunakan stepwise regression yang dapat menentukan variabel prediktor terbaik bedasarkan nilai AIC (Akaike Information Criterion).

Membuat dan melihat summary dari model regresi

#Mengambil semua variabel prediktor dan menyeleksinya menggunakan stepwise dengan direction "both"
model_house_full <- lm(Prices~.,house_train)
model_house2 <- step(model_house_full, direction = "both")
## Start:  AIC=-15228107
## Prices ~ Area + Garage + FirePlace + Baths + White.Marble + Black.Marble + 
##     Indian.Marble + Floors + City + Solar + Electric + Fiber + 
##     Glass.Doors + Swiming.Pool + Garden
## Warning: attempting model selection on an essentially perfect fit is nonsense
## 
## Step:  AIC=-15228107
## Prices ~ Area + Garage + FirePlace + Baths + White.Marble + Black.Marble + 
##     Floors + City + Solar + Electric + Fiber + Glass.Doors + 
##     Swiming.Pool + Garden
## Warning: attempting model selection on an essentially perfect fit is nonsense

## Warning: attempting model selection on an essentially perfect fit is nonsense
##                Df      Sum of Sq            RSS       AIC
## - Swiming.Pool  1              0              0 -15228108
## - Garden        1              0              0 -15228108
## <none>                                        0 -15228107
## - Solar         1     6249733253     6249733253   3862679
## - Electric      1   156247074284   156247074284   5150246
## - FirePlace     1   449908400277   449908400277   5573290
## - Garage        1   600849493624   600849493624   5689011
## - Baths         1  1249308762837  1249308762837   5981813
## - Area          1  1287887001420  1287887001420   5993978
## - Black.Marble  1  1666118928272  1666118928272   6096976
## - Glass.Doors   1  1980203729458  1980203729458   6166057
## - City          1  3261303330667  3261303330667   6365629
## - White.Marble  1 13085049569172 13085049569172   6921369
## - Fiber         1 13805727501174 13805727501174   6942815
## - Floors        1 22499756119789 22499756119789   7138184
## 
## Step:  AIC=-15228108
## Prices ~ Area + Garage + FirePlace + Baths + White.Marble + Black.Marble + 
##     Floors + City + Solar + Electric + Fiber + Glass.Doors + 
##     Garden
## Warning: attempting model selection on an essentially perfect fit is nonsense

## Warning: attempting model selection on an essentially perfect fit is nonsense
##                Df      Sum of Sq            RSS       AIC
## - Garden        1              0              0 -15228108
## <none>                                        0 -15228108
## + Swiming.Pool  1              0              0 -15228107
## - Solar         1     6249736612     6249736612   3862677
## - Electric      1   156247080099   156247080099   5150244
## - FirePlace     1   449908512688   449908512688   5573288
## - Garage        1   600850567647   600850567647   5689009
## - Baths         1  1249315026569  1249315026569   5981813
## - Area          1  1287888651671  1287888651671   5993976
## - Black.Marble  1  1666120395621  1666120395621   6096974
## - Glass.Doors   1  1980203949448  1980203949448   6166055
## - City          1  3261306931325  3261306931325   6365628
## - White.Marble  1 13085138478202 13085138478202   6921370
## - Fiber         1 13805931941846 13805931941846   6942819
## - Floors        1 22499758892623 22499758892623   7138182
## 
## Step:  AIC=-15228109
## Prices ~ Area + Garage + FirePlace + Baths + White.Marble + Black.Marble + 
##     Floors + City + Solar + Electric + Fiber + Glass.Doors
## Warning: attempting model selection on an essentially perfect fit is nonsense

## Warning: attempting model selection on an essentially perfect fit is nonsense
##                Df      Sum of Sq            RSS       AIC
## <none>                                        0 -15228108
## + Garden        1              0              0 -15228108
## + Swiming.Pool  1              0              0 -15228108
## - Solar         1     6249818496     6249818496   3862681
## - Electric      1   156247427429   156247427429   5150242
## - FirePlace     1   449908735472   449908735472   5573286
## - Garage        1   600851498123   600851498123   5689008
## - Baths         1  1249317404624  1249317404624   5981811
## - Area          1  1287894456360  1287894456360   5993976
## - Black.Marble  1  1666123223867  1666123223867   6096973
## - Glass.Doors   1  1980220300264  1980220300264   6166057
## - City          1  3261310764218  3261310764218   6365626
## - White.Marble  1 13085163335973 13085163335973   6921369
## - Fiber         1 13805957605927 13805957605927   6942817
## - Floors        1 22499777306655 22499777306655   7138180
summary(model_house2)
## 
## Call:
## lm(formula = Prices ~ Area + Garage + FirePlace + Baths + White.Marble + 
##     Black.Marble + Floors + City + Solar + Electric + Fiber + 
##     Glass.Doors, data = house_train)
## 
## Residuals:
##           Min            1Q        Median            3Q           Max 
## -0.0000003176  0.0000000000  0.0000000000  0.0000000000  0.0000034002 
## 
## Coefficients:
##                            Estimate             Std. Error         t value
## (Intercept)   1000.0000000050688413     0.0000000000465559  21479559782844
## Area            25.0000000000070486     0.0000000000001192 209778136038948
## Garage        1499.9999999996425686     0.0000000000104686 143285967167646
## FirePlace      749.9999999999911324     0.0000000000060489 123988754689341
## Baths         1249.9999999999893134     0.0000000000060500 206612446614282
## White.Marble 14000.0000000002419256     0.0000000000209372 668666644179607
## Black.Marble  5000.0000000000090949     0.0000000000209554 238601760808100
## Floors       15000.0000000000036380     0.0000000000171073 876817471794076
## City          3499.9999999999668034     0.0000000000104846 333822939671435
## Solar          250.0000000000266027     0.0000000000171075  14613484651970
## Electric      1250.0000000000256932     0.0000000000171074  73067882728683
## Fiber        11750.0000000001473381     0.0000000000171074 686836478766525
## Glass.Doors   4450.0000000001500666     0.0000000000171074 260121853248574
##                         Pr(>|t|)    
## (Intercept)  <0.0000000000000002 ***
## Area         <0.0000000000000002 ***
## Garage       <0.0000000000000002 ***
## FirePlace    <0.0000000000000002 ***
## Baths        <0.0000000000000002 ***
## White.Marble <0.0000000000000002 ***
## Black.Marble <0.0000000000000002 ***
## Floors       <0.0000000000000002 ***
## City         <0.0000000000000002 ***
## Solar        <0.0000000000000002 ***
## Electric     <0.0000000000000002 ***
## Fiber        <0.0000000000000002 ***
## Glass.Doors  <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.00000000541 on 399989 degrees of freedom
## Multiple R-squared:      1,  Adjusted R-squared:      1 
## F-statistic: 1.669e+29 on 12 and 399989 DF,  p-value: < 0.00000000000000022

Dari hasil Summary model_house2 diatas didapat informasi yaitu:

1. Nilai AIC terbaik (terendah) adalah -15228109

2. Nilai Adjusted R-Squared adalah 1 atau 100% model tersebut dapat menjelaskan variasi nilai dari Prices.

3. Nilai p-value dari dari masing-masing varibel prediktor kurang dari 0.05 (p-value < 0.05), maka bisa dianggap masing-masing variabel prediktor signifikan atau berpengaruh terhadap variabel target (Prices)

4. Setiap variabel mempunyai nilai tambah untuk target variabel, untuk lebih lengkapnya bisa dilihat pada formula berikut ini

\[ Prices = 1000.00 + (25.00\times Area) + (1499.99\times Garage) + (749.99\times Fire\ Place) + (1249.99\times Baths) + (14000.00\times White\ Marble)\ + \]

\[ (5000.00\times Black\ Marble) + (15000.00\times Floors) + (3499.99\times City)\ + (250.00\times Solar) + (1250.00\times Electric)\ + \]

\[ (11750.00\times Fiber) + (4450.00\times Glass\ Doors) \]

6. Evaluasi Model

Setelah membuat formula untuk target variabel, selanjutnya adalah mengevaluasi apakah formula tersebut sudah sesuai sesuai dengan cara membuat model dari masing-masing formula

6.1 model_house1

Prediksi

pred_test1 <- predict(model_house1, newdata = house_test)
head(pred_test1)
##        3       29       64       65       67       79 
## 48105.05 51565.86 48105.05 51565.86 51371.85 39849.28

Cek Eror

\[ RMSE = \sqrt{\frac{1}{n} \sum (\hat y - y)^2} \]

#Root Mean Squared Eror
RMSE(pred_test1, house_test$Prices)
## [1] 5147.273

Dengan mengecek eror menggunakan RMSE (Root Mean Squared Eror) dapat lihat bahwa model akan melenceng dari data aktual sebanyak 5147.273

Asumsi

Multikolinearitas

vif(model_house1) 
##       Floors        Fiber White.Marble 
##     1.000001     1.000004     1.000003

Nilai masing-masing variabel prediktor kurang dari 10, yang berarti antar masing-masing prediktor tidak memiliki kemiripan karakteristik

Normality

qqPlot(model_house1$residuals)

## 406693 176280 
## 325381 140906

Dapat dilihat value (point) dari data mengikuti bentuk garis linear, yang berati data berdistribusi normal

Melihat grafik distribusi normal

plot(density(model_house1$residuals))

Dari hasil grafik/plot dapat dilihat bentuk dari grafik berbentuk seperti lonceng dengan titik puncak berada pada angka 0, jadi dapat dikatakan bahwa model berdistribusi normal

Heterodasticity

plot(model_house1$fitted.values, #prediksi
     model_house1$residuals) #eror

Bentuk dari value (point) tidak membentuk sebuah pola tertentu

Pengecekan p-value, menggunakan bptest

bptest(model_house1)
## 
##  studentized Breusch-Pagan test
## 
## data:  model_house1
## BP = 3177.7, df = 3, p-value < 0.00000000000000022

Hasil bptest dari model didapat nilai p-value < 0.05 yang berarti asumsi tidak terpenuhi

Linearity

Pengecekan korelasi target variabel dengan prediktor variabel

ggcorr(house %>% 
         select(Floors,Fiber,White.Marble,Prices),
         label = T, label_size = 3.5, hjust=1, layout.exp = 2)

Dapat dilihat nilai korelasi target dengan prediktor, memiliki nilai yang cukup tinggi.

  • Prices dengan White.Marble : 0.4
  • Prices dengan Fiber : 0.5
  • Prices dengan Floors : 0.6
data.frame(prediksi = model_house1$fitted.values,
            error = model_house1$residuals) %>% 
  ggplot(aes(prediksi, error)) +
  geom_hline(yintercept = 0) +
  geom_point() +
  geom_smooth()

Summary Model

*Setelah model_house1 diprediksi dan dicek nilai errornya menggunakan RMSE, didapat nilai 5147.273 yang berati model_house1 dapat melenceng sebesar nilai tersebut. Lalu pengecekan asumsi menggunakan Multikolinearitas, Normality, Heterodasticity, dan Linearity hasilnya tidak semua asumsi yang dilakukan terpenuhi.

6.2 model_house2

Prediksi

pred_test2 <- predict(model_house2, newdata = house_test)
head(pred_test2)
##     3    29    64    65    67    79 
## 49500 47300 43750 48100 50450 33950

Cek Eror

\[ RMSE = \sqrt{\frac{1}{n} \sum (\hat y - y)^2} \]

#Root Mean Squared Eror
RMSE(pred_test2, house_test$Prices)
## [1] 0.000000005409621

Dengan mengecek eror menggunakan RMSE (Root Mean Squared Eror) dapat lihat bahwa model yang akan melenceng dari data aktual sebanyak 0.000000005409621

Asumsi

Multikolinearitas

vif(model_house2) 
##         Area       Garage    FirePlace        Baths White.Marble Black.Marble 
##     1.000024     1.000053     1.000017     1.000043     1.331874     1.331864 
##       Floors         City        Solar     Electric        Fiber  Glass.Doors 
##     1.000011     1.000023     1.000028     1.000021     1.000026     1.000020

Nilai masing-masing variabel prediktor kurang dari 10, yang berarti antar masing-masing prediktor tidak memiliki kemiripan karakteristik

Normality

qqPlot(model_house2$residuals)

## [1] 1 2

Dapat dilihat value (point) dari data mengikuti bentuk garis linear, yang berati data berdistribusi normal walaupun ada nilai yg outlier

plot(density(model_house2$residuals))

Dari hasil grafik/plot dapat dilihat bahwa model berdistribusi normal dengan yang sangat kecil

Heterodasticity

plot(model_house2$fitted.values, #prediksi
     model_house2$residuals) #eror

bptest(model_house2)
## 
##  studentized Breusch-Pagan test
## 
## data:  model_house2
## BP = 11.235, df = 12, p-value = 0.5089

Hasil bptest dari model didapat nilai p-value > 0.05 yang berarti asumsi terpenuhi

Linearity

ggcorr(house %>% 
         select(Area,Garage,FirePlace,Baths,White.Marble,Black.Marble,Floors,City,Solar,Electric,Fiber,Glass.Doors,Prices),
         label = T, label_size = 3.5, hjust=1, layout.exp = 2)

Dapat dilihat hasil pengecekan korelasi terdapat beberapa variabel prediktor yg berhubungan dengan variabel target (berwarna orange) dan yang tidak berhubungan (berwarna biru)

data.frame(prediksi = model_house2$fitted.values,
            error = model_house2$residuals) %>% 
  ggplot(aes(prediksi, error)) +
  geom_hline(yintercept = 0) +
  geom_point() +
  geom_smooth()

Summary Model

*Setelah model_house2 diprediksi dan dicek nilai errornya menggunakan RMSE, didapat nilai 0.000000005409621 yang berati model_house2 dapat melenceng sebesar nilai tersebut. Lalu pengecekan asumsi menggunakan Multikolinearitas, Normality, Heterodasticity, dan Linearity hasilnya asumsi yang dilakukan terpenuhi walaupun terdapat outlier dimodel tersebut.

7. Kesimpulan

Model Performa

model <- c("model_house1", "model_house2")
R_Squared <- c(0.8185,1.0000)
RMSE <- c(5147.273,0.000000005409621 )

tabelmodel <- data.frame(model,R_Squared,RMSE)

print (tabelmodel)
##          model R_Squared                 RMSE
## 1 model_house1    0.8185 5147.273000000000138
## 2 model_house2    1.0000    0.000000005409621

Berdasarkan pembuatan 2 model diatas (model_house1 dan model_house2) dapat disimpulkan bahwa:

1. R-Squared model_house1 memiliki nilai 0.8185 sedangkan model_house2 memiliki nilai 1, jadi dapat dikatakan berdasarkan nilai R-Squared untuk model_house2 lebih dipilih karena model dapat menjelas variasi nilai dari Prices sebesar 1 (100%)

2. Error Dari hasil pengujian Error dengan menggunakan RMSE (Root Mean Squared Eror) model_house1 memiliki nilai 5147.273 sedangkan model_house2 memiliki nilai 0.000000005409621, jadi dapat dikatakan berdasarkan nilai Error untuk model_house2 lebih dipilih karena kemungkinan model yang akan melenceng dari data aktual hanya sebesar 0.000000005409621

3. Asumsi Dari hasil asumsi untuk kedua model berdasarkan grafik dan test yang dilakukan, bahwa model_house2 lebih dipilih dibandingkan dengan model_house1

Jadi dapat disimpulkan dalam menentukan harga rumah, variabel yang penting dapat dilihat dari model_house2. Variabel yang penting tersebut yaitu Area, Garage, FirePlace, Baths, White.Marble, Black.Marble, Floors, City, Solar, Electric, Fiber dan Glass.Doors.