我们将数据科学用于购房的和平目的

要出售不必要的东西,您必须先购买不必要的东西,但我们没有钱。
-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/


All Articles