<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Paixão por Dados</title>
    <link>http://www.sillasgonzaga.com/tags/mapas/index.xml</link>
    <description>Recent content on Paixão por Dados</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <copyright>&amp;copy; 2016. All rights reserved.</copyright>
    <atom:link href="http://www.sillasgonzaga.com/tags/mapas/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Mapeando a abertura de escolas municipais em São Paulo ao longo dos anos com um GIF</title>
      <link>http://www.sillasgonzaga.com/post/mapeando-a-abertura-de-escolas-municipais-em-sao-paulo-ao-longo-dos-anos/</link>
      <pubDate>Mon, 14 May 2018 00:00:00 +0000</pubDate>
      
      <guid>http://www.sillasgonzaga.com/post/mapeando-a-abertura-de-escolas-municipais-em-sao-paulo-ao-longo-dos-anos/</guid>
      <description>&lt;p&gt;Pessoas adoram mapas. Sempre que puder fazer mapas para representar visualmente uma determinada informação, faça!&lt;/p&gt;
&lt;p&gt;Suponha que você deseja fazer uma visualização da taxa de homicídio por estados brasileiros. Nada te impede de fazer um gráfico de barras, onde cada UF seria representado por uma barra cujo tamanho seria dependente do valor da taxa, mas teria um impacto visual menor em que cada estado estaria colorido de acordo com essa variável.&lt;/p&gt;
&lt;p&gt;Contudo, em algumas situações, um mapa é a única maneira possível de transmitir com clareza uma ideia. Esta é a ideia deste post: mostrar como um mapa pode ser útil para mostrar a evolução das abertudas de escolas municipais na cidade de São Paulo.&lt;/p&gt;
&lt;div id=&#34;coleta-e-limpeza-dos-dados&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Coleta e limpeza dos dados&lt;/h2&gt;
&lt;p&gt;Eu já tive a oportunidade de participar de uma palestra do pessoal da Secretaria Municipal de Educação de São Paulo, onde conheci suas iniciativas de &lt;a href=&#34;http://dados.prefeitura.sp.gov.br/group/educacao&#34;&gt;dados abertos&lt;/a&gt;. Esses projetos são benéficos não só para a população como um todo, por toda a questão da transparência, mas especialmente para quem deseja desenvolver projetos para praticar análise de dados, ganhando assim experiência real para lidar com tarefas de limpeza, manuseio e visualização de dados.&lt;/p&gt;
&lt;p&gt;O dataset de interesse deste post é o &lt;a href=&#34;http://dados.prefeitura.sp.gov.br/dataset/cadastro-de-escolas-municipais-conveniadas-e-privadas&#34;&gt;Cadastro de escolas municipais, conveniadas e privadas&lt;/a&gt;.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# pacotes
library(tidyverse)
library(ggmap)
library(gganimate)
library(lubridate)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# definir locale para lidar com caracteres especiais
lcl &amp;lt;- locale(encoding = &amp;quot;ISO-8859-1&amp;quot;)
df &amp;lt;- read_csv2(&amp;quot;/home/sillas/R/Projetos/paixaopordados-blogdown/data/escolasr34dez2017.csv&amp;quot;,
                locale = lcl)

# dimensoes do dataset
dim(df)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] 6878   53&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O dataset possui 53 colunas, mas só precisamos de realmente 3: as colunas de coordenadas geográficas e a de data de fundação das escolas.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df &amp;lt;- df %&amp;gt;% 
  select(DATA = DT_CRIACAO, LAT = LATITUDE, LON = LONGITUDE)

knitr::kable(head(df))&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr class=&#34;header&#34;&gt;
&lt;th align=&#34;left&#34;&gt;DATA&lt;/th&gt;
&lt;th align=&#34;right&#34;&gt;LAT&lt;/th&gt;
&lt;th align=&#34;right&#34;&gt;LON&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;13-jun-88&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;-23553905&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;-46398452&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;04-jul-88&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;-23489728&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;-46670198&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;05-jul-88&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;-23478312&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;-46427344&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;27-mai-88&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;-23612237&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;-46749888&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;22-jun-88&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;-23486142&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;-46733901&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;07-jun-88&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;-23611929&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;-46750176&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;O output acima revela a necessidade de alguns ajustes de limpeza: converter a coluna &lt;code&gt;DATA&lt;/code&gt; para a classe &lt;code&gt;Date&lt;/code&gt; e dividir as colunas de latitude e longitude por um milhão para obter os valores corretos.&lt;/p&gt;
&lt;p&gt;A transformação da coluna &lt;code&gt;DATA&lt;/code&gt; poderia ser feita por funções automáticas, como a &lt;code&gt;strptime&lt;/code&gt;, mas isso dependeria de algumas configurações internas do seu sistema operacional. Por isso, eu uso uma solução mais manual:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;converter_mes &amp;lt;- function(x){
  nomes &amp;lt;- c(&amp;quot;jan&amp;quot;, &amp;quot;fev&amp;quot;, &amp;quot;mar&amp;quot;, &amp;quot;abr&amp;quot;, &amp;quot;mai&amp;quot;, &amp;quot;jun&amp;quot;,
             &amp;quot;jul&amp;quot;, &amp;quot;ago&amp;quot;, &amp;quot;set&amp;quot;, &amp;quot;out&amp;quot;, &amp;quot;nov&amp;quot;, &amp;quot;dez&amp;quot;)
  
  numeros &amp;lt;- str_pad(1:12, width = 2, pad = &amp;quot;0&amp;quot;)
  
  x &amp;lt;- str_replace_all(x, nomes[1], numeros[1])
  x &amp;lt;- str_replace_all(x, nomes[2], numeros[2])
  x &amp;lt;- str_replace_all(x, nomes[3], numeros[3])
  x &amp;lt;- str_replace_all(x, nomes[4], numeros[4])
  x &amp;lt;- str_replace_all(x, nomes[5], numeros[5])
  x &amp;lt;- str_replace_all(x, nomes[6], numeros[6])
  x &amp;lt;- str_replace_all(x, nomes[7], numeros[7])
  x &amp;lt;- str_replace_all(x, nomes[8], numeros[8])
  x &amp;lt;- str_replace_all(x, nomes[9], numeros[9])
  x &amp;lt;- str_replace_all(x, nomes[10], numeros[10])
  x &amp;lt;- str_replace_all(x, nomes[11], numeros[11])
  x &amp;lt;- str_replace_all(x, nomes[12], numeros[12])
  
  x
  
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Escrita a função, passo para a transformação das colunas:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df &amp;lt;- df %&amp;gt;% 
  mutate(DATA_CLEAN = dmy(converter_mes(DATA)),
         LAT = LAT/1e6,
         LON = LON/1e6
         ) %&amp;gt;% 
  mutate(ANO = year(DATA_CLEAN)) %&amp;gt;% 
  # remover linhas onde LAT ou LON é NA
  na.omit()

summary(df)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##      DATA                LAT              LON           DATA_CLEAN        
##  Length:4576        Min.   :-23.89   Min.   :-47.05   Min.   :1969-01-30  
##  Class :character   1st Qu.:-23.63   1st Qu.:-46.71   1st Qu.:2004-10-24  
##  Mode  :character   Median :-23.57   Median :-46.63   Median :2011-10-23  
##                     Mean   :-23.57   Mean   :-46.60   Mean   :2008-10-17  
##                     3rd Qu.:-23.51   3rd Qu.:-46.48   3rd Qu.:2015-05-08  
##                     Max.   :-22.89   Max.   :-46.37   Max.   :2068-12-12  
##       ANO      
##  Min.   :1969  
##  1st Qu.:2004  
##  Median :2011  
##  Mean   :2008  
##  3rd Qu.:2015  
##  Max.   :2068&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Surgiu um novo erro: a coluna &lt;code&gt;ANO&lt;/code&gt; possui valores acima do ano atual (2018). Isso provavelmente foi causado na conversão de datas como &lt;code&gt;30/08/68&lt;/code&gt;, que o R retornou 2068 ao invés de 1968. Sinceramente, não parei para investigar o motivo disso, até porque é facilmente consertado:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df &amp;lt;- df %&amp;gt;% 
  mutate(ANO = if_else(ANO &amp;gt; year(today()), ANO - 100, ANO))&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&#34;apresentacao-dos-dados&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Apresentação dos dados&lt;/h2&gt;
&lt;p&gt;Primeiramente, qual a distribuição da abertura de novas escolas por ano?&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df %&amp;gt;% 
  count(ANO) %&amp;gt;% 
  ggplot(aes(x = ANO, y = n)) + 
  geom_col(fill = &amp;quot;darkorange1&amp;quot;) + 
  theme_minimal() +
  labs(x = NULL, y = NULL,
       title = &amp;quot;Quantidade de escolas fundadas por ano em São Paulo&amp;quot;) +
  scale_x_continuous(breaks = scales::pretty_breaks(n = 10))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2018-05-14-mapeando-a-abertura-de-escolas-municipais-em-sao-paulo-ao-longo-dos-anos_files/figure-html/unnamed-chunk-6-1.png&#34; width=&#34;864&#34; /&gt;&lt;/p&gt;
&lt;p&gt;A grande maioria das escolas foi criada a partir do ano de 2005. Confesso que esperava uma distribuição mais uniforme.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;criando-o-mapa&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Criando o mapa&lt;/h2&gt;
&lt;p&gt;Existem diversas maneiras de criar um mapa no R. O melhor método depende basicamente do tipo de dados que se tem em mãos. Caso seja necessário, por exemplo, plotar polígonos, áreas e fronteiras, o indicado é o combo do pacote &lt;code&gt;sf&lt;/code&gt; e da função &lt;code&gt;ggplot2::geom_sf&lt;/code&gt;. No nosso caso, como estamos interessados em plotar pontos e já possuímos os dados das coordenadas geográficas, uma das melhores opções é usar o pacote &lt;code&gt;ggmap&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Para criar um mapa, são necessários dois parâmetros iniciais: um ponto central e um nível de zoom, que define a escala do gráfico.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# para o centro de sp, usei as coordenadas da praca da se, que peguei no google maps
praca_se &amp;lt;- c(lon = -46.634123, lat = -23.548408)
# o zoom é calculado pela funcao calc_zoom do ggmap
zoom_sp &amp;lt;- calc_zoom(lon = LON, lat = LAT, data = df)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Apenas com esses dois parâmetros, já é possível plotar um mapa base:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;mapa_sp &amp;lt;- get_map(location = praca_se,
                   zoom = zoom_sp,
                   maptype = &amp;quot;toner-lite&amp;quot;)

ggmap(mapa_sp) +
  # plotar praça da sé
  geom_point(x = praca_se[1], y = praca_se[2], color = &amp;quot;red&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2018-05-14-mapeando-a-abertura-de-escolas-municipais-em-sao-paulo-ao-longo-dos-anos_files/figure-html/unnamed-chunk-8-1.png&#34; width=&#34;864&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Vamos então adicionar um pouco de vida ao gráfico e plotar todas as escolas presentes no dataset:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggmap(mapa_sp) +
  geom_point(data = df, aes(x = LON, y = LAT),
             color = &amp;quot;red&amp;quot;, alpha = 0.1)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2018-05-14-mapeando-a-abertura-de-escolas-municipais-em-sao-paulo-ao-longo-dos-anos_files/figure-html/unnamed-chunk-9-1.png&#34; width=&#34;864&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Aparantemente existe uma concentração de escolas perto, entre outras, da área de Itaquaquecetuba. Uma maneira de visualizar densidade de pontos é por meio do &lt;code&gt;geom_density2d&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggmap(mapa_sp) +
  geom_density2d(data = df, aes(x = LON, y = LAT),
                 color = &amp;quot;red&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2018-05-14-mapeando-a-abertura-de-escolas-municipais-em-sao-paulo-ao-longo-dos-anos_files/figure-html/unnamed-chunk-10-1.png&#34; width=&#34;864&#34; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;acrescentando-o-elemento-tempo-no-mapa&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Acrescentando o elemento tempo no mapa&lt;/h2&gt;
&lt;p&gt;Ainda não mostrei como representar o fator tempo na visualização. Penso que isto pode ser feito de três maneiras: colorir as escolas de acordo com o ano de fundação, separar o gráfico em &lt;em&gt;facets&lt;/em&gt; por ano ou, minha preferida, criar um gif composto por uma série de gráficos sobrepostos. Fazer isso é muito fácil com o auxílio do pacote &lt;code&gt;gganimate&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;Para criar uma sobreposição de gráficos ggplot com o pacote &lt;code&gt;gganimate&lt;/code&gt;, basta setar a &lt;em&gt;aesthetic&lt;/em&gt; especial &lt;code&gt;frame&lt;/code&gt; com o nome da variável que você deseja usar para separar os gráficos em unidades individuais. O argumento &lt;code&gt;cumulative&lt;/code&gt; é usado para que as escolas de anos mais recentes permaneçam no gráfico ao longo dos anos:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;p &amp;lt;- ggmap(mapa_sp) +
  geom_point(data = df,
             aes(x = LON, y = LAT, frame = ANO,
                 cumulative  = TRUE), color = &amp;quot;red&amp;quot;, alpha = 0.1) + 
  labs(x = NULL, y = NULL, title = &amp;quot;Escolas em São Paulo em &amp;quot;)

# o argumento interval define o intervalo de transição do gif em segundos
gganimate(p = p, interval = .075)&lt;/code&gt;&lt;/pre&gt;
&lt;video width=&#34;864&#34;  controls loop&gt;
&lt;source src=&#34;http://www.sillasgonzaga.com/post/2018-05-14-mapeando-a-abertura-de-escolas-municipais-em-sao-paulo-ao-longo-dos-anos_files/figure-html/unnamed-chunk-11.webm&#34; /&gt;
&lt;/video&gt;
&lt;p&gt;Taí! Com o auxílio do gráfico, é possível perceber (pelo menos foi o que vi, vai que é uma miragem) que, de acordo com o dataset, nas primeiras décadas foram priorizadas as áreas mais periféricas de São Paulo. A região mais central aparenta ter recebido mais escolas apenas a partir das últimas duas décadas.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;publicidade&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Publicidade&lt;/h2&gt;
&lt;p&gt;Sou um dos intrutores do curso de &lt;a href=&#34;https://www.ibpad.com.br/produto/ciencia-de-dados-com-r-sp/&#34;&gt;Ciência de Dados do IBPAD&lt;/a&gt;. Temos um dia do curso voltado exclusivamente para visualização de dados, dentre eles mapas! Mais informações de novas turmas &lt;a href=&#34;https://www.ibpad.com.br/produto/ciencia-de-dados-com-r-sp/&#34;&gt;neste link&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Como usar o R para escolher um lugar para morar (4) - Mapa interativo</title>
      <link>http://www.sillasgonzaga.com/post/olx04/</link>
      <pubDate>Fri, 18 Nov 2016 00:00:00 +0000</pubDate>
      
      <guid>http://www.sillasgonzaga.com/post/olx04/</guid>
      <description>&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;library(magrittr)
library(dplyr)
library(leaflet)
library(stringr)
library(RColorBrewer)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# carregar arquivo com apartamentos
df.apt &amp;lt;- read.csv2(&amp;quot;/home/sillas/R/Projetos/olx/data/post4-df.apt.csv&amp;quot;, stringsAsFactors = FALSE)

# carregar arquivos com coordenadas
df.coord &amp;lt;- read.csv2(&amp;quot;/home/sillas/R/Projetos/olx/data/post4-coordenadas.csv&amp;quot;, stringsAsFactors = FALSE)
head(df.coord)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##        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&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# Juntar arquivos em um só
df.apt$cep %&amp;lt;&amp;gt;% as.character()
df.apt %&amp;lt;&amp;gt;% left_join(df.coord, by = &amp;quot;cep&amp;quot;)
rm(df.coord)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Além de apartamentos, eu tenho também os dados de &lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/aluguel/aluguel-de-quartos&#34;&gt;quartos para alugar&lt;/a&gt; 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.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df.quartos &amp;lt;- read.csv2(&amp;quot;/home/sillas/R/Projetos/olx/data/post4-quartos.csv&amp;quot;, stringsAsFactors = FALSE)
head(df.quartos)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##                                                                                                                                                     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&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Já temos tudo o que precisamos para plotar os apartamentos em um mapa. Isso é feito muito facilmente com o pacote &lt;code&gt;leaflet&lt;/code&gt;. Eu comento abaixo o passo-a-passo do código para plotar o mapa.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# Remover os apartamentos sem coordenadas
df.apt %&amp;lt;&amp;gt;% filter(!is.na(lat))
df.quartos %&amp;lt;&amp;gt;% 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 &amp;lt;- c(df.apt$preco, df.quartos$preco)
aluguel %&amp;lt;&amp;gt;% na.omit()
quantile(aluguel, seq(0, 1,  0.05))&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##         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&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# 90% dos preços estão abaixo de R$3200
intervalo &amp;lt;- seq(0, 3200, 400)
# criar palette para colorir os pontos no mapa: verde significa aluguel baixo, vermelho aluguel caro
palette_rev &amp;lt;- rev(brewer.pal(length(intervalo), &amp;quot;RdYlGn&amp;quot;))

# O vetor de cores é criado com a função colorBin
vetorCoresApt &amp;lt;- colorBin(palette_rev, domain = df.apt$preco, bins = intervalo, na.color = &amp;quot;black&amp;quot;)
vetorCoresQuarto &amp;lt;- colorBin(palette_rev, domain = df.quartos$preco, bins = intervalo, na.color = &amp;quot;black&amp;quot;)

# Criar função para exibir texto ao clicar em um imóvel
html_link &amp;lt;- function(link) paste0(&amp;#39;&amp;lt;a href=&amp;quot;&amp;#39;, link, &amp;#39;&amp;quot;&amp;gt;Link&amp;lt;/a&amp;gt;&amp;#39;)

textoPopup &amp;lt;- function(data, tipo) {
  # tipo = quarto ou Apartamento
  if (!tipo %in% c(&amp;quot;apartamento&amp;quot;, &amp;quot;quarto&amp;quot;)) stop(&amp;quot;Input errado.&amp;quot;)
   x = paste0(
     &amp;quot;Tipo do imóvel: &amp;quot;, tipo, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;,
     &amp;quot;Url: &amp;quot;, html_link(data$link), &amp;quot;&amp;lt;br&amp;gt;&amp;quot;,
     &amp;quot;Título: &amp;quot;, data$titulo, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;,
     &amp;quot;Preço: R$&amp;quot;, data$preco, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;
     )
   
   if (tipo == &amp;quot;apartamento&amp;quot;) {
     x = paste0(
       x,
       &amp;quot;Condomínio: R$&amp;quot;, data$taxa_condominio, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;,
       &amp;quot;Quartos: &amp;quot;, data$qtd_quarto, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;,
       &amp;quot;Área (m²): &amp;quot;, data$area_condominio, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;,
       &amp;quot;Garagem: &amp;quot;, data$garagem, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;
     )
   }
   return(x)
}

# adicionar ruído aleatório para fazer com que pontos em uma mesma rua se dispersem
set.seed(123)
jit &amp;lt;- 40
df.apt$lat &amp;lt;- jitter(df.apt$lat, jit)
df.apt$lon &amp;lt;- jitter(df.apt$lon, jit) 

df.quartos$lat %&amp;lt;&amp;gt;% jitter(jit)
df.quartos$lon %&amp;lt;&amp;gt;% jitter(jit)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt; # iniciar objeto leaflet


map &amp;lt;- leaflet() %&amp;gt;%
  addTiles() %&amp;gt;%
  addProviderTiles(&amp;quot;OpenStreetMap.BlackAndWhite&amp;quot;) %&amp;gt;%
  # coordenadas de um ponto em específico para exemplo
  addMarkers(lng = -43.183447, lat = -22.913912) %&amp;gt;% 
  # plotar apartamentos
  addCircleMarkers(data = df.apt,
                   lng = ~lon, lat = ~lat,
                   color = ~vetorCoresApt(preco),
                   opacity = 1.5,
                   popup = textoPopup(df.apt, &amp;quot;apartamento&amp;quot;),
                   # Definir nome do grupo para ser usado na camada
                   group = &amp;quot;Apartamentos&amp;quot;) %&amp;gt;%
  # plotar quartos
  addCircleMarkers(data = df.quartos,
                   lng = ~lon, lat = ~lat,
                   color = ~vetorCoresQuarto(preco),
                   opacity = 1.5,
                   popup = textoPopup(df.quartos, &amp;quot;quarto&amp;quot;),
                   group = &amp;quot;Quartos&amp;quot;) %&amp;gt;%
  addLayersControl(
    overlayGroups = c(&amp;quot;Apartamentos&amp;quot;, &amp;quot;Quartos&amp;quot;),
    options = layersControlOptions(collapsed = FALSE)
  ) %&amp;gt;%
  addLegend(pal = vetorCoresApt, values = df.apt$preco)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Clique na imagem abaixo para abrir o produto final:&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://i.imgur.com/dDpeckS.png&#34; class=&#34;uri&#34;&gt;http://i.imgur.com/dDpeckS.png&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://sillasgonzaga.shinyapps.io/aptsnorio/&#34;&gt;&lt;img src=&#34;http://i.imgur.com/dDpeckS.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>