要出售不必要的东西,您必须先购买不必要的东西,但我们没有钱。
-Prostokvashino的三人
介绍
碰巧我住在蒙特利尔的公寓(或当地公寓)中。大约一年前,有一次,我想到可以搬到自己的家来。我已经有一些买卖房屋的经验,从原则上讲,可以像大多数当地居民一样简单地解决这个问题:雇用一名房地产经纪人并让他处理所有问题,但这将是无聊且无趣的。
因此,我决定科学地处理此问题。有一项任务:您需要弄清楚我所拥有的价值,以及我能承受的价格。好吧,这是一个过去的问题-了解风在哪里吹。并探索R中的地理空间计算。
原则上,很明显,如果我想留在一个文明的地区并每天骑自行车来应对全球变暖,我不会只在当地(当地)租一间单独的家庭住宅。另一个常见的本地选择是购买双工或三层,即 有两三个公寓的房子:你住在一个,在其余的地方,你会繁殖兔子其余的则交还给房客。然后出现另一个未知数量-租金收入。
因此,我想绘制一张包含待售房屋价格,租金价格的城市地图,并且还能够跟踪所有这些随时间的变化。
zillow之类的服务无法显示出带有估计房屋价格图表的精美图片,因此不适用于我们所在的地区,您只能研究当地房地产经纪人协会的定期报告,该报告定期报告价格上涨,但我无法保持下去:https : //apciq.ca/ zh /房地产市场/。没有人可以在任何地方大规模地分析租金价格,您只需监视留言板,但这是一项相当无聊的任务。
总的来说,我做的第一件事是浏览Internet上关于本地房地产价格的现成开放数据,但我发现几乎没有任何发现,但是我发现本地待售房屋挂牌服务的文档记录不良,无法携带有关现有信息的信息。在市场上:https : //github.com/Froren/realtorca
— , , - requests beatifulsoap, .
— , , , , , ; , .
, openstreet map, .
— , , sqlite , , . , , , , ..
R, tidy-verse, Simple Features for R, — - Geocomputation with R, ggplot2 ( tidyverse), tmap.
, , (join?) .
, , dplyr , :
R , :
library(tidyverse)
library(sf)
property<-read_csv("....") %>%
st_as_sf(coords=c("lng","lat"), crs=4326) %>%
st_transform(crs=32188)
:
neighbourhood<-geojson_sf("quartierreferencehabitation.geojson") %>%
st_transform(32188) %>%
filter(nom_qr %in% c("Saint-Louis", "Milton-Parc")) %>%
summarize() %>%
st_buffer(dist=0)
:
neighbors <- st_join(property, neighbourhood, left=F)
openstreetmap :
osm_neighbourhood<-read_osm(st_bbox(neighbourhood%>%st_transform(4326)), ext=1.5, type="esri")
tmap :
library(tmap)
library(tmaptools)
tm_shape(osm_neighbourhood) + tm_rgb(alpha=0.7)+
tm_shape(neighbourhood) + tm_borders(col='red',alpha=0.8) +
tm_shape(neighbors) + tm_symbols(shape=3,size=0.2,alpha=0.8) +
tm_shape(ref_home) + tm_symbols(col='red',shape=4,size=0.5,alpha=0.8)+
tm_compass(position=c("right", "bottom"))+
tm_scale_bar(position=c("right", "bottom"))

, :

( ):
lm(price ~ parking:area_interior)
:
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 33776.10 22175.97 1.523 0.129
## parkingFALSE:area_interior 444.28 23.54 18.876 <2e-16 ***
## parkingTRUE:area_interior 523.01 19.65 26.614 <2e-16 ***
.. 444$ 33, +523$.
, 443k$, [433k$ — 453k$]
, , :

.. , .. . , . , , , generalized linear model inverse Gaussian distribution , - , :

: 435k$, 95% [419k$ — 450k$] — , .
, , , — .
, , — .. , , ( X X ) .
, () , ( , ).

generalized linear model inverse Gaussian distribution :
glm(price_sqft ~ parking + bedrooms,family=inverse.gaussian(link="log")
:
## (Intercept) parkingTRUE bedrooms2 bedrooms3 bedrooms4
## 503.1981961 1.1215828 0.9720589 0.9662187 0.8325715
.. , 503$, 12% , — 2.8%, 3 — 3.3%, 4 17%, .
430k$ [ 413k$ — 448k$]
. .
- , - , — - , ?
, loess.

, — - .

, . , ( ) .
“ ” Generalized additive model
, . R mgcv gam:
gam(price_sqft ~ parking + bedrooms + s(start_date, k=24), family=inverse.gaussian(link="log"))
, , inverse Gaussian distribution, , , 24 . gam — , k .
( 2 ):

, : 429k [413k-447k], . . , .
, , .

, 60 . , .
, , . , 1, - :
#
selected_mls=17758383
# 2
max_distance=2000
#
plex_pe<-prop_geo_p %>% filter(type!='Apartment', type!='House')
ref<-plex_pe%>%filter(mls==selected_mls)
#
search_roi <- st_buffer(ref, max_distance)
# , -
result <- st_intersection(plex_pe %>% filter(mls!=selected_mls), search_roi) %>%
filter(area_interior<10000, area_interior>100,area_land>0,price<1e7,price>100 )
:

:

, , , - — , ( XX ), ..
, 523k$, [ 570k$ — 620k$]
, . , . sf :
, (), , :
aggregate(filter(kijiji_geo_p,bedrooms==2)%>%dplyr::select(price), mtl_p, median, join = st_contains)

, . . .
, :
gam(price_sqft ~ type + bedrooms + parking + s(x,y,k=100), family=inverse.gaussian(link="log"))
, 100:
pred_rent_whole <- raster(extent(mtl_land),res=100)
crs(pred_rent_whole)<-crs(mtl_land)
my_predict<-function(...) predict(...,type="response")
pred_rent_whole<- raster::interpolate(pred_rent_whole, model_rent_geo_whole, fun=my_predict, xyOnly=T,const=data.frame(bedrooms=2))
#
pred_rent_whole <- mask(pred_rent_whole, mtl_land)
tmap:
tm_shape(osm_mtl)+tm_rgb(alpha=0.6)+
tm_shape(mtl_arr) + tm_borders(alpha=0.8, col='black')+
tm_shape(pred_rent_whole)+tm_raster(style="cont",alpha=0.7, title='$')+ tm_shape(subway_stop_p%>%dplyr::select(stop_name))+tm_symbols(col='blue',alpha=0.2,size=0.03)+
tm_shape(subway_p)+tm_lines(col='blue',alpha=0.2)+
tm_compass(position=c("right", "bottom"))+
tm_scale_bar(position=c("left", "bottom"))+
tm_layout(scale=1.5)

— .
, .

, .

, ( /( * ).
.

( / ).

, , ( ).

, R 评估什么,何时何地买卖。但是生活是一件更复杂的事情,在实际应用中,人们对真实售价的了解不足(在我们地区,这仅适用于注册房地产经纪人)。因此,您不应期望获得的预测与实际情况相符100%。总的来说,没有躲藏的人不是我的错。
资源
所有数据和源代码都在存储库中。买我们的大象!
对于那些读到最后的人有奖励
交互式地图及其结果:http : //www.ilmarin.info/re_mtl/