1. Mendefenisikan Permasalahan
Suatu hari, Xander ingin
memprediksi harga dari suatu rumah dengan beberapa
fasilitas yang memumpuni seperti:
- ID - ID
- Date - Tanggal
- Price - Harga
- Bedrooms - Jumalh Kamar Tidur
- Bathrooms - Jumlah Kamar Mandi
- Sqft Living - Luas Bangunan (in foot)
- Sqft Lot - Luas Tanah (in foot)
- Floors - Jumlah Lantai
- Waterfront - Bersebelahan dengan Air seperti danau.
- View - Gazing/ Pemandangan
- Condition - KondisiRumah
- Grade - Grade Bangunan
- Sqft Above - Luas Bangunan Di Atas Tanah
- Sqft Basement - Luas Basement
- Year Built - Tahun Dibangun
- Year Renovated - Tahun Direnovasi terakhir
- Zipcode - Kode Pos
- Latitude - Lintang
- Longitude - Bujur
- Sqft Living15 - Luas Ruang Hunian pada 2015 (dalam kaki persegi)
- Sqft Lot15 - Luas Lahan pada 2015 (dalam kaki persegi).
Maka dari itu, Xander akan mengerjakan perhitungannya dibantu oleh
aplikasi R Studio, dengan nama house
house_house.csv. Yuk lihat perhitungannya!
2. house_data Preparation
library(tidyverse) # library utk manipulasi dan visualisasi house
library(readr) # library utk membaca house CSV
# membaca house
house <- read_csv("house_data.csv")
# melihat 6 baris pertama
head(house)## # A tibble: 6 × 21
## id date price bedrooms bathrooms sqft_living sqft_lot
## <dbl> <dttm> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 7129300520 2014-10-13 00:00:00 221900 3 1 1180 5650
## 2 6414100192 2014-12-09 00:00:00 538000 3 2.25 2570 7242
## 3 5631500400 2015-02-25 00:00:00 180000 2 1 770 10000
## 4 2487200875 2014-12-09 00:00:00 604000 4 3 1960 5000
## 5 1954400510 2015-02-18 00:00:00 510000 3 2 1680 8080
## 6 7237550310 2014-05-12 00:00:00 1225000 4 4.5 5420 101930
## # ℹ 14 more variables: floors <dbl>, waterfront <dbl>, view <dbl>,
## # condition <dbl>, grade <dbl>, sqft_above <dbl>, sqft_basement <dbl>,
## # yr_built <dbl>, yr_renovated <dbl>, zipcode <dbl>, lat <dbl>, long <dbl>,
## # sqft_living15 <dbl>, sqft_lot15 <dbl>
3. Exploratory Data Analysis (EDA)
## id date price
## Min. :1.000e+06 Min. :2014-05-02 00:00:00.00 Min. : 75000
## 1st Qu.:2.123e+09 1st Qu.:2014-07-22 00:00:00.00 1st Qu.: 321950
## Median :3.905e+09 Median :2014-10-16 00:00:00.00 Median : 450000
## Mean :4.580e+09 Mean :2014-10-29 04:38:01.96 Mean : 540088
## 3rd Qu.:7.309e+09 3rd Qu.:2015-02-17 00:00:00.00 3rd Qu.: 645000
## Max. :9.900e+09 Max. :2015-05-27 00:00:00.00 Max. :7700000
## bedrooms bathrooms sqft_living sqft_lot
## Min. : 0.000 Min. :0.000 Min. : 290 Min. : 520
## 1st Qu.: 3.000 1st Qu.:1.750 1st Qu.: 1427 1st Qu.: 5040
## Median : 3.000 Median :2.250 Median : 1910 Median : 7618
## Mean : 3.371 Mean :2.115 Mean : 2080 Mean : 15107
## 3rd Qu.: 4.000 3rd Qu.:2.500 3rd Qu.: 2550 3rd Qu.: 10688
## Max. :33.000 Max. :8.000 Max. :13540 Max. :1651359
## floors waterfront view condition
## Min. :1.000 Min. :0.000000 Min. :0.0000 Min. :1.000
## 1st Qu.:1.000 1st Qu.:0.000000 1st Qu.:0.0000 1st Qu.:3.000
## Median :1.500 Median :0.000000 Median :0.0000 Median :3.000
## Mean :1.494 Mean :0.007542 Mean :0.2343 Mean :3.409
## 3rd Qu.:2.000 3rd Qu.:0.000000 3rd Qu.:0.0000 3rd Qu.:4.000
## Max. :3.500 Max. :1.000000 Max. :4.0000 Max. :5.000
## grade sqft_above sqft_basement yr_built
## Min. : 1.000 Min. : 290 Min. : 0.0 Min. :1900
## 1st Qu.: 7.000 1st Qu.:1190 1st Qu.: 0.0 1st Qu.:1951
## Median : 7.000 Median :1560 Median : 0.0 Median :1975
## Mean : 7.657 Mean :1788 Mean : 291.5 Mean :1971
## 3rd Qu.: 8.000 3rd Qu.:2210 3rd Qu.: 560.0 3rd Qu.:1997
## Max. :13.000 Max. :9410 Max. :4820.0 Max. :2015
## yr_renovated zipcode lat long
## Min. : 0.0 Min. :98001 Min. :47.16 Min. :-122.5
## 1st Qu.: 0.0 1st Qu.:98033 1st Qu.:47.47 1st Qu.:-122.3
## Median : 0.0 Median :98065 Median :47.57 Median :-122.2
## Mean : 84.4 Mean :98078 Mean :47.56 Mean :-122.2
## 3rd Qu.: 0.0 3rd Qu.:98118 3rd Qu.:47.68 3rd Qu.:-122.1
## Max. :2015.0 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 : 12768
## 3rd Qu.:2360 3rd Qu.: 10083
## Max. :6210 Max. :871200
# Distribusi Histogram
house %>%
keep(is.numeric) %>%
gather(key = "variables", value = "values") %>%
ggplot(aes(x = values)) +
geom_histogram(bins = 30, fill = "blue", color = "black") +
facet_wrap(~variables, scales = "free_x")## id date price bedrooms bathrooms
## 0 0 0 0 0
## sqft_living sqft_lot floors waterfront view
## 0 0 0 0 0
## condition grade sqft_above sqft_basement yr_built
## 0 0 0 0 0
## yr_renovated zipcode lat long sqft_living15
## 0 0 0 0 0
## sqft_lot15
## 0
Catatan:
Berikut adalah penjelasan singkat untuk setiap variabel penting ,
sebagai berikut:
. Harga (Price)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 75000 321950 450000 540088 645000 7700000
Harga mulai dari 75.000 USD Sampai 7.700.000 USD Dengan Mean senilai
540.088 USD
. Kamar Tidur (Bedrooms)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 3.000 3.000 3.371 4.000 33.000
Tersedia dari 0 sampai 33 Kamar dengan Mean sekitar 3-4 Kamar.
. Kamar Mandi (Bathrooms)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.000 1.750 2.250 2.115 2.500 8.000
Mulai dari 0-8 kamar Mandi dengan rata-rata memiliki 2-3 Kamar Mandi.
Luas Bangunan
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 290 1427 1910 2080 2550 13540
Luas Bangunan dimuali dari 290 sqft sampai 13.540 sqft dengan Mean sebesar 2.080 SQFT.
Luas Tanah (Sqft Lot)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 520 5040 7618 15107 10688 1651359
Luas Tanah Dimulai dari 520 SQFT sampai 1.651.359 SQFT (Yallah Luas
Sekali) dengan Mean Luas Tanah 15.107 SQFT.
** Lantai (Floors)**
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 1.000 1.500 1.494 2.000 3.500
Rumah yang dijual memiliki 1 sampai 3,5 Lantai dengan Rata-rata kebanyakan memiliki 1-2 Lantai.
Waterfront
## # A tibble: 2 × 2
## waterfront n
## <dbl> <int>
## 1 0 21450
## 2 1 163
Sebanyak 21430 Rumah tidak memiliki view Danau,hanya sekitar 163 yang
memilikinya.
View
## # A tibble: 5 × 2
## view n
## <dbl> <int>
## 1 0 19489
## 2 1 332
## 3 2 963
## 4 3 510
## 5 4 319
Kebanyakan rumah memili view yang jelek (0) dibandingkan dengan
Kategori 1-4.
Kondisi (Condition)
## # A tibble: 5 × 2
## condition n
## <dbl> <int>
## 1 1 30
## 2 2 172
## 3 3 14031
## 4 4 5679
## 5 5 1701
Diketahui bahwa Rata-rata Bangunan kebanyakan berstatus Okay sampai
Sangat Bagus jika mengacu bahwa Variabel Kondisi emnggunakan Skala
Likert.
Kualitas Konstruksi (Grade)
## # A tibble: 12 × 2
## grade n
## <dbl> <int>
## 1 1 1
## 2 3 3
## 3 4 29
## 4 5 242
## 5 6 2038
## 6 7 8981
## 7 8 6068
## 8 9 2615
## 9 10 1134
## 10 11 399
## 11 12 90
## 12 13 13
Diketahui bahwa Rata-rata Bangunan kebanyakan berstatus Okay sampai Sangat Bagus jika mengacu bahwa Variabel Kondisi emnggunakan Skala Likert.
Luas Bangunan Utama (Sqft Above)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 290 1190 1560 1788 2210 9410
Luas Bangunan dari 290-9410 SQFT Dengan Mean 1.788 SQFT.
Luas Basement (Sqft Basement)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.0 0.0 0.0 291.5 560.0 4820.0
- Keterangan: Luas basement dari 0 (Tidak ada) hingga 4.820 kaki
persegi. Degan Mean 291.5 SQFT
Tahun Dibangun (Year Built)
## # A tibble: 116 × 2
## yr_built n
## <dbl> <int>
## 1 1900 87
## 2 1901 29
## 3 1902 27
## 4 1903 46
## 5 1904 45
## 6 1905 74
## 7 1906 92
## 8 1907 65
## 9 1908 86
## 10 1909 94
## # ℹ 106 more rows
- Keterangan: Tahun properti dibangun berkisar dari tahun 1900 hingga 2015.
Tahun Direnovasi (Year Renovated)
## # A tibble: 70 × 2
## yr_renovated n
## <dbl> <int>
## 1 0 20699
## 2 1934 1
## 3 1940 2
## 4 1944 1
## 5 1945 3
## 6 1946 2
## 7 1948 1
## 8 1950 2
## 9 1951 1
## 10 1953 3
## # ℹ 60 more rows
Kebanyakan Rumah Tidak Pernah Di Renovasi.
Kode Pos (Zipcode)
## # A tibble: 70 × 2
## zipcode n
## <dbl> <int>
## 1 98001 362
## 2 98002 199
## 3 98003 280
## 4 98004 317
## 5 98005 168
## 6 98006 498
## 7 98007 141
## 8 98008 283
## 9 98010 100
## 10 98011 195
## # ℹ 60 more rows
ZipCode menunjukkan Banyaknya Rumah DIjual di Daerah Kode Pos TErsedebut.
Luas Hunian di 2015 (Sqft Living15)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 399 1490 1840 1987 2360 6210
- Keterangan: Menunjukkan luas hunian seperti yang tercatat pada tahun
2015, dari 399 hingga 6210 kaki persegi. Dengan Mean 1987
Luas Tanah di 2015 (Sqft Lot15)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 651 5100 7620 12768 10083 871200
- Keterangan: Menunjukkan luas tanah seperti yang tercatat pada tahun
2015, dari 651 hingga 871,200 kaki persegi. Dengan Mean 12.768
4. Data Preprocessing
# mengecek dan menangani nilai yang hilang - dan mengisi nilai yang hilang dengan median
house <- house %>%
mutate_if(is.numeric, ~ifelse(is.na(.), median(., na.rm = TRUE), .))
# Mengubah data house menjadi Distribusi Normal - Contoh menggunakan penskalaan min-max
house <- house %>%
mutate_if(is.numeric, ~(. - min(.)) / (max(.) - min(.)))5. Model Building (Perbandingan 5 model)
library(nnet)
library(rpart)
library(class)
library(stats)
# Menyiapkan house untuk model
house <- na.omit(house) # menghilangkan baris yang NA
# Membagi house menjadi house latihan dan house uji
set.seed(123)
indices <- sample(1:nrow(house), size = 0.75 * nrow(house))
train_house <- house[indices, ]
test_house <- house[-indices, ]
# Model Linear Regresi (Linear Model)
linmod <- lm(price ~ .-id -zipcode , train_house)
# Decision Tree
model_tree <- rpart(price ~ .-id, train_house)
# Neural Network (used in Non-Linear)
model_nnet <- nnet(price ~ .-id, train_house, size = 10, linout = TRUE, decay = 5e-4, maxit = 200)## # weights: 211
## initial value 50147.412481
## iter 10 value 37.095647
## iter 20 value 37.094518
## final value 37.094505
## converged
Linear Model
##
## Call:
## lm(formula = price ~ . - id - zipcode, data = train_house)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.15997 -0.01281 -0.00125 0.01003 0.57472
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3.645e-01 3.014e-02 -12.093 < 2e-16 ***
## date 1.980e-10 2.118e-11 9.350 < 2e-16 ***
## bedrooms -1.384e-01 9.407e-03 -14.715 < 2e-16 ***
## bathrooms 4.809e-02 3.942e-03 12.200 < 2e-16 ***
## sqft_living 2.444e-01 8.818e-03 27.715 < 2e-16 ***
## sqft_lot 2.328e-02 1.235e-02 1.885 0.0595 .
## floors 1.765e-04 1.358e-03 0.130 0.8966
## waterfront 7.411e-02 2.570e-03 28.834 < 2e-16 ***
## view 2.446e-02 1.274e-03 19.192 < 2e-16 ***
## condition 1.832e-02 1.413e-03 12.970 < 2e-16 ***
## grade 1.577e-01 3.893e-03 40.510 < 2e-16 ***
## sqft_above 3.733e-02 6.014e-03 6.208 5.50e-10 ***
## sqft_basement NA NA NA NA
## yr_built -3.775e-02 1.245e-03 -30.326 < 2e-16 ***
## yr_renovated 5.374e-03 1.114e-03 4.825 1.41e-06 ***
## lat 4.537e-02 9.798e-04 46.307 < 2e-16 ***
## long -1.815e-02 2.168e-03 -8.374 < 2e-16 ***
## sqft_living15 2.094e-02 3.011e-03 6.954 3.68e-12 ***
## sqft_lot15 -4.213e-02 9.780e-03 -4.307 1.66e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.02624 on 16191 degrees of freedom
## Multiple R-squared: 0.6994, Adjusted R-squared: 0.6991
## F-statistic: 2216 on 17 and 16191 DF, p-value: < 2.2e-16
Model Linear menggunakan Semua Variabel sebagai Prediktor menghasilkan Model Linear dengan nilai R-SQuared sebesar 69,91% dengan kebanyakan variabel memiliki hubungan yang signifikan dengan Harga.
Decision Tree
## n= 16209
##
## node), split, n, deviance, yval
## * denotes terminal node
##
## 1) root 16209 37.0945000 0.06095083
## 2) grade< 0.625 13033 8.6908710 0.04764066
## 4) lat< 0.6087341 5479 1.3503030 0.03154457 *
## 5) lat>=0.6087341 7554 4.8914500 0.05931534
## 10) sqft_living< 0.1271698 4847 1.6937420 0.05053339 *
## 11) sqft_living>=0.1271698 2707 2.1545680 0.07503978 *
## 3) grade>=0.625 3176 16.6197900 0.11557030
## 6) sqft_living< 0.2939623 2739 6.0694770 0.10085710
## 12) lat< 0.5932122 597 0.4461721 0.06380461 *
## 13) lat>=0.5932122 2142 4.5752560 0.11118410
## 26) long>=0.2761628 1207 0.8365521 0.09567946 *
## 27) long< 0.2761628 935 3.0739860 0.13119910
## 54) sqft_living< 0.2071698 549 0.9026689 0.10712130 *
## 55) sqft_living>=0.2071698 386 1.4003590 0.16544450 *
## 7) sqft_living>=0.2939623 437 6.2410500 0.20778850
## 14) sqft_living< 0.5343396 423 3.8821340 0.19722510
## 28) long>=0.2645349 246 0.9381754 0.15802350 *
## 29) long< 0.2645349 177 2.0404990 0.25170860
## 58) lat< 0.5887888 19 0.1050947 0.11518760 *
## 59) lat>=0.5887888 158 1.5386980 0.26812570 *
## 15) sqft_living>=0.5343396 14 0.8855854 0.52695360 *
node, split, n, deviance, yval: Menunjukkan struktur pohon keputusan dengan split berdasarkan variabel, jumlah sampel pada node (16209), standard deviance (ukuran ketidakseragaman house di node), dan nilai prediksi (yval) untuk node tersebut. Misalnya, node yang membagi house berdasarkan grade < 0.609 memiliki 13905 sampel dengan deviasi 37,09 dan ketepatan prediksi 0.0609.
Neural Network
## a 19-10-1 network with 211 weights
## inputs: date 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
## output(s): price
## options were - linear output units decay=5e-04
weights: Jumlah bobot/neuron pada model, yaitu211.serta19-10-1 network: Menunjukkan anatomi jaringan dengan 19 input variable, 10 neuron di hidden layer, dan 1 outputvariable.
6. Model Evaluation
actual <- test_house$price
predictions_lm <- predict(linmod, test_house)
predictions_tree <- predict(model_tree, test_house)
predictions_nnet <- predict(model_nnet, test_house, type = "raw")
calc_rmse <- function(predictions, actual) {
sqrt(mean((predictions - actual)^2))
}
calc_r_squared <- function(predictions, actual) {
1 - sum((predictions - actual)^2) / sum((actual - mean(actual))^2)
}
# Calculate RMSE
rmse_lm <- calc_rmse(predictions_lm, actual)
rmse_tree <- calc_rmse(predictions_tree, actual)
rmse_nnet <- calc_rmse(predictions_nnet, actual)
# Calculate R-squared
r_squared_lm <- calc_r_squared(predictions_lm, actual)
r_squared_tree <- calc_r_squared(predictions_tree, actual)
r_squared_nnet <- calc_r_squared(predictions_nnet, actual)
# Print results
cat("RMSE for Linear Model: ", rmse_lm, "\n")## RMSE for Linear Model: 0.02739963
## RMSE for Tree Model: 0.02823536
## RMSE for Neural Network: 0.04905994
## R-squared for Linear Model: 0.6880816
## R-squared for Tree Model: 0.6687635
## R-squared for Neural Network: -1.307348e-05
R-Squared
Nilai R-Squared :
Linear Model = 68,8%. Mampu menjelaskan hampir cukup signifikan variasi dalam house. Ini menandakan bahwa model linear cukup efektif dalam memprediksi house price yang digunakan.Decison Tree Model = 66.87%. Decision Tree Juga mampu menjelaskan dengan baik variabel Price dengan menggunakan prediktor lain (KEcuali ID) . Dibandingkan dengan model linear, model pohon keputusan menunjukkan efektivitas yang sama dalam menjelaskan house price yang ada.Neural Network: -1.037e-05. Model ini performanya sangat buruk. Nilai Negatif menjelskan bahwa Neural Network sangat gagal dalam melakukan Preidction.
ANOVA
# Assuming 'house' is your house set and 'train_house' is prepared houseset for training
# Fit all models as linear models for compatibility with ANOVA
linmod <- lm(price ~ . - id, train_house)
model_tree <- glm(price ~ . - id, train_house, family = gaussian(link = "identity"))
model_nnet <- glm(price ~ . - id, train_house, family = gaussian()) # Using glm as an approximation
# Perform ANOVA
anova_results <- anova(linmod, model_tree, model_nnet)
print(anova_results)## Analysis of Variance Table
##
## Model 1: price ~ (id + date + 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) - id
## Model 2: price ~ (id + date + 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) - id
## Model 3: price ~ (id + date + 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) - id
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 16190 10.998
## 2 16190 10.998 0 -6.7502e-14
## 3 16190 10.998 0 0.0000e+00
Semua Model Disimpulkan memiliki Nilai Signifikansi yang sama, padahal seharusnya NEural Network tidak sepowerful itu dfalam data ini.
7. Conclusion
Berdasarkan R-squared beserta RMSE dari tiga model yang diuji,
*
Linear Model = 68,8%. Mampu menjelaskan hampir cukup
signifikan variasi dalam house. Ini menandakan bahwa model linear cukup
efektif dalam memprediksi house price yang digunakan. dengan RMSE atau
error paling rendsah. yaitu 2,7%
Decison Tree Model = 66.87%. Decision Tree Juga mampu menjelaskan dengan baik variabel Price dengan menggunakan prediktor lain (KEcuali ID) . Dibandingkan dengan model linear, model pohon keputusan menunjukkan efektivitas yang sama dalam menjelaskan house price yang ada. Dengan Error Rate 2,82%Neural Network: -1.037e-05. Model ini performanya sangat buruk. Nilai Negatif menjelskan bahwa Neural Network sangat gagal dalam melakukan Preidction.