Usamos a Data Science para fins pacíficos de comprar uma casa

Para vender algo desnecessário, você deve primeiro comprar algo desnecessário, mas não temos dinheiro.
- Três de Prostokvashino

Introdução


Aconteceu que eu moro no meu apartamento (ou condomínio local) em Montreal. E uma vez, cerca de um ano atrás, fui visitado pelo pensamento de que seria bom mudar para sua própria casa. Eu já tinha alguma experiência na compra e venda de imóveis e, em princípio, seria possível abordar essa questão de maneira simples, como a maioria dos habitantes locais: contratar um corretor de imóveis e deixá-lo lidar com todos os problemas, mas seria chato e desinteressante.


Por isso, decidi abordar esse assunto cientificamente. Há uma tarefa: você precisa descobrir quanto vale o que tenho e onde está o que posso pagar. Bem, uma pergunta passageira - para entender onde o vento sopra. E explorar os cálculos geo-espacial em R .


Em princípio, ficou imediatamente claro que eu não puxaria apenas uma casa de família separada (localmente) se eu quisesse ficar em uma área civilizada e atingir o aquecimento global com um passeio diário de bicicleta. Outra opção local comum é comprar duplex ou triplex, ou seja, casas onde existem dois ou três apartamentos: você mora em um,no resto você cria coelhoso restante é entregue aos inquilinos. Em seguida, outra quantidade desconhecida aparece - a renda do aluguel.


Portanto, eu queria fazer um mapa da cidade com preços de imóveis à venda, preços de aluguel e também ser capaz de acompanhar como tudo isso muda com o tempo.


zillow, , , , , , : https://apciq.ca/en/real-estate-market/. , , .


, , , , , , : 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"))

imagem
, :


imagem


( ):


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$]


, , :


imagem


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


imagem


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


, , , — .
, , — .. , , ( X X ) .


, () , ( , ).


imagem


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.
imagem


, — - .
imagem


, . , ( ) .


“ ” 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 ):


imagem


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



, , .
imagem


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

:


imagem


:


imagem


, , , - — , ( XX ), ..
, 523k$, [ 570k$ — 620k$]



, . , . sf :


, (), , :


aggregate(filter(kijiji_geo_p,bedrooms==2)%>%dplyr::select(price), mtl_p, median, join = st_contains)

imagem


, . . .
, :


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)

imagem
— .


, .
imagem


, .
imagem


, ( /( * ).
.


imagem


( / ).
imagem


, , ( ).


imagem



, R avalie o que, quando e onde comprar ou vender. Mas a vida é uma coisa mais complicada, na aplicação real não há conhecimento suficiente do preço real de venda (em nossa área, isso está disponível apenas para corretores registrados). Portanto, você não deve esperar que as previsões obtidas coincidam com a realidade em 100%. Em geral, quem não escondeu não é minha culpa.


Fonte


Todos os dados e código fonte estão no repositório . Compre nossos elefantes!


Bônus para quem leu até o fim


Mapa interativo com os resultados: http://www.ilmarin.info/re_mtl/


All Articles