<jupyter_start><jupyter_text>PRÁTICA GUIADA: Visualização com Seaborn Substituição de valores, pivot_table e dummies<jupyter_code>import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
%matplotlib inline

import seaborn as sns<jupyter_output><empty_output><jupyter_text>1. Introdução Nesta prática vamos trabalhar com dados de nascimentos nos Estados Unidos. Os dados fornecidos pelo Center for Disease Control (CDC) podem ser encontrados [aqui](https://raw.githubusercontent.com/jakevdp/data-CDCbirths/master/births.csv). Mais informações sobre a análise [aqui](http://andrewgelman.com/2012/06/14/cool-ass-signal-processing-using-gaussian-processes/).<jupyter_code>births = pd.read_csv('births.csv', delimiter=';')
births.head()
births.tail()
births.info()
births.describe()
births['day'].unique()<jupyter_output><empty_output><jupyter_text>* Observar que o último elemento do array ```births['day'].unique()```, é uma string, portanto, a função ```isnull()```, retorna ```False``` para esse elemento.* Vamos fazer uma primeira limpeza dos valores incorretos<jupyter_code>births['day'].replace(['99','null'], np.nan, inplace=True)
births['day'] = births['day'].astype(float)
births['day'].unique()<jupyter_output><empty_output><jupyter_text>2. Algumas primeiras visualizações com Seaborn * Queremos obter uma visualização da quantidade de nascimentos por ano. Para isso, primeiro geramos uma tabela (com `pivot_table`) com os dados agregados.<jupyter_code>table = births.pivot_table(values = 'births', index='year', columns='gender', aggfunc='sum', margins=True)
table.head()<jupyter_output><empty_output><jupyter_text>* Vamos tratar os dados de entrada para o gráfico<jupyter_code>anos = table.index[:-1]
anos
nascimentos_anos = table.iloc[:-1,-1].get_values()
nascimentos_anos<jupyter_output><empty_output><jupyter_text>* Comprovamos que a quantidade de dados para cada eixo está correta.<jupyter_code>len(anos) == len(nascimentos_anos)<jupyter_output><empty_output><jupyter_text>Construir o gráfico.<jupyter_code>plt.figure(figsize=(20,8))

plt.title("Nascimentos nos EUA (1969-2008)", fontsize=20)

plt.xlabel('Year', fontsize=15)
plt.ylabel('Total de nascimentos', fontsize=15)

plt.xticks(fontsize=12, rotation=60)
plt.yticks(fontsize=12, rotation=90)

sns.barplot(x = anos, y = nascimentos_anos );<jupyter_output><empty_output><jupyter_text>* Outra opção para gerar o mesmo gráfico...<jupyter_code>plt.figure(figsize=(20,8))

plt.title("Nascimentos nos EUA (1969-2008)", fontsize=20)

plt.xlabel('Year', fontsize=15)
plt.ylabel('Total de nascimentos', fontsize=15)

plt.xticks(fontsize=12, rotation=60)
plt.yticks(fontsize=12, rotation=90)

sns.barplot(x=births['year'], y=births['births'], estimator=np.sum, ci=None);<jupyter_output><empty_output><jupyter_text>* Agora, queremos gerar um gráfico do total de nascimentos por década...<jupyter_code>births['decade'] = 10 * (births['year'] // 10)

table2 = births.pivot_table('births', index='decade', columns='gender', aggfunc='sum', margins=True)
table2

table2.columns = pd.Index(['F','M','All'])
table2.index = pd.Index(['1960','1970','1980','1990','2000','All'])

table2


# Iniciamos o gráfico de barras com a informação a ser representada graficamente.
plot = sns.barplot( x = table2.index[0:5], y = table2['All'][0:5], ci=None)

# Adicionar o título.
plot.set_title('Nascimentos por década', fontdict = {'fontsize': 30, 'verticalalignment':'bottom'})

# Ajustar a legenda dos eixos.
plot.set_xlabel('Década', fontdict = {'fontsize':19})
plot.set_ylabel('Nascimentos', fontdict = {'fontsize':19});<jupyter_output><empty_output><jupyter_text>Agora vamos fazer um gráfico separando por gênero<jupyter_code>table2['decade'] = table2.index
tabla3 = table2.melt(id_vars=['decade'])

tabla3 = tabla3.loc[ (tabla3['decade'] != 'All') & (tabla3['variable'] != 'All') ]

tabla3
# Começar o gráfico
plot = sns.barplot(x = 'decade', y = 'value', hue = 'variable', data = tabla3, ci=None);

# Adicionar o título.
plot.set_title('Nascimentos por década', fontdict = {'fontsize': 21, 'verticalalignment':'bottom'} )

# Ajustar a legenda dos eixos.
plot.set_xlabel('Década', fontdict = {'fontsize':19})
plot.set_ylabel('Nascimentos', fontdict = {'fontsize':19})

plt.show()<jupyter_output><empty_output><jupyter_text>5. Algumas formas de visualizar séries de tempo<jupyter_code># Tomar estilos de Seaborn
sns.set(style="darkgrid", palette="colorblind", color_codes=True)  

plot = births.pivot_table('births', index='year', 
columns='gender', aggfunc='sum').plot()
# Adicionar o título.
plot.set_title('Nascimentos por gênero (1969-2008)', fontdict = {'fontsize': 21, 'verticalalignment':'bottom'} )

# Ajustar a legenda dos eixos.
plot.set_xlabel('Ano', fontdict = {'fontsize':19})
plot.set_ylabel('Nascimentos', fontdict = {'fontsize':19});<jupyter_output><empty_output><jupyter_text>* Agora plotar a proporção de homens<jupyter_code>table['M/F'] = round(table['M'] / table['F'], 2)
table['%M'] = round(table['M'] / table['All'] * 100, 1)
table.head()
# sns.tsplot?
sns.set(style="darkgrid", palette="Set2")

# Gerar o eixo x com 40 posições (2008-1969) para usar cada um dos anos como tag.

plt.xticks([x for x in range(40)], table.index[:-1], rotation=90)

# Fazer o gráfico

sns.tsplot(data=table['%M'][:-1], legend=False);<jupyter_output>C:\Users\sn3fru\Anaconda3\lib\site-packages\seaborn\timeseries.py:183: UserWarning: The tsplot function is deprecated and will be removed or replaced (in a substantially altered version) in a future release.
  warnings.warn(msg, UserWarning)<jupyter_text>* Outra maneira... passamos o índice da tabela como o argumento `time=`<jupyter_code>sns.tsplot(data=table['%M'][:-1], time=table.index[0:-1].get_values(), legend=False);<jupyter_output>C:\Users\sn3fru\Anaconda3\lib\site-packages\seaborn\timeseries.py:183: UserWarning: The tsplot function is deprecated and will be removed or replaced (in a substantially altered version) in a future release.
  warnings.warn(msg, UserWarning)<jupyter_text>3. Usando Dummies e filtros * Gerar agora um `DataFrame` que contenha o `gender` como dummy:<jupyter_code>births = births.join(pd.get_dummies(births['gender'], prefix='gender', prefix_sep='_', drop_first=True))
births.head()<jupyter_output><empty_output><jupyter_text>* Eliminar a coluna `gender`<jupyter_code>del births['gender']
births.head()<jupyter_output><empty_output><jupyter_text>* Tanto homens quanto mulheres aparecem uma vez para cada dia, portanto, metade dos registros é de homens e a outra metade, de mulheres. * A média de todos os dias deve estar em 0.5 quando ambos os sexos forem informados<jupyter_code>probabilidades = births.groupby(['day','month'])['gender_M'].aggregate('mean').unstack()
probabilidades<jupyter_output><empty_output><jupyter_text>* Vemos que não é assim com todos os meses.* Observamos o mês de abril.<jupyter_code>births[births['month'] == 4]<jupyter_output><empty_output><jupyter_text>* Os dados incorretos geram alguns dias em que a proporção não é 50%<jupyter_code>probabilidades[(probabilidades>0.5).any(1)]
probabilidades[(probabilidades<0.5).any(1)]<jupyter_output><empty_output><jupyter_text>6. Nascimentos por dia * Agora vamos estudar a quantidade de nascimentos por dia para diferentes meses do ano.<jupyter_code>for i in range(28,32):
    sns.distplot(births['births'][(births['day']==i)]);<jupyter_output>C:\Users\sn3fru\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py:6462: UserWarning: The 'normed' kwarg is deprecated, and has been replaced by the 'density' kwarg.
  warnings.warn("The 'normed' kwarg is deprecated, and has been "
C:\Users\sn3fru\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py:6462: UserWarning: The 'normed' kwarg is deprecated, and has been replaced by the 'density' kwarg.
  warnings.warn("The 'normed' kwarg is deprecated, and has been "
C:\Users\sn3fru\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py:6462: UserWarning: The 'normed' kwarg is deprecated, and has been replaced by the 'density' kwarg.
  warnings.warn("The 'normed' kwarg is deprecated, and has been "
C:\Users\sn3fru\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py:6462: UserWarning: The 'normed' kwarg is deprecated, and has been replaced by the 'density' kwarg.
  warnings.warn("The 'normed' kwarg is deprecated, and has been "<jupyter_text>* O dia 28 mostra uma distribuição normal ao longo dos meses<jupyter_code>sns.distplot(births['births'][(births['day']==28)]);<jupyter_output>C:\Users\sn3fru\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py:6462: UserWarning: The 'normed' kwarg is deprecated, and has been replaced by the 'density' kwarg.
  warnings.warn("The 'normed' kwarg is deprecated, and has been "<jupyter_text>* A partir do dia 29 é mostrado 0 para os meses que não aparecem * Os dados incorretos distorcem as distribuições nos dias restantes<jupyter_code>sns.distplot(births['births'][(births['day']==29)]);
sns.distplot(births['births'][(births['day']==30)]);
sns.distplot(births['births'][(births['day']==31)]);<jupyter_output>C:\Users\sn3fru\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py:6462: UserWarning: The 'normed' kwarg is deprecated, and has been replaced by the 'density' kwarg.
  warnings.warn("The 'normed' kwarg is deprecated, and has been "<jupyter_text>* Você eliminaria algum registro? Por quê?* Descobrimos que alguns dados estavam mal carregados no conjunto de dados original<jupyter_code>births[births['month'] == 2].head(60)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.14536049825820754, 'fraction_numerical': 0.025440726274675394, 'mean_word_length': 7.216825672159584, 'pattern_counts': {'":': 0, '<': 85, '<?xml version=': 0, '>': 85, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, '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': '162649', 'license': 'MIT', 'n_tokens_mistral': 3720, 'n_tokens_neox': 3488, 'n_words': 780, 'path': '09-Viz/02_seaborn/viz_seaborn_1.ipynb', 'repo_name': 'abefukasawa/datascience_course', 'size': '9473'}