<jupyter_start><jupyter_text>Visualização de dadosTeremos uma breve introdução a visualização de dados, passando pelos gráficos mais importantes para que consigamos entender melhor a nossa base. Para isso vamos utilizar duas bibliotecas: matplotlib (em seu modulo pyplot) e seaborn. A primeira é de mais baixo nível enquanto a segunda é uma implementação mais avançada que gera visualizações mais complexas com menos código.<jupyter_code>import numpy as np
import pandas as pd

import matplotlib.pyplot as plt

import seaborn as sns
%matplotlib inline<jupyter_output><empty_output><jupyter_text>Lendo a base<jupyter_code>df = pd.read_csv('breast_cancer.csv')
df.head()
df.shape<jupyter_output><empty_output><jupyter_text>Essa base é chamada **Breast Cancer Wisconsin**, tendo 569 instâncias e 31 atributos. Cada exemplo da base é uma serie de medidas feitas em tumores, geralmente sendo utilizada na tarefa de classificação deles como malignos ou benignos. Segue uma lista com o significada de cada feature:<jupyter_code>df.columns<jupyter_output><empty_output><jupyter_text>Nosso objetivo vai ser responder algumas perguntas sobre a base utilizando diferentes tipos de visualização  HistogramaHistograma um gráfico utilizado para visualizar a distribuição dos seus dados, isto é, a frequencia em que cada valor ocorre. Para a visualização histograma podemos usar matplotlib, através da função plt.hist() ou usando a sns.distplot() do seaborn.Um histograma divide os valores em **bins** de tamanho igual para a contagem do número de ocorrencia de cada valor.A partir do formato do histograma é possível ter uma ideia aproximada do tipo de distribuição que a variável possui, como por exemplo gaussiana ou exponencial.Vamos ver alguns exemplos de uso do histograma no contexto da nossa base... **Como é a distribuição do raio dos tumores?**<jupyter_code>plt.hist(df['mean radius'], bins=10)
# plt.title() adiciona um titulo ao grafico
plt.title('Distribuição do raio médio') 
plt.show()<jupyter_output><empty_output><jupyter_text>**Bins** de um histograma indica o número de "caixas" que os dados vão ser divididos para a contagem da frequencia.<jupyter_code>plt.hist(df['mean radius'], bins=50)
plt.title('Distribuição do raio médio (+ bins)') 
plt.show()
sns.distplot(df['mean radius'])
plt.title('Distribuição do raio médio (seaborn)')<jupyter_output>/home/sanchez/anaconda3/lib/python3.6/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>Como é possivel ver com o gráfico fica mais bonito e ainda é adicionada uma aproximação continua da distribuição. **A distribuição dos raios é igual para tumores benignos e malignos?**Para responder essa pergunta podemos plotar ambas as distribuições em um mesmo gráfico (Iremos usar o seaborn, mas com o matplotlib ficaria da mesma forma)<jupyter_code># Hist=False deixa os gráfico menos poluido
sns.distplot(df[df['target'] == 0]['mean radius'], hist=False, label='Benigno') 
sns.distplot(df[df['target'] == 1]['mean radius'], hist=False, label='Maligno')<jupyter_output><empty_output><jupyter_text>BoxplotBoxplot é outro tipo de gráfico que serbve para vermos a distribuição dos dados, porém fazendo uso dos **quartis** da variável analisada. O boxplot possui uma caixa, que indica os quartis 1, 2 e 3, duas retas que representam os dados dentro do intervalo (Q1−1.5⋅IQR,Q3+1.5⋅IQR), onde IQR = Q3 = Q1 é o intervalo interquartil.Para utilizar o boxplot podemos usar a função plt.boxplot(), do matplotlib, ou a sns.boxplot() do seaborn.Vamos analisar alguma variáveis da nossa base... **Como está distribuida a textura média? Existem muitos valores discrepantes?**<jupyter_code>sns.boxplot(df['mean texture']);<jupyter_output><empty_output><jupyter_text>Essa variável possui alguns outliers, mas não muitos **Existe uma diferença na distribuição da área dos tumores malignos e benignos?**<jupyter_code>sns.boxplot(x='target',y='mean area', data=df)<jupyter_output><empty_output><jupyter_text>Podemos ver que as distribuições são bem diferentes para tipos diferentes de tumores.  BarplotBarplot, ou gráfico de barras, é um tipo de gráfico que já estamos muito acostumados. Ele simplesmente relaciona categorias com algum tipo de valor, como por exemplo uma contagem ou uma porcentagem.Podemos fazer um gráfico de barras utilizado a função plt.bar() do matplotlib ou com a função sns.barplot() do seaborn.Vamos usar esse conceito para descobrir uma coisa importante sobre nossa base... **Quantos exemplos da base são malignos e quantos são benignos?**<jupyter_code># Função value_counts() do Pandas conta a frequencia de cada valor distinto na Series
contagem = df['target'].value_counts()
contagem
# Primeiro atributo são as categorias e o segundo os valores
sns.barplot(contagem.index, contagem)<jupyter_output><empty_output><jupyter_text>**Pergunta: **Qual o problema que esse número de exemplos de cada classe pode causar pensando na avaliação do nosso modelo? O seaborn já tem uma função que realiza a contagem e criar o barplot de uma vez só. Mas perceba que em alguns momentos não queremos só a contagem, então temos que gerar a Series como fizemos antes<jupyter_code># Faz a contagem e o barplot de uma só vez
sns.countplot(df['target'])<jupyter_output><empty_output><jupyter_text>Scatter plotScatter plot é um tipo de gráfico que mostra a relação entre duas variáveis. O que ele faz é pegar o par ordenado (variavel_1, variavel_2) e a colocar no gráfico, dessa forma conseguimos ver se existe alguma tendencia envolvendo as duas variáveis.Para usa-lo podemos utilizar a função plt.scatter() do matplotlib ou a sns.scatterplot() do seaborn.Agora vamos analisar a relação entre as variáveis da nossa base... **Qual é a relação esperada entre o raio do tumor e seu perímetro? E com sua área?**<jupyter_code># Essa função cria um grid de eixos, e podemos passar esses eixos para o seaborn
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(14, 5))

sns.scatterplot(df['mean radius'], df['mean perimeter'], ax=axes[0])
sns.scatterplot(df['mean radius'], df['mean area'], ax=axes[1])<jupyter_output><empty_output><jupyter_text>**Existe algum tipo de relação entre o raio e simetria do tumor?**<jupyter_code>sns.scatterplot(df['mean radius'], df['mean symmetry'])<jupyter_output><empty_output><jupyter_text>Aparentemente não temos nenhuma grande tendencia nesse par de variáveis **Considerando a relação entre o raio e textura como o target se comporta?**Podemos separar em cores diferentes targets diferentes usando o parâmetro hue<jupyter_code>sns.scatterplot(df['mean radius'], df['mean texture'], hue=df['target'])<jupyter_output><empty_output><jupyter_text>Podemos ver que aparentemente raio pequeno e pouca textura indicam que o tumor é benigno  PairplotMas será que temos que olhar manualmente cada par para ver se achamos relações entre eles? O seaborn tem uma função que já faz isso automaticamente sns.pairplot(). É bom perceber que daria para fazer a mesma coisa com o matplotlib usando um laço e a função plt.subplots() que acabamos de ver!<jupyter_code># Vamos usar só um subconjunto das colunas para podermos ver melhor
df_5columns = df.iloc[:, 3:8]
sns.pairplot(df_5columns)<jupyter_output><empty_output><jupyter_text>É possível ver, por exemplo, uma relação linear entre a compactação e a concavidade.  Correlação (Heatmap)Correlação de Pearson é uma medida estatística que indica o quão fortemente duas variáveis estão realcionadas. Sua formula é a seguinte. Seus valores variam entre -1 e 1, onde 1 é diretamente proporcional, 0 é sem relação e -1 é inversamente proporcional.A função utilizada para obter a matriz de correlação entre as variáveis é a corr(), do próprio Pandas. Mas como uma matriz de números com dimensão (n_features, n_features) é ruim de visualizar esses dados são normalmente exibidos usando a função sns.heatmap()<jupyter_code>plt.figure(figsize=(12,10))
sns.heatmap(df.corr())<jupyter_output><empty_output><jupyter_text>** Pergunta: ** Por que a diagonal se comporta dessa forma? Vamos utilizar aquelas 5 colunas que separamos para o pairplot() e ver a correlação entre elas<jupyter_code># Parametro annot adiciona o valor dentro dos elementos da matriz
sns.heatmap(df_5columns.corr(), annot=True)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.07505966587112171, 'fraction_numerical': 0.006324582338902148, 'mean_word_length': 6.163247863247864, 'pattern_counts': {'":': 0, '<': 64, '<?xml version=': 0, '>': 64, 'https://': 0, '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': '16', 'dir': 'jupyter-structured-clean-dedup', 'id': '283236', 'license': 'MIT', 'n_tokens_mistral': 2922, 'n_tokens_neox': 2807, 'n_words': 1041, 'path': 'Aula03/.ipynb_checkpoints/visualizacao-checkpoint.ipynb', 'repo_name': 'MatheusSanchez/DataScience', 'size': '8380'}