Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila Aula 3 - Intensivão de Python
Apostila Aula 3 - Intensivão de Python
Ciência de Dados
O que é?
É você usar os dados/informações do negócio para extrair informações valiosas e ajudar na
tomada de decisão.
De forma simples e o que é usado em muitas empresas -> É você resolver um desafio da
empresa/do negócio usando os dados disponíveis
O certo seria: Ciência de Dados tá preocupado em resolver os desafios do negócio e saber o
que fazer no futuro, fazer alguma previsão que vai ajudar a tomar o rumo da empresa e o
Business Intelligence tá em descrever como as coisas funcionaram/funcionaram até aqui
In [ ]:
Você cria o seu perfil de host (pessoa que disponibiliza um imóvel para aluguel por diária) e cria o
anúncio do seu imóvel.
Nesse anúncio, o host deve descrever as características do imóvel da forma mais completa possível,
de forma a ajudar os locadores/viajantes a escolherem o melhor imóvel para eles (e de forma a
tornar o seu anúncio mais atrativo)
Existem dezenas de personalizações possíveis no seu anúncio, desde quantidade mínima de diária,
preço, quantidade de quartos, até regras de cancelamento, taxa extra para hóspedes extras,
exigência de verificação de identidade do locador, etc.
Nosso objetivo
Construir um modelo de previsão de preço que permita uma pessoa comum que possui um imóvel
possa saber quanto deve cobrar pela diária do seu imóvel.
Ou ainda, para o locador comum, dado o imóvel que ele está buscando, ajudar a saber se aquele
imóvel está com preço atrativo (abaixo da média para imóveis com as mesmas características) ou
não.
Elas estão disponíveis para download abaixo da aula (se você puxar os dados direto do Kaggle pode
ser que encontre resultados diferentes dos meus, afinal as bases de dados podem ter sido
atualizadas).
Caso queira uma outra solução, podemos olhar como referência a solução do usuário Allan Bruno
do kaggle no Notebook: https://www.kaggle.com/allanbruno/helping-regular-people-price-listings-
on-airbnb
Você vai perceber semelhanças entre a solução que vamos desenvolver aqui e a dele, mas também
algumas diferenças significativas no processo de construção do projeto.
As bases de dados são os preços dos imóveis obtidos e suas respectivas características em cada
mês.
Expectativas Iniciais
Acredito que a sazonalidade pode ser um fator importante, visto que meses como dezembro
costumam ser bem caros no RJ
A localização do imóvel deve fazer muita diferença no preço, já que no Rio de Janeiro a
localização pode mudar completamente as características do lugar (segurança, beleza natural,
pontos turísticos)
Adicionais/Comodidades podem ter um impacto significativo, visto que temos muitos prédios e
casas antigos no Rio de Janeiro
Vamos descobrir o quanto esses fatores impactam e se temos outros fatores não tão intuitivos que
são extremamente importantes.
Para cada arquivo da base de dados a gente vai importar o arquivo e criar uma coluna na base de
dados com o mês e o ano de cada informação
In [4]: meses = {'jan': 1, 'fev':2, 'mar':3, 'abr': 4, 'mai':5, 'jun': 6, 'jul': 7, 'ago': 8, '
caminho_bases = pathlib.Path('dataset')
base_airbnb = pd.DataFrame()
mes = meses[nome_mes]
ano = arquivo.name[-8:]
ano = int(ano.replace('.csv', ''))
display(base_airbnb)
Living in a
0 14063 https://www.airbnb.com/rooms/14063 20180414160018 2018-04-14
Postcard
Beautiful
Modern
3 25026 https://www.airbnb.com/rooms/25026 20180414160018 2018-04-14
Decorated
Studio in Copa
TRANSAMERICA
34324 38844730 https://www.airbnb.com/rooms/38844730 20190923212307 2019-09-24 BARRA DA
TIJUCA R IV
Alugo para o
34325 38846408 https://www.airbnb.com/rooms/38846408 20190923212307 2019-09-24
Rock in Rio
Apt COMPLETO
em
34326 38846703 https://www.airbnb.com/rooms/38846703 20190923212307 2019-09-24 COPACABANA
c/TOTAL
SEGURANÇA
Cobertura
34327 38847050 https://www.airbnb.com/rooms/38847050 20190923212307 2019-09-24
Cinematografica
Quarto em
34328 38847655 https://www.airbnb.com/rooms/38847655 20190923212307 2019-09-24 cobertura em
frente à praia III
In [5]: print(list(base_airbnb.columns))
base_airbnb.head(1000).to_csv('primeiros_registros.csv', sep=';')
Visualizando os dados, percebemos que existe uma grande disparidade em dados faltantes. As
colunas com mais de 300.000 valores NaN foram excluídas da análise
Para as outras colunas, como temos muitos dados (mais de 900.000 linhas) vamos excluir as
linhas que contém dados NaN
host_is_superhost 460
host_listings_count 460
latitude 0
longitude 0
property_type 0
room_type 0
accommodates 0
bathrooms 1724
bedrooms 850
beds 2502
bed_type 0
amenities 0
price 0
guests_included 0
extra_people 0
minimum_nights 0
maximum_nights 0
number_of_reviews 0
instant_bookable 0
is_business_travel_ready 0
cancellation_policy 0
ano 0
mes 0
dtype: int64
print(base_airbnb.shape)
print(base_airbnb.isnull().sum())
(897709, 23)
host_is_superhost 0
host_listings_count 0
latitude 0
longitude 0
property_type 0
room_type 0
accommodates 0
bathrooms 0
bedrooms 0
beds 0
bed_type 0
amenities 0
price 0
guests_included 0
extra_people 0
minimum_nights 0
maximum_nights 0
number_of_reviews 0
instant_bookable 0
is_business_travel_ready 0
cancellation_policy 0
ano 0
localhost:8888/nbconvert/html/Desktop/Intensivão de Python/Aula 3/Gabarito - Solução Airbnb Rio.ipynb?download=false 6/33
10/02/2021 Gabarito - Solução Airbnb Rio
mes 0
dtype: int64
In [9]: print(base_airbnb.dtypes)
print('-'*60)
print(base_airbnb.iloc[0])
host_is_superhost object
host_listings_count float64
latitude float64
longitude float64
property_type object
room_type object
accommodates int64
bathrooms float64
bedrooms float64
beds float64
bed_type object
amenities object
price object
guests_included int64
extra_people object
minimum_nights int64
maximum_nights int64
number_of_reviews int64
instant_bookable object
is_business_travel_ready object
cancellation_policy object
ano int64
mes int64
dtype: object
------------------------------------------------------------
host_is_superhost f
host_listings_count 1
latitude -22.9469
longitude -43.1827
property_type Apartment
room_type Entire home/apt
accommodates 4
bathrooms 1
bedrooms 0
beds 2
bed_type Real Bed
amenities {TV,Internet,"Air conditioning",Kitchen,Doorma...
price $133.00
guests_included 2
extra_people $34.00
minimum_nights 60
maximum_nights 365
number_of_reviews 38
instant_bookable f
is_business_travel_ready f
cancellation_policy strict_14_with_grace_period
ano 2018
mes 4
Name: 0, dtype: object
Como preço e extra people estão sendo reconhecidos como objeto (ao invés de ser um float)
temos que mudar o tipo de variável da coluna.
In [10]: #price
base_airbnb['price'] = base_airbnb['price'].str.replace('$', '')
base_airbnb['price'] = base_airbnb['price'].str.replace(',', '')
base_airbnb['price'] = base_airbnb['price'].astype(np.float32, copy=False)
#extra people
base_airbnb['extra_people'] = base_airbnb['extra_people'].str.replace('$', '')
base_airbnb['extra_people'] = base_airbnb['extra_people'].str.replace(',', '')
base_airbnb['extra_people'] = base_airbnb['extra_people'].astype(np.float32, copy=False
#verificando os tipos
print(base_airbnb.dtypes)
host_is_superhost object
host_listings_count float64
latitude float64
longitude float64
property_type object
room_type object
accommodates int64
bathrooms float64
bedrooms float64
beds float64
bed_type object
amenities object
price float32
guests_included int64
extra_people float32
minimum_nights int64
maximum_nights int64
number_of_reviews int64
instant_bookable object
is_business_travel_ready object
cancellation_policy object
ano int64
mes int64
dtype: object
1. Ver a correlação entre as features e decidir se manteremos todas as features que temos.
2. Excluir outliers (usaremos como regra, valores abaixo de Q1 - 1.5xAmplitude e valores
acima de Q3 + 1.5x Amplitude). Amplitude = Q3 - Q1
3. Confirmar se todas as features que temos fazem realmente sentido para o nosso modelo
ou se alguma delas não vai nos ajudar e se devemos excluir
Vamos começar pelas colunas de preço (resultado final que queremos) e de extra_people
(também valor monetário). Esses são os valores numéricos contínuos.
Por fim, vamos avaliar as colunas de texto e definir quais categorias fazem sentido mantermos
ou não.
MAS CUIDADO: não saia excluindo direto outliers, pense exatamente no que você está fazendo. Se
não tem um motivo claro para remover o outlier, talvez não seja necessário e pode ser prejudicial
para a generalização. Então tem que ter uma balança ai. Claro que você sempre pode testar e ver
qual dá o melhor resultado, mas fazer isso para todas as features vai dar muito trabalho.
Ex de análise: Se o objetivo é ajudar a precificar um imóvel que você está querendo disponibilizar,
excluir outliers em host_listings_count pode fazer sentido. Agora, se você é uma empresa com uma
série de propriedades e quer comparar com outras empresas do tipo também e se posicionar dessa
forma, talvez excluir quem tem acima de 6 propriedades tire isso do seu modelo. Pense sempre no
seu objetivo
Out[11]: <AxesSubplot:>
def histograma(coluna):
plt.figure(figsize=(15, 5))
sns.distplot(coluna, hist=True)
def grafico_barra(coluna):
plt.figure(figsize=(15, 5))
ax = sns.barplot(x=coluna.value_counts().index, y=coluna.value_counts())
ax.set_xlim(limites(coluna))
price
In [14]: diagrama_caixa(base_airbnb['price'])
histograma(base_airbnb['price'])
C:\Users\joaop\anaconda3\lib\site-packages\seaborn\distributions.py:2551: FutureWarning:
`distplot` is a deprecated function and will be removed in a future version. Please adap
t your code to use either `displot` (a figure-level function with similar flexibility) o
r `histplot` (an axes-level function for histograms).
warnings.warn(msg, FutureWarning)
Como estamos construindo um modelo para imóveis comuns, acredito que os valores acima do
limite superior serão apenas de apartamentos de altíssimo luxo, que não é o nosso objetivo
principal. Por isso, podemos excluir esses outliers.
In [16]: histograma(base_airbnb['price'])
print(base_airbnb.shape)
C:\Users\joaop\anaconda3\lib\site-packages\seaborn\distributions.py:2551: FutureWarning:
`distplot` is a deprecated function and will be removed in a future version. Please adap
t your code to use either `displot` (a figure-level function with similar flexibility) o
r `histplot` (an axes-level function for histograms).
warnings.warn(msg, FutureWarning)
(810427, 23)
extra_people
In [17]: diagrama_caixa(base_airbnb['extra_people'])
histograma(base_airbnb['extra_people'])
C:\Users\joaop\anaconda3\lib\site-packages\seaborn\distributions.py:2551: FutureWarning:
`distplot` is a deprecated function and will be removed in a future version. Please adap
t your code to use either `displot` (a figure-level function with similar flexibility) o
r `histplot` (an axes-level function for histograms).
warnings.warn(msg, FutureWarning)
In [19]: histograma(base_airbnb['extra_people'])
print(base_airbnb.shape)
C:\Users\joaop\anaconda3\lib\site-packages\seaborn\distributions.py:2551: FutureWarning:
`distplot` is a deprecated function and will be removed in a future version. Please adap
t your code to use either `displot` (a figure-level function with similar flexibility) o
r `histplot` (an axes-level function for histograms).
warnings.warn(msg, FutureWarning)
(751233, 23)
host_listings_count
localhost:8888/nbconvert/html/Desktop/Intensivão de Python/Aula 3/Gabarito - Solução Airbnb Rio.ipynb?download=false 12/33
10/02/2021 Gabarito - Solução Airbnb Rio
In [20]: diagrama_caixa(base_airbnb['host_listings_count'])
grafico_barra(base_airbnb['host_listings_count'])
Podemos excluir os outliers, porque para o objetivo do nosso projeto porque hosts com mais de 6
imóveis no airbnb não é o público alvo do objetivo do projeto (imagino que sejam imobiliários ou
profissionais que gerenciam imóveis no airbnb)
accommodates
In [22]: diagrama_caixa(base_airbnb['accommodates'])
grafico_barra(base_airbnb['accommodates'])
Pelo mesmo motivo do "host_listings_count" vamos excluir os outliers dessa coluna porque
apartamentos que acomodam mais de 9 pessoas não são o nosso foco, nosso objetivo aqui é
para imóveis comuns.
Caso a gente quisesse incluir apartamentos de alto padrão a gente poderia manter essa variável
ou então construir um modelo só focado em imóvei com mais de 9 hóspedes
bathrooms
In [24]: diagrama_caixa(base_airbnb['bathrooms'])
plt.figure(figsize=(15, 5))
sns.barplot(x=base_airbnb['bathrooms'].value_counts().index, y=base_airbnb['bathrooms']
Out[24]: <AxesSubplot:ylabel='bathrooms'>
Pelo mesmo motivo dos anteriores, vamos excluir os outliers nos banheiros
bedrooms
In [26]: diagrama_caixa(base_airbnb['bedrooms'])
grafico_barra(base_airbnb['bedrooms'])
Pelo mesmo motivo dos anteriores, vamos excluir outliers em quantidade de quartos
beds
In [28]: diagrama_caixa(base_airbnb['beds'])
grafico_barra(base_airbnb['beds'])
Pelo mesmo motivo dos anteriores, vamos excluir outliers em quantidade de camas
guests_included
In [30]: #diagrama_caixa(base_airbnb['guests_included'])
#grafico_barra(base_airbnb['guests_included'])
print(limites(base_airbnb['guests_included']))
plt.figure(figsize=(15, 5))
sns.barplot(x=base_airbnb['guests_included'].value_counts().index, y=base_airbnb['guest
(1.0, 1.0)
Out[30]: <AxesSubplot:ylabel='guests_included'>
Vamos remover essa feature da análise. Parece que os usuários do airbnb usam muito o valor
padrão do airbnb como 1 guest included. Isso pode levar o nosso modelo a considerar uma feature
que na verdade não é essencial para a definição do preço, por isso, me parece melhor excluir a
coluna da análise
minimum_nights
In [32]: diagrama_caixa(base_airbnb['minimum_nights'])
grafico_barra(base_airbnb['minimum_nights'])
Aqui temos um motivo talvez até mais forte para excluir esses apartamentos da análise.
Estamos querendo um modelo que ajude a precificar apartamentos comuns como uma pessoa
comum gostaria de disponibilizar. No caso, apartamentos com mais de 8 noites como o
"mínimo de noites" podem ser apartamentos de temporada ou ainda apartamentos para morar,
em que o host exige pelo menos 1 mês no apartamento.
maximum_nights
In [34]: diagrama_caixa(base_airbnb['maximum_nights'])
grafico_barra(base_airbnb['maximum_nights'])
Isso porque parece que quase todos os hosts não preenchem esse campo de maximum nights,
então ele não parece que vai ser um fator relevante.
number_of_reviews
In [36]: diagrama_caixa(base_airbnb['number_of_reviews'])
grafico_barra(base_airbnb['number_of_reviews'])
Aqui poderíamos tomar algumas decisões diferentes. Eu vou tomar uma decisão baseado na
minha análise pessoal de tirar essa característica da análise, por alguns motivos:
1. Se excluirmos os outliers, vamos excluir as pessoas que tem a maior quantidade de reviews
(o que normalmente são os hosts que têm mais aluguel). Isso pode impactar muito
negativamente o nosso modelo
2. Pensando no nosso objetivo, se eu tenho um imóvel parado e quero colocar meu imóvel
lá, é claro que eu não tenho review nenhuma. Então talvez tirar essa característica da
análise pode na verdade acabar ajudando.
3. Particularmente tenho dúvida se essa característica deveria impactar ou não o preço final
plt.figure(figsize=(15, 5))
grafico = sns.countplot('property_type', data=base_airbnb)
grafico.tick_params(axis='x', rotation=90)
Apartment 458354
House 51387
Condominium 26456
Serviced apartment 12671
Loft 12352
Guest suite 3621
Bed and breakfast 3472
Hostel 2665
Guesthouse 2155
Other 1957
Villa 1294
Townhouse 969
Aparthotel 693
Chalet 481
Earth house 468
Tiny house 457
Boutique hotel 447
localhost:8888/nbconvert/html/Desktop/Intensivão de Python/Aula 3/Gabarito - Solução Airbnb Rio.ipynb?download=false 20/33
10/02/2021 Gabarito - Solução Airbnb Rio
Hotel 376
Casa particular (Cuba) 298
Cottage 230
Bungalow 207
Dorm 185
Cabin 141
Nature lodge 124
Castle 80
Treehouse 76
Island 54
Boat 53
Hut 40
Campsite 34
Resort 31
Camper/RV 24
Yurt 23
Tent 18
Tipi 17
Barn 15
Farm stay 13
Pension (South Korea) 9
Dome house 8
Igloo 6
In-law 6
Vacation home 4
Pousada 3
Houseboat 3
Timeshare 3
Casa particular 2
Plane 1
Name: property_type, dtype: int64
C:\Users\joaop\anaconda3\lib\site-packages\seaborn\_decorators.py:36: FutureWarning: Pas
s the following variable as a keyword arg: x. From version 0.12, the only valid position
al argument will be `data`, and passing other arguments without an explicit keyword will
result in an error or misinterpretation.
warnings.warn(
Aqui a nossa ação não é "excluir outliers", mas sim agrupar valores que são muito pequenos.
Todos os tipos de propriedade que têm menos de 2.000 propriedades na base de dados, eu
vou agrupar em um grupo chamado "outros". Acho que isso vai facilitar o nosso modelo
print(base_airbnb['property_type'].value_counts())
plt.figure(figsize=(15, 5))
grafico = sns.countplot('property_type', data=base_airbnb)
grafico.tick_params(axis='x', rotation=90)
['Other', 'Villa', 'Townhouse', 'Aparthotel', 'Chalet', 'Earth house', 'Tiny house', 'Bo
utique hotel', 'Hotel', 'Casa particular (Cuba)', 'Cottage', 'Bungalow', 'Dorm', 'Cabi
n', 'Nature lodge', 'Castle', 'Treehouse', 'Island', 'Boat', 'Hut', 'Campsite', 'Resor
t', 'Camper/RV', 'Yurt', 'Tent', 'Tipi', 'Barn', 'Farm stay', 'Pension (South Korea)',
'Dome house', 'Igloo', 'In-law', 'Vacation home', 'Pousada', 'Houseboat', 'Timeshare',
'Casa particular', 'Plane']
Apartment 458354
House 51387
Condominium 26456
Serviced apartment 12671
Loft 12352
Outros 8850
Guest suite 3621
Bed and breakfast 3472
Hostel 2665
Guesthouse 2155
Name: property_type, dtype: int64
C:\Users\joaop\anaconda3\lib\site-packages\seaborn\_decorators.py:36: FutureWarning: Pas
s the following variable as a keyword arg: x. From version 0.12, the only valid position
al argument will be `data`, and passing other arguments without an explicit keyword will
result in an error or misinterpretation.
warnings.warn(
- room_type
In [40]: print(base_airbnb['room_type'].value_counts())
plt.figure(figsize=(15, 5))
localhost:8888/nbconvert/html/Desktop/Intensivão de Python/Aula 3/Gabarito - Solução Airbnb Rio.ipynb?download=false 22/33
10/02/2021 Gabarito - Solução Airbnb Rio
Em tipo de quarto, não precisamos fazer nada, ele já parece estar bem distribuído
- bed_type
In [41]: print(base_airbnb['bed_type'].value_counts())
plt.figure(figsize=(15, 5))
grafico = sns.countplot('bed_type', data=base_airbnb)
grafico.tick_params(axis='x', rotation=90)
print(base_airbnb['bed_type'].value_counts())
plt.figure(figsize=(15, 5))
grafico = sns.countplot('bed_type', data=base_airbnb)
grafico.tick_params(axis='x', rotation=90)
Airbed 1155
Couch 496
Name: bed_type, dtype: int64
C:\Users\joaop\anaconda3\lib\site-packages\seaborn\_decorators.py:36: FutureWarning: Pas
s the following variable as a keyword arg: x. From version 0.12, the only valid position
al argument will be `data`, and passing other arguments without an explicit keyword will
result in an error or misinterpretation.
warnings.warn(
['Pull-out Sofa', 'Futon', 'Airbed', 'Couch']
Real Bed 570643
Outros 11340
Name: bed_type, dtype: int64
C:\Users\joaop\anaconda3\lib\site-packages\seaborn\_decorators.py:36: FutureWarning: Pas
s the following variable as a keyword arg: x. From version 0.12, the only valid position
al argument will be `data`, and passing other arguments without an explicit keyword will
result in an error or misinterpretation.
warnings.warn(
Aqui a nossa ação não é "excluir outliers", mas sim agrupar valores que são muito pequenos.
Como temos 1 valor claramente MUITO maior do que todos os outros, vou criar apenas 2
grupos de camas: "Real Bed" e "outros"
- cancellation_policy
In [42]: print(base_airbnb['cancellation_policy'].value_counts())
plt.figure(figsize=(15, 5))
grafico = sns.countplot('cancellation_policy', data=base_airbnb)
grafico.tick_params(axis='x', rotation=90)
print(base_airbnb['cancellation_policy'].value_counts())
plt.figure(figsize=(15, 5))
grafico = sns.countplot('cancellation_policy', data=base_airbnb)
grafico.tick_params(axis='x', rotation=90)
flexible 258096
strict_14_with_grace_period 200743
moderate 113281
strict 9696
super_strict_60 135
super_strict_30 32
Name: cancellation_policy, dtype: int64
C:\Users\joaop\anaconda3\lib\site-packages\seaborn\_decorators.py:36: FutureWarning: Pas
s the following variable as a keyword arg: x. From version 0.12, the only valid position
al argument will be `data`, and passing other arguments without an explicit keyword will
result in an error or misinterpretation.
warnings.warn(
['strict', 'super_strict_60', 'super_strict_30']
flexible 258096
strict_14_with_grace_period 200743
moderate 113281
strict 9863
Name: cancellation_policy, dtype: int64
C:\Users\joaop\anaconda3\lib\site-packages\seaborn\_decorators.py:36: FutureWarning: Pas
s the following variable as a keyword arg: x. From version 0.12, the only valid position
al argument will be `data`, and passing other arguments without an explicit keyword will
result in an error or misinterpretation.
warnings.warn(
- amenities
Como temos uma diversidade muito grande de amenities e, às vezes, as mesmas amenities podem
ser escritas de forma diferente, vamos avaliar a quantidade de amenities como o parâmetro para o
nosso modelo.
In [43]: print(base_airbnb['amenities'].iloc[1].split(','))
print(len(base_airbnb['amenities'].iloc[1].split(',')))
base_airbnb['n_amenities'] = base_airbnb['amenities'].str.split(',').apply(len)
['{TV', '"Cable TV"', 'Internet', 'Wifi', '"Air conditioning"', 'Kitchen', 'Doorman', 'E
levator', '"Buzzer/wireless intercom"', '"Family/kid friendly"', 'Hangers', '"Hair drye
r"', 'Iron', '"Laptop friendly workspace"}']
14
In [45]: diagrama_caixa(base_airbnb['n_amenities'])
grafico_barra(base_airbnb['n_amenities'])
Então, essa virou uma coluna de valor numérico e, como todas as outras colunas de valores
numéricos, eu exclui outliers com os mesmos modelos anteriores
Encoding
Precisamor Ajustar as features para facilitar o trabalho do modelo futuro (features de categoria, true
e false, etc.)
Features de Valores True ou False, vamos substituir True por 1 e False por 0.
Features de Categoria (features em que os valores da coluna são textos) vamos utilizar o
método de encoding de variáveis dummies
5 rows × 36 columns
Modelo de Previsão
Métricas de Avaliação
Vamos usar aqui o R² que vai nos dizer o quão bem o nosso modelo consegue explicar o preço. Isso
seria um ótimo parâmetro para ver o quão bom é nosso modelo
-> Quanto mais próximo de 100%, melhor
Vou calcular também o Erro Quadrático Médio, que vai mostrar para gente o quanto o nosso
modelo está errando.
-> Quanto menor for o erro, melhor
Esses são alguns dos modelos que existem para fazer previsão de valores numéricos (o que
chamamos de regressão). Estamos querendo calcular o preço, portanto, queremos prever um valor
numérico.
Assim, escolhemos esses 3 modelos. Existem dezenas, ou até centenas de modelos diferentes. A
medida com que você for aprendendo mais e mais sobre Ciência de Dados, você vai aprender
sempre novos modelos e entendendo aos poucos qual o melhor modelo para usar em cada
situação.
Mas na dúvida, esses 3 modelos que usamos aqui são bem bons para muitos problemas de
Regressão.
y = base_airbnb_cod['price']
X = base_airbnb_cod.drop('price', axis=1)
Essa etapa é crucial. As Inteligências Artificiais aprendendo com o que chamamos de treino.
Basicamente o que a gente faz é: a gente separa as informações em treino e teste, ex: 10% da base
de dados vai servir para teste e 90% para treino (normalmente treino é maior mesmo)
Aí, damos para o modelo os dados de treino, ele vai olhar aqueles dados e aprender a prever os
preços.
Depois que ele aprende, você faz um teste com ele, com os dados de teste, para ver se ela está bom
ou não. Analisando os dados de teste você descobre o melhor modelo
Modelo RandomForest:
R²:97.23%
RSME:44.10
Modelo LinearRegression:
R²:32.70%
RSME:217.54
Modelo ExtraTrees:
R²:97.51%
RSME:41.85
Modelo RandomForest:
R²:97.23%
RSME:44.10
Modelo LinearRegression:
R²:32.70%
RSME:217.54
Modelo ExtraTrees:
R²:97.51%
RSME:41.85
Esse foi o modelo com maior valor de R² e ao mesmo tempo o menor valor de RSME. Como
não tivemos uma grande diferença de velocidade de treino e de previsão desse modelo com o
modelo de RandomForest (que teve resultados próximos de R² e RSME), vamos escolher o
Modelo ExtraTrees.
O modelo de regressão linear não obteve um resultado satisfatório, com valores de R² e RSME
muito piores do que os outros 2 modelos.
bedrooms 0.115197
latitude 0.103485
longitude 0.101353
n_amenities 0.089108
extra_people 0.087071
accommodates 0.070214
bathrooms 0.070116
minimum_nights 0.064810
beds 0.053086
host_listings_count 0.039851
instant_bookable 0.021885
cancellation_policy_flexible 0.019602
host_is_superhost 0.013770
property_type_Apartment 0.012592
cancellation_policy_moderate 0.012311
ano 0.011353
cancellation_policy_strict_14_with_grace_period 0.007938
property_type_House 0.006895
property_type_Condominium 0.005172
mes 0.004681
bed_type_Outros 0.002663
property_type_Outros 0.002377
property_type_Loft 0.002105
property_type_Guesthouse 0.000930
cancellation_policy_strict 0.000847
property_type_Hostel 0.000629
is_business_travel_ready 0.000000
is_business_travel ready não parece ter muito impacto no nosso modelo. Por isso, para chegar
em um modelo mais simples, vamos excluir essa feature e testar o modelo sem ela.
y = base_airbnb_cod['price']
X = base_airbnb_cod.drop('price', axis=1)
modelo_et.fit(X_train, y_train)
previsao = modelo_et.predict(X_test)
print(avaliar_modelo('ExtraTrees', y_test, previsao))
Modelo ExtraTrees:
R²:97.51%
RSME:41.84
modelo_et.fit(X_train, y_train)
previsao = modelo_et.predict(X_test)
print(avaliar_modelo('ExtraTrees', y_test, previsao))
In [57]: print(previsao)
In [ ]: