Reza Lutfi Ismail 18 November 2020
Rumah atau properti merupakan salah satu aset yang diidam-idamkan oleh semua orang. selain digunakan sebagai kebutuhan pribadi yaitu tempat tinggal, banyak yang memanfaatkan rumah sebagai instrument investasi yang nantinya disewa sebagai pasive income.
namun, karena faktor jumlah penduduk melebihi dari kapasitas rumah yang memadai dan juga naiknya index harga properti setiap tahunnya, ini yang menyebabkan terjadinya kenaikan harga rumah yang sangat tinggi. tidak sedikit ditemukan harga rumah yang tidak wajar. pada project kali ini, saya akan membuat sebuah machine yang nantinya dapat diharapkan sebagai referensi pendekatan harga untuk anda dalam membeli atau menjual rumah khususnya di area jabodetabek yang nantinya dapat digunakan bagi individu maupun corporate yang bergerak dibidang property.
karena ketersediaan data di indonesia sangatlah sulit, pada project kali ini saya menggunakan data hasil scraping web dari situs lamudi: https://www.lamudi.co.id/ dengan menggunakan package rvest pada R Studio. berikut merupakan dataset hasil scraping yang akan saya gunakan
## Warning: package 'tidyverse' was built under R version 4.0.3
## -- Attaching packages ------------------------------------------------------------------------------------------------------------------------------------------- tidyverse 1.3.0 --
## v ggplot2 3.3.2 v purrr 0.3.4
## v tibble 3.0.3 v dplyr 1.0.2
## v tidyr 1.1.2 v stringr 1.4.0
## v readr 1.4.0 v forcats 0.5.0
## Warning: package 'ggplot2' was built under R version 4.0.3
## Warning: package 'tidyr' was built under R version 4.0.3
## Warning: package 'readr' was built under R version 4.0.3
## Warning: package 'purrr' was built under R version 4.0.3
## Warning: package 'dplyr' was built under R version 4.0.3
## Warning: package 'stringr' was built under R version 4.0.3
## -- Conflicts ---------------------------------------------------------------------------------------------------------------------------------------------- tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
## Warning: package 'GGally' was built under R version 4.0.3
## Registered S3 method overwritten by 'GGally':
## method from
## +.gg ggplot2
## Warning: package 'MLmetrics' was built under R version 4.0.3
##
## Attaching package: 'MLmetrics'
## The following object is masked from 'package:base':
##
## Recall
jabodetabek <- read.csv("data_input/jabodetabek.csv")
jabodetabek <- jabodetabek %>%
select(-X)
jabodetabekberikut penjelasan dari masing-masing kolom yang terdapat pada dataset: - nama = nama properti - harga = harga properti - luas_bangunan = luas bangunan pada properti (dalam satuan m^2) - luas_tanah = luas tanah pada properti (dalam satuan m^2) - kamar_tidur = jumlah kamar tidur pada properti - kecamatan = letak kecamatan properti - kabupaten = letak kabupaten/kota pada properti
pada project ini, saya melakukan scrap pada website lamudi seperti pada gambar dibawah
lalu saya menggunakan package rvest untuk melakukan scraping
list_data <- list()
for (i in 1:100) {
url = paste0("https://www.lamudi.co.id/banten/tangerang-selatan/house/single-family-house/buy/bedrooms:1,2,3,4,5+/bathrooms:1,2,3,4,5+/price:1000000-3500000000000/land_size:1-9000000/building_size:1-4000000000/?page=", i)
webpage = read_html(url)
nama <- html_nodes(webpage, css = ".ListingCell-KeyInfo-title") %>%
html_text(trim = T)
harga <- html_nodes(webpage, css = ".PriceSection-FirstPrice") %>%
html_text(trim = T)
alamat <- html_nodes(webpage, css = ".ListingCell-KeyInfo-address") %>%
html_text(trim = T)
luas_bangunan <- html_nodes(webpage, css = ".icon-livingsize") %>%
html_text(trim = T)
luas_tanah <- html_nodes(webpage, css = ".icon-land_size") %>%
html_text(trim = T)
kamar_tidur <- html_nodes(webpage, css = ".icon-bedrooms") %>%
html_text(trim = T)
list_data[[i]] <- data.frame(nama = nama, harga = harga, alamat = alamat, luas_bangunan = luas_bangunan, luas_tanah = luas_tanah, kamar_tidur = kamar_tidur)
}
tangerang_selatan <- list_data %>%
bind_rows()pada project ini, tujuan saya terbagi menjadi ada dua yaitu: 1. memberi rekomendasi dalam pembelian rumah 2. memberi rekomendasi dalam penjualan rumah
dimana pada tujuan pertama, saya akan melakukan filtering pada budget yang akan ditentukan oleh si pengguna yang nantinya, output yang diberikan adalah dalam bentuk data visualisasi
sedangkan pada tujuan kedua, saya akan membuat model regressi, dimana target yang dituju adalah harga dan predictor yang digunakan adalah luas_tanah, luas_bangunan dan kamar_tidur
mula-mula, saya melakukan exploratory data yaitu melihat sebaran data dan korelasinya terhadap variabel target
## Warning in ggcorr(jabodetabek, label = T): data in column(s) 'nama',
## 'kecamatan', 'kabupaten' are not numeric and were ignored
dari plot correlation diatas, terlihat bahwa variabel
luas_tanah sama sekali tidak memiliki korelasi terhadap harga. untuk mengetahui lebih lanjut, saya akan menganalisa sebaran data dari masing-masing variabel terhadap variabel harga
jabodetabek %>%
ggplot(aes(x = luas_tanah, y = harga))+
geom_jitter()+
geom_smooth()+
labs(title = "Harga vs Luas Tanah",
x = "Luas Tanah (m^2)",
y = "Harga (Rp)")+
theme_minimal()## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
## Warning: Removed 19 rows containing non-finite values (stat_smooth).
## Warning: Removed 19 rows containing missing values (geom_point).
jabodetabek %>%
ggplot(aes(y = harga, x = luas_bangunan))+
geom_jitter()+
geom_smooth()+
labs(title = "Harga vs Luas Bangunan",
x = "Luas Bangunan (m^2)",
y = "Harga (Rp)")+
theme_minimal()## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
## Warning: Removed 19 rows containing non-finite values (stat_smooth).
## Warning: Removed 19 rows containing missing values (geom_point).
jabodetabek %>%
ggplot(aes(y = harga, x = kamar_tidur))+
geom_jitter()+
geom_smooth()+
labs(title = "Harga vs Jumlah Kamar Tidur",
x = "Jumlah Kamar Tidur",
y = "Harga (Rp)")+
theme_minimal()## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
terlihat bahwa terdapat outlier pada semua variabel. untuk menentukan batas maksimum, saya berkonsultasi dengan seorang ahli teknik sipil dan arsitektur dan didapat batas maksimal wajar dari masing-masing variabel adalah: - luas bangunan < 500 m^2 - luas tanah < 350 m^2 - kamar tidur < 10
jabodetabek_no_outlier <- jabodetabek %>%
filter(luas_bangunan < 500 & luas_tanah < 350 & kamar_tidur < 10)setelah dilakukan filtering untuk menghilangkan outlier, data berkurang sebanyak 159 dari yang awalnya berjumlah 18000
## Warning in ggcorr(jabodetabek_no_outlier, label = T): data in column(s) 'nama',
## 'kecamatan', 'kabupaten' are not numeric and were ignored
terlihat bahwa terdapat kenaikan nilai korelasi untuk semua variabel
jabodetabek_no_outlier %>%
ggplot(aes(x = luas_tanah, y = harga))+
geom_jitter()+
geom_smooth()+
labs(title = "Harga vs Luas Tanah",
x = "Luas Tanah (m^2)",
y = "Harga (Rp)")+
theme_minimal()## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
jabodetabek_no_outlier %>%
ggplot(aes(y = harga, x = luas_bangunan))+
geom_jitter()+
geom_smooth()+
labs(title = "Harga vs Luas Bangunan",
x = "Luas Bangunan (m^2)",
y = "Harga (Rp)")+
theme_minimal()## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
jabodetabek_no_outlier %>%
ggplot(aes(y = harga, x = kamar_tidur))+
geom_jitter()+
geom_smooth()+
labs(title = "Harga vs Jumlah Kamar Tidur",
x = "Jumlah Kamar Tidur",
y = "Harga (Rp)")+
theme_minimal()## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
## Warning: Computation failed in `stat_smooth()`:
## x has insufficient unique values to support 10 knots: reduce k.
terlihat dari sebaran data pada objek data tanpa outlier, data lebih membentuk pola
untuk memberikan rekomendasi dalam membeli rumah, saya akan menyajikannya dalam bentuk aggregasi rerata harga di kecamatan yang nantinya akan disajikan dalam bentuk visualisasi. untuk sementara, saya akan memberikan gambaran secara kasar untuk mencari harga tertinggi berdasarkan kecamatan se-jabodetabek
jabodetabek_no_outlier %>%
group_by(kecamatan, kabupaten) %>%
summarise(rerata_harga = mean(harga)) %>%
drop_na() %>%
arrange(-rerata_harga) %>%
head(10) %>%
ggplot(aes(x = rerata_harga, y = reorder(kecamatan, rerata_harga), fill = kecamatan))+
geom_col()+
labs(title = "Most Expensive Property by Districts in Jabodetabek",
x = "Price (Rp)",
y = "Districts")+
theme_minimal()+
theme(legend.position = "none")## `summarise()` regrouping output by 'kecamatan' (override with `.groups` argument)