Github: https://github.com/gabrielerichsonmrp/gehm_regression

1 Intro

Tujuan dari project ini adalah untuk memprediksi penjualan rumah di King County, Washington, AS menggunakan metode Linear Regression. Dataset terdiri dari data historis rumah yang dijual antara Mei 2014 hingga Mei 2015.

2 Data Preparation

2.1 Read Data

Data yang digunakan dapat didownload dari KC_Housesales_Data

2.2 Data Structure

#> Observations: 21,597
#> Variables: 21
#> $ id            <dbl> 7129300520, 6414100192, 5631500400, 2487200875, 19544...
#> $ date          <fct> 10/13/2014, 12/9/2014, 2/25/2015, 12/9/2014, 2/18/201...
#> $ price         <dbl> 221900, 538000, 180000, 604000, 510000, 1230000, 2575...
#> $ bedrooms      <int> 3, 3, 2, 4, 3, 4, 3, 3, 3, 3, 3, 2, 3, 3, 5, 4, 3, 4,...
#> $ bathrooms     <dbl> 1.00, 2.25, 1.00, 3.00, 2.00, 4.50, 2.25, 1.50, 1.00,...
#> $ sqft_living   <int> 1180, 2570, 770, 1960, 1680, 5420, 1715, 1060, 1780, ...
#> $ sqft_lot      <int> 5650, 7242, 10000, 5000, 8080, 101930, 6819, 9711, 74...
#> $ floors        <dbl> 1.0, 2.0, 1.0, 1.0, 1.0, 1.0, 2.0, 1.0, 1.0, 2.0, 1.0...
#> $ waterfront    <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
#> $ view          <int> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0,...
#> $ condition     <int> 3, 3, 3, 5, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3, 4,...
#> $ grade         <int> 7, 7, 6, 7, 8, 11, 7, 7, 7, 7, 8, 7, 7, 7, 7, 9, 7, 7...
#> $ sqft_above    <int> 1180, 2170, 770, 1050, 1680, 3890, 1715, 1060, 1050, ...
#> $ sqft_basement <int> 0, 400, 0, 910, 0, 1530, 0, 0, 730, 0, 1700, 300, 0, ...
#> $ yr_built      <int> 1955, 1951, 1933, 1965, 1987, 2001, 1995, 1963, 1960,...
#> $ yr_renovated  <int> 0, 1991, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,...
#> $ zipcode       <int> 98178, 98125, 98028, 98136, 98074, 98053, 98003, 9819...
#> $ lat           <dbl> 47.5112, 47.7210, 47.7379, 47.5208, 47.6168, 47.6561,...
#> $ long          <dbl> -122.257, -122.319, -122.233, -122.393, -122.045, -12...
#> $ sqft_living15 <int> 1340, 1690, 2720, 1360, 1800, 4760, 2238, 1650, 1780,...
#> $ sqft_lot15    <int> 5650, 7639, 8062, 5000, 7503, 101930, 6819, 9711, 811...

Berdasarkan data diatas, dataset yang digunakan memiliki 500.000 observasi dan 15 variabel. Selain itu, Struktur data yang kita miliki sudah sesuai dengan kebutuhan.

2.3 Remove Variable

Dari struktur data diatas terdapat data id dan date. Variabel id tidak memberi informasi yang cukup penting sehingga dapat diremove. kemudian untuk modelling kali ini kita tidak mempertimbangkan tahun penjualan karena data diambil dari Mei 2014 hingga Mei 2015 sehingga perubahan yang terjadi tidak signifikan.

2.4 Missing Values

Tidak ada missing value pada dataset ini.

#>         price      bedrooms     bathrooms   sqft_living      sqft_lot 
#>             0             0             0             0             0 
#>        floors    waterfront          view     condition         grade 
#>             0             0             0             0             0 
#>    sqft_above sqft_basement      yr_built  yr_renovated       zipcode 
#>             0             0             0             0             0 
#>           lat          long sqft_living15    sqft_lot15 
#>             0             0             0             0

3 Data Inspection

3.1 10 Top Line Data


3.2 10 Bottom Line Data


3.3 Deskrpisi Variabel

Pada data yang hanya bernilai 1 dan 0 menandakan 1 = “Iya” dan 0 = “Tidak”

Area Area rumah
Garage Jumlah Garasi
FirePlace Jumlah Perapin
Baths Jumlah Kamar Mandi
White.Marble Apakah menggunkan keramik “White Marble”
Black.Marble Apakah menggunakan keramik “Black Marble”
Floors Apakah lantai sudah diflooring
City Lokasi Kota dari rumah
Solar Apakah terdapat tenaga surya
Electric Apakah terdapat listrik
Fiber Apakah menggunakan Fiber
Glass.Doors Apakah menggunakan pintu kaca
Swiming.Pool Apakah terdapat kolam renang
Garden Apakah terdapat taman
Prices Harga rumah. variabel yang akan diprediksi dalam analisis ini.


3.4 Data Summary

#>      price            bedrooms        bathrooms      sqft_living   
#>  Min.   :  78000   Min.   : 1.000   Min.   :0.500   Min.   :  370  
#>  1st Qu.: 322000   1st Qu.: 3.000   1st Qu.:1.750   1st Qu.: 1430  
#>  Median : 450000   Median : 3.000   Median :2.250   Median : 1910  
#>  Mean   : 540297   Mean   : 3.373   Mean   :2.116   Mean   : 2080  
#>  3rd Qu.: 645000   3rd Qu.: 4.000   3rd Qu.:2.500   3rd Qu.: 2550  
#>  Max.   :7700000   Max.   :33.000   Max.   :8.000   Max.   :13540  
#>     sqft_lot           floors        waterfront            view       
#>  Min.   :    520   Min.   :1.000   Min.   :0.000000   Min.   :0.0000  
#>  1st Qu.:   5040   1st Qu.:1.000   1st Qu.:0.000000   1st Qu.:0.0000  
#>  Median :   7618   Median :1.500   Median :0.000000   Median :0.0000  
#>  Mean   :  15099   Mean   :1.494   Mean   :0.007547   Mean   :0.2343  
#>  3rd Qu.:  10685   3rd Qu.:2.000   3rd Qu.:0.000000   3rd Qu.:0.0000  
#>  Max.   :1651359   Max.   :3.500   Max.   :1.000000   Max.   :4.0000  
#>    condition        grade          sqft_above   sqft_basement       yr_built   
#>  Min.   :1.00   Min.   : 3.000   Min.   : 370   Min.   :   0.0   Min.   :1900  
#>  1st Qu.:3.00   1st Qu.: 7.000   1st Qu.:1190   1st Qu.:   0.0   1st Qu.:1951  
#>  Median :3.00   Median : 7.000   Median :1560   Median :   0.0   Median :1975  
#>  Mean   :3.41   Mean   : 7.658   Mean   :1789   Mean   : 291.7   Mean   :1971  
#>  3rd Qu.:4.00   3rd Qu.: 8.000   3rd Qu.:2210   3rd Qu.: 560.0   3rd Qu.:1997  
#>  Max.   :5.00   Max.   :13.000   Max.   :9410   Max.   :4820.0   Max.   :2015  
#>   yr_renovated        zipcode           lat             long       
#>  Min.   :   0.00   Min.   :98001   Min.   :47.16   Min.   :-122.5  
#>  1st Qu.:   0.00   1st Qu.:98033   1st Qu.:47.47   1st Qu.:-122.3  
#>  Median :   0.00   Median :98065   Median :47.57   Median :-122.2  
#>  Mean   :  84.46   Mean   :98078   Mean   :47.56   Mean   :-122.2  
#>  3rd Qu.:   0.00   3rd Qu.:98118   3rd Qu.:47.68   3rd Qu.:-122.1  
#>  Max.   :2015.00   Max.   :98199   Max.   :47.78   Max.   :-121.3  
#>  sqft_living15    sqft_lot15    
#>  Min.   : 399   Min.   :   651  
#>  1st Qu.:1490   1st Qu.:  5100  
#>  Median :1840   Median :  7620  
#>  Mean   :1987   Mean   : 12758  
#>  3rd Qu.:2360   3rd Qu.: 10083  
#>  Max.   :6210   Max.   :871200



4 EDA

4.1 Correlation Matrix of Input Data

Berdasarkan matriks korelasi dari data input diatas, setiap variabel mempunyai pengaruh terhadap Price kecuali condition dan longitude. Kemudian variabel yang memiliki korelasi paling tinggi dengan Price adalah sqft_living dan grade.

6 Modelling: Linear Regression

Modelling menggunakan metode regresi Linear ini dilakukan untuk memprediksi harga dari suatu rumah (Prices).

6.1 Single Predictor

Berdasarkan matriks korelasi sebelumnya, variabel sqft_living dan grade memiliki korelasi paling kuat dengan variabel Price. Mari kita coba:

Linear Regression with single predictor: sqft_living

#> 
#> Call:
#> lm(formula = price ~ sqft_living, data = house_train)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -939043 -137911  -22388  100402 1328765 
#> 
#> Coefficients:
#>              Estimate Std. Error t value            Pr(>|t|)    
#> (Intercept) 56708.704   4401.073   12.88 <0.0000000000000002 ***
#> sqft_living   224.911      1.976  113.83 <0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 209500 on 15115 degrees of freedom
#> Multiple R-squared:  0.4616, Adjusted R-squared:  0.4615 
#> F-statistic: 1.296e+04 on 1 and 15115 DF,  p-value: < 0.00000000000000022

Jika dilihat berdasarkan P-Value variabel sqft_living sangat berpengaruh terhadap harga. Namun, jika sebagai single predictor, model ini hanya memiliki nilai Adjusted R-squared: 0.4615 yang berarti hanya berhasil menangkap variansi dari target sebesar 46%

Linear Regression with single predictor: grade

#> 
#> Call:
#> lm(formula = price ~ grade, data = house_train)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -546749 -136708  -29188   94792 1408292 
#> 
#> Coefficients:
#>             Estimate Std. Error t value            Pr(>|t|)    
#> (Intercept)  -798454      11613  -68.76 <0.0000000000000002 ***
#> grade         172520       1505  114.65 <0.0000000000000002 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 208800 on 15115 degrees of freedom
#> Multiple R-squared:  0.4651, Adjusted R-squared:  0.4651 
#> F-statistic: 1.315e+04 on 1 and 15115 DF,  p-value: < 0.00000000000000022

Jika dilihat berdasarkan P-Value variabel grade sangat berpengaruh terhadap harga. Namun, jika sebagai single predictor, model ini hanya memiliki nilai Adjusted R-squared: 0.4615 yang berarti hanya berhasil menangkap variansi dari target sebesar 46%.

Kesimpulan: Model Linear Regression menggunakan single predictor tidak cocok diterapkan untuk menentukan harga rumah pada dataset ini.



6.2 Multiple Predictor

#> 
#> Call:
#> lm(formula = price ~ ., data = house_train)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -814783  -86349  -10888   67453 1014703 
#> 
#> Coefficients: (1 not defined because of singularities)
#>                     Estimate     Std. Error t value             Pr(>|t|)    
#> (Intercept)   -2203718.12279  2653008.90515  -0.831               0.4062    
#> bedrooms        -15545.64862     1729.12554  -8.990 < 0.0000000000000002 ***
#> bathrooms        28440.64411     2987.08035   9.521 < 0.0000000000000002 ***
#> sqft_living         97.67100        4.11018  23.763 < 0.0000000000000002 ***
#> sqft_lot             0.25148        0.04900   5.132      0.0000002895341 ***
#> floors           30737.22022     3286.84541   9.352 < 0.0000000000000002 ***
#> waterfront      276282.06569    18291.16379  15.105 < 0.0000000000000002 ***
#> view             45197.38008     1967.14560  22.976 < 0.0000000000000002 ***
#> condition        30402.18238     2160.70713  14.070 < 0.0000000000000002 ***
#> grade            92262.74833     1995.77858  46.229 < 0.0000000000000002 ***
#> sqft_above           7.75236        4.03269   1.922               0.0546 .  
#> sqft_basement             NA             NA      NA                   NA    
#> yr_built         -2151.58881       66.59657 -32.308 < 0.0000000000000002 ***
#> yr_renovated        22.29191        3.37609   6.603      0.0000000000417 ***
#> zipcode           -399.19511       29.94200 -13.332 < 0.0000000000000002 ***
#> lat             587905.36296     9765.15490  60.204 < 0.0000000000000002 ***
#> long           -138904.55063    11928.56379 -11.645 < 0.0000000000000002 ***
#> sqft_living15       45.97308        3.21390  14.304 < 0.0000000000000002 ***
#> sqft_lot15          -0.28530        0.06913  -4.127      0.0000369031984 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 152800 on 15099 degrees of freedom
#> Multiple R-squared:  0.7137, Adjusted R-squared:  0.7134 
#> F-statistic:  2214 on 17 and 15099 DF,  p-value: < 0.00000000000000022

Hasil summary dari model lm_house_all memberikan banyak informasi. nilai Estimate menginterpretasikan nilai setiap koefisien, misalnya apabila rumah memiliki waterfront maka akan berkontribusi pada kenaikan harga rumah sebesar USD 276282.06. Tapi kalau dilihat yang aneh pada variabel bedrooms, jika jumlah kamar bertambah 1 maka harga rumah berkuran sebesar USD -15545.64, apakah didaerah sana orang gak suka kamar banyak? :)

Mari melihat nilai dari Pr(>|t|), nilai ini menunjukan seberapa besar suatu variabel berpengaruh untuk memprediksi Prices. jika nilainya Pr(>|t|) dibawah 0.05 maka dapat diasumsikan bahwa variabel memiliki pengaruh signifikan dan sebaliknya. Berdasarkan summary model diatas, variabel sqft_above dan sqft_basement memilki nilai P Value > 0.05 bahkan NA Value, sehingga variabel ini dapat di exclude dari prediktor. Namun saya masih kurang mengerti untuk mendektsi singularitas pada variabel sqft_basement, next saya update terkait ini.

Selain itu, jika dilihat nilai Adjusted R-squared:0.7134 , hal ini menandakan bahwa model lm_house_all dapat memprediksi 71.3%. Angka yang belum cukup bagus, tapi coba kita selesaikan.



6.3 Stepwise Method

#> Start:  AIC=360919.5
#> price ~ bedrooms + bathrooms + sqft_living + sqft_lot + floors + 
#>     waterfront + view + condition + grade + sqft_above + sqft_basement + 
#>     yr_built + yr_renovated + zipcode + lat + long + sqft_living15 + 
#>     sqft_lot15
#> 
#> 
#> Step:  AIC=360919.5
#> price ~ bedrooms + bathrooms + sqft_living + sqft_lot + floors + 
#>     waterfront + view + condition + grade + sqft_above + yr_built + 
#>     yr_renovated + zipcode + lat + long + sqft_living15 + sqft_lot15
#> 
#>                 Df      Sum of Sq             RSS    AIC
#> <none>                            352569764618921 360920
#> - sqft_above     1    86292753269 352656057372190 360921
#> - sqft_lot15     1   397765471958 352967530090879 360935
#> - sqft_lot       1   615102445269 353184867064190 360944
#> - yr_renovated   1  1018037330628 353587801949549 360961
#> - bedrooms       1  1887389454602 354457154073523 360998
#> - floors         1  2042055310253 354611819929173 361005
#> - bathrooms      1  2116810239119 354686574858039 361008
#> - long           1  3166310589734 355736075208655 361053
#> - zipcode        1  4150550166874 356720314785795 361094
#> - condition      1  4622900972379 357192665591300 361114
#> - sqft_living15  1  4777917079792 357347681698713 361121
#> - waterfront     1  5327452570036 357897217188957 361144
#> - view           1 12326801207736 364896565826656 361437
#> - sqft_living    1 13185823472395 365755588091316 361473
#> - yr_built       1 24373155402529 376942920021450 361928
#> - grade          1 49902803183870 402472567802791 362919
#> - lat            1 84635672813050 437205437431971 364170
#> 
#> Call:
#> lm(formula = price ~ bedrooms + bathrooms + sqft_living + sqft_lot + 
#>     floors + waterfront + view + condition + grade + sqft_above + 
#>     yr_built + yr_renovated + zipcode + lat + long + sqft_living15 + 
#>     sqft_lot15, data = house_train)
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -814783  -86349  -10888   67453 1014703 
#> 
#> Coefficients:
#>                     Estimate     Std. Error t value             Pr(>|t|)    
#> (Intercept)   -2203718.12279  2653008.90515  -0.831               0.4062    
#> bedrooms        -15545.64862     1729.12554  -8.990 < 0.0000000000000002 ***
#> bathrooms        28440.64411     2987.08035   9.521 < 0.0000000000000002 ***
#> sqft_living         97.67100        4.11018  23.763 < 0.0000000000000002 ***
#> sqft_lot             0.25148        0.04900   5.132      0.0000002895341 ***
#> floors           30737.22022     3286.84541   9.352 < 0.0000000000000002 ***
#> waterfront      276282.06569    18291.16379  15.105 < 0.0000000000000002 ***
#> view             45197.38008     1967.14560  22.976 < 0.0000000000000002 ***
#> condition        30402.18238     2160.70713  14.070 < 0.0000000000000002 ***
#> grade            92262.74833     1995.77858  46.229 < 0.0000000000000002 ***
#> sqft_above           7.75236        4.03269   1.922               0.0546 .  
#> yr_built         -2151.58881       66.59657 -32.308 < 0.0000000000000002 ***
#> yr_renovated        22.29191        3.37609   6.603      0.0000000000417 ***
#> zipcode           -399.19511       29.94200 -13.332 < 0.0000000000000002 ***
#> lat             587905.36296     9765.15490  60.204 < 0.0000000000000002 ***
#> long           -138904.55063    11928.56379 -11.645 < 0.0000000000000002 ***
#> sqft_living15       45.97308        3.21390  14.304 < 0.0000000000000002 ***
#> sqft_lot15          -0.28530        0.06913  -4.127      0.0000369031984 ***
#> ---
#> Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 152800 on 15099 degrees of freedom
#> Multiple R-squared:  0.7137, Adjusted R-squared:  0.7134 
#> F-statistic:  2214 on 17 and 15099 DF,  p-value: < 0.00000000000000022

Metode Stepwise akan menyeleksi variabel-variabel yang memilki pengaruh signifikan terhadap prediktor. Lihat bagian Step: AIC=360919.5, semakin kecil nilai AIC, maka semakin disarankan variabel prediktor yang dipilih dan nilai AIC paling kecil berada dibagian paling bawah tampilan. Berdasarkan hasil stepwise backward, formula untuk Multiple Linear Regression yang disarankan:



7 Model Evaluation

Berdasarkan hasil stepwise backward, formula untuk Multiple Linear Regression yang disarankan:

Formula:
lm(price ~ bedrooms + bathrooms + sqft_living + sqft_lot + floors + waterfront + view + condition + grade + sqft_above + yr_built + yr_renovated + zipcode + lat + long + sqft_living15 + sqft_lot15, data=house_train)

7.1 Model Performance: Error

Cara evaluasi model di kasus regresi dapat menggunakan beberapa matriks penilaian, antara lain:

R-squared & Adjusted R-squared
* Model yang dibuat menggunakan multiple predictor sehingga nilai yang baik diinterpretasikan adalah nilai Adjusted R-squared. model ini memiliki nilai Adjusted R-squared : 0.7134 , hal ini menandakan bahwa model lm_house_all dapat memprediksi 71.3%. Angka yang belum cukup bagus, akan dicoba lagi menggunakan metode lain dikesempatan berikutnya.

Error
* Mean Absolute Error (MAE): Paling mudah untuk di interpretasikan karena dibandingkan dengan satuan data aktual.
* Mean Absolute Percentage Error (MAPE): Punya interval untuk seberapa baik model kita. (0 sd 100%). NamuN MAPE terdapat batasan, apabila pada data aktual memiliki nilai 0, MAPE akan inf.
* Root Mean Square Error (RMSE): Baik digunakan untuk data2 yang nilai fluktuatif.

Berikut pengujian error model ini:

Hasil pengujian error menggunakan 3 metode diatas menunjukan nilainya kurang cukup baik, dimana semakin kecil nilai error maka semakin baik model yang dibuat. Jika berdasarkan nilai MAE, maka model ini memiliki error kurang lebih sekitar USD 106.946.



7.2 Assumption Checking

1. Linearity

Berdasarkan pengujian linearity terlihat bahwa model yang dibuat belum berhasil menangkap variansi data dengan baik, terlihat error atau jarak data dari mean cukup jauh.


2. Normality Residual

#> 
#>  Shapiro-Wilk normality test
#> 
#> data:  lm_house_model$residuals[0:5000]
#> W = 0.91304, p-value < 0.00000000000000022
#> 
#>  Anderson-Darling normality test
#> 
#> data:  lm_house_model$residuals
#> A = 217.41, p-value < 0.00000000000000022

Hipotesis:
- H0: Residual berdistribusi normal
- H1: Residual tidak berdistribusi normal

Kesimpulan Karena nilai p-value: 0.00000000000000022 < 0.05 maka keputusannya adalah terima H1, dengan kesimpulan residual dari model tidak berdistribusi normal.


3. No-Heteroscedasticity

#> 
#>  studentized Breusch-Pagan test
#> 
#> data:  lm_house_model
#> BP = 1920.3, df = 17, p-value < 0.00000000000000022

Hipotesis:

- H0: Data residual Homogen (tidak membentuk sebuah pola)
- H1: Data residual heteros (membentuk sebuah pola)

Kesimpulan
Karena nilai p-value: 0.00000000000000022 < 0.05 maka keputusannya adalah terima H1, dengan kesimpulan residual dari model bersifat heteros, dapat dilihat membentuk sebuah pola.


4. No-Multicollinearity

Tidak terdapat Multicollinearity dari variabel yang digunakan pada model.

#>      bedrooms     bathrooms   sqft_living      sqft_lot        floors 
#>      1.644960      3.212349      8.130736      2.264065      2.039732 
#>    waterfront          view     condition         grade    sqft_above 
#>      1.154350      1.354526      1.255650      3.283318      6.648321 
#>      yr_built  yr_renovated       zipcode           lat          long 
#>      2.461627      1.148428      1.662262      1.188152      1.846180 
#> sqft_living15    sqft_lot15 
#>      2.977752      2.268754


8 Predict to Data Test

Berikut data hasil prediksi Price terhadap data test.
price : Harga asli
predict.fit : hasil prediksi fit value
predict.lower : hasil prediksi prekiraan harga terendah
predict.upper : hasil prediksi perkiraan harga tertinggi



9 Summary

Model ini memiliki nilai Adjusted R-squared : 0.7134 , hal ini menandakan bahwa model lm_house_all dapat memprediksi 71.3%. Kemudian Hasil pengujian error menggunakan metode MAE menunjukan error kurang lebih sekitar USD 106.946. Pada pengujian asumsi, model ini hanya berhasil melewati pengujian Multicollinearity sedangkan pada gagal dalam pengujian Linearity, Normality dan Heteroscedasticity. Kesimpulannya, model ini masih kurang baik jika hendak digunakan untuk memprediksi harga rumah terkait dataset ini. Saya akan coba melakukan tunning atau menggunakan metode lainnya di kesempatan selanjutnya.