1 Introdução

Utilizamos uma base de dados do kaggle, carregada pelo usuário Rubens Júnior1 informando detalhes de casas para alugar no Brasil
Link para página Aqui.
Escolhemos esta base por conter dados diversificados e pela simplicidade do conteúdo.
Utilizamos somente as 1000 primeiras linhas da base.

2 Limpeza dos dados


Carregando pacotes

library(ggplot2)
library(dplyr)
library(stringr)
library(knitr)
library(rmarkdown)
library(forcats)
library(patchwork)
library(ggExtra)
library(janitor)

Limpeza dos dados

Path = 'Moradia/houses_to_rent.csv'
Tabela = read.csv(Path)
Tabela <- Tabela[1:1000,]
Tabela <- Tabela %>% select(-X)
Tabela <- Tabela %>% mutate(city = as.factor(city))
Tabela <- Tabela %>% mutate(floor = as.numeric(as.character(floor)))
Tabela <- Tabela %>% mutate(hoa = str_replace(as.character(hoa),",",""))
Tabela <- Tabela %>% mutate(hoa = as.numeric(str_remove(as.character(hoa),"R\\$")))

Tabela <- Tabela %>% mutate(rent.amount = str_replace(as.character(rent.amount),",",""))
Tabela <- Tabela %>% mutate(rent.amount = floor(as.numeric(str_remove(as.character(rent.amount),"R\\$"))))

Tabela <- Tabela %>% mutate(property.tax = str_replace(as.character(property.tax),",",""))
Tabela <- Tabela %>% mutate(property.tax = floor(as.numeric(str_remove(as.character(property.tax),"R\\$"))))

Tabela <- Tabela %>% mutate(fire.insurance = str_replace(as.character(fire.insurance),",",""))
Tabela <- Tabela %>% mutate(fire.insurance= floor(as.numeric(str_remove(as.character(fire.insurance),"R\\$"))))

Tabela <- Tabela %>% mutate(total = str_replace(as.character(total),",",""))
Tabela <- Tabela %>% mutate(total = floor(as.numeric(str_remove(as.character(total),"R\\$"))))
write.csv(Tabela,"Moradia/Dados limpos")
paged_table(head(Tabela,100))


Fizemos algumas alterações em células numéricas que estavam em formato factor por conter cifrão e outros elementos.

3 Medidas



Analisaremos a seguir nossa amostra via tabelas de frequência e medidas tanto de resumo quanto de dispersão.

3.1 Analisando dados categóricos


Através da análise individual das variáveis categóricas podemos inferir que um imóvel em nossa amostra muito provavelmente aceita animais, não vem com mobília e é da cidade 1.

3.1.1 Animais

paged_table(Tabela %>% 
  tabyl(animal) %>%
  adorn_totals(where = c("row")) %>% 
  adorn_percentages(denominator = "col") %>% 
  adorn_pct_formatting(digits = 2) %>% 
  adorn_ns(position = "front"))

3.1.2 Cidade

paged_table(Tabela %>% 
  tabyl(city) %>%
  adorn_totals(where = c("row")) %>% 
  adorn_percentages(denominator = "col") %>% 
  adorn_pct_formatting(digits = 2) %>% 
  adorn_ns(position = "front"))

3.1.3 Mobília

paged_table(Tabela %>% 
  tabyl(furniture) %>%
  adorn_totals(where = c("row")) %>% 
  adorn_percentages(denominator = "col") %>% 
  adorn_pct_formatting(digits = 2) %>% 
  adorn_ns(position = "front"))

3.2 relação entre as variáveis categóricas

Analisaremos a seguir as relações entre as variáveis categóricas em nossa amostra.

3.2.1 Animais x Mobília

paged_table(Tabela %>% 
  tabyl(animal,furniture) %>%
  adorn_totals(where = c("row","col")) %>% 
  adorn_percentages(denominator = "col") %>% 
  adorn_pct_formatting(digits = 2) %>% 
  adorn_ns(position = "front"))


Casas sem mobília geralmente são mais tolerantes com animais, o que é razoável de se pensar, pois animais podem arranhar e danificar a mobília do locador.

3.2.2 Animais x Cidade

paged_table(Tabela %>% 
  tabyl(animal,city) %>%
  adorn_totals(where = c("row","col")) %>% 
  adorn_percentages(denominator = "col") %>% 
  adorn_pct_formatting(digits = 2) %>% 
  adorn_ns(position = "front"))


Observe que a tolerância aos animais é indiferente à qual cidade o imóvel pertence.

3.2.3 Cidade x Mobília

paged_table(Tabela %>% 
  tabyl(city,furniture) %>%
  adorn_totals(where = c("row","col")) %>% 
  adorn_percentages(denominator = "col") %>% 
  adorn_pct_formatting(digits = 2) %>% 
  adorn_ns(position = "front"))


Desta forma concluímos que a proporção de imóveis mobiliados na cidade 1 é consideravelmente superior ao da cidade 0.

3.3 Analisando dados numéricos



Algumas variáveis apresentam uma variabilidade dos dados alta como metragem e o valor total para alugar. Outras variáveis apesar de variância alta, por apresentarem outliers apresentam-se menos dispersas.

3.3.1 Quartos

paged_table(Tabela %>%
              mutate(rooms = ifelse(rooms >= 5,"5+",rooms) ) %>% 
              tabyl(rooms) %>%
              adorn_totals(where = c("row")) %>%
              adorn_percentages(denominator = "col") %>% 
              adorn_pct_formatting(digits = 2) %>% 
              adorn_ns(position = "front"))
summary(Tabela$rooms)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1.00    2.00    3.00    2.48    3.00    7.00
var(Tabela$rooms)
## [1] 1.276877


Observe que mais de 80% dos imóveis da amostra possuem até 3 quartos.Indicando uma baixa variabilidade dos dados.

3.3.2 Banheiros

paged_table(Tabela %>%
              mutate(bathroom = ifelse(bathroom >= 5,"5+",bathroom) ) %>% 
              tabyl(bathroom) %>%
              adorn_totals(where = c("row")) %>%
              adorn_percentages(denominator = "col") %>% 
              adorn_pct_formatting(digits = 2) %>% 
              adorn_ns(position = "front"))
summary(Tabela$bathroom)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   1.000   2.000   2.356   3.000  10.000
var(Tabela$bathroom)
## [1] 2.085349


Por mais que tenham imóveis com até 10 banheiros em nossa amostra, observe que mais de 90% se concentram nos imóveis com até 4 banheiros. Podemos perceber a presença desses outliers pela magnitude da variância.

3.3.3 vagas de garagem

paged_table(Tabela %>%
              mutate(parking.spaces = ifelse(parking.spaces >= 5,"5+",parking.spaces) ) %>% 
              tabyl(parking.spaces) %>%
              adorn_totals(where = c("row")) %>%
              adorn_percentages(denominator = "col") %>% 
              adorn_pct_formatting(digits = 2) %>% 
              adorn_ns(position = "front"))
summary(Tabela$parking.spaces)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   1.000   1.000   1.778   2.000   8.000
var(Tabela$parking.spaces)
## [1] 2.525241


Um imóvel sem vagas de garagem representa 19% da amostra. Considerando apenas os imóveis com vagas de garagem 70% destes possuem 1 ou 2 vagas.Pelo mesmo argumento dos outliers, a variância está razoavelmente alta, dando uma errada impressão de variabilidade dos dados.

3.3.4 andar

paged_table(Tabela %>%
              mutate(floor = cut(Tabela$floor,
                                 breaks = c(0,5,10,15,85) ) ) %>% 
              tabyl(floor) %>%
              adorn_totals(where = c("row")) %>%
              adorn_percentages(denominator = "col") %>% 
              adorn_pct_formatting(digits = 2) %>% 
              adorn_ns(position = "front"))
summary(Tabela$floor)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
##   1.000   3.000   6.000   7.694  11.000  85.000     246
var(Tabela$floor, na.rm = TRUE)
## [1] 39.94718


O exemplo mais marcante na falha da variância em lidar com outliers pode ser conferida neste exemplo. Além disso é interessante resaltar que os imóveis da amostra com andar “NA” serão tratados como casas. Desta forma, quase 25% dos imóveis para alugar são casas. Considerando apenas o apartamentos, quase 90% estão entre o primeiro e o 15º andar.

3.3.5 metragem

paged_table(Tabela %>%
              mutate(area = cut(Tabela$area,
                                 breaks = c(0,50,100,150,200,250,900) ) ) %>% 
              tabyl(area) %>%
              adorn_totals(where = c("row")) %>%
              adorn_percentages(denominator = "col") %>% 
              adorn_pct_formatting(digits = 2) %>% 
              adorn_ns(position = "front"))
summary(Tabela$area)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    10.0    58.0   100.0   147.8   198.0   900.0
var(Tabela$area)
## [1] 17498.37



3.3.6 valor total

# Corrigir notação científica de "total"

paged_table(Tabela %>%
              mutate(total = cut(Tabela$total,breaks = c(500,1500,3000,4500,6000,9000,12000,25000)) ) %>% 
              tabyl(total) %>%
              adorn_totals(where = c("row")) %>%
              adorn_percentages(denominator = "col") %>% 
              adorn_pct_formatting(digits = 2) %>% 
              adorn_ns(position = "front"))
summary(Tabela$total)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     660    2550    4279    6026    8598   24890
var(Tabela$total)
## [1] 22836097

3.4 Variáveis correlacionadas



Como era esperado, valor total e área estão positivamente correlacionados, isto é, quanto maior a área, maior é o valor esperado. No entanto, os dados nos mostram que andar e preço não estão bem correlacionados, isto é, a correlação está relativamente próxima de 0 (0.001).

3.4.1 valor total x area

paged_table(Tabela %>%
              mutate(area = cut(Tabela$area,
                                 breaks = c(0,50,100,150,200,250,900) ),
                     total = cut(Tabela$total,breaks = c(500,1500,3000,4500,6000,9000,12000,25000)) ) %>%  
              tabyl(total,area) %>%
              adorn_totals(where = c("row","col")) %>%
              adorn_percentages(denominator = "col") %>% 
              adorn_pct_formatting(digits = 2) %>% 
              adorn_ns(position = "front"))
Covariance <- cov(Tabela$total,Tabela$area)/( sd(Tabela$total) * sd(Tabela$area) ) 

Covariance
## [1] 0.6942193
Tabela %>% ggplot(aes(x = total, y = area)) + geom_point() + 
    labs(x = "Total", y = "Área", title = "") + 
    theme(
    plot.title = element_text(hjust = 0.5),
    axis.title = element_text(color = "red"),
    panel.background = element_rect(fill = "grey"),
    panel.grid = element_blank())

0.5 a 0.7 positivo ou negativo indica uma correlação moderada.

3.4.2 vagas de garagem x metragem

paged_table(Tabela %>%
              mutate(parking.spaces = ifelse(parking.spaces >= 5,
                                             "5+",parking.spaces),
                     area = cut(Tabela$area,
                                 breaks = c(0,50,100,150,200,250,900) ) ) %>% 
              tabyl(parking.spaces,area) %>%
              adorn_totals(where = c("row","col")) %>%
              adorn_percentages(denominator = "col") %>% 
              adorn_pct_formatting(digits = 2) %>% 
              adorn_ns(position = "front"))
Covariance <- cov(Tabela$parking.spaces,Tabela$area)/( sd(Tabela$parking.spaces) * sd(Tabela$area) ) 

Covariance
## [1] 0.7225513
Tabela %>% ggplot(aes(x = parking.spaces, y = area)) + geom_point() + 
    labs(x = "Vagas", y = "Área", title = "") + 
    theme(
    plot.title = element_text(hjust = 0.5),
    axis.title = element_text(color = "red"),
    panel.background = element_rect(fill = "grey"),
    panel.grid = element_blank())

0.7 a 0.9 positivo ou negativo indica uma correlação forte.

3.4.3 valor total x andar

paged_table(Tabela %>%
              mutate(floor = cut(Tabela$floor,
                                 breaks = c(0,5,10,15,85) ),
                     total = cut(Tabela$total,
                                          breaks = c(500,1500,3000,4500,6000,9000,12000,25000))) %>% 
              tabyl(total,floor) %>%
              adorn_totals(where = c("row","col")) %>%
              adorn_percentages(denominator = "col") %>% 
              adorn_pct_formatting(digits = 2) %>% 
              adorn_ns(position = "front"))
Covariance <- cov(Tabela$total, !is.na(Tabela$floor) )/( sd(Tabela$total) * sd( Tabela$floor, na.rm = TRUE))

Covariance
## [1] 0.001760456
Tabela %>% ggplot(aes(x = floor, y = total)) + geom_point() + 
    labs(x = "Andar", y = "Total", title = "") + 
    theme(
    plot.title = element_text(hjust = 0.5),
    axis.title = element_text(color = "red"),
    panel.background = element_rect(fill = "grey"),
    panel.grid = element_blank())


0 a 0.3 positivo ou negativo indica uma correlação desprezível.


Covariance <- cov(Tabela$area,Tabela$floor, use = 'na.or')/( sd(Tabela$area) * sd( Tabela$floor, na.rm = TRUE ) ) 

Covariance
## [1] 0.06296963


Covariance <- cov(Tabela$rooms, Tabela$floor, use = 'na.or')/( sd(Tabela$rooms) * sd( Tabela$floor, na.rm = TRUE ) ) 

Covariance
## [1] 0.01298221


4 Visualizações


paged_table( Tabela %>% count(floor) %>% arrange(desc(floor)),
             options = list(rows.print = 5))
Tabela %>% ggplot(aes(floor)) + geom_point(stat = 'count', size = 2)  +
  coord_cartesian(xlim = c(0, 40)) +
  scale_x_continuous(breaks = seq(0, 40, 2)) +
  labs(x = "Andar", y = "Nº casas", title = "Contagem de casas por andar") + 
    theme(
    plot.title = element_text(hjust = 0.5),
    axis.title = element_text(color = "purple"),
    panel.background = element_rect(fill = "grey"),
    panel.grid = element_blank())



Quanto maior o andar menos imóveis para alugar, o que era esperado.


Vamos a algumas estatísticas de valores

abaixo o boxplot com as variáveis numéricas nos darão uma ideia de dispersão, média e quantis.

p1 <- Tabela %>% ggplot(aes(y = hoa)) + geom_boxplot()
p2 <- Tabela %>% ggplot(aes(y = rent.amount)) + geom_boxplot()
p3 <- Tabela %>% ggplot(aes(y = property.tax)) + geom_boxplot()
p4 <- Tabela %>% ggplot(aes(y = fire.insurance)) + geom_boxplot()
p1+p2+p3+p4



Percebe-se que o valor do aluguel tende a ser mais bem distribuído que as outras cobranças.

Vamos criar uma nova coluna “preço_ relativo_m2” obtida pela razão entre o total em valor e a área. Vejamos os que possuem o \(m^2\) acima de R$100,00.

Tabela <- Tabela %>% mutate(preço_m2 = total/area)
paged_table( head(Tabela) )
Tabela %>% filter(preço_m2 >=100) %>% ggplot(aes(preço_m2))  + geom_point(stat = 'count')


vejamos se o preço por \(m^2\) tem alguma relação com a cidade.

Tabela %>% group_by(city) %>% ggplot(aes(x = city, y = preço_m2)) + geom_boxplot(color = "blue") +
  coord_cartesian(ylim = c(0, 200)) +
  labs(x = "Cidade", y = "R$/m2", title = "Preço por Metro Quadrado") + 
    theme(
    plot.title = element_text(hjust = 0.5),
    axis.title = element_text(color = "red"),
    panel.background = element_rect(fill = "grey"),
    panel.grid = element_blank())

A cidade 1 tem o \(m^2\) mais caro que a cidade 0, no entanto a cidade 0 tem uma distribuição de preços mais regular.

Vejamos a relação entre preço do aluguel, área e número de quartos.

paged_table(Tabela %>% count(animal))
paged_table(Tabela %>% filter(rent.amount > 12000) %>% count(animal))
Tabela %>% filter(rent.amount > 12000) %>% 
  ggplot(aes(x = area, y = rent.amount, colour = animal)) + geom_point()



Casas maiores e mais caras tendem a ter mais tolerância com pets uma vez que no total essa proporção é de 0.78 e para casas com aluguel acima de R$12000,00 é de 0.87.

graf <- Tabela %>%
  filter( !is.na(Tabela) ) %>% 
  ggplot() + 
  geom_point(mapping = aes(x = area, y = total, color = total)) +
  scale_color_gradient(low = "orange", high = "red") +
  theme(legend.position="none")

graf <- ggMarginal(graf, type="histogram",fill = "darkorange") 


show(graf)


Observe que existe um ponto de concentração de imóveis na faixa de valor total para alugar até 5 mil e área de até 150 m^2 .

colors = c("darkgray","steelblue")

vagas <- Tabela %>% ggplot( aes(x = parking.spaces, fill = city ) ) +
  geom_bar(show.legend = FALSE) +
  labs(x = "vagas de garagem", y = "número de imóveis") + 
  scale_fill_manual(values = colors) 

quartos <- Tabela %>% ggplot( aes(x = rooms, fill = city ) ) +
  geom_bar() +
  labs(x = "número de quartos") +
  scale_fill_manual(values = colors,
                    name = "cidade",
                    labels = c("0", "1")) +
  theme(axis.title.y = element_blank(),
        legend.position="top")

banheiros <- Tabela %>% ggplot( aes(x = bathroom, fill = city ) ) +
  geom_bar(show.legend = FALSE) +
  labs(x = "número de banheiros") + 
  scale_fill_manual(values = colors) +
  theme(axis.title.y = element_blank() )

vagas + quartos + banheiros 


Podemos observar nos gráficos que por mais que o número de imóveis para alugar da cidade 0 seja bem menor do que o número de imóveis da cidade 1, as variáveis observadas aparentam ser indiferentes quanto a qual cidade pertencem.

Tabela %>%
  ggplot(aes(sample = total) ) +
  stat_qq(color = "black",
          fill = "gray",
          alpha = 1/5,
          size = 2) +
  stat_qq_line(color = "red") +
  labs(title = "Gráfico quantil x quantil do valor total dos imóveis",
       x = "quantis teóricos",
       y = "quantis amostrais")


Note que a distância inicial dos dados à reta teórica demonstra que existe uma concentração de imóveis a valores inferiores. Portanto existe uma acentuada assimetria dos dados para a esquerda.

5 Bibliotecas utilizadas


Grande parte dos comandos foram feitos utilizando ggplot2,dplyr. stringr auxiliou na limpeza dos dados, forcats,knitr e rmarkdown foram usadas para a construção de estruturas de dados categóricos. patchwork para juntar gráficos distintos. ggExtra para plotar gráficos marginais. janitor para as tabelas de frequência.

6 Divisão do Trabalho e Curva de Aprendizado

  • Limpeza de dados : Marcos
  • Medidas : análises 3.1, 3.2, 3.3 Hanna e 3.4 Marcos
  • Visualizações : 6 primeiras Marcos e 3 últimas Hanna

Hanna: “Foi interessante no sentido de aplicabilidade de cada medida e tipo de gráfico em cada contexto a ser analisado, ao mesmo tempo que produtivo do ponto de vista de familiarização com as possibilidades de customização do ggplot2 e de usabilidade do pacote janitor para as tabelas de frequência”

Marcos : “Familiarização com o tidyverse ggplot e rbase. Além disso foi inportante pro aprendizado de Rmarkdown e para a exploração de dados”

Github: https://github.com/HannaRF/Exploratory_Data_Analysis

7 Referências


  1. Link para a página do usuário que carregou a base aqui↩︎