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
comments powered by Disqus