1 Rekomendasi Beli - Jual Rumah di Area Jabodetabek

Reza Lutfi Ismail 18 November 2020

1.1 Background

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.

knitr::include_graphics("gambar.png")

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

library(tidyverse)
## 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()
library(GGally)
## Warning: package 'GGally' was built under R version 4.0.3
## Registered S3 method overwritten by 'GGally':
##   method from   
##   +.gg   ggplot2
library(MLmetrics)
## 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)
jabodetabek

berikut 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

1.2 Scraping

pada project ini, saya melakukan scrap pada website lamudi seperti pada gambar dibawah

knitr::include_graphics("scraping.png")

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()

1.3 Exploratory Data Analysis

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

ggcorr(jabodetabek, label = T)
## 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

ggcorr(jabodetabek_no_outlier, label = T)
## 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

1.4 Data Visualization

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)