Projeto: Previsão do preço da estadia

Desafio

Faça uma análise exploratória para avaliar a consistência dos dados e identifcar possíveis variáveis que impactam sua variável resposta.

Para a realização deste teste você pode utilizar o software de sua preferência (Python ou R).

Sua solução deverá ser entregue no formato Jupyter, por meio de um repositório Git. Inclua também um arquivo README.md no qual você deve cobrir as respostas para os 5 pontos abaixo.

a. Como foi a definição da sua estratégia de modelagem?
b. Como foi definida a função de custo utilizada?
c. Qual foi o critério utilizado na seleção do modelo final?
d. Qual foi o critério utilizado para validação do modelo? Por que escolheu utilizar esse método? e. Quais evidências você possui de que seu modelo é suficientemente bom?

Sobre o dataset

O dataset utilizado é uma extração de dados do Airbnb Rio de Janeiro, conforme fonte.

image info

Airbnb permite aos indivíduos alugar o todo ou parte de sua própria casa, como uma forma de acomodação extra. O site fornece uma plataforma de busca e reservas entre a pessoa que oferece a acomodação e o turista que busca pela locação. Abrange mais de 500 mil anúncios em mais de 35.000 cidades e 192 países. Desde sua criação em Novembro de 2008 até Junho de 2012, mais de 10 milhões de reservas foram agendadas via Airbnb.

Sumário e principais resultados

Algoritmo Final Selecionado

Random Forest

Métricas de Avaliação

MSE (Mean Squared Error)
MAE (Mean Absolute Error)
R^2 (R squared)

Index

1. Imports
    1.1. Bibliotecas
    1.2. Conjunto de dados
    1.3. Dicionário das variáveis
2. Análise Exploratória dos dados
    2.1. Descrição dos dados
    2.2. Respondendo à perguntas
3. Machine Learning
    3.1. Preparação dos dados
    3.2. Definindo a baseline
    3.3. Tranformação dos dados
    3.4. Escolhendo o modelo
    3.5. Variação no treino dos modelos
        3.5.1. 1º Tunning do modelo selecionado
        3.5.2. 2º Tunning do modelo selecionado
4. Treinamento com todos os dados
    4.1. Previsão nos dados de teste
5. Conclusão  


Conclusões e Resultados

BASELINE:
    MSE: 14404.359124812358
    MAE: 98.5996424320113
    R^2: 0.2230869229876291

MODELO FINAL:
    MSE: 0.2199302824060129
    MAE: 0.38104048502370497
    R^2: 0.41041561263625315

1. Imports

1.1. Bibliotecas

1.2. Conjunto de dados

1.3. Dicionário das variáveis

2. Análise Exploratória dos dados

2.1. Descrição dos dados

Nesta seção conheceremos um pouco mais sobre os dados, suas dimensões e analisando algumas estatísticas descritivas.

Vamos criar agora, um dataframe que nos mostra se temos valores faltando, tipo dos dados e valores unicos em cada coluna.

Podemos ver que a variável neighbourhood_group não possui nenhum valor, enquanto que nas variáveis last_review e reviews_per_month possuem 37% de dados faltando.

Olhando as primeiras linhas e comparando com o tipo dos dados vemos que algumas variáveis estão incorretas, é o caso das variáveis host_id que é do tipo categórica e está como inteiro e a last_review que é do formato data e está como objeto, vamos fazer as devidas transformações em seguida.

E os valores únicos, bom para saber quantitativamente os valores únicos em cada amostra e ter uma idéia sobre seu tipo.

Já sabemos que algumas variáveis possuem dados faltando, vamos dar uma olhada visualmente o quanto representa dentro do nosso conjunto de dados.

A variável neigbourhood_group pode ser removida, já as variáveis last_review e reviews_per_month vamos ver posteriormente o que podemos fazer.

Vamos dar uma olhada nas distribuições das variáveis numéricas contínuas, plotando suas densidades.

Vamos analisar:

Com intuito de entender um pouco melhor, vamos ver as principais estatísticas com o método describe() do pandas.

Agora ver mais claramente a dimensão dos valores em relação suas distribuições, tomando a variável price como exemplo, 75% tem valores abaixo de 550 e seu valor máximo de 652216. Vamos tratar isso mais a frente.

Vamos dar uma olhada nas estatísticas das variáveis categóricas.

Vamos dar uma olhada mais uma vez nas distribuições, agora como um boxplot individualmente.

Precisamos tratar essas variáveis, porque os outliers influenciam diretamente no nosso modelo preditivo. Há várias técnicas para remover os outliers, como pelo z-score e pelo quantidade do interquartil por exemplo, mas vamos fazer algo mais simples definindo uma linha de corte pela concentração do volume de dados.

Por exemplo, a variável price concentra-se até em torno de 600, então definiremos os valores até 650. Da mesma forma definiremos para as variáveis minimum_nights e number_of_reviews.

Um ponto que devemos levar em consideração é a quantidade de amostras, quanto mais removemos, menor a quantidade para treinarmos o nosso modelo.

Conforme mencionei, com os cortes que fizemos, já reduzimos quase que 50% do conjunto de dados (de 26615 para 14053), optei por manter assim para não reduzirmos mais, mesmo que possa influenciar no nosso modelo.

Vamos novamente plotar os boxplots e observar o quanto melhorou em relação aos outliers.

Então vamos atualizar nosso conjunto de dados, pelo nosso dataset completo vamos localizar as amostras do dataset modificado pelo índice, utilizando como parâmetro do método loc[].

Aquela nossa variável sem dados, vamos removê-la.

Com base na latitude e longitude, vamos plotar os pontos em um mapa pela biblioteca plotly com open-street-map, com isso poderemos interagir também, caso desejar.

Podemos observar no geral que as correlações não são fortes e especificamente a latitude é o que mais relaciona com a nossa variável alvo price, que por sua se relaciona também com a longitude, fazendo sentido que é a localização.

2.2. Respondendo à perguntas

Vamos analisar mais especificamente alguns pontos, respondendo as seguintes perguntas:

  1. Qual a média de preços de aluguel?

  2. Quais as regiões mais caras?

  3. Quais os tipos de quartos mais alugados?

  4. Como o número de locais listados e os preços dos quartos / apartamentos variam de acordo com a região?

  5. Qual a variação de demanda ao longo do tempo?

  6. Qual a variação do preço ao longo do tempo?

Qual a média de preços de aluguel, no geral, e a média por região?

Quais as regiões mais caras?

A região com a maior média é Osvaldo Cruz e a menor média é Senador Camará.

Quais os tipos de quartos mais alugados?

A concentração dos tipos mais alugados, tanto em procura quanto por preço são de casas/apartamentos e quartos inteiros, os hoteis são os menos procurados.

Vou plotar um scatterplot com latitude e longitude, separando os pontos por cor para termos uma idéia da distribuição. Já vimos no mapa que a concentação maior de locais alugados são próximos as praias.

Vamos calcular a correlação dos tipos diferentes de room_type com variável price.

Qual a variação de demanda ao longo do tempo?

Qual a variação do preço ao longo do tempo?

3. Machine Learning

Agora vamos começar a modelar para treinar o modelo para realizar as previsões dos preços.

Antes de tudo, temos um conjunto de dados no qual iremos separar 10% desse conjunto, com uma amostra aleatória para testar o modelo. Esse conjunto para teste não participará em momento algum do treinamento do modelo, será exclusivamente, após o modelo devidamente parametrizado e treinado para realizar as previsões.

Desse jeito simularemos os dados em produção que chegam para o modelo, sem o modelo ter visto.

3.1. Preparação dos dados

Agora utilizaremos os dados de treino e validação para treinar, tunnar e validar o modelo.

Antes, vamos definir as variáveis que farão parte do nosso treinamento. já vimos qua as correlações em geral não são fortes, portanto vou selecionar as que eu acho mais significativas e depois vou ajustando conforme necessário.

Agora vamos separar os dados em treino e validação para rodar alguns modelos, de forma mais simples pra ver qual o que performa melhor.

3.2. Definindo a baseline

Para termos um base para comparação se o nosso modelo está melhorando conforme ajustes e o quanto ele melhorou, vamos definir uma baseline.

Utilizaremos um algoritmo de Linear regression sem transformações nos dados.

Para validação dos modelos utilizaremos 3 métricas para compare:

3.3. Tranformação dos dados

Antes de treinar o modelo, temos uma variável categórica que devemos transformar em numero para que o algoritmo entenda. A variável room_type será convertida e utilizaremos o LabelEncoder() do Sklearn.

Como uma boa prática, vamos criar cópias dos conjuntos antes das transformações.

Vale ressaltar, que as transformações devem ser treinadas somente com os dados de treino, tipo fit_transform e para os dados de validação, assim como de testes, somente transform, para evitar o data lackage ou vazamento de dados.

Ainda precisamos tratar os dados ausentes da coluna reviews_per_month, para um primeiro treinameno vamos substituir por zero.

Agora vamos obter a baseline.

Nosso modelo não performou muito bem, tanto para a previsão dos dados treino quanto para validação, o modelo errou muito, mas vamos melhorar isso!

3.4. Escolhendo o modelo

Vamos então rodar com os mesmos dados, vários algoritmos de Regressão Linear e analisar quem obtem os melhores resultados.

Podemos ver que os algoritmos de RANDOM FOREST e GRADIENT BOOSTING foram os que obtiveram os melhores desempenhos. Vamos dar uma olhada nas features mais importantes consideradas pelos modelos.

Podemos observar que, embora a ordenação sendo diferentes, analisando as 5 primeiras variáveis, vemos que os dois consideraram as mesmas.

Vou então testar outras combinações, somente para esses dois modelos, seguindo o mesmo fluxo que anteriormente.

Desconsiderando as duas últimas variáveis: minimum_nights e number_of_reviews.

Vamos analisar também com o framework boruta.

Referência para o Boruta:
https://towardsdatascience.com/boruta-explained-the-way-i-wish-someone-explained-it-to-me-4489d70e154a

3.5. Variação no treino dos modelos

Após variar algumas parâmetros, os valores que melhor contribuiram para as melhores performance do modelo serão usados para tunnar os hiperparâmetros.

3.5.1. 1º Tunning do modelo selecionado

Vamos dar uma olhada na regressão com scatterplot dos dados atuais no eixo x e os valores previstos no eixo y.

Vimos uma certa correlação entre as variáveis.

Com os valores dos hiperparâmetros encontrados, vamos variar em torno deles e utilizar o GridSearchCV para refinar a busca.

3.5.2. 2º Tunning do modelo selecionado

4. Treinamento com todos os dados

Para finalizar, após encontrar os melhores hiperparâmetros vamos definir as mesmas variáveis que utilizamos no treino e treinar com todos os dados no dataset de treino.

4.1. Previsão nos dados de teste

Agora é o momento de certificar que o nosso treinamento está performando bem, de acordo com os dados de validação.

Vamos utilizar os dados de teste, que separamos para não ter vazamento e por fim certificar nosso modelo.

Dessa forma é o mais próximo de um modelo em produção no qual o modelo treinado realiza previsões em dados que ele nunca viu e como o modelo é generalizado, ele consegue realizar as previsões estatisticamente corretas.

Importante mencionar que agora que as transoformações devem utilizar somente o método transform, que já foi treinado com o conjunto de treino.

Não devemos ter vazamento de dados, isso invalida o modelo.

5. Conclusão

Comparando os resultados finais com a baseline:

Baseline:

Modelo Final: