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.
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.
Analisaremos a seguir nossa amostra via tabelas de frequência e medidas tanto de resumo quanto de dispersão.
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.
paged_table(Tabela %>%
tabyl(animal) %>%
adorn_totals(where = c("row")) %>%
adorn_percentages(denominator = "col") %>%
adorn_pct_formatting(digits = 2) %>%
adorn_ns(position = "front"))
paged_table(Tabela %>%
tabyl(city) %>%
adorn_totals(where = c("row")) %>%
adorn_percentages(denominator = "col") %>%
adorn_pct_formatting(digits = 2) %>%
adorn_ns(position = "front"))
paged_table(Tabela %>%
tabyl(furniture) %>%
adorn_totals(where = c("row")) %>%
adorn_percentages(denominator = "col") %>%
adorn_pct_formatting(digits = 2) %>%
adorn_ns(position = "front"))
Analisaremos a seguir as relações entre as variáveis categóricas em nossa amostra.
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.
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.
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.
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.
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.
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.
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.
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.
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
# 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
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).
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.
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.
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
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.
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.
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