20240612
不動産情報のスクレイピングと重回帰分析
1、Suumoで売買物件のurlを確保
売買物件の検索条件を決めて、最初のページのurlをコピーする
条件は、3LDK以上の間取り、千代田区・文京区・新宿区エリア
駅から10分以内にもチェックを入れてみる
https://scrapbox.io/files/66691aff797b59001d13a582.png
2、Rで作業の準備
2−1、
まずどこで作業をするか決める
そのために現在のworking directoryを知る
code:R
getwd()
"/Users/munetomoando/Dropbox/R/real-estate"
のように返事が返ってくる。
そこでよければそのまま。変更するなら、real-estate2のように新しいフォルダを作ってから
code:R
setwd(“/Users/munetomoando/real-estate2”)
のように変更する。
2−2、
必要なパッケージを入れる。
code:R
require(rvest)
require(tidyverse)
require(ggthemes)
require(DataExplorer)
require(patchwork)
require(hereR)
require(tmap)
require(tmaptools)
require(stringi)
require(sf)
require(geojsonsf)
rvest (Easily Harvest (Scrape) Web Pages)がスクレイピングのパッケージ
詳しく知りたい人はReference manual: rvest.pdfを読むと良い
3、スクレイピング
下の命令のうちurlの部分のみ1段階目でコピーしたものに入れ替える
code:R
# Scraping data from SUUMO
html <- read_html(base_url)
max_page_num <- read_html(base_url) %>%
html_elements(".pagination-parts") %>%
html_elements("a") %>%
html_text2() %>%
as.integer() %>%
max(na.rm = TRUE) %>%
as.character()
header <- c("name", "price", "address", "line_station", "area", "room_type", "balcony", "year_built")
page_urls <- str_glue(str_c(base_url, "&page={1:", max_page_num, "}"))
scraper <- function(url) {
read_html(url) %>%
html_elements(".dottable--cassette") %>%
html_elements("dd") %>%
html_text2() %>%
matrix(ncol = 8, byrow = TRUE) %>%
as_tibble()
}
dat <- map(page_urls, scraper) %>%
list_rbind() %>%
rename_with(~ header)
https://scrapbox.io/files/66691b0651bef0001dde199b.png
https://scrapbox.io/files/66691b0992f24d001d5e0dae.png
そのままだと価格に「億」といった単位や広さにも坪の表記などもあって比較しにくい
→データを整形する
4、データの整形
code:R
# Data cleansing
dat <- dat %>%
separate(col = price, sep = "億", into = c("hundread_M", "ten_K"), fill = "left") %>%
mutate(hundread_M = as.integer(hundread_M) * 100000000) %>%
mutate(ten_K = str_extract(ten_K, "\\d+")) %>%
mutate(ten_K = as.integer(ten_K) * 10000) %>%
replace_na(replace = list(hundread_M = 0, ten_K = 0)) %>%
mutate(price = hundread_M + ten_K) %>%
separate(line_station, sep = "「", into = c("line", "station")) %>%
separate(station, sep = "」", into = c("station", "walk_from_station")) %>%
mutate(walk_from_station = str_extract(walk_from_station, "\\d+")) %>%
mutate(walk_from_station = as.integer(walk_from_station)) %>%
mutate(area = str_extract(area, "\\d+(?:\\.\\d+)?")) %>%
mutate(area = as.numeric(area)) %>%
mutate(year_built = str_replace(year_built, pattern = "年", replacement = "-")) %>%
mutate(year_built = str_remove(year_built, pattern = "月")) %>%
mutate(year_built = as_date(year_built, format = ("%Y-%m"))) %>%
mutate(age_of_building = as.integer((Sys.Date() - year_built)/365)) %>%
select(-c(hundread_M, ten_K, balcony, room_type))
https://scrapbox.io/files/66691b0e2cd8bf001df11d7d.png
5、必要に応じてリストの書き出し
code:R
write.csv(dat,"dat.csv")
先ほど決めたworking directoryにあるはず。
このファイルをexcelで読み込むと見やすい
6、簡単なグラフを描くことで傾向をみる
予想される傾向として、
広いと高い
新しいと高い
駅から近いと高い
散布図を描いてみる
部屋の広さと価格の関係を散布図に書く
code:R
plot(dat$area,dat$price)
https://scrapbox.io/files/666929018eac25001c1a5ac4.png
https://scrapbox.io/files/6669291c1713cf001cb43fd6.png
右上がりの関係を直線で近似した回帰直線を描く
code:R
plot(dat$area,dat$price)
m<-lm(dat$price~dat$area)
abline(m)
https://scrapbox.io/files/666ed6c594f245001c4eea4b.png
築年数と価格の関係を散布図に書く
おそらく右下がりの関係があるはず
どのように命令すれば良いか?
code:R
plot(dat$age_of_building,dat$price)
7、重回帰分析をやってみる
価格がどのような要因で決まるのかを考えるために、広さ、築年数、駅からの徒歩時間の3つの要因で説明することを考える
被説明変数がprice, 説明変数がarea, age_of_building, walk_from_station
code:R
result=lm(price~area+age_of_building+walk_from_station,data=dat)
summary(result)
8、結果の解釈
9、予測
今回の結果から、広さが100m2で築年数20年で駅から徒歩10分の物件の予想価格は?
10、今回考慮できていない要素は?
千代田区か新宿区かといった区の情報
同じ新宿区でもエリアによって魅力が異なる
近隣にある施設
同じマンションの何階にあるのか
方角
駐車場の有無
管理費や修繕積立金など
リノベーションの有無