Introdução

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.

Objetivos

Limpeza e Tratamento dos Dados

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.

Análise Exploratória dos Dados

Gráfico de Correlação

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.

Gráfico de Dispersão

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.

Distribuição da variável Preço

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.

Médias de preço e números de quartos por domicílio

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.

Análise de Regressão

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.

Predição

É possível fazer a predição neste site

Conclusão e Estudos Futuros

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.