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.