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.


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))


Medidas


Animais

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

Cidade

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

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"))


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"))

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"))

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"))

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

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

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

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(!is.na(Tabela$floor) )
## [1] 0.1856697

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

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

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.

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.

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( !is.na(Tabela$floor) ) ) 

Covariance
## [1] 0.02582247
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, !is.na(Tabela$floor) )/( sd(Tabela$area) * sd( !is.na(Tabela$floor) ) ) 

Covariance
## [1] -0.3375788


Covariance <- cov(Tabela$rooms, !is.na(Tabela$floor) )/( sd(Tabela$rooms) * sd( !is.na(Tabela$floor) ) ) 

Covariance
## [1] -0.2218664


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)


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 = "na cidade",
                    labels = c("não", "sim")) +
  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 

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")




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.Usei patchwork para juntar gráficos distintos.E ggExtra para plotar gráficos marginais.E janitor para tabelas de frequência.




Referências


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