<?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/olx/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/olx/index.xml" rel="self" type="application/rss+xml" />
    
    <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>
    
    <item>
      <title>Como usar o R para escolher um lugar para morar (2) - Análise dos dados</title>
      <link>http://www.sillasgonzaga.com/post/olx02/</link>
      <pubDate>Thu, 17 Nov 2016 00:00:00 +0000</pubDate>
      
      <guid>http://www.sillasgonzaga.com/post/olx02/</guid>
      <description>&lt;p&gt;No post anterior, mostramos como obter os dados de apartamentos para aluguel no Rio de Janeiro do site do OLX. Neste post, vamos analisar esses dados e ver se descobrimos algo interessante. Algumas das perguntas que podemos responder com os dados que temos são:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Quais as principais diferenças entre os apartamentos nas cidades do Rio de Janeiro e Niterói?&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Quantos quartos os apartamentos têm em média?&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Quais os bairros com os aluguéis mais caros?&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;A oferta de apartamentos de um bairro influencia o preço médio do aluguel?&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Existe relação entre o preço do aluguel de um imóvel e outras variáveis, como a taxa de condomínio?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ressalto que no post anterior eu mostrei como obter dados de uma amostra de 50 apartamentos (os da primeira página). Aqui, eu estou usando os dados de todos os apartamentos (mais de 10000) do site do OLX que eu não posso disponibilizar por motivos legais (já que eles pertencem ao OLX, que é uma empresa privada).&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;library(magrittr) # não vivo sem esse pacote
library(tidyr) # data cleaning
library(dplyr) # data cleaning
library(ggplot2) # graficos
library(RColorBrewer)
library(stringr)
library(plotly)
azul = &amp;quot;#01a2d9&amp;quot; # definir cor para usar nos gráficos
devtools::source_gist(&amp;quot;ae62d57836c37ebff4a5f7a8dc32eeb7&amp;quot;, filename = &amp;quot;meu_tema.R&amp;quot;) # carregar meu tema personalizado para gráficos no ggplot2&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;load(&amp;quot;/home/sillas/R/Projetos/olx/data/post2-df_apt.rdata&amp;quot;)
df$bairro %&amp;lt;&amp;gt;% str_trim()&lt;/code&gt;&lt;/pre&gt;
&lt;div id=&#34;analise-geral&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Análise geral&lt;/h1&gt;
&lt;div id=&#34;valor-do-aluguel&#34; class=&#34;section level3&#34;&gt;
&lt;h3&gt;Valor do aluguel&lt;/h3&gt;
&lt;p&gt;A melhor forma de mostrar a distribuição do preço do aluguel dos apartamentos no Rio de Janeiro é por meio de um histograma:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggplot(df, aes(preco)) +
  geom_histogram(binwidth = 1000, fill = azul) +
  meu_tema() +
  labs(x = &amp;quot;Aluguel (R$)&amp;quot;, y = &amp;quot;Quantidade de apartamentos&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2016-11-17-olx02_files/figure-html/unnamed-chunk-1-1.png&#34; width=&#34;1152&#34; /&gt;&lt;/p&gt;
&lt;p&gt;O histograma acima ficou muito distorcido devido à presença de alguns imóveis cujo valor do aluguel chega a mais de R$1.500.000. É necessário, portanto, remover as anomalias do dataset. Como existem apenas 34 imóveis (menos de 1% do total) cujo aluguel é superior a R$20000, decidi usar esse valor como limite máximo para a remoção de anomalias.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df2 &amp;lt;- df %&amp;gt;% filter(preco &amp;lt;= 20000)

ggplot(df2, aes(preco)) +
  geom_histogram(breaks = seq(0, 20000, 500), fill = azul) +
  meu_tema() +
  scale_x_continuous(breaks  = seq(0, 20000, 1000)) +
  labs(x = &amp;quot;Aluguel (R$)&amp;quot;, y = &amp;quot;Quantidade de apartamentos&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2016-11-17-olx02_files/figure-html/unnamed-chunk-2-1.png&#34; width=&#34;1152&#34; /&gt;&lt;/p&gt;
&lt;p&gt;O histograma acima mostra que a maior parte dos apartamentos está no intervalo entre R$500,01 a R$1000,00. Contudo, aumentar o número de intervalos do histograma pode nos ajudar a encontrar conclusões ainda melhores. Veja o que encontramos ao reduzir a “espessura” de cada bloco do histograma de 500 para 100:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggplot(df2, aes(preco)) +
  geom_histogram(breaks = seq(0, 20000, 100), fill = azul) +
  meu_tema() +
  coord_cartesian(xlim = c(0, 5000)) +
  scale_x_continuous(breaks  = seq(0, 20000, 500)) +
  labs(x = &amp;quot;Aluguel (R$)&amp;quot;, y = &amp;quot;Quantidade de apartamentos&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2016-11-17-olx02_files/figure-html/unnamed-chunk-3-1.png&#34; width=&#34;1152&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Uma possível conclusão do gráfico acima é que os locadores tendem a precificar seus apartamentos em um valor “fechado” a cada R$500,00, como R$500, R$1000, R$1500, etc. Além disso, o fato de existirem mais apartamentos à esquerda de cada “pico” ao invés de à direita mostra que os proprietários preferem “arredondar” os valores para cima, nunca para baixo. Em outras palavras: a decisão sobre o preço do aluguel de um apartamento é enviesada e não segue uma lógica racional. Novamente, isso é apenas uma conclusão pessoal minha.&lt;/p&gt;
&lt;p&gt;Para ser mais preciso, confira a quantidade numérica de apartamentos agrupados em intervalos de preço de aluguel de R$100:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df2 %&amp;gt;% filter(between(preco, 1900, 3100)) %&amp;gt;% count(cut_interval(preco, length = 100, dig.lab = 5))&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## # A tibble: 12 x 2
##    `cut_interval(preco, length = 100, dig.lab = 5)`     n
##                                              &amp;lt;fctr&amp;gt; &amp;lt;int&amp;gt;
##  1                                      [1900,2000]   679
##  2                                      (2000,2100]   154
##  3                                      (2100,2200]   280
##  4                                      (2200,2300]   223
##  5                                      (2300,2400]   128
##  6                                      (2400,2500]   383
##  7                                      (2500,2600]   113
##  8                                      (2600,2700]    97
##  9                                      (2700,2800]   143
## 10                                      (2800,2900]    82
## 11                                      (2900,3000]   246
## 12                                      (3000,3100]    21&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Temos, por exemplo, que existe um brusco aumento na quantidade de apartamentos no intervalo entre R$2301 a R$2400 e R$2401 a R$2500 e uma brusca redução entre este último intervalo e o seguinte (R$2501 a R$2600.)&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;area-do-condominio&#34; class=&#34;section level3&#34;&gt;
&lt;h3&gt;Área do condomínio&lt;/h3&gt;
&lt;p&gt;De forma semelhante ao preço do aluguel, vamos analisar a distribuição das áreas dos condomínios por meio de um histograma.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggplot(df2, aes(x = area_condominio)) +
  geom_histogram(fill = azul) +
  meu_tema() +
  labs(x = &amp;quot;Área do condomínio (m²)&amp;quot;, y = NULL)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2016-11-17-olx02_files/figure-html/unnamed-chunk-5-1.png&#34; width=&#34;1152&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df2 %&amp;gt;% filter(area_condominio &amp;gt; 7000)&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/alugo-apartamento-campo-grande-254728943
## 2                 http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/locacao-tijuca-209451015
##                            titulo preco         cidade       bairro
## 1 Alugo Apartamento- Campo Grande   850 Rio de Janeiro Campo Grande
## 2                  Locação Tijuca  3800 Rio de Janeiro     Maracanã
##                                            adicional tem_quarto tem_area
## 1           2 quarto | 57150 m² | Condomínio: RS 100       TRUE     TRUE
## 2  3 quarto | 9438 m² | Condomínio: RS 0000 | 1 vaga       TRUE     TRUE
##   tem_taxa tem_garagem qtd_quarto taxa_condominio area_condominio      cep
## 1     TRUE       FALSE          2             100            7150 23080300
## 2     TRUE        TRUE          3               0            9438 20271063
##   garagem
## 1      NA
## 2       1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Novamente, o gráfico foi distorcido devido à presença de anomalias. Existe até apartamento cuja área informada é de &lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/alugo-apartamento-campo-grande-254728943&#34;&gt;mais de 57 mil m²&lt;/a&gt;! Precisamos, novamente, remover essas anomalias dos nossos dados, mas qual seria um bom valor para o limite máximo da área? Podemos responder a essa pergunta analisando os percentis:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;quantile(df2$area_condominio, seq(0, 1, 0.01), na.rm = TRUE)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##      0%      1%      2%      3%      4%      5%      6%      7%      8% 
##    1.00   18.00   22.00   25.00   26.36   29.00   30.00   30.00   31.00 
##      9%     10%     11%     12%     13%     14%     15%     16%     17% 
##   34.00   35.00   36.00   40.00   40.00   40.00   40.00   42.00   44.00 
##     18%     19%     20%     21%     22%     23%     24%     25%     26% 
##   45.00   45.00   46.80   48.00   49.00   50.00   50.00   50.00   50.00 
##     27%     28%     29%     30%     31%     32%     33%     34%     35% 
##   50.00   50.00   52.00   53.00   55.00   55.00   55.00   56.00   57.00 
##     36%     37%     38%     39%     40%     41%     42%     43%     44% 
##   58.00   60.00   60.00   60.00   60.00   60.00   60.00   61.00   63.00 
##     45%     46%     47%     48%     49%     50%     51%     52%     53% 
##   64.00   65.00   65.00   65.00   66.00   68.00   68.00   70.00   70.00 
##     54%     55%     56%     57%     58%     59%     60%     61%     62% 
##   70.00   70.00   70.00   70.00   70.00   72.00   73.00   74.24   75.00 
##     63%     64%     65%     66%     67%     68%     69%     70%     71% 
##   75.00   76.00   78.00   79.00   80.00   80.00   80.00   80.00   80.64 
##     72%     73%     74%     75%     76%     77%     78%     79%     80% 
##   83.00   85.00   85.00   88.00   90.00   90.00   90.00   90.00   94.00 
##     81%     82%     83%     84%     85%     86%     87%     88%     89% 
##   96.00   98.00  100.00  100.00  104.00  110.00  110.00  113.00  120.00 
##     90%     91%     92%     93%     94%     95%     96%     97%     98% 
##  120.00  126.00  130.00  140.00  150.00  160.00  179.00  200.00  230.00 
##     99%    100% 
##  300.00 9438.00&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vemos que apenas 1% dos apartamentos possui área informada superior a 300m². Portanto, esse será o nosso valor máximo para definir as anomalias.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df2 %&amp;lt;&amp;gt;% filter(area_condominio &amp;lt;= 300)

ggplot(df2, aes(x = area_condominio)) +
  geom_histogram(breaks = seq(0, 300, 10), fill = azul) +
  meu_tema() +
  labs(x = &amp;quot;Área do condomínio (m²)&amp;quot;, y = NULL) +
  scale_x_continuous(breaks = seq(0, 300, 50))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2016-11-17-olx02_files/figure-html/unnamed-chunk-7-1.png&#34; width=&#34;1152&#34; /&gt;&lt;/p&gt;
&lt;p&gt;A maior parte dos condomínios têm área entre 41 a 70m².&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;taxa-do-condominio&#34; class=&#34;section level3&#34;&gt;
&lt;h3&gt;Taxa do condomínio&lt;/h3&gt;
&lt;p&gt;De forma semelhante ao preço do aluguel, vamos analisar a distribuição das áreas dos condomínios por meio de um histograma.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;limite &amp;lt;- max(df2$taxa_condominio, na.rm = TRUE)

ggplot(df2, aes(x = taxa_condominio)) +
  geom_histogram(breaks = seq(0, limite, 100), fill = azul) +
  meu_tema() +
  labs(x = &amp;quot;Taxa do condomínio (R$)&amp;quot;, y = NULL) +
  scale_x_continuous(breaks = seq(0, limite, 500))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2016-11-17-olx02_files/figure-html/unnamed-chunk-8-1.png&#34; width=&#34;1152&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# Reduzindo o comprimento dos intervalos
ggplot(df2, aes(x = taxa_condominio)) +
  geom_histogram(breaks = seq(0, limite, 50), fill = azul) +
  meu_tema() +
  labs(x = &amp;quot;Taxa do condomínio (R$)&amp;quot;, y = NULL) +
  scale_x_continuous(breaks = seq(0, limite, 500))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2016-11-17-olx02_files/figure-html/unnamed-chunk-8-2.png&#34; width=&#34;1152&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Nota-se que a taxa de condomínio apresenta o mesmo comportamento que o preço do aluguel.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;quartos&#34; class=&#34;section level3&#34;&gt;
&lt;h3&gt;Quartos&lt;/h3&gt;
&lt;p&gt;Quantos quartos têm em média os apartamentos?&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggplot(df, aes(x = qtd_quarto)) +
  geom_bar(fill = azul) +
  meu_tema() +
  labs(x = &amp;quot;Quartos&amp;quot;, y = &amp;quot;Quantidade de apartamentos&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2016-11-17-olx02_files/figure-html/unnamed-chunk-9-1.png&#34; width=&#34;1152&#34; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;analise-rio-de-janeiro-x-niteroi&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Análise Rio de Janeiro x Niterói&lt;/h1&gt;
&lt;p&gt;Agora, vamos analisar como diferentes variáveis diferem de acordo com a cidade. Primeiramente, quantos bairros diferentes temos no dataset?&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df %&amp;gt;%
  group_by(cidade) %&amp;gt;%
  summarise(qtd_bairros = n_distinct(bairro),
            qtd_apartamentos = n())&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## # A tibble: 2 x 3
##           cidade qtd_bairros qtd_apartamentos
##            &amp;lt;chr&amp;gt;       &amp;lt;int&amp;gt;            &amp;lt;int&amp;gt;
## 1        Niterói          39             1276
## 2 Rio de Janeiro         154             9804&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Temos mais de 154 bairros no Rio de Janeiro, o que mostra que o OLX cobre praticamente toda a cidade.&lt;/p&gt;
&lt;div id=&#34;aluguel&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Aluguel&lt;/h2&gt;
&lt;p&gt;Espera-se que a diferença do aluguel seja diferente para as duas cidades, correto?&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ggplot(df2, aes(x = cidade, y = preco)) + 
  geom_boxplot() +
  meu_tema() +
  labs(x = NULL, y = &amp;quot;Aluguel (R$)&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2016-11-17-olx02_files/figure-html/unnamed-chunk-11-1.png&#34; width=&#34;1152&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Aparentemente, Niteroi e Rio de Janeiro possuem a mesma mediana do preço de aluguel. A quantidade de apartamentos anormalmente caros é mais comum no Rio de Janeiro. Para confirmar isso:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# utilizando o data frame inteiro e não o filtrado
df %&amp;gt;%
  group_by(cidade) %&amp;gt;%
  summarise(aluguel_mediano = median(preco, na.rm = TRUE),
            aluguel_medio = mean(preco, na.rm = TRUE))&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## # A tibble: 2 x 3
##           cidade aluguel_mediano aluguel_medio
##            &amp;lt;chr&amp;gt;           &amp;lt;dbl&amp;gt;         &amp;lt;dbl&amp;gt;
## 1        Niterói            1500      2513.048
## 2 Rio de Janeiro            1500      2864.210&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Muito surpreendetemente, Rio de Janeiro e Niterói apresentam exatamente o mesmo aluguel mediano. A existência de muitas anomalias no Rio de Janeiro fazem com que ela apresente um aluguel médio cerca de R$300 maior que Niterói. Será que essa diferença é estatisticamente significante?&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;aov(preco ~ cidade, data = df) %&amp;gt;% summary()&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##                Df    Sum Sq   Mean Sq F value Pr(&amp;gt;F)
## cidade          1 1.350e+08 135007106    0.19  0.663
## Residuals   10645 7.566e+12 710771131               
## 433 observations deleted due to missingness&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O valor p é superior a 0,05, então não podemos afirmar que há uma diferença significativa nos preços de aluguel entre o Rio de Janeiro e Niterói.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;quartos-1&#34; class=&#34;section level2&#34;&gt;
&lt;h2&gt;Quartos&lt;/h2&gt;
&lt;p&gt;Em relação ao número de quartos:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df2 %&amp;gt;%
  group_by(cidade, qtd_quarto) %&amp;gt;%
  #summarise(n = n()) %&amp;gt;%
  ggplot(aes(x = qtd_quarto, fill = cidade)) +
    geom_bar(position = &amp;quot;fill&amp;quot;) +
    meu_tema() +
    scale_y_continuous(breaks = seq(0, 1, 0.1)) +
    labs(x = &amp;quot;Quartos&amp;quot;, y = &amp;quot;Porcentual&amp;quot;, fill = NULL) +
    theme(legend.position = &amp;quot;bottom&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2016-11-17-olx02_files/figure-html/unnamed-chunk-14-1.png&#34; width=&#34;1152&#34; /&gt;&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df2 %&amp;gt;%
  filter(tem_quarto) %&amp;gt;%
  group_by(cidade, qtd_quarto) %&amp;gt;%
  #summarise(n = n()) %&amp;gt;%
  ggplot(aes(fill = as.character(qtd_quarto), x = cidade)) +
    geom_bar(position = &amp;quot;fill&amp;quot;) +
    meu_tema() +
    scale_fill_manual(values = brewer.pal(5, &amp;quot;Reds&amp;quot;)) +
    scale_y_continuous(breaks = seq(0, 1, 0.1)) +
    labs(x = NULL, y = &amp;quot;Porcentual&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2016-11-17-olx02_files/figure-html/unnamed-chunk-14-2.png&#34; width=&#34;1152&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Os dois gráficos acima mostram que os apartamentos para aluguel do Rio de Janeiro costumam ter menos quartos: Cerca de 30% dos imóveis da cidade possuem apenas 1 quarto. A proporção de apartamentos com 2 ou 3 quartos é maior em Niterói do que na capital do estado.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;analise-de-bairros-do-rio-de-janeiro&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Análise de bairros do Rio de Janeiro&lt;/h1&gt;
&lt;p&gt;Para esta análise, vamos considerar apenas a cidade do Rio de Janeiro.&lt;/p&gt;
&lt;p&gt;Quais os bairros com mais ofertas de apartamento? Quais os com os aluguéis mais caros?&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df.rio &amp;lt;- df %&amp;gt;% filter(cidade == &amp;quot;Rio de Janeiro&amp;quot; &amp;amp; preco &amp;lt; 20000)


temp &amp;lt;- df.rio %&amp;gt;%
  group_by(cidade, bairro) %&amp;gt;%
  summarise(qtd_apt = n(),
            aluguel_mediano = median(preco, na.rm = TRUE),
            area_mediana = median(area_condominio, na.rm = TRUE)) %&amp;gt;%
  arrange(desc(qtd_apt)) %&amp;gt;%
  ungroup 

head(temp, 10)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## # A tibble: 10 x 5
##            cidade                   bairro qtd_apt aluguel_mediano
##             &amp;lt;chr&amp;gt;                    &amp;lt;chr&amp;gt;   &amp;lt;int&amp;gt;           &amp;lt;dbl&amp;gt;
##  1 Rio de Janeiro          Barra da Tijuca     928            2500
##  2 Rio de Janeiro Recreio Dos Bandeirantes     793            1800
##  3 Rio de Janeiro               Copacabana     791            2300
##  4 Rio de Janeiro             Campo Grande     379             850
##  5 Rio de Janeiro              Jacarepaguá     349            1970
##  6 Rio de Janeiro                   Centro     319            1200
##  7 Rio de Janeiro                   Tijuca     279            2000
##  8 Rio de Janeiro                 Botafogo     265            2600
##  9 Rio de Janeiro                 Flamengo     240            2500
## 10 Rio de Janeiro                  Taquara     215            1100
## # ... with 1 more variables: area_mediana &amp;lt;dbl&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;São mais de 150 bairros, então não dá para mostrar todos em uma tabela aqui no post. Talvez uma boa forma de visualizar esses dados seja por meio de um gráfico:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;y &amp;lt;- list(title = &amp;quot;Preço mediano do aluguel (R$)&amp;quot;)
x &amp;lt;- list(title = &amp;quot;Quantidade de apts. para aluguel&amp;quot;)


plot_ly(temp, x = ~qtd_apt, y = ~aluguel_mediano, size = ~area_mediana,
        text = ~paste(&amp;quot;Bairro: &amp;quot;, bairro)) %&amp;gt;%
  layout(title = &amp;quot;Análise de apartamentos para alugar por bairro&amp;quot;, xaxis = x, yaxis = y) -&amp;gt; p&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Clique na imagem abaixo para conferir o gráfico interativo.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://plot.ly/~sillas.gonzaga/1/analise-de-apartamentos-para-alugar-por-bairro/&#34;&gt;&lt;img src=&#34;http://i.imgur.com/vc9MMhr.png&#34;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Conforme mostra o gráfico acima, não dá para dizer que existe relação entre a quantidade de apartamentos disponíveis para alugar em um bairro e o preço do aluguel.&lt;/p&gt;
&lt;p&gt;Vamos então mostrar um boxplot com a distribuição de preço de aluguel para os 20 bairros com mais oferta de apartamentos.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;temp &amp;lt;- df.rio %&amp;gt;%
  group_by(cidade, bairro) %&amp;gt;%
  summarise(qtd_imoveis = n(),
            aluguel_mediano = median(preco, na.rm = TRUE)) %&amp;gt;%
  arrange(desc(qtd_imoveis)) %&amp;gt;%
  ungroup %&amp;gt;%
  top_n(20, qtd_imoveis)

df.rio %&amp;gt;%
  filter(bairro %in% temp$bairro) %&amp;gt;%
  ggplot(aes(x = reorder(bairro, preco, FUN = median), y = preco)) +
    geom_boxplot() + geom_point(color = &amp;quot;blue&amp;quot;, alpha = 5/100) +
    meu_tema(axis.text.size = 9) +
    coord_flip() +
    scale_y_continuous(breaks = seq(0, 20000, 1000)) +
    theme(legend.position = &amp;quot;bottom&amp;quot;) +
    labs(x = NULL, y = &amp;quot;Aluguel (R$)&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2016-11-17-olx02_files/figure-html/unnamed-chunk-17-1.png&#34; width=&#34;1152&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Com o gráfico acima, aprendemos que:&lt;br /&gt;
* O aluguel mediano de um apartamento no Leblon é maior que R$4000,00. Contudo, ainda assim é possível encontrar apartamentos cujo valor é o mesmo do mediano encontrado em bairros menos ricos;&lt;br /&gt;
* Existem apenas três bairros (dentre os 20 mais populares) onde o preço mediano do aluguel é menor que R$1000,00;&lt;br /&gt;
* O bairro onde existe o maior número de anomalias é a Barra da Tijuca. Isso significa que nesse bairro, o valor mediano do aluguel não é um dado muito útil por causa da má-distribuição dos valores e da quantidade de pontos fora da curva.&lt;/p&gt;
&lt;p&gt;Em relação à área dos apartamentos, temos:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df.rio %&amp;gt;%
  filter(bairro %in% temp$bairro &amp;amp; area_condominio &amp;lt; 300) %&amp;gt;%
  ggplot(aes(x = reorder(bairro, area_condominio, FUN = median), y = area_condominio)) +
    geom_boxplot() + geom_point(color = &amp;quot;blue&amp;quot;, alpha = 5/100) +
    meu_tema(axis.text.size = 9) +
    coord_flip() +
    scale_y_continuous(breaks = seq(0, 300, 50)) +
    theme(legend.position = &amp;quot;bottom&amp;quot;) +
    labs(x = NULL, y = &amp;quot;Aluguel (R$)&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2016-11-17-olx02_files/figure-html/unnamed-chunk-18-1.png&#34; width=&#34;1152&#34; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;analise-de-regressao-o-que-determina-o-preco-de-um-aluguel&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Análise de regressão: O que determina o preço de um aluguel?&lt;/h1&gt;
&lt;p&gt;Já que temos dados tão legais em mãos, por que não levar a análise a um passo adiante e aplicar uma técnica estatística para tentar explicar o preço do aluguel de um apartamento por meio de variáveis independentes?&lt;/p&gt;
&lt;p&gt;Para não ter a complicação de usar uma variável categórica com vários valores diferentes (bairro) em um modelo de regressão, eu construí o modelo apenas para os apartamentos do Centro do Rio de Janeiro.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;temp &amp;lt;- df2 %&amp;gt;% select(preco, cidade, bairro, qtd_quarto, taxa_condominio, area_condominio)
temp %&amp;lt;&amp;gt;% filter(cidade == &amp;quot;Rio de Janeiro&amp;quot; &amp;amp; bairro == &amp;quot;Centro&amp;quot;)



summary(temp)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##      preco         cidade             bairro            qtd_quarto   
##  Min.   :   1   Length:271         Length:271         Min.   :1.000  
##  1st Qu.:1000   Class :character   Class :character   1st Qu.:1.000  
##  Median :1200   Mode  :character   Mode  :character   Median :1.000  
##  Mean   :1376                                         Mean   :1.232  
##  3rd Qu.:1600                                         3rd Qu.:1.000  
##  Max.   :5000                                         Max.   :3.000  
##                                                                      
##  taxa_condominio  area_condominio
##  Min.   :   0.0   Min.   :  1.0  
##  1st Qu.: 300.0   1st Qu.: 30.0  
##  Median : 380.0   Median : 38.0  
##  Mean   : 384.1   Mean   : 42.3  
##  3rd Qu.: 452.0   3rd Qu.: 50.0  
##  Max.   :1500.0   Max.   :118.0  
##  NA&amp;#39;s   :24&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;z &amp;lt;- lm(preco ~ qtd_quarto + taxa_condominio + area_condominio, data = temp)
summary(z)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## 
## Call:
## lm(formula = preco ~ qtd_quarto + taxa_condominio + area_condominio, 
##     data = temp)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -1223.54  -251.40   -48.26   195.50  2010.33 
## 
## Coefficients:
##                  Estimate Std. Error t value Pr(&amp;gt;|t|)    
## (Intercept)     386.16410   81.99771   4.709 4.18e-06 ***
## qtd_quarto      273.17100   99.11117   2.756  0.00629 ** 
## taxa_condominio   0.02677    0.17921   0.149  0.88136    
## area_condominio  15.01647    2.49506   6.018 6.45e-09 ***
## ---
## Signif. codes:  0 &amp;#39;***&amp;#39; 0.001 &amp;#39;**&amp;#39; 0.01 &amp;#39;*&amp;#39; 0.05 &amp;#39;.&amp;#39; 0.1 &amp;#39; &amp;#39; 1
## 
## Residual standard error: 439.8 on 243 degrees of freedom
##   (24 observations deleted due to missingness)
## Multiple R-squared:  0.4838, Adjusted R-squared:  0.4774 
## F-statistic:  75.9 on 3 and 243 DF,  p-value: &amp;lt; 2.2e-16&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alguns comentários sobre o resultado da regressão:&lt;br /&gt;
* O valor do R² é de 0,4838, não muito alto;&lt;br /&gt;
* A taxa do condomínio, surpreendentemente, não influencia grandemente o valor do aluguel.&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&#34;consideracoes-finais&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Considerações finais&lt;/h1&gt;
&lt;p&gt;Ainda assim, não respondemos a principal pergunta desta série de posts: como escolho um lugar para morar a partir desses dados? Com as análises acima, conseguimos descobrir algumas coisas interessantes sobre o Rio de Janeiro, mas isso não nos ajuda muito a escolher um lugar para morar. Isso vai ficar para os próximos dois posts.&lt;/p&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Como usar o R para escolher um lugar para morar (3) - Converter CEP em coordenadas geográficas</title>
      <link>http://www.sillasgonzaga.com/post/olx03/</link>
      <pubDate>Thu, 17 Nov 2016 00:00:00 +0000</pubDate>
      
      <guid>http://www.sillasgonzaga.com/post/olx03/</guid>
      <description>&lt;p&gt;No primeiro e segundo post desta série, mostrei como obter dados de apartamentos para alugar a partir do site da OLX e analisá-los, mas ainda não temos a resposta definita para a pergunta que motivou esta série: Como o R pode ajudar a escolher um lugar para morar?&lt;/p&gt;
&lt;p&gt;Uma boa ideia seria plotar os imóveis em um mapa, não? No terceiro post da série, mostrarei como fazer isso, além de como extrair os CEPs dos imóveis (novamente por web scraping) e converter os CEPs para endereços, que serão usados para obter as coordenadas geográficas dos apartamentos. É mostrado no final um simples gráfico feito com o pacote &lt;code&gt;ggmap&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;library(magrittr)
library(dplyr)
library(rvest)
library(curl)
library(readr)
library(stringr)
library(ggmap)&lt;/code&gt;&lt;/pre&gt;
&lt;div id=&#34;extrair-cep-do-imovel-com-web-scraping&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Extrair CEP do imóvel com web scraping&lt;/h1&gt;
&lt;p&gt;Para plotar os imóveis em um mapa, precisamos de suas coordenadas geográficas. Tais dados podem ser obtidos com a função &lt;code&gt;geocode&lt;/code&gt; do pacote &lt;code&gt;ggmap&lt;/code&gt;. Essa função aceita um endereço (ou parte de um) como input e retorna a latitude e a longitude. Por exemplo, para o CEP do estádio Maracanã, no Rio de Janeiro:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;geocode(&amp;quot;20271110&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Contudo, você deve se lembrar que não possuímos até o momento nenhum dado sobre o endereço dos imóveis. Vamos dar uma olhada novamente nos dados gerados no primeiro post:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df &amp;lt;- read.csv2(&amp;quot;/home/sillas/R/Projetos/olx/data/post1-df-olx.csv&amp;quot;, stringsAsFactors = FALSE)
head(df)&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/excelente-quarto-e-sala-mobiliado-267207757
## 2                         http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/assuncao-450-313-238033660
## 3       http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/excelente-apartamento-no-pechincha-269066615
## 4                  http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-em-botafogo-257852884
## 5 http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apto-2-quadras-da-praia-primeira-locacao-265081945
## 6        http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/excelente-apartamento-pe-na-areia-196737787
##                                      titulo preco         cidade
## 1         Excelente quarto e sala mobiliado  1600 Rio de Janeiro
## 2                         Assunção, 450/313  2300 Rio de Janeiro
## 3        Excelente apartamento no pechincha  1100 Rio de Janeiro
## 4                   Apartamento em Botafogo  4900 Rio de Janeiro
## 5 Apto 2 quadras da praia. Primeira locação   800 Rio de Janeiro
## 6         Excelente apartamento pé na areia  2600 Rio de Janeiro
##                      bairro
## 1                    Centro
## 2                  Botafogo
## 3                 Pechincha
## 4                  Botafogo
## 5  Recreio Dos Bandeirantes
## 6                Copacabana
##                                            adicional tem_quarto tem_area
## 1              1 quarto | 40 m² | Condomínio: RS 370       TRUE     TRUE
## 2     1 quarto | 45 m² | Condomínio: RS 375 | 1 vaga       TRUE     TRUE
## 3     1 quarto | 40 m² | Condomínio: RS 480 | 1 vaga       TRUE     TRUE
## 4  4 quarto | 120 m² | Condomínio: RS 1200 | 2 vagas       TRUE     TRUE
## 5               1 quarto | 35 m² | Condomínio: RS 50       TRUE     TRUE
## 6              2 quarto | 62 m² | Condomínio: RS 950       TRUE     TRUE
##   tem_taxa tem_garagem qtd_quarto taxa_condominio area_condominio garagem
## 1     TRUE       FALSE          1             370              40      NA
## 2     TRUE        TRUE          1             375              45       1
## 3     TRUE        TRUE          1             480              40       1
## 4     TRUE        TRUE          4            1200             120       2
## 5     TRUE       FALSE          1              50              35      NA
## 6     TRUE       FALSE          2             950              62      NA&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Como eu disse, não temos nenhum dado sobre a localização do imóvel - além do bairro, o que é muito pouco. Isso acontece porque a página que lista os apartamentos não informa esses dados, como se vê na imagem abaixo:&lt;/p&gt;
&lt;div class=&#34;figure&#34;&gt;
&lt;img src=&#34;http://i.imgur.com/4mXiS3M.png&#34; /&gt;

&lt;/div&gt;
&lt;p&gt;Dentro da página do imóvel, já conseguimos ter pelo menos seu CEP:&lt;/p&gt;
&lt;div class=&#34;figure&#34;&gt;
&lt;img src=&#34;http://i.imgur.com/3XF4XS9.png&#34; /&gt;

&lt;/div&gt;
&lt;p&gt;Ou seja: para extrair o CEP do imóvel, é necessário entrar em sua página! Isso aumenta a complexidade do código em n vezes porque agora teremos de fazer o scraping não de 245 páginas mas sim de mais de 10000.&lt;/p&gt;
&lt;p&gt;Para extrair o CEP, a lógica é a mesma da mostrada no primeiro post desta série. Como vamos extrair apenas este único dado da página, vou mostrar o passo-a-passo do scraping mais detalhadamente.&lt;/p&gt;
&lt;p&gt;Primeiramente, nós precisamos saber qual é o elemento HTML (chamado de tag) que identifica o CEP no código fonte da página. Não precisa ser expert em HTML para saber isso (eu mesmo não sei nada), basta utilizar as ferramentas do Firefox ou do Chrome para inspecionar a página e descobrir a tag do elemento desejado.&lt;/p&gt;
&lt;p&gt;Abra &lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/excelente-quarto-e-sala-mobiliado-267207757&#34;&gt;esta página&lt;/a&gt;, clique com o botão direito no CEP e clique em Inspecionar elemento (ou algo semelhante). Será aberto um menu na parte inferior do browser com o código fonte da página. Passe o mouse nas diferentes linhas e veja os elementos que correspondem às tags do código.&lt;/p&gt;
&lt;div class=&#34;figure&#34;&gt;
&lt;img src=&#34;http://i.imgur.com/IuhcpEJ.png&#34; /&gt;

&lt;/div&gt;
&lt;p&gt;Na imagem acima, veja que o CEP está dentro do bloco (não sei se é assim mesmo que isso é chamado) da localização do apartamento, cuja tag é indicada pelo string &lt;code&gt;OLXad-location-map mb20px&lt;/code&gt;. Na verdade, após fazer alguns testes, descobri que usamos o string &lt;code&gt;.OLXad-location-map&lt;/code&gt; para localizar a tag da localização do imóvel. Como não conheço HTML, não sei explicar o porquê disso acontecer. Web scraping tem muito de tentar diversos inputs até conseguir o resultado desejado.&lt;/p&gt;
&lt;p&gt;Vamos usar essa informação em nosso código:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;url &amp;lt;- &amp;quot;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/excelente-quarto-e-sala-mobiliado-267207757&amp;quot;
mycurl &amp;lt;- curl(url, handle = curl::new_handle(&amp;quot;useragent&amp;quot; = &amp;quot;Mozilla/5.0&amp;quot;))
url &amp;lt;- read_html(mycurl, encoding = &amp;quot;ISO8859-1&amp;quot;)
# Localizando a tag de localização do imóvel
x &amp;lt;- url %&amp;gt;% html_nodes(&amp;quot;.OLXad-location-map&amp;quot;)
# Imprimir o elemento x em formato de texto:
print(x)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## {xml_nodeset (0)}&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;html_text(x)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## character(0)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Podemos ver que, conforme o esperado, o CEP está dentro do bloco de localização. Só isso já seria necessário para extrair o CEP, mas nós conseguimos melhorar isso para facilitar o processo de data cleaning posteriormente.&lt;/p&gt;
&lt;p&gt;Perceba que dentro da tag &lt;code&gt;OLXad-location-map mb20px&lt;/code&gt;, existe uma subtag &lt;code&gt;p&lt;/code&gt; que identifica apenas o CEP do imóvel.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;url %&amp;gt;% html_nodes(&amp;quot;.OLXad-location-map&amp;quot;) %&amp;gt;% html_nodes(&amp;quot;p&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## {xml_nodeset (0)}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O output gerado é da classe &lt;code&gt;xml_nodeset&lt;/code&gt; e tem três elementos: o município, o CEP e o bairro. Estamos interessados apenas no CEP, portanto:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;#html_text serve para converter um objeto xml_nodeset em texto
x &amp;lt;- url %&amp;gt;% html_nodes(&amp;quot;.OLXad-location-map&amp;quot;) %&amp;gt;% html_nodes(&amp;quot;p&amp;quot;) %&amp;gt;% .[2] %&amp;gt;% html_text()
x&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## character(0)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Agora precisamos fazer um pouco de data cleaning. É necessário apenas remover o caractere &lt;code&gt;-&lt;/code&gt; e extrair os algarismos do string. Fazer isso é muito fácil graças ao pacote &lt;code&gt;stringr&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;x %&amp;lt;&amp;gt;% str_replace_all(&amp;quot;-&amp;quot;, &amp;quot;&amp;quot;)
x&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## character(0)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;x %&amp;lt;&amp;gt;% parse_number()
x&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## numeric(0)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finalmente, conseguimos extrair o CEP do imóvel. Vamos então aplicar esse mesmo procedimento para os outros apartamentos do data frame. Para automatizar esse processo, criei a função &lt;code&gt;extrairCEP()&lt;/code&gt;, que usa uma outra função chamada &lt;code&gt;limparString()&lt;/code&gt;. Os códigos de ambas são mostrados abaixo.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# definir função para limpar strings coletadas
limparString &amp;lt;- function(x) {
  # x = string coletado do olx
  x %&amp;lt;&amp;gt;% str_replace_all(&amp;quot;[\t]&amp;quot;, &amp;quot;&amp;quot;)
  x %&amp;lt;&amp;gt;% str_replace_all(&amp;quot;[\n]&amp;quot;, &amp;quot;&amp;quot;)
  x %&amp;lt;&amp;gt;% str_replace_all(&amp;quot;Apartamentos&amp;quot;, &amp;quot;&amp;quot;)
  x %&amp;lt;&amp;gt;% str_replace_all(&amp;quot;Anúncio Profissional&amp;quot;, &amp;quot;&amp;quot;)
  x %&amp;lt;&amp;gt;% str_replace(&amp;quot;-&amp;quot;, &amp;quot;&amp;quot;)
  x %&amp;lt;&amp;gt;% str_replace_all(&amp;quot;[R$]&amp;quot;, &amp;quot;&amp;quot;)
  x %&amp;lt;&amp;gt;% str_replace_all(&amp;quot;[.]&amp;quot;, &amp;quot;&amp;quot;)
  x %&amp;lt;&amp;gt;% str_trim()
  return(x)
}


extrairCEP &amp;lt;- function(url) {
  # url = url de um quarto
  mycurl &amp;lt;- curl(url, handle = curl::new_handle(&amp;quot;useragent&amp;quot; = &amp;quot;Mozilla/5.0&amp;quot;))
  url &amp;lt;- read_html(mycurl, encoding = &amp;quot;ISO8859-1&amp;quot;)
  #url &amp;lt;- read_html(url, encoding = &amp;quot;ISO8859-1&amp;quot;)
  #url &amp;lt;- html_nodes(url, &amp;quot;.OLXad-location-map&amp;quot;) deprecated
  
  # if clause para pegar casos em que o node id é diferente
  if (length(html_nodes(url, &amp;quot;.OLXad-location-map&amp;quot;)) &amp;gt; 0) {
    url %&amp;lt;&amp;gt;% html_nodes(&amp;quot;.OLXad-location-map&amp;quot;)
  } else {
    url %&amp;lt;&amp;gt;% html_nodes(&amp;quot;.OLXad-location&amp;quot;)
  }
  
  url &amp;lt;- html_nodes(url, &amp;quot;p&amp;quot;)
  url &amp;lt;- url[2]
  url &amp;lt;- html_text(url)
  cep &amp;lt;- limparString(url)
  cep &amp;lt;- readr::parse_number(cep)
  return(cep)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Para algumas páginas, a tag de identificação do bloco da localização do apartamento não é &lt;code&gt;.OLXad-location-map&lt;/code&gt; mas sim &lt;code&gt;.OLXad-location&lt;/code&gt;, por isso a necessidade da if clause na função &lt;code&gt;extrairCEP()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Outro problema é que, em alguns casos, o CEP do imóvel não é informado, fazendo necessário usar a função &lt;code&gt;tryCatch()&lt;/code&gt; para retornar &lt;code&gt;NA&lt;/code&gt; em caso de erro:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;system.time(ceps &amp;lt;- unname(sapply(df$link, function(i) tryCatch({extrairCEP(i)}, error = function(e){NA}))))&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##   usuário   sistema decorrido 
##    10.968     0.360    31.447&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;ceps&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [[1]]
## numeric(0)
## 
## [[2]]
## numeric(0)
## 
## [[3]]
## numeric(0)
## 
## [[4]]
## numeric(0)
## 
## [[5]]
## numeric(0)
## 
## [[6]]
## numeric(0)
## 
## [[7]]
## numeric(0)
## 
## [[8]]
## numeric(0)
## 
## [[9]]
## numeric(0)
## 
## [[10]]
## numeric(0)
## 
## [[11]]
## numeric(0)
## 
## [[12]]
## numeric(0)
## 
## [[13]]
## numeric(0)
## 
## [[14]]
## numeric(0)
## 
## [[15]]
## numeric(0)
## 
## [[16]]
## numeric(0)
## 
## [[17]]
## numeric(0)
## 
## [[18]]
## numeric(0)
## 
## [[19]]
## numeric(0)
## 
## [[20]]
## numeric(0)
## 
## [[21]]
## numeric(0)
## 
## [[22]]
## [1] 22471120
## 
## [[23]]
## numeric(0)
## 
## [[24]]
## numeric(0)
## 
## [[25]]
## numeric(0)
## 
## [[26]]
## numeric(0)
## 
## [[27]]
## numeric(0)
## 
## [[28]]
## numeric(0)
## 
## [[29]]
## numeric(0)
## 
## [[30]]
## numeric(0)
## 
## [[31]]
## numeric(0)
## 
## [[32]]
## numeric(0)
## 
## [[33]]
## numeric(0)
## 
## [[34]]
## numeric(0)
## 
## [[35]]
## numeric(0)
## 
## [[36]]
## numeric(0)
## 
## [[37]]
## numeric(0)
## 
## [[38]]
## numeric(0)
## 
## [[39]]
## numeric(0)
## 
## [[40]]
## numeric(0)
## 
## [[41]]
## numeric(0)
## 
## [[42]]
## numeric(0)
## 
## [[43]]
## numeric(0)
## 
## [[44]]
## numeric(0)
## 
## [[45]]
## numeric(0)
## 
## [[46]]
## numeric(0)
## 
## [[47]]
## numeric(0)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# incorporar ao data frame
df$cep &amp;lt;- ceps&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&#34;obter-endereco-a-partir-do-cep&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Obter endereço a partir do CEP&lt;/h1&gt;
&lt;p&gt;Como eu mostrei no início do post, seria possível conseguir as coordenadas do imóvel (ou pelo menos da rua dele) a partir do CEP. Entretanto, em alguns testes que eu fiz, percebi que em alguns casos a acurácia não era muito grande. Sabemos que quanto mais dados de endereço o Google tiver, mais precisas serão as coordenadas. Por isso, é importante ter não somente o CEP mas também o nome da rua, bairro, cidade e estado.&lt;/p&gt;
&lt;p&gt;Para conseguir esses dados a partir do CEP, usei uma função criada e postada no grupo &lt;a href=&#34;https://www.facebook.com/groups/1410023525939155/&#34;&gt;R Brasil - Programadores&lt;/a&gt; pelo membro José de Jesus Filho. Segue seu código:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;postal&amp;lt;-function(cep){
  # converter cep em endereço
  library(httr)
  l&amp;lt;-list()
  for(i in seq_along(cep)){
    cep &amp;lt;- stringr::str_replace(cep,&amp;quot;\\D&amp;quot;,&amp;quot;&amp;quot;)
    cep &amp;lt;- stringr::str_pad(cep,8,side=&amp;quot;left&amp;quot;,pad=&amp;quot;0&amp;quot;)
    cep &amp;lt;- as.character(cep)
    url &amp;lt;- paste0(&amp;quot;http://correiosapi.apphb.com/cep/&amp;quot;,cep)
    a &amp;lt;- GET(url[i])
    b &amp;lt;- content(a,as=&amp;quot;parsed&amp;quot;)
    l[[i]] &amp;lt;- b
  }
  x &amp;lt;- as.data.frame(do.call(&amp;quot;rbind&amp;quot;,l))
  for (col in 1:ncol(x)) {x[, col] &amp;lt;- as.character(x[, col])}
  return(x)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Por exemplo, continuando com o CEP do Maracanã, a função &lt;code&gt;postal()&lt;/code&gt; retorna:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;postal(20271110)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##                    message
## 1 Endereço não encontrado!&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Como se vê, a função funciona muito bem, então podemos a aplicar para os outros imóveis:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;system.time(df.endereco &amp;lt;- postal(df$cep))
# é criado um data frame. 
head(df.endereco)
# vamos juntar as colunas do data frame de endereços em uma só
# primeiro &lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;É necessário juntar todas as colunas do data frame de endereços em uma só. Para juntar diferentes strings com um separador em comum (vírgula, por exemplo), é recomendável usar a função &lt;code&gt;str_c()&lt;/code&gt; do pacote &lt;code&gt;stringr&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;df.endereco$endereco_completo &amp;lt;- df.endereco %$% str_c(logradouro, cep, bairro, cidade, estado, sep = &amp;quot;, &amp;quot;)
df.endereco$endereco_completo &amp;lt;- df.endereco %$% str_c(tipoDeLogradouro, endereco_completo, sep = &amp;quot; &amp;quot;)
# exemplo de como ficou:
df.endereco$endereco_completo[1:5]&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;## [1] &amp;quot;Rua Riachuelo, 20230010, Centro, Rio de Janeiro, RJ&amp;quot;                       
## [2] &amp;quot;Rua Assunção, 22251030, Botafogo, Rio de Janeiro, RJ&amp;quot;                      
## [3] &amp;quot;Estrada do Tindiba, 22740360, Pechincha, Rio de Janeiro, RJ&amp;quot;               
## [4] &amp;quot;Rua Marquês de Olinda, 22251040, Botafogo, Rio de Janeiro, RJ&amp;quot;             
## [5] &amp;quot;Rua Risoleta Neves, 22795105, Recreio dos Bandeirantes, Rio de Janeiro, RJ&amp;quot;&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# incorporando a coluna de endereço completo no data frame principal
df$endereco_completo &amp;lt;- df.endereco$endereco_completo&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&#34;obter-coordenadas-a-partir-do-endereco&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Obter coordenadas a partir do endereço&lt;/h1&gt;
&lt;p&gt;Finalmente, podemos extrair do Google as coordenadas do endereço do imóvel com a função &lt;code&gt;geocode()&lt;/code&gt;. Antes de usar a função, porém, é importante lembrar que a API do Google tem um limite de consultas por dia. Você pode checar seu limite com a função &lt;code&gt;geocodeQueryCheck()&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;geocodeQueryCheck()&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Assim, já podemos obter as coordenadas geográficas dos imóveis:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;x &amp;lt;- geocode(df$endereco_completo)&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# incorporando ao data frame

df$lat &amp;lt;- x$lat
df$lon &amp;lt;- x$lon&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Uma opção para plotar os imóveis em um mapa seria com o próprio pacote &lt;code&gt;ggmap&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;qmplot(lon, lat, data = df, size = preco, color = &amp;quot;red&amp;quot;) + labs(size = &amp;quot;Aluguel&amp;quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&#34;http://www.sillasgonzaga.com/post/2016-11-17-olx03_files/figure-html/grafico%20ggmap-1.png&#34; width=&#34;672&#34; /&gt;&lt;/p&gt;
&lt;p&gt;Mesmo o gráfico acima sendo uma ótima visualização, é possível fazer melhor. No próximo post, mostrarei como plotar os pontos em um mapa interativo usando o pacote &lt;code&gt;leaflet&lt;/code&gt;.&lt;/p&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Como usar o R para escolher um lugar para morar(1) - Web Scraping e Data Cleaning</title>
      <link>http://www.sillasgonzaga.com/post/olx01/</link>
      <pubDate>Thu, 17 Nov 2016 00:00:00 +0000</pubDate>
      
      <guid>http://www.sillasgonzaga.com/post/olx01/</guid>
      <description>&lt;div id=&#34;introducao&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Introdução&lt;/h1&gt;
&lt;p&gt;Imagine-se na seguinte situação: você foi convidado a se mudar para a cidade do Rio de Janeiro a trabalho e precisa procurar um lugar para morar. Pessoas normais resolveriam esse problema pesquisando preços de apartamentos ou quartos para alugar em sites como OLX ou AirBNB. Mas como alguém fascinado em programação e análise resolveria?&lt;/p&gt;
&lt;p&gt;Nesta série de posts, mostro como o R pode ser usado tomar a decisão sobre escolher um apartamento ou quarto para alugar. No OLX, a formatação HTML das páginas de apartamentos são diferentes das de quartos. Neste post, eu mostro como fazer o web scraping, por meio do pacote &lt;code&gt;rvest&lt;/code&gt;, apenas de apartamentos, mas o mesmo procedimento (com pequenas modificações) pode ser feito também para quartos.&lt;/p&gt;
&lt;p&gt;As bibliotecas usadas serão:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;library(magrittr) # não vivo sem esse pacote
library(rvest) # principal pacote para web-scraping
library(readr) # usado para extrair numeros de texto
library(stringr) # usado para o data cleaning
library(curl) # usado como suporte para o rvest
library(tidyr) # data cleaning
library(dplyr) # data cleaning
source(&amp;quot;/home/sillas/R/Projetos/olx/funcoes.R&amp;quot;) # algumas funcoes que criei para auxiliar o data cleaning&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div id=&#34;web-scraping&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Web scraping&lt;/h1&gt;
&lt;p&gt;A primeira etapa é obter os dados. Até a data de hoje (12 de Novembro de 2016), o &lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/aluguel/apartamentos&#34;&gt;OLX&lt;/a&gt; listava um pouco mais de 12000 apartamentos para alugar, com 245 páginas e 50 apartamentos em cada página.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;url_apt &amp;lt;- &amp;quot;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/aluguel/apartamentos&amp;quot;
number_pages &amp;lt;- 245 #hard coded
# Criar vetor com todos os urls para as páginas do olx
lista_urls &amp;lt;- paste0(url_apt, &amp;quot;?o=&amp;quot;, 1:number_pages)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A seguir, eu uso uma função para extrair as informações importantes de cada anúncio, que são: o link para o anúncio, o título, o preço, o bairro e mais algumas informações adicionais, como número de vagas de garagem e o valor da taxa de condomínio. Explicar o passo-a-passo do web scraping e explicar como o código fonte das páginas do OLX funciona está fora do escopo deste post, mas acredito que basta ler o código da função extrairAnuncios() para entender o que o script faz. Caso o leitor deseje saber mais sobre web scraping, o post 3 da série traz um tutorial de web scraping bem detalhado.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;extrairAnuncios &amp;lt;- function(url_pagina, info_adicional) {
  ### INPUTS:
  # url_pagina: url de uma pagina do olx com uma lista de links de anúncios.
  # info_adicional: variavel booleana. se verdadeiro, faz o scraping de dados adicionais do anuncio
  # ... deve ser usado apenas para apartamentos, pois a sintaxe do html para quartos é diferente
  mycurl &amp;lt;- curl(url_pagina, handle = curl::new_handle(&amp;quot;useragent&amp;quot; = &amp;quot;Mozilla/5.0&amp;quot;))
  mycurl &amp;lt;- read_html(mycurl)

  x &amp;lt;- mycurl %&amp;gt;% html_nodes(&amp;quot;.OLXad-list-link&amp;quot;)
  
  # extrair link do anuncio
  col_links &amp;lt;- mycurl %&amp;gt;% html_nodes(&amp;quot;.OLXad-list-link&amp;quot;) %&amp;gt;% html_attr(&amp;quot;href&amp;quot;)
  # extrair titulo do anuncio
  col_titles &amp;lt;- mycurl %&amp;gt;% html_nodes(&amp;quot;.OLXad-list-link&amp;quot;) %&amp;gt;% html_attr(&amp;quot;title&amp;quot;)
  # extrair preço
  precos &amp;lt;- lapply(x, . %&amp;gt;% html_nodes(&amp;quot;.col-3&amp;quot;))
  precos %&amp;lt;&amp;gt;% lapply(html_text)
  precos %&amp;lt;&amp;gt;% unlist()
  precos %&amp;lt;&amp;gt;% limparString()
  precos %&amp;lt;&amp;gt;% as.numeric()
  col_precos &amp;lt;- precos
  # extrair bairros
  bairros &amp;lt;- mycurl %&amp;gt;% html_nodes(&amp;quot;.OLXad-list-line-2&amp;quot;) %&amp;gt;% html_text()
  bairros %&amp;lt;&amp;gt;% str_replace_all(&amp;quot;[\t]&amp;quot;, &amp;quot;&amp;quot;)
  bairros %&amp;lt;&amp;gt;% str_replace_all(&amp;quot;[\n]&amp;quot;, &amp;quot;&amp;quot;)
  bairros %&amp;lt;&amp;gt;% str_replace_all(&amp;quot;Apartamentos&amp;quot;, &amp;quot;&amp;quot;)
  bairros %&amp;lt;&amp;gt;% str_replace_all(&amp;quot;Aluguel de quartos&amp;quot;, &amp;quot;&amp;quot;)
  bairros %&amp;lt;&amp;gt;% str_replace_all(&amp;quot;Anúncio Profissional&amp;quot;, &amp;quot;&amp;quot;)
  bairros %&amp;lt;&amp;gt;% str_replace(&amp;quot;-&amp;quot;, &amp;quot;&amp;quot;)
  bairros %&amp;lt;&amp;gt;% str_trim()
  col_bairros &amp;lt;- bairros
  # extrair informações adicionais de apartamento
  
  if (info_adicional) {
    adicional &amp;lt;- mycurl %&amp;gt;% html_nodes(&amp;quot;.mt5px&amp;quot;) %&amp;gt;% html_text()
    adicional %&amp;lt;&amp;gt;% str_replace_all(&amp;quot;[\t]&amp;quot;, &amp;quot;&amp;quot;)
    adicional %&amp;lt;&amp;gt;% str_replace_all(&amp;quot;[\n]&amp;quot;, &amp;quot;&amp;quot;)
    col_adicionais &amp;lt;- adicional
    
  }
    return(data.frame(link = col_links,
                    titulo = col_titles,
                    preco = col_precos,
                    bairro = col_bairros,
                    adicional = col_adicionais,
                    stringsAsFactors = FALSE))
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Agora já podemos aplicar a função &lt;code&gt;extrairAnuncios()&lt;/code&gt; no vetor da lista de urls para baixar os dados. Para fins de demonstração, vou executar o procedimento apenas para a primeira página.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;url_teste &amp;lt;- lista_urls[1]
system.time(df &amp;lt;- extrairAnuncios(url_teste, info_adicional = TRUE))&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##   usuário   sistema decorrido 
##     1.084     0.028    11.953&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# Vamos dar uma olhada nos dados
head(df) %&amp;gt;% knitr::kable()&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;link&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;titulo&lt;/th&gt;
&lt;th align=&#34;right&#34;&gt;preco&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;bairro&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;adicional&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;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-de-2-quartos-no-rio-centro-417491615&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-de-2-quartos-no-rio-centro-417491615&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Apartamento de 2 quartos no Rio Centro&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1500&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro, Camorim&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2 quartos | Condomínio: R$ 550 | 1 vaga&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-no-meier-vilela-tavares-417491090&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-no-meier-vilela-tavares-417491090&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Apartamento no Méier- Vilela Tavares&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1600&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro, Méier&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2 quartos | 60 m² | Condomínio: R$ 650&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/vip-aluga-lindo-apartamento-2-quartos-com-armarios-417489866&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/vip-aluga-lindo-apartamento-2-quartos-com-armarios-417489866&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;(Vip Aluga) Lindo apartamento 2 quartos com armários&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;900&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro, Campo Grande&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2 quartos | 48 m² | Condomínio: R$ 310 | 1 vaga&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/tijuquinha-kitinete-itanhanga-417487116&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/tijuquinha-kitinete-itanhanga-417487116&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Tijuquinha kitinete Itanhangá&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;750&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro, Itanhangá&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;1 quarto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-de-3-quartos-com-dep-no-recreio-417487754&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-de-3-quartos-com-dep-no-recreio-417487754&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Apartamento de 3 quartos com dep. no Recreio&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;2500&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro, Recreio Dos Bandeirantes&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;3 quartos | 107 m² | Condomínio: R$ 880 | 1 vaga&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-concetto-recreio-2-quartos-mobiliado-opcional-consulte-primeira-locacao-417487425&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-concetto-recreio-2-quartos-mobiliado-opcional-consulte-primeira-locacao-417487425&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Apartamento Concetto Recreio, 2 Quartos, Mobiliado (Opcional, Consulte)- Primeira Locação&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1799&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro, Recreio Dos Bandeirantes&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2 quartos | 82 m² | Condomínio: R$ 492 | 1 vaga&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div id=&#34;data-cleaning&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Data Cleaning&lt;/h1&gt;
&lt;p&gt;Pode-se ver que o web scraping (ao menos para esses 5 exemplos) foi bem feito pois os os dados foram extraídos adequadamente. Contudo, é evidente a necessidade de se limpar os dados para poder os analisar. A coluna de informações adicionais, por exemplo, informa dados de até quatro variáveis: quantidade de quartos, quantidade de vagas de garagem, área e o preço da taxa de condomínio. Para deixar o processo de limpeza ainda mais difícil, nem todos os anúncios fornecem dados dessas quatro variáveis.&lt;/p&gt;
&lt;p&gt;Antes de partir para esse problema, vamos separa a coluna de bairro em duas: uma de cidade e outra de bairro. Removi os imóveis que não são do Rio de Janeiro ou de Niterói para fins de simplicidade.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# remover os que nao sao do RJ ou de niteroi
df %&amp;lt;&amp;gt;% filter(str_detect(bairro, &amp;quot;Niterói&amp;quot;) | str_detect(bairro, &amp;quot;Rio de Janeiro&amp;quot;))
df %&amp;lt;&amp;gt;% separate(bairro, c(&amp;quot;cidade&amp;quot;, &amp;quot;bairro&amp;quot;), sep = &amp;quot;,&amp;quot;)
head(df) %&amp;gt;% knitr::kable()&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;link&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;titulo&lt;/th&gt;
&lt;th align=&#34;right&#34;&gt;preco&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;cidade&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;bairro&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;adicional&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;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-de-2-quartos-no-rio-centro-417491615&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-de-2-quartos-no-rio-centro-417491615&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Apartamento de 2 quartos no Rio Centro&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1500&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Camorim&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2 quartos | Condomínio: R$ 550 | 1 vaga&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-no-meier-vilela-tavares-417491090&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-no-meier-vilela-tavares-417491090&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Apartamento no Méier- Vilela Tavares&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1600&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Méier&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2 quartos | 60 m² | Condomínio: R$ 650&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/vip-aluga-lindo-apartamento-2-quartos-com-armarios-417489866&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/vip-aluga-lindo-apartamento-2-quartos-com-armarios-417489866&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;(Vip Aluga) Lindo apartamento 2 quartos com armários&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;900&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Campo Grande&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2 quartos | 48 m² | Condomínio: R$ 310 | 1 vaga&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/tijuquinha-kitinete-itanhanga-417487116&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/tijuquinha-kitinete-itanhanga-417487116&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Tijuquinha kitinete Itanhangá&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;750&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Itanhangá&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;1 quarto&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-de-3-quartos-com-dep-no-recreio-417487754&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-de-3-quartos-com-dep-no-recreio-417487754&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Apartamento de 3 quartos com dep. no Recreio&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;2500&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Recreio Dos Bandeirantes&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;3 quartos | 107 m² | Condomínio: R$ 880 | 1 vaga&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-concetto-recreio-2-quartos-mobiliado-opcional-consulte-primeira-locacao-417487425&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-concetto-recreio-2-quartos-mobiliado-opcional-consulte-primeira-locacao-417487425&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Apartamento Concetto Recreio, 2 Quartos, Mobiliado (Opcional, Consulte)- Primeira Locação&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1799&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Recreio Dos Bandeirantes&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2 quartos | 82 m² | Condomínio: R$ 492 | 1 vaga&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Agora podemos partir para a limpeza da coluna de adicionais. Primeiramente, vamos ver quantos anúncios possuem as quatro variáveis adicionais:&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# substituir quartos por quarto
df$adicional %&amp;lt;&amp;gt;% str_replace_all(&amp;quot;quartos&amp;quot;, &amp;quot;quarto&amp;quot;)
df %&amp;lt;&amp;gt;% mutate(
  tem_quarto = str_detect(adicional, &amp;quot;quarto&amp;quot;),
  tem_area = str_detect(adicional, &amp;quot;m²&amp;quot;),
  tem_taxa = str_detect(adicional, &amp;quot;Condomínio&amp;quot;),
  tem_garagem = str_detect(adicional, &amp;quot;vaga&amp;quot;)
)

x &amp;lt;- round(apply(df[, 7:10], 2, mean), 3) * 100
print(x)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##  tem_quarto    tem_area    tem_taxa tem_garagem 
##       100.0        87.5        79.2        64.6&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Assim, 100% dos apartamentos (dessa amostra de 50 apartamentos) têm informação sobre a quantidade de quartos, 87.5% sobre área, 79.2% informam a taxa de condomínio e 64.6% têm vaga de garagem.&lt;/p&gt;
&lt;p&gt;É necessário usar o pacote &lt;code&gt;stringr&lt;/code&gt; para observar a posição dos termos que identificam a variável:&lt;br /&gt;
* O substring “quarto” indica a presença de informação sobre quantidade de quartos;&lt;br /&gt;
* O substring “Condomínio: R$” indica a presença de informação sobre taxa do condomínio;&lt;br /&gt;
* O substring “m²” indica a presença de informação sobre área;&lt;br /&gt;
* O substring “vaga” indica a presença de informação sobre vagas de garagem.&lt;/p&gt;
&lt;p&gt;O desafio aqui é criar colunas adicionais para cada uma dessas categorias de informação adicional. A seguir, eu comento linha a linha o procedimento necessário para realizar essa tarefa, que é basicamente o mesmo para as variáveis.&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# COLUNA DE QUANTIDADE DE QUARTOS
# Quarto: pegar posicao inicial e final do string quarto
# Localizar trecho dentro do string referente a quartos
matriz_posicao &amp;lt;- str_locate(df$adicional, &amp;quot;quarto&amp;quot;)
# Voltar 2 posições no string para pegar o número (ex: 2 quarto)
matriz_posicao[,1] &amp;lt;- matriz_posicao[,1] - 2
# extrair string com posições iniciais e finais
vetor_quartos &amp;lt;- str_sub(df$adicional, matriz_posicao[,1], matriz_posicao[,2])
# extrair apenas número (primeiro caractere do string) e converter para numeric
vetor_quartos &amp;lt;- str_sub(vetor_quartos, 1, 1)
vetor_quartos %&amp;lt;&amp;gt;% as.numeric()
# adicionar ao data frame
df$qtd_quarto &amp;lt;- vetor_quartos


# Condominio
# retirar cifrao pra ficar mais facil
df$adicional %&amp;lt;&amp;gt;% str_replace_all(&amp;quot;\\$&amp;quot;, &amp;quot;S&amp;quot;)
matriz_posicao &amp;lt;- str_locate(df$adicional, &amp;quot;Condomínio: RS &amp;quot;)
# mover cinco posicoes para pegar algarismos após o RS
vetor_taxa &amp;lt;- str_sub(df$adicional, matriz_posicao[, 2], matriz_posicao[, 2] + 4)
# extrair apenas numeros
vetor_taxa %&amp;lt;&amp;gt;% parse_number()
# vendo se funcionou
data.frame(df$adicional, vetor_taxa) %&amp;gt;% head(20)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##                                        df.adicional vetor_taxa
## 1            2 quarto | Condomínio: RS 550 | 1 vaga        550
## 2             2 quarto | 60 m² | Condomínio: RS 650        650
## 3    2 quarto | 48 m² | Condomínio: RS 310 | 1 vaga        310
## 4                                          1 quarto         NA
## 5   3 quarto | 107 m² | Condomínio: RS 880 | 1 vaga        880
## 6    2 quarto | 82 m² | Condomínio: RS 492 | 1 vaga        492
## 7    2 quarto | 51 m² | Condomínio: RS 504 | 1 vaga        504
## 8                                  1 quarto | 58 m²         NA
## 9   2 quarto | 140 m² | Condomínio: RS 135 | 1 vaga        135
## 10   2 quarto | 50 m² | Condomínio: RS 315 | 1 vaga        315
## 11   2 quarto | 72 m² | Condomínio: RS 620 | 1 vaga        620
## 12           2 quarto | 60 m² | Condomínio: RS 1200       1200
## 13   2 quarto | 49 m² | Condomínio: RS 290 | 1 vaga        290
## 14                                         1 quarto         NA
## 15   2 quarto | 76 m² | Condomínio: RS 980 | 1 vaga        980
## 16  3 quarto | 72 m² | Condomínio: RS 490 | 2 vagas        490
## 17  2 quarto | 80 m² | Condomínio: RS 1100 | 1 vaga       1100
## 18                        1 quarto | 45 m² | 1 vaga         NA
## 19                                         2 quarto         NA
## 20                                3 quarto | 1 vaga         NA&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# Funcionou! Incorporar vetor ao data frame
df$taxa_condominio &amp;lt;- vetor_taxa


# Área
matriz_posicao &amp;lt;- str_locate(df$adicional, &amp;quot; m²&amp;quot;)
# voltar quatro posições
vetor_area &amp;lt;- str_sub(df$adicional, matriz_posicao[,1] - 4, matriz_posicao[, 1])
# converter para numerico
vetor_area %&amp;lt;&amp;gt;% parse_number()
# vendo se funcionou
data.frame(df$adicional, vetor_area) %&amp;gt;% head(20)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##                                        df.adicional vetor_area
## 1            2 quarto | Condomínio: RS 550 | 1 vaga         NA
## 2             2 quarto | 60 m² | Condomínio: RS 650         60
## 3    2 quarto | 48 m² | Condomínio: RS 310 | 1 vaga         48
## 4                                          1 quarto         NA
## 5   3 quarto | 107 m² | Condomínio: RS 880 | 1 vaga        107
## 6    2 quarto | 82 m² | Condomínio: RS 492 | 1 vaga         82
## 7    2 quarto | 51 m² | Condomínio: RS 504 | 1 vaga         51
## 8                                  1 quarto | 58 m²         58
## 9   2 quarto | 140 m² | Condomínio: RS 135 | 1 vaga        140
## 10   2 quarto | 50 m² | Condomínio: RS 315 | 1 vaga         50
## 11   2 quarto | 72 m² | Condomínio: RS 620 | 1 vaga         72
## 12           2 quarto | 60 m² | Condomínio: RS 1200         60
## 13   2 quarto | 49 m² | Condomínio: RS 290 | 1 vaga         49
## 14                                         1 quarto         NA
## 15   2 quarto | 76 m² | Condomínio: RS 980 | 1 vaga         76
## 16  3 quarto | 72 m² | Condomínio: RS 490 | 2 vagas         72
## 17  2 quarto | 80 m² | Condomínio: RS 1100 | 1 vaga         80
## 18                        1 quarto | 45 m² | 1 vaga         45
## 19                                         2 quarto         NA
## 20                                3 quarto | 1 vaga         NA&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# Funcionou! Incorporar ao data frame
df$area_condominio &amp;lt;- vetor_area


# Garagem
matriz_posicao &amp;lt;- str_locate(df$adicional, &amp;quot; vaga&amp;quot;)
# voltar quatro posições
vetor_garagem &amp;lt;- str_sub(df$adicional, matriz_posicao[,1] - 2, matriz_posicao[, 1])
# converter para numerico
vetor_garagem %&amp;lt;&amp;gt;% readr::parse_number()
# vendo se funcionou
data.frame(df$adicional, vetor_garagem) %&amp;gt;% head(20)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;##                                        df.adicional vetor_garagem
## 1            2 quarto | Condomínio: RS 550 | 1 vaga             1
## 2             2 quarto | 60 m² | Condomínio: RS 650            NA
## 3    2 quarto | 48 m² | Condomínio: RS 310 | 1 vaga             1
## 4                                          1 quarto            NA
## 5   3 quarto | 107 m² | Condomínio: RS 880 | 1 vaga             1
## 6    2 quarto | 82 m² | Condomínio: RS 492 | 1 vaga             1
## 7    2 quarto | 51 m² | Condomínio: RS 504 | 1 vaga             1
## 8                                  1 quarto | 58 m²            NA
## 9   2 quarto | 140 m² | Condomínio: RS 135 | 1 vaga             1
## 10   2 quarto | 50 m² | Condomínio: RS 315 | 1 vaga             1
## 11   2 quarto | 72 m² | Condomínio: RS 620 | 1 vaga             1
## 12           2 quarto | 60 m² | Condomínio: RS 1200            NA
## 13   2 quarto | 49 m² | Condomínio: RS 290 | 1 vaga             1
## 14                                         1 quarto            NA
## 15   2 quarto | 76 m² | Condomínio: RS 980 | 1 vaga             1
## 16  3 quarto | 72 m² | Condomínio: RS 490 | 2 vagas             2
## 17  2 quarto | 80 m² | Condomínio: RS 1100 | 1 vaga             1
## 18                        1 quarto | 45 m² | 1 vaga             1
## 19                                         2 quarto            NA
## 20                                3 quarto | 1 vaga             1&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;# Funcionou! Incorporar ao data frame
df$garagem &amp;lt;- vetor_garagem

# Remover objetos desnecessários
rm(matriz_posicao, vetor_adicional, vetor_area, vetor_garagem, vetor_quartos, vetor_taxa)&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Vamos ver como ficou o data frame final&lt;/p&gt;
&lt;pre class=&#34;r&#34;&gt;&lt;code&gt;head(df) %&amp;gt;% knitr::kable()&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;link&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;titulo&lt;/th&gt;
&lt;th align=&#34;right&#34;&gt;preco&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;cidade&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;bairro&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;adicional&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;tem_quarto&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;tem_area&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;tem_taxa&lt;/th&gt;
&lt;th align=&#34;left&#34;&gt;tem_garagem&lt;/th&gt;
&lt;th align=&#34;right&#34;&gt;qtd_quarto&lt;/th&gt;
&lt;th align=&#34;right&#34;&gt;taxa_condominio&lt;/th&gt;
&lt;th align=&#34;right&#34;&gt;area_condominio&lt;/th&gt;
&lt;th align=&#34;right&#34;&gt;garagem&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;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-de-2-quartos-no-rio-centro-417491615&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-de-2-quartos-no-rio-centro-417491615&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Apartamento de 2 quartos no Rio Centro&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1500&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Camorim&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2 quarto | Condomínio: RS 550 | 1 vaga&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;FALSE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;2&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;550&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;NA&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-no-meier-vilela-tavares-417491090&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-no-meier-vilela-tavares-417491090&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Apartamento no Méier- Vilela Tavares&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1600&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Méier&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2 quarto | 60 m² | Condomínio: RS 650&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;FALSE&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;2&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;650&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;60&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;NA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/vip-aluga-lindo-apartamento-2-quartos-com-armarios-417489866&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/vip-aluga-lindo-apartamento-2-quartos-com-armarios-417489866&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;(Vip Aluga) Lindo apartamento 2 quartos com armários&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;900&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Campo Grande&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2 quarto | 48 m² | Condomínio: RS 310 | 1 vaga&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;2&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;310&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;48&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/tijuquinha-kitinete-itanhanga-417487116&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/tijuquinha-kitinete-itanhanga-417487116&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Tijuquinha kitinete Itanhangá&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;750&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Itanhangá&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;1 quarto&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;FALSE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;FALSE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;FALSE&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;NA&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;NA&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;NA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;odd&#34;&gt;
&lt;td align=&#34;left&#34;&gt;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-de-3-quartos-com-dep-no-recreio-417487754&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-de-3-quartos-com-dep-no-recreio-417487754&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Apartamento de 3 quartos com dep. no Recreio&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;2500&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Recreio Dos Bandeirantes&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;3 quarto | 107 m² | Condomínio: RS 880 | 1 vaga&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;3&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;880&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;107&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class=&#34;even&#34;&gt;
&lt;td align=&#34;left&#34;&gt;&lt;a href=&#34;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-concetto-recreio-2-quartos-mobiliado-opcional-consulte-primeira-locacao-417487425&#34; class=&#34;uri&#34;&gt;http://rj.olx.com.br/rio-de-janeiro-e-regiao/imoveis/apartamento-concetto-recreio-2-quartos-mobiliado-opcional-consulte-primeira-locacao-417487425&lt;/a&gt;&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Apartamento Concetto Recreio, 2 Quartos, Mobiliado (Opcional, Consulte)- Primeira Locação&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1799&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Rio de Janeiro&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;Recreio Dos Bandeirantes&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;2 quarto | 82 m² | Condomínio: RS 492 | 1 vaga&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;left&#34;&gt;TRUE&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;2&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;492&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;82&lt;/td&gt;
&lt;td align=&#34;right&#34;&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div id=&#34;conclusao&#34; class=&#34;section level1&#34;&gt;
&lt;h1&gt;Conclusão&lt;/h1&gt;
&lt;p&gt;No próximo post, analisaremos os dados obtidos aqui.&lt;/p&gt;
&lt;/div&gt;
</description>
    </item>
    
  </channel>
</rss>