Esta análise trata de imóveis para alugar no Distrito Federal no ano de 2024. O conjunto de dados foi disponibilizado no Kaggle e tem cinco colunas: preço, bairro, número de quartos, área e tipo de imóvel. Atualemnte há diversas plataformas especializadas em locação e venda de propriedades imobiliárias, no entanto uma análise de regressão e uma análise exploratória podem ser úteis para entender o comportamento desse mercado e entender padrões.
imoveis_df <- read_delim("imoveis-df.csv", delim = ";", escape_double = FALSE, trim_ws = TRUE)
summary(imoveis_df) # Preço e área zero são inconsistentes, além dos 4 NA's em área, tipo e bairro estão como chr
trat_imoveis_df <- imoveis_df |> # Resolvendo as consistências
filter(preco != 0 & area >= 20 & preco != 0 & preco <= 5000 & area <=600) |>
na.exclude()
trat_imoveis_df <- trat_imoveis_df |> mutate_at(vars(tipo, bairro), factor) # Mudando bairro e tipo para fct
summary(trat_imoveis_df)
trat_imoveis_df$tipo |> levels() # Vamos proseeguir apenas com a categorias moradias
trat_imoveis_df <- trat_imoveis_df |> filter(tipo == c("Apartamento", "Casa", "Kitnet")) # Filtrados apenas os tipos de interesse
trat_imoveis_df$bairro <- str_to_title(trat_imoveis_df$bairro) # Colocando os nomes dos bairros em letra maiúscula
trat_imoveis_df <- as_tibble(trat_imoveis_df)
Os dados foram filtrados e resolvidas algumas inconsistências na tabela. Ao final da limpeza, temos as seguintes medidas resumo:
summary(trat_imoveis_df)
## preco tipo area quartos
## Min. : 210 Apartamento:477 Min. : 20.0 Min. :1.000
## 1st Qu.: 900 Kitnet :199 1st Qu.: 30.0 1st Qu.:1.000
## Median :1250 Casa : 90 Median : 44.0 Median :1.000
## Mean :1609 Hotel-Flat : 0 Mean : 61.7 Mean :1.697
## 3rd Qu.:1950 Loja : 0 3rd Qu.: 69.0 3rd Qu.:2.000
## Max. :5000 Lote : 0 Max. :579.0 Max. :6.000
## (Other) : 0
## bairro
## Length:766
## Class :character
## Mode :character
##
##
##
##
Assim, pode-se perceber que restaram 766 observações no conjunto de dados, na maioria apartamentos. Além disso, a área varia de 20 a 576 m², o preço médio é maior do que um salário mínimo (1412 reais) e, em média, as propriedades têm mais de um quarto.
matcor <- trat_imoveis_df |> select_if(is.numeric) |> cor()
corrplot::corrplot(matcor)
A alta correlação entre as variáveis era de certo modo esperada, uma vez
que quanto maior a área, maior número de quartos e maior o preço do
aluguel também.
p <- trat_imoveis_df |> ggplot(aes( x = area, y = preco, color = tipo, text = paste0("bairro: ", bairro,"\n quartos: ", quartos))) +
geom_point() +
labs( x = "Área", y = "Preço") +
ggtitle("Dispersão do Preço x Área das observações")
ggplotly(p)
Pode-se observar que as casas de modo geral apresentam as maiores áreas, porém há apartamentos que também atingem alguns dos maiores valores observados. É uma decisão interessante a ser tomada pelo locatário.
trat_imoveis_df |> ggplot(aes(x = preco)) +
geom_histogram()
Percebe-se uma forte assimetria nos preços dos imóveis, uma cauda pesada
à direita. É uma indicação que não segue uma normalidade.
trat_imoveis_df %>% group_by(tipo) %>%
summarise(media = mean(preco)) %>%
ggplot(aes(x = tipo, y = media)) +
geom_bar(stat="identity", fill="steelblue")+
geom_text(aes(label=media %>% round(digits = 2)), vjust=1.6, color="white", size=3.5) +
ggtitle('Média de preços de imóveis por tipo') +
labs(x = "Tipo de domicílio", y = "Preço médio (R$)")
trat_imoveis_df %>% group_by(tipo) %>%
summarise(media = mean(quartos)) %>%
ggplot(aes(x = tipo, y = media)) +
geom_bar(stat="identity", fill="steelblue")+
geom_text(aes(label=media %>% round(digits = 2)), vjust=1.6, color="white", size=3.5) +
ggtitle('Média de quarto por tipo de imóvel') +
labs(x = "Tipo de domicílio", y = "Número de quartos")
As casas tem quase 3 quartos em média, enquanto as kitnet só tem um,
como esperado por definição. Os preços parecem seguir o padrão das
áreas: casas com os maiores valores, seguidas de apartamentos e
kitnets.
Como visto anteriormente, a distribuição dos preços não segue uma gaussiana. Para resolver este problema, foi tentato sem existo as transformações logarítmicas e de BoxCox. Assim, foi ajustado um modelo de regressão generalizado.
modelo1 <- glm(preco ~ tipo + area + quartos + bairro, data = trat_imoveis_df, family = Gamma(link = 'log'))
summary.glm(modelo1)
##
## Call:
## glm(formula = preco ~ tipo + area + quartos + bairro, family = Gamma(link = "log"),
## data = trat_imoveis_df)
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.3926 -0.2319 -0.0454 0.1434 1.1086
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.8780253 0.0434914 158.147 < 2e-16 ***
## tipoCasa 0.0030703 0.0466863 0.066 0.947582
## tipoKitnet -0.3706504 0.0310419 -11.940 < 2e-16 ***
## area 0.0037895 0.0003436 11.030 < 2e-16 ***
## quartos 0.1804410 0.0206912 8.721 < 2e-16 ***
## bairroAreal -0.3532239 0.1219071 -2.897 0.003874 **
## bairroAsa Norte 0.1417384 0.0418777 3.385 0.000751 ***
## bairroAsa Sul 0.3475898 0.0500319 6.947 8.21e-12 ***
## bairroCeilandia -0.6920805 0.0745584 -9.282 < 2e-16 ***
## bairroCruzeiro 0.0739795 0.0924669 0.800 0.423932
## bairroGama -0.2925199 0.1219520 -2.399 0.016704 *
## bairroGuara I -0.3390762 0.0811777 -4.177 3.31e-05 ***
## bairroGuara Ii -0.1337542 0.0590027 -2.267 0.023685 *
## bairroJardim Botanico -0.3654728 0.0942274 -3.879 0.000114 ***
## bairroLago Norte 0.1477943 0.0606599 2.436 0.015069 *
## bairroLago Sul -0.1254938 0.1632452 -0.769 0.442292
## bairroLucio Costa -0.0543618 0.1581873 -0.344 0.731204
## bairroMangueiral -0.2912501 0.1144377 -2.545 0.011129 *
## bairroNoroeste 0.4768047 0.0916575 5.202 2.56e-07 ***
## bairroNucleo Bandeirante -0.6645782 0.1033377 -6.431 2.28e-10 ***
## bairroOctogonal 0.3300269 0.1587699 2.079 0.037996 *
## bairroParanoa -0.7138530 0.1328132 -5.375 1.03e-07 ***
## bairroPark Sul 0.4626959 0.1030046 4.492 8.19e-06 ***
## bairroRecanto Das Emas -0.8547739 0.1242468 -6.880 1.29e-11 ***
## bairroRiacho Fundo -0.5455467 0.0956515 -5.703 1.70e-08 ***
## bairroSamambaia -0.6442697 0.0671560 -9.594 < 2e-16 ***
## bairroSanta Maria -0.7507780 0.1426527 -5.263 1.86e-07 ***
## bairroSobradinho -0.3438918 0.0973470 -3.533 0.000437 ***
## bairroSudoeste 0.2410804 0.0479221 5.031 6.15e-07 ***
## bairroTaguatinga -0.5142674 0.0504218 -10.199 < 2e-16 ***
## bairroVicente Pires -0.5223048 0.0915332 -5.706 1.68e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for Gamma family taken to be 0.09605938)
##
## Null deviance: 252.416 on 765 degrees of freedom
## Residual deviance: 67.549 on 735 degrees of freedom
## AIC: 11448
##
## Number of Fisher Scoring iterations: 7
Ajustado o modelo, varificou-se a qualidade do mesmo. Todas as variáveis foram significativas. Assim, já é possível fazer a predição dos preços.
É possível fazer a predição neste site
Esse projeto foi curto, mas teve seu principal objetivo alcançado que era trabalhar com o shiny. Gostaria de voltar a trabalhar com esse tema, numa próxima vez raspando sites de imobiliárias da minha região e talvez conseguindo mais itens que acho válido nesse assunto como se tem garagem ou não, se é primeiro aluguel, ano de construção do imóvel, etc…No mais, fica clara a necessidade de melhorar a estética e minhas habilidades em geral com o Shiny, de repente será refeito esta aplicação no futuro com mais preocupações estéticas.