Onde se hospedar pelo Airbnb em Lisboa, Portugal

Airbnb já é considerado como sendo a maior empresa hoteleira da atualidade, mesmo não possuindo nenhum hotel !

No final de 2018, a Startup fundada 10 anos atrás, já havia hospedado mais de 300 milhões de pessoas ao redor de todo o mundo, desafiando as redes hoteleiras tradicionais.

Uma das iniciativas do Airbnb é disponibilizar dados do site, para algumas das principais cidades do mundo. Por meio do portal INSIDE Airbnb, é possível baixar uma grande quantidade de dados para desenvolver projetos e soluções de Data Science.

Neste notebook, iremos analisar os dados referentes à cidade Lisboa que fica em Portugal, e ver quais insights podem ser extraídos a partir de dados brutos, objetivando escolher uma hospadagem com preço acessível e com boa avaliação dos hospedes

Obtenção dos Dados

Todos os dados usados aqui foram obtidos a partir do site Inside Airbnb. Para esta análise exploratória inicial, será baixado apenas o seguinte arquivo:

listings.csv – Summary information and metrics for listings in Lisbon (good for visualisations)

# importar os pacotes necessarios
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline
# importar o arquivo listings.csv para um DataFrame
df = pd.read_csv("http://data.insideairbnb.com/portugal/lisbon/lisbon/2019-09-27/visualisations/listings.csv")

Análise dos Dados

Vamos mostrar as 5 primeiras linhas dos dados obtidos para ter uma visão geral:

# mostrar as 5 primeiras entradas/linhas
df.head()
idnamehost_idhost_nameneighbourhood_groupneighbourhoodlatitudelongituderoom_typepriceminimum_nightsnumber_of_reviewslast_reviewreviews_per_monthcalculated_host_listings_countavailability_365
06499Belém 1 Bedroom Historical Apartment14455BrunoLisboaBelm38.69675-9.19840Entire home/apt363162019-08-130.26110
125659Sunny, Alfama Sleeps 3 – Coeur d’Alfama107347EllieLisboaSanta Maria Maior38.71167-9.12696Entire home/apt6031082019-08-291.631324
228066ear the birds120855LuciaAzambujaAveiras de Cima39.14654-8.91503Private room5310NaNNaN1365
329138Room for rent in shared house125304SusanaLisboaAreeiro38.73634-9.13792Private room7110NaNNaN1365
429248Apartamento Alfama com vista para o rio!125768BárbaraLisboaSanta Maria Maior38.71272-9.12628Entire home/apt6033132019-09-182.941354

Agora vamos ao dicionários de dados descrevendo para qual o conteúdo de cada coluna.

#obtem mais informações sobre as colunas
df.info()
RangeIndex: 25134 entries, 0 to 25133
Data columns (total 16 columns):
id                                25134 non-null int64
name                              25112 non-null object
host_id                           25134 non-null int64
host_name                         25126 non-null object
neighbourhood_group               25134 non-null object
neighbourhood                     25134 non-null object
latitude                          25134 non-null float64
longitude                         25134 non-null float64
room_type                         25134 non-null object
price                             25134 non-null int64
minimum_nights                    25134 non-null int64
number_of_reviews                 25134 non-null int64
last_review                       21585 non-null object
reviews_per_month                 21585 non-null float64
calculated_host_listings_count    25134 non-null int64
availability_365                  25134 non-null int64
dtypes: float64(3), int64(7), object(6)
memory usage: 3.1+ MB

O conjunto de dados possui 25134 linhas (entradas) e 16 colunas (variáveis)

Dicionário das variáveis

  • id – número de id gerado para identificar o imóvel
  • name – nome da propriedade anunciada
  • host_id – número de id do proprietário (anfitrião) da propriedade
  • host_name – Nome do anfitrião
  • neighbourhood_group – esta coluna não contém nenhum valor válido
  • neighbourhood – nome do bairro
  • latitude – coordenada da latitude da propriedade
  • longitude – coordenada da longitude da propriedade
  • room_type – informa o tipo de quarto que é oferecido
  • price – preço para alugar o imóvel
  • minimum_nights – quantidade mínima de noites para reservar
  • number_of_reviews – número de reviews que a propriedade possui
  • last_review – data do último review
  • reviews_per_month – quantidade de reviews por mês
  • calculated_host_listings_count – quantidade de imóveis do mesmo anfitrião
  • availability_365 – número de dias de disponibilidade dentro de 365 dias

Antes de iniciar qualquer análise, vamos verificar a cara do nosso dataset, analisando as 5 primeiras entradas.

Analisando valores ausentes

Um ponto muito importante, antes de partir para analise dos dados, é fazer a limpeza de valores ausentes que podem distorcer os resultados.

# ordenar em ordem decrescente as variáveis por seus valores ausentes
(df.isnull().sum() / df.shape[0] * 100).sort_values(ascending=False)
reviews_per_month                 14.120315
last_review                       14.120315
name                               0.087531
host_name                          0.031829
availability_365                   0.000000
calculated_host_listings_count     0.000000
number_of_reviews                  0.000000
minimum_nights                     0.000000
price                              0.000000
room_type                          0.000000
longitude                          0.000000
latitude                           0.000000
neighbourhood                      0.000000
neighbourhood_group                0.000000
host_id                            0.000000
id                                 0.000000
dtype: float64

Podemos verificar que as variáveis reviews_per_month e last_review tem 14% nulos.

Como vamos considerar o fator quantidade de reviews como o mais importante para seleção da hospedagem, precisamos tratar a reviews_per_month, zedando onde estiver com valores ausentes.

# Atualizar review_per_months para ZERO onde estiver NaN
df = df.replace({"reviews_per_month": {np.nan: 0}})
(df.isnull().sum() / df.shape[0] * 100).sort_values(ascending=False)
last_review                       14.120315
name                               0.087531
host_name                          0.031829
availability_365                   0.000000
calculated_host_listings_count     0.000000
reviews_per_month                  0.000000
number_of_reviews                  0.000000
minimum_nights                     0.000000
price                              0.000000
room_type                          0.000000
longitude                          0.000000
latitude                           0.000000
neighbourhood                      0.000000
neighbourhood_group                0.000000
host_id                            0.000000
id                                 0.000000
dtype: float64

Identificando valores “fora da curva”

Outro ponto importante é idenitificar valores muito fora do padrão. Podemos utilizar os gráficos abaixo para ter uma ideia visual destes “outliers”. https://pt.wikipedia.org/wiki/Outlier

Para isto vamos analisar visualmente o conteúdo da variavel número de reviews total e a média mensal de reviews. Além da variavel price e da minimum_nights pois não queremos aquele onde o minimo de noites seja maior que 7 dias.

# plotar o histograma do número de reviews total
df[['price','reviews_per_month','number_of_reviews', 'minimum_nights']].hist(bins=20, figsize=(25,10), color='Green');

# Analise estatistica df[[‘number_of_reviews’, ‘reviews_per_month’, ‘price’, ‘minimum_nights’]].describe()

number_of_reviewsreviews_per_monthpriceminimum_nights
count25134.00000025134.00000025134.00000025134.000000
mean39.3009471.53970097.9475612.820761
std60.8061131.652411195.57741410.546084
min0.0000000.0000000.0000001.000000
25%2.0000000.21000048.0000001.000000
50%14.0000001.00000069.0000002.000000
75%50.0000002.440000100.0000003.000000
max825.00000016.67000012345.0000001000.000000

Podemos verificar que:

Number_of_reviews: a maioria está entre 0 e 50 reviews, porém tem alguns com reviews acima de 600 e até mesmo 1 que chega a 800 reviews. Quanto maior a quantidade de reviews melhor.

Reviews_per_month: a maioria está entre 0 e 2 reviews por mês, sendo que em torno de 500 hospedagens chegam a 5 reviews mensais. Existem poucos que tem média de reviews acima de 15 mensais. Quanto mair a média melhor.

Price: a maioria está abaixo de 100 euros. A mediana está em 69 euros.

Minimum_nigths: a mediana em 2 dias, e podemos considerar outliers acima de 15 dias.

Podemos verificar que com certeza temos um outlier no preço acima de 2000 euros. Pois 75% está abaixo de 100 euros.

Como queremos somente hospedagens com valor que fiquem mais proximos da mediana, vamos criar novo conjunto de dados filtrando o que nos interessa, objetivando assim obter hospedagens com valores mais medianos e que tenham maior quantidade de locação e de revisões.

Fazendo a limpeza dos dados

Levando em consideração que queremos uma hospedagem com valor mediano, vamos criar um novo conjunto de dados desconsiderando aquelas entradas que estão fora da faixa que desejamos.

Vamos selecionar as que tenham mais reviews totais e mensais e também as que ficam mais próximo do centro, que o tipo de hospedagem seja ‘Private room’ ou ‘Entire home/apt’ e que a localização que seja o mais próximo do centro.

# mostrar a quantidade de cada tipo de imóvel disponível
df.room_type.value_counts()
Entire home/apt    18329
Private room        5740
Hotel room           682
Shared room          383
Name: room_type, dtype: int64

Aplicando os filtros e gerando ium novo dataset.

# Novo DF com dados filtrados
novo = df.loc[ (df.price > 50) & (df.price < 70) & 
              (df.number_of_reviews > 50) & (df.reviews_per_month >= 2) &
              (df.minimum_nights <= 7) &
              ((df.room_type == 'Entire home/apt') | (df.room_type == 'Private room')) &
              (df.neighbourhood_group == 'Lisboa') 
              # & (df.latitude > 38.71) & (df.latitude < 38.74) &
              #(df.longitude > -9.14) & (df.longitude < -9.12)
               ]
novo[['number_of_reviews', 'reviews_per_month', 'price']].describe()
number_of_reviewsreviews_per_monthprice
count991.000000991.000000991.000000
mean144.3218973.74366360.272452
std80.2040351.4203914.690032
min51.0000002.00000051.000000
25%83.0000002.68000056.000000
50%122.0000003.46000060.000000
75%184.5000004.46000065.000000
max520.00000016.67000069.000000

Analisando a planilha podemos ver que melhorou muito pois a quantidade mediana de reviews subiu 442% e a quantidade mensal tambem melhorou muito.

ANALISEAntesDepoisAumento/Redução
entradas25.134991-96%
number_of_reviews14122+871%
reviews_pre_month13,4+340%
price6960-13%

Agora temos dados mais próximos do nosso objetivo. Mas ainda falta mais analises para finalizarmos a seleção.

# após limpeza
novo[['price','reviews_per_month','number_of_reviews', 'minimum_nights']].hist(bins=15, figsize=(25,10), color='Green');

Agora podemos ver com mais clareza. A Mediana minima de noites são 2 noites e temos muitos hospedagens com valor mediano de 50 euros.

Analisando preço médio.

Analisando preço médio por bairro, verificamos que a varição é pequena se compararmos com a variação da amostra original.

# ver preços por bairros, na média - 5 mais caras e 5 mais baratas
novo.groupby(['neighbourhood']).price.mean().sort_values(ascending=False)#[:10]
neighbourhood
Benfica                   69.000000
Lumiar                    64.500000
Alvalade                  61.500000
Santo Antnio              60.910448
Santa Maria Maior         60.667797
Estrela                   60.602740
Arroios                   60.600000
Penha de Frana            60.304348
So Vicente                60.231405
Campo de Ourique          60.230769
So Domingos de Benfica    60.000000
Misericrdia               59.870536
Parque das Naes           59.444444
Areeiro                   59.166667
Alcntara                  59.000000
Avenidas Novas            58.625000
Campolide                 58.000000
Belm                      57.941176
Ajuda                     57.428571
Olivais                   56.000000
Beato                     55.500000
Carnide                   55.000000
Name: price, dtype: float64

Vamos mostrar um mapa das hospedagens, e colorindo por seu preço, sendo o vermelho o mais barato e o azul escuro o mais caro.

# plotar os imóveis pela latitude-longitude
novo.plot(kind="scatter", x='longitude', y='latitude', alpha=0.4, c=novo['price'], s=8,
              cmap=plt.get_cmap('jet'), figsize=(12,8));

Conclusões

Como podemos verificar os dados normalmente vem com algumas variaveis contendo valores outliers e tambem valores ausentes. Muito importante fazer a limpeza antes de iniciar a analise exploratória.

Neste estudo de caso, fizemos varias limpesas e também uma seleção conforme a nossa necessidade de visualizar as hospedagens que consideramos mais adequadas.

Faltou analisar os reviews negativos, porém a amostra não disponibilzava esta informação.

Abaixo uma lista dos hospedagens com maior reviews que é o fator principal que consideramos para selecionar as hospedagens.

# Apartamento mais avaliados
df_clean.sort_values(by="number_of_reviews", ascending=False)[:5]

Out[0]:

idnamehost_idhost_nameneighbourhood_groupneighbourhoodlatitudelongituderoom_typepriceminimum_nightsnumber_of_reviewslast_reviewreviews_per_monthcalculated_host_listings_countavailability_365
11491745355open space in Lisbon close airport9186518AndreLisboaOlivais38.76907-9.11009Entire home/apt4918252019-09-2411.451153
27484689339Double bed near Lisb airport(Blue)23427234AntónioLouresMoscavide e Portela38.78431-9.11202Private room2216582019-09-2612.34353
55133734BED & BREAKFAST WITH A VIEW! Sintra656540MarianneSintraColares38.79621-9.47342Private room2616452019-09-246.391312
7611085634Cozy Flat at Bica/ Bairro Alto5968047MariaLisboaMisericrdia38.70926-9.14607Entire home/apt4016422019-09-248.271291
94176153The White House – Historical Center842219Inês & AntónioLisboaMisericrdia38.70817-9.14368Entire home/apt20016362019-09-166.422215

Agora é um trabalho manual de selecionar a hospedagem definitiva, utilizando o proprio site do Aribnb e passando como parametro o id da hospedagem:

Para consultar a hospedagem, utilize este link: https://www.airbnb.com.br/rooms/1745355 lembrando de trocar o último código pelo ID da hospedagem.

Os fontes deste notebook podem ser acessados no Github: https://github.com/helderam/data-science .

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *