No post anterior da série, mostrei como fazer um gráfico em um mapa a partir das coordenadas geográficas dos imóveis. Neste post, a grande sacada da série: um mapa interativo em que é possível visualizar diversas dimensões de cada um dos apartamentos, como o preço do aluguel, a proximidade em relação a um ponto de interesse, etc.
Dessa vez, vou usar o data frame que contem todos os apartamentos listados no OLX que eu não mostrei (exatamente) como obter e nem posso compartilhar em respeito ao OLX.
library ( magrittr )
library ( dplyr )
library ( leaflet )
library ( stringr )
library ( RColorBrewer )
# carregar arquivo com apartamentos
df.apt <- read.csv2 ( "/home/sillas/R/Projetos/olx/data/post4-df.apt.csv" , stringsAsFactors = FALSE )
# carregar arquivos com coordenadas
df.coord <- read.csv2 ( "/home/sillas/R/Projetos/olx/data/post4-coordenadas.csv" , stringsAsFactors = FALSE )
head ( df.coord )
## cep
## 1 20550018
## 2 22411030
## 3 20751010
## 4 22081025
## 5 21863000
## 6 22050011
## ender_completo_cep
## 1 Rua São Francisco Xavier, 20550018, São Francisco Xavier, Rio de Janeiro, RJ
## 2 Rua Alberto de Campos, 22411030, Ipanema, Rio de Janeiro, RJ
## 3 Rua Silva Xavier, 20751010, Abolição, Rio de Janeiro, RJ
## 4 Rua Júlio de Castilhos, 22081025, Copacabana, Rio de Janeiro, RJ
## 5 Avenida Brasil, 21863000, Bangu, Rio de Janeiro, RJ
## 6 Rua Domingos Ferreira, 22050011, Copacabana, Rio de Janeiro, RJ
## lat lon
## 1 -22.91664 -43.22569
## 2 -22.98111 -43.20309
## 3 -22.88317 -43.30166
## 4 -22.98421 -43.19162
## 5 -22.85579 -43.49151
## 6 -22.97227 -43.18664
# Juntar arquivos em um só
df.apt $ cep %<>% as.character ()
df.apt %<>% left_join ( df.coord , by = "cep" )
rm ( df.coord )
Além de apartamentos, eu tenho também os dados de quartos para alugar no OLX, que apesar de eu não ter mostrado no blog o procedimento para os conseguir, ele é basicamente o mesmo do que eu mostrei para os apartamentos.
df.quartos <- read.csv2 ( "/home/sillas/R/Projetos/olx/data/post4-quartos.csv" , stringsAsFactors = FALSE )
head ( df.quartos )
## link
## 1 http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/oportunidade-no-engenho-novo-1-quarto-268551811
## 2 http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/alugo-kitnets-268550116
## 3 http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/quarto-equipado-p-vagas-metro-s-pena-250m-todos-os-direitos-266676832
## 4 http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/quarto-para-mocas-que-trabalhem-fora-fica-no-pechincha-r-450-00-mensais-mais-1-2-da-luz-268539233
## 5 http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/para-estudantes-moca-vaga-em-residencia-praca-saens-pena-metro-a-200m-265331246
## 6 http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/kitinetes-em-sepetiba-sem-fiador-nem-deposito-242529872
## titulo
## 1 Oportunidade no Engenho Novo 1 Quarto
## 2 Alugo kitnets
## 3 Quarto Equipado P/Vagas - Metrô S Pena (250m) - Todos os Direitos
## 4 Quarto para moças que trabalhem fora. Fica no Pechincha. R 450,00 mensais mais 1/2 da luz
## 5 Para Estudantes ( Moça) Vaga em Residência : Praça Saens Pena (Metrô a 200m)
## 6 Kitinetes em Sepetiba sem fiador nem depósito
## preco cidade bairro cep
## 1 750 Rio de Janeiro Engenho Novo 20710280
## 2 500 Rio de Janeiro Flamengo 22230040
## 3 330 Rio de Janeiro Tijuca 20511240
## 4 450 Rio de Janeiro Taquara 22770640
## 5 330 Rio de Janeiro Tijuca 20511240
## 6 340 Rio de Janeiro Campo Grande 23070180
## endereco_completo
## 1 Rua Condessa Belmonte, 20710280, Engenho Novo, Rio de Janeiro, RJ
## 2 Rua Fernando Osório, 22230040, Flamengo, Rio de Janeiro, RJ
## 3 Rua Pinto de Figueiredo, 20511240, Tijuca, Rio de Janeiro, RJ
## 4 Rua Oswaldo Lussac, 22770640, Taquara, Rio de Janeiro, RJ
## 5 Rua Pinto de Figueiredo, 20511240, Tijuca, Rio de Janeiro, RJ
## 6 Rua Tapes, 23070180, Campo Grande, Rio de Janeiro, RJ
## lat lon
## 1 -22.90869 -43.27106
## 2 -22.93636 -43.17645
## 3 -22.92492 -43.23611
## 4 -22.93931 -43.36200
## 5 -22.92492 -43.23611
## 6 -22.90321 -43.57095
Já temos tudo o que precisamos para plotar os apartamentos em um mapa. Isso é feito muito facilmente com o pacote leaflet
. Eu comento abaixo o passo-a-passo do código para plotar o mapa.
# Remover os apartamentos sem coordenadas
df.apt %<>% filter ( ! is.na ( lat ))
df.quartos %<>% filter ( ! is.na ( lat ))
# Para distinguir os apartamentos no mapa pelo preço, usamos a função colorBin para criar intervalos de cores
# Qual seria um bom intervalo?
aluguel <- c ( df.apt $ preco , df.quartos $ preco )
aluguel %<>% na.omit ()
quantile ( aluguel , seq ( 0 , 1 , 0.05 ))
## 0% 5% 10% 15% 20% 25%
## 1.0 450.0 580.0 700.0 780.0 850.0
## 30% 35% 40% 45% 50% 55%
## 936.0 1000.0 1100.0 1200.0 1300.0 1495.4
## 60% 65% 70% 75% 80% 85%
## 1600.0 1799.3 1950.0 2100.0 2400.0 2700.0
## 90% 95% 100%
## 3200.0 4498.9 21750000.0
# 90% dos preços estão abaixo de R$3200
intervalo <- seq ( 0 , 3200 , 400 )
# criar palette para colorir os pontos no mapa: verde significa aluguel baixo, vermelho aluguel caro
palette_rev <- rev ( brewer.pal ( length ( intervalo ), "RdYlGn" ))
# O vetor de cores é criado com a função colorBin
vetorCoresApt <- colorBin ( palette_rev , domain = df.apt $ preco , bins = intervalo , na.color = "black" )
vetorCoresQuarto <- colorBin ( palette_rev , domain = df.quartos $ preco , bins = intervalo , na.color = "black" )
# Criar função para exibir texto ao clicar em um imóvel
html_link <- function ( link ) paste0 ( '<a href="' , link , '">Link</a>' )
textoPopup <- function ( data , tipo ) {
# tipo = quarto ou Apartamento
if ( ! tipo %in% c ( "apartamento" , "quarto" )) stop ( "Input errado." )
x = paste0 (
"Tipo do imóvel: " , tipo , "<br>" ,
"Url: " , html_link ( data $ link ), "<br>" ,
"Título: " , data $ titulo , "<br>" ,
"Preço: R$" , data $ preco , "<br>"
)
if ( tipo == "apartamento" ) {
x = paste0 (
x ,
"Condomínio: R$" , data $ taxa_condominio , "<br>" ,
"Quartos: " , data $ qtd_quarto , "<br>" ,
"Área (m²): " , data $ area_condominio , "<br>" ,
"Garagem: " , data $ garagem , "<br>"
)
}
return ( x )
}
# adicionar ruído aleatório para fazer com que pontos em uma mesma rua se dispersem
set.seed ( 123 )
jit <- 40
df.apt $ lat <- jitter ( df.apt $ lat , jit )
df.apt $ lon <- jitter ( df.apt $ lon , jit )
df.quartos $ lat %<>% jitter ( jit )
df.quartos $ lon %<>% jitter ( jit )
# iniciar objeto leaflet
map <- leaflet () %>%
addTiles () %>%
addProviderTiles ( "OpenStreetMap.BlackAndWhite" ) %>%
# coordenadas de um ponto em específico para exemplo
addMarkers ( lng = -43.183447 , lat = -22.913912 ) %>%
# plotar apartamentos
addCircleMarkers ( data = df.apt ,
lng = ~ lon , lat = ~ lat ,
color = ~ vetorCoresApt ( preco ),
opacity = 1.5 ,
popup = textoPopup ( df.apt , "apartamento" ),
# Definir nome do grupo para ser usado na camada
group = "Apartamentos" ) %>%
# plotar quartos
addCircleMarkers ( data = df.quartos ,
lng = ~ lon , lat = ~ lat ,
color = ~ vetorCoresQuarto ( preco ),
opacity = 1.5 ,
popup = textoPopup ( df.quartos , "quarto" ),
group = "Quartos" ) %>%
addLayersControl (
overlayGroups = c ( "Apartamentos" , "Quartos" ),
options = layersControlOptions ( collapsed = FALSE )
) %>%
addLegend ( pal = vetorCoresApt , values = df.apt $ preco )
Clique na imagem abaixo para abrir o produto final:
http://i.imgur.com/dDpeckS.png