Este repositório tem como finalidade estimar o valor de estadia no Rio de Janeiro analisando dados do AirBnB
use python >= 3.6
pip3 install -r requirements.txt
wget http://data.insideairbnb.com/brazil/rj/rio-de-janeiro/2020-01-21/data/listings.csv.gz
gzip -d listings.csv.gz
mv listings.csv data/
mkdir models
python3 main.py
Inicialmente foi realizado uma análise exploratória no conjunto de dados, removendo aquelas que julguei não serem necessárias para a condução deste estudo. Em seguida, foram verificadas as propriedades de cada variável restante, tais como seu o tipo, descrição, quantidade de dados nulos ( 1, 2, 3 ), exemplo de itens existentes em cada variável, bem como a identificação de variáveis que possuem apenas um label.
Após esse contato inicial com a base de dados, foram utilizadas as seguintes rotinas de pré-processamento:
-
Tratamento textual de variáveis categóricas para transformá-las em numéricas
(ex.:'$500,00'
parafloat(500.00)
) -
Agrupamento de variáveis numéricas para transformá-las em categóricas
(ex.:'$1.500,00'
para500.00
) -
Contagem de palavras existentes em variáveis de texto para transformá-las em variáveis numéricas
(ex.:'lindo APTO em Copacabana'
para4
).
Para cada variável numérica, foram gerados seus respectivos gráficos de
histograma e boxplot,
possibilitando identificar visualmente casos aonde existem
distribuição assimétrica dos dados e outliers.
A variável price
, por exemplo, apresenta uma
assimetria à direita,
ou seja, tem uma concentração de valores baixos, mas sua média é influenciada
em função da cauda longa com valores mais altos.
Em seu gráfico boxplot é possível visualizar a presença de outliers.
A partir da interpretação gráfica, auxiliado pela análise descritiva de cada
variável feita anteriormente, foi aplicado uma
remoção de outliers
da base de dados, a qual consistiu em normalizar os dados de dada variável
e excluir suas entradas que estivessem acima de 3 desvios padrões
(-3 > z-score > 3
).
A variável dependente price
foi
transformada em log,
facilitando a conversão
do modelo de regressão a ser aplicado.
Os gráficos de histograma e boxplot foram então gerados novamente, possibilitando identificar as distribuições atualizadas após o processo de remoção de outliers, bem como todas as rotinas de exploração de dados, as quais foram recomputadas para análise.
Foi empregada a métrica de ajuste o RMSE (Root Mean Square Error), que consiste em aferir a diferença entre o valor estimado por dado modelo de regressão e o valor real. Por elevar o erro ao quadrado, esta é uma métrica sensível à outliers, o que pode ser um indicadivo para iterar a análise e filtragem dos dados.
Outro fator que favoreceu o uso desta métrica é que, por se tratar de uma avaliação universal, permite comparar o resultado de diferentes modelos empregados.
Uma vez separado o conjunto de dados em treino (70%) e validação (30%), o modelo final foi aquele que alcançou o menor erro RMSE no conjunto de validação, que neste caso foi utilizando o método Gradient Boosting.
Foram empregados no total cinco métodos distintos de regressão, sendo três abordagens lineares Ridge, Lasso e ElasticNet , a regressão não-linear SVR e o modelo Gradient Boosting.
Para todos os casos foram testados diferentes combinações de hiperparâmetros, além da avaliação cruzada, buscando o melhor ajuste possível para o conjunto de dados existente.
Visto que a variável dependente price
é contínua, esta tarefa teve a
necessidade de utilização de uma abordagem de regressão.
Neste sentido, foi decidido utilizar modelos mais simples e de baixa complexidade,
tanto em sua implementação como na otimização de hiperparâmetros,
possibilitando agregar resultados consistentes em pouco tempo.
O modelo de regressão escolhido apresentou ser mais robusto frente aos demais no benchmark desenvolvido neste estudo, sendo suficiente para dada tarefa.