<jupyter_start><jupyter_text>Análise dos Dados do Airbnb - Cidade do MéxicoO [Airbnb](https://www.airbnb.com.br/) já é considerado como sendo a **maior empresa hoteleira da atualidade**.  Fato curioso que é ele **não possui nenhum hotel**!Conectando pessoas que querem viajar (e se hospedar) com anfitriões que querem alugar seus imóveis de maneira prática, o Airbnb fornece uma plataforma inovadora para tornar essa hospedagem alternativa.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](http://insideairbnb.com/get-the-data.html), é 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 do México, e ver quais insights podem ser extraídos a partir de dados brutos.**A cidade do México (*Ciudad de México*) é uma capital mais populosa do México e da América do Norte  e de altitude elevada. Umas das cidades mais antigas da América do Norte, possui vários pontos turísticos e  abriga uma arquitetura impressionante.Que tal conhecer a terra de  **Frida Kahlo**?  Obtenção dos DadosTodos os dados usados aqui foram obtidos a partir do site [Airbnb](https://www.airbnb.com.br/).Para esta análise exploratória inicial, será utilizado apenas o seguinte arquivo:listings.csv- Summary information and metrics for listings in Cidade do México (good for visualisations).<jupyter_code># importar os pacotes necessarios
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

%matplotlib inline<jupyter_output><empty_output><jupyter_text>Também vamos utilizar o pacote Folium para visualização de mapa interativo dentro do nosso notebook. Para isso, é necessário a instalação e importação do pacote.<jupyter_code>pip install folium
import folium

# importar o arquivo listings.csv para um DataFrame
df = pd.read_csv("http://data.insideairbnb.com/mexico/df/mexico-city/2019-11-25/visualisations/listings.csv")<jupyter_output><empty_output><jupyter_text>Análise dos Dados **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 diasAntes de iniciar qualquer analise, vamos verificar a cara do nosso *dataset*, analisando as 5 primeiras entradas.<jupyter_code># mostrar as 5 primeiras entradas
df.head()<jupyter_output><empty_output><jupyter_text>Analisando os cinco primeiros registros, percebemos que a coluna `neighbourhood_group` não possui nenhum valor. O acrônimo de NaN que significa "*Not a Number*" e indica um valor numérico indefinido ou irrepresentável.  **Q1. Quantos atributos (variáveis) e quantas entradas o nosso conjunto de dados possui? Quais os tipos das variáveis?** Vamos identificar a quantidade de variáveis e quantas entradas o dataset possui. Também vamos verificar quais são os tipos de variáveis<jupyter_code># identificar o volume de dados do DataFrame
print("Quantidade de Entradas:\t {}".format(df.shape[0]))
print("Quantidade de Variáveis:\t {}\n".format(df.shape[1]))

# verificar as 5 primeiras entradas do dataset
display(df.dtypes)<jupyter_output>Quantidade de Entradas:	 20571
Quantidade de Variáveis:	 16<jupyter_text>**Conclusões**: O Dataset possui 16 variáveis e  20571 entradas.Este dataset que baixamos é a versão "resumida" do Airbnb. Na mesma página que baixamos o arquivo *listings.csv*. Há uma versão mais completa com 20571 entradas e 106 variáveis (listings.csv.gz).  **Q2. Qual a porcentagem de valores ausentes no *dataset*?** A qualidade de um dataset está diretamente relacionada à quantidade de valores ausentes. É necessário verificar logo no início se esses valores nulos são significativos comparados ao total de entradas.<jupyter_code># ordenar em ordem decrescente as variáveis por seus valores ausentes
(df.isnull().sum() / df.shape[0]).sort_values(ascending=False)
df[['price', 'availability_365', 'number_of_reviews', 'reviews_per_month','minimum_nights','availability_365']]<jupyter_output><empty_output><jupyter_text>**Conclusões:** * É possível ver que as colunas `neighbourhood_group`  possui 100% dos seus valores faltantes. * As variáveis `reviews_per_month` e `last_review` possuem 21,3 % dos valores nulos.* A variável `host_name ` tem 0,15%  dos valores nulos. * A variável `name ` tem aproximadamente 0,04%  dos valores nulos.  Podemos verificar que temos alguns valores ausentes na coluna `reviews_per_month`. Essa coluna refere-se aos comentários feito por mês, o que podemos levantar algumas hipóteses: 1) que algumas acomodações alugadas não receberam avaliações ou 2) que são acomodações novas que ainda não foram alugados Na variável `host_name` e `name` a quantidade de dados nulos não possui tanta representatividade no nosso dataset. Então vamos eliminar esses valores.<jupyter_code># eliminar todas as entradas onde existam valores ausentes em `host_name`
df_row_dropna = df.dropna(subset=['host_name'], axis=0)

# eliminar todas as entradas onde existam valores ausentes em `name`
df_row_dropna = df.dropna(subset=['name'], axis=0)

# comparar o antes e o depois de `host_name`
print("Antes:\t{}".format(df.shape))
print("Depois:\t{}".format(df_row_dropna.shape))<jupyter_output>Antes:	(20571, 16)
Depois:	(20562, 16)<jupyter_text>**Q3. Qual o tipo de distribuição das variáveis?**  Para analise sobre a distribuição dos dados, iremos plotar os histogramas. Foram plotados histogramas para cada uma das variáveis numéricas do *dataset*.Vamos verificar a quantidade de valores nulos<jupyter_code>df.isnull().sum()<jupyter_output><empty_output><jupyter_text>Podemos verificar que as variáveis ´last_review´ e ´reviews_per_month´ possui a mesma quantidade de valores ausentes. Não podemos eliminar esses valores ausentes, pois pode interferir na nossa análise. Uma hipótese para essa quantidade é que podem ser acomodações novas ou acomodações que não receberam avaliações.  **Q4. Há outliers presentes?**Através da distribuição do histograma é possível verificar a presença de outliers. Eles são dados que são drasticamente diferente dos demais, um ponto fora da curva. Que quando não tratados pode inteferir nos resultados obtidos da análise.Podemos verificar das entradas das variáveis `price`, `minimum_nights` e `calculated_host_listings_count` não seguem uma distribuição. Para confirmar a presença dos outliers vamos utilizar as seguintes etapas:a) Resumo estatístico por meio do método `describe()`<jupyter_code>#resumo estatístico das variaveis numericas 
df[['calculated_host_listings_count', 'minimum_nights', 'price', 'reviews_per_month', 'number_of_reviews', 'availability_365' ]].describe()
# plotar o histograma das variáveis numéricas
df.hist(bins=15, figsize=(15,10), color = "#CD853F");<jupyter_output><empty_output><jupyter_text>**Conclusões:**a) A coluna `availability_365` descreve a quantidade de acomodações disponíveis no ano. Observou que diversas acomodações não estão disponíveis ao longo do ano e que não estão disponíveis em nenhum dia do ano.b)  Outra coluna `host_id` que representa a identificação do anfitrião, percebemos que existe uma grande quantidade de ids maiores que possivelmente deve represetar a ordem crescente dos cadastros. Podemos chegar na hipótese de um crescimento da plataforma pela quantidade de cadastros. c) Na `latitude` e `altitude` percebemos que uma concentração nos pontos centrais. Seriam áreas urbanas? Próximo a área central?d) Podemos verificar que em algumas coluna existe a presença de outliers como na coluna `preço` não condizem com a realidade. Para 34.000 em uma diária é bem fora do comum. É necessário realizar a remoção desses outliers. e) A coluna `neighbourhood_group` não contém nenhum dado. Iremos utilizar a latitude e altitude para agrupar os grupos de bairros em uma mapa interativo utilizando o pacote  *Folium*  **Boxplot para Mínimo de Noites**<jupyter_code># minimo de noites
df.minimum_nights.plot(kind='box', vert=False, figsize=(15, 3))
plt.show()

# ver quantidade de valores acima de 30 dias para minimo de noites
print("Mínimo de noites : valores acima de 30:")
print("{} entradas".format(len(df[df.minimum_nights > 30])))
print("{:.4f}%".format((len(df[df.minimum_nights > 30]) / df.shape[0])*100))

df.minimum_nights.plot(kind='box', vert=False, xlim=(0,30), figsize=(15,3));<jupyter_output><empty_output><jupyter_text>**Boxplot para Preço**<jupyter_code># preço
df.price.plot(kind='box', vert=False, figsize=(15, 3),)
plt.show()


# ver quantidade de valores acima de 2800 para price
print("\nprice: valores acima de 2800")
print("{} entradas".format(len(df[df.price > 2800])))
print("{:.4f}%".format((len(df[df.price > 2800]) / df.shape[0])*100))<jupyter_output><empty_output><jupyter_text>**Vamos realizar a limpeza de dados**<jupyter_code>#limpar  os outliers 
df_clean = df.copy()
df_clean.drop(df_clean[df_clean.price > 2800].index, axis=0, inplace=True)
df_clean.drop(df_clean[df_clean.minimum_nights > 30].index, axis=0, inplace=True)
df_clean.drop(df_clean[df_clean.price <= 0].index, axis=0, inplace=True)<jupyter_output><empty_output><jupyter_text>Agora vamos plotar novamente os gráficos<jupyter_code># plotar o histograma para as variáveis numéricas
df_clean.hist(bins=15, figsize=(15,10), color = "#CD853F");
from folium import plugins
lat = df['latitude'][:500].values
long = df['longitude'][:500].values

coordenadas = []

city_mexico = folium.Map(location=[-19.4194815,-99.1916445],    # Coordenadas retiradas do Google Maps
    zoom_start=3)

for la,lo in zip(lat,long):
    coordenadas.append([la,lo])

city_mexico.add_child(plugins.HeatMap(coordenadas))
city_mexico<jupyter_output><empty_output><jupyter_text>Através do mapa interativo, percebemos uma maior concentração nos bairros centrais.  **Q6. Qual a média dos preços do aluguel?**<jupyter_code>df_clean['price'].describe()<jupyter_output><empty_output><jupyter_text>Podemos observar que a média dos preços de 659 por dia e o preço máximo é de 1.491. E a metade das acomodações está na faixa de 581.  **Q5. Qual a correlação existente entre as variáveis**? **Correlação**Correlação é uma análise que mede o grau de dependência entre duas variáveis. É necessário compreender que a correlação pode não ter um sentido de causa e efeito. Mas que a ligação entre as variáveis não implica necessariamente um condição para a ocorrência do outro, mas pode indicar possíveis causas que podem ser analisadas através da análise conjunta da matriz de correlação.Aqui está um exemplo disso: Essa charge foi baseada na pesquisa de um ex-médico  chamado <NAME> que associou  a vacina MMR (que protege contra o sarampo, rubéola e a caxumba) e o desenvolvimento de comportamento autista em algumas crianças. Causando assim, um alarde aos pais que decidiram não vacinar seus filhos, trazendo de volta algumas doenças consideradas erradicadas.<jupyter_code># criar uma matriz de correlação
corr = df_clean[['price', 'minimum_nights', 'number_of_reviews', 'reviews_per_month',
    'calculated_host_listings_count', 'availability_365']].corr()

display(corr)<jupyter_output><empty_output><jupyter_text>Outra forma de plotar uma correlação entre as variáveis é através do **HeatMap** - Mapa de Calor,  uma representação gráfica de dados.<jupyter_code># plotar um heatmap a partir das correlações
sns.heatmap(corr, cmap='RdBu_r', fmt='.2f', square=True, linecolor='white', annot=True);<jupyter_output><empty_output><jupyter_text>Observando o HeatMap as cores mais aproximadas do vermelho representam uma alta correlação, enquanto os valores mais próximo ao azul, indicam uma baixa correlação.Observamos que existe uma  linha central que traz uma alta correlação com o valor 1.0 que é apenas uma associação com as mesmas colunas no eixo x e y. As colunas que trazem uma correlação positiva são `reviews_per_month` e `number_of_reviews`com 0.57. Que podemos inferir que a quantidade de reviews por mês aumenta consequentemente  o  número de reviews. Uma outra observação é a variável `price` e `calculated_host_listings_count`. O que podemos inferir que os imóveis mais caros são de locadores que possui mais anúncios. O `price` também tem correlação negativa com `number_of_reviews` e `reviews_per_month` o que podemos deduzir que os imóveis mais caros são os que possuem menos reviews. O que podemos concluir que esse imóveis são esporadicamente não são alugados. As colunas que possuem correlação negativa são  `availability_365` e  `minium_nights`. Podemos concluir que as acomadações disponíveis mais vezes no ano, são aquelas que possuem o menor número de noites mínimas. Outra correlação negativa são `price` e `minium_nights` que podemos deduzir que imóveis mais caros possuem um maior número de noites.  **Q7. Qual o tipo de imóvel mais alugado no Airbnb?**<jupyter_code># mostrar a quantidade de cada tipo de imóvel disponível
df_clean.room_type.value_counts()
# mostrar a porcentagem de cada tipo de imóvel disponível
tipos_q = df_clean.room_type.value_counts()

quarto_percentual = tipos_q / df_clean.shape[0];
pd.DataFrame(quarto_percentual).style.format('{:.2%}')<jupyter_output><empty_output><jupyter_text>Dos imóveis disponíveis no DataFrame, aproximadamente:  * 48,14% são quartos privativos* 48,05% são casas ou apartamentos alugados * 2,01 % são quartos compartilhados* 1,81% são quartos de hotel Demonstrando que a quantidade de quartos privativos tem percentuais similares.  **Q8. Qual a localidade mais cara do dataset?**<jupyter_code># ver preços por bairros, na média
df_clean.groupby(["neighbourhood"]).price.mean().sort_values(ascending=False)[:10]<jupyter_output><empty_output><jupyter_text>**Conclusões:**Analisando a lista de preços por bairros e pesquisa em site de viagem, chegamos a seguinte hipotése: Um bairro como o Coyoacán que possui um Mercado conhecido e o museu da Frida Kahlo e que  aparece em várias listas de melhores bairros provavelmente apareceria entre as cinco regiões mais caras. Os links utilizados para essa conclusão estão a seguir:a) [TripAdivsor](https://www.tripadvisor.com.br/Attractions-g150800-Activities-c47-t34-Mexico_City_Central_Mexico_and_Gulf_Coast.html)b) [Quero viajar mais](https://www.queroviajarmais.com/onde-ficar-se-hospedar-cidade-do-mexico/)c) [Airbnb - Cidade do México](https://www.airbnb.com.br/locations/mexico-city) Como esses bairros não estão no nosso dataset, vamos ter que ***minerar*** mais os dados.Vamos analisar através da quantidade de móveis em cada bairro.<jupyter_code>df_clean["neighbourhood"].value_counts().sort_values(ascending = False)[:10]<jupyter_output><empty_output><jupyter_text>Verificamos uma distribuição diferente da anterior. Temos alguns bairros com menos de 37 imóveis, então pela média há uma dispersão de dados.  Vamos verificar os cinco primeiras acomodações do bairro mais caro da nossa primeira analise "Cuajimalpa de Morelos"<jupyter_code>df_clean[df_clean.neighbourhood == "Cuajimalpa de Morelos"][:10]

df_clean[df_clean.neighbourhood == "Cuauhtémoc"][:10]<jupyter_output><empty_output><jupyter_text>Observando os dois demonstrativos de acomadações dos bairros **"Cuajimalpa de Morelos"** e **"Cuauhtémoc"**. O último apresenta uma maior quantidade de acomodações e os preços aparentemente mais elevados, o que demonstra que o cálculo da média não foi suficiente para apresentar o bairro mais caro. Iremos utilizar outra abordagem que será a **mediana**<jupyter_code>df_clean.groupby(["neighbourhood"]).price.median().sort_values(ascending=False)[:10]<jupyter_output><empty_output><jupyter_text>Pela mediana os dois bairros mais caros são <NAME> e <NAME> são bairros próximos situados na parte oeste da Cidade do México. Percebemos também que o bairro Coyancán possui o maior número de imóveis o que confirma que é um bairro bem turístico. <NAME> faz fronteira com Azcapotzalco a norte; com <NAME>, <NAME> e <NAME> a sul; e com Cuauhtémoc a leste.Percebemos que os 5 bairros mais caros fazem parte da mesma demarcação territorial.<jupyter_code># plotar os imóveis pela latitude-longitude
df_clean.plot(kind="scatter", x='longitude', y='latitude', alpha=0.4, c=df_clean['price'], s=8,
              cmap=plt.get_cmap('tab20c'), figsize=(12,8));<jupyter_output><empty_output><jupyter_text>**Q8. Qual é a média do mínimo de noites para aluguel (minimum_nights)?**<jupyter_code># ver a média da coluna `minimum_nights``
df.minimum_nights.mean()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.08139534883720931, 'fraction_numerical': 0.01590882795325697, 'mean_word_length': 6.1492969396195205, 'pattern_counts': {'":': 0, '<': 95, '<?xml version=': 0, '>': 100, 'https://': 5, 'lorem ipsum': 0, 'www.': 5, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '22', 'dir': 'jupyter-structured-clean-dedup', 'id': '333344', 'license': 'CNRI-Python', 'n_tokens_mistral': 6255, 'n_tokens_neox': 5927, 'n_words': 1982, 'path': 'Analisando_os_Dados_do_Airbnb.ipynb', 'repo_name': 'prisantos/portfolio_datascience', 'size': '17357'}