# Aula 8 - Análise e visualização de dados com Python - biblioteca pandas (Parte 4)

Nas aulas anteriores, avançamos na parte mais prática da biblioteca pandas, observando os recursos referentes à importação e manipulação de dados, além de algumas análises iniciais. Desta vez, voltemos o olhar a um aspecto distinto do pandas e do Python que também é muito importante na hora de analisar e, principalmente, apresentar os dados que foram coletados. Essa aula, portanto, é uma introdução básica à visualização de dados em pandas.

O que veremos aqui:

- Como a visualização de dados é encarada no pandas;
- Principais linhas de código para você começar a criar seus próprios gráficos em Python usando o pandas.

## Então, como podemos visualizar os dados com o pandas?

A biblioteca pandas baseia sua parte de visualização usando uma API de outra biblioteca, o **Matplotlib**. Por isso mesmo, quando planejamos plotar algum gráfico em um relatório ou *notebook* usando o pandas, podemos utilizar recursos do Matplotlib para fazer isso.

````python
import pandas as pd #Importa o pandas
import matplotlib.pyplot as plt #Importa a API do Matplotlib
%matplotlib inline #Define que os resultados/plots obtidos com o Matplotlib sejam apresentados e armazenados junto do notebook com o qual estamos trabalhando
````

A API do Matplotlib, nesse caso, é a [`pyplot`](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.html#module-matplotlib.pyplot): esta é uma coleção de funções que permitem fazer gráficos simples, mas apresentáveis, e que já ajudam muito na visualização dos dados que importamos e manipulamos com o pandas. Você pode explorar mais as possibilidades de plotagem de gráficos com o pandas que serão apresentadas aqui dando uma olhada no [Guia do Usuário do pandas](https://pandas.pydata.org/docs/user_guide/visualization.html#visualization), além do [Cookbook](https://pandas.pydata.org/docs/user_guide/cookbook.html#cookbook-plotting) e o [10 minutes to pandas](https://pandas.pydata.org/docs/user_guide/10min.html#plotting), projetos do próprio site do pandas para compreender melhor a bibiloteca.

Sem mais delongas, vamos à apresentação dos tipos de gráficos que podem ser produzidos usando as bibliotecas pandas e Matpotlib.

### O básico do básico: função `plot()`

Essa é a função que servirá de base para fazer as plotagens de gráficos ao usarmos o pandas (e o Matplotlib) em nossos projetos. Por padrão, a função `plot()` tem como *output* um gráfico de linhas; é interessante usar esse gráfico ao lidarmos, por exemplo, com [conjuntos de dados que possuam amostragens ocorrentes em um período de tempo contínuo](https://docs.tibco.com/pub/spotfire_web_player/6.0.0-november-2013/pt-BR/WebHelp/GUID-60AD831A-D7C3-4407-AA54-44EBD23A29D0.html).

Para lidarmos com a parte prática da aula, utilizaremos o mesmo conjunto de dados com o qual estamos trabalhando nas últimas semanas (`surveys.csv`). A partir dele, faremos algumas alterações conforme necessário.  

````python
df = pd.read_csv("https://github.com/mhalmenschlager/python-biologia/raw/main/archives/surveys.csv")
df.head()
````

![image-20210915181223246.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1631832034913/OEA-VK3Gc.png)

#### Gráfico de linha

Como foi já referenciado no título dessa seção, começemos com o básico do básico, usando a função `plot()` puramente. O retorno será de um [gráfico de linha](https://pt.wikipedia.org/wiki/Gr%C3%A1fico_de_linha), considerando linhas e colunas da tabela que importamos, conforme visto em `df.head()`:

````pyt
df.plot()
````

![image-20210915181449017.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1631832088600/3_VAz2rdT.png)

Mesmo que o gráfico não faça o menor sentido nesse momento, já podemos perceber aqui que tipo de resultado teremos quando usarmos a função `plot()`. Essa função também nos dá possibilidades de plotar gráficos com variáveis específicas, de outros tipos, até mesmo com diferentes títulos e legendas; nesses casos, é necessário apenas adicionar alguns outros argumentos a essa linha, indicando quais variáveis serão consideradas para fazer o gráfico, que tipo de gráfico queremos, e assim por diante. Esses argumentos são colocados dentro dos parênteses da função `plot()`, conforme o exemplo abaixo:

````python
df.plot(x='year', y='record_id') #Especifica os valores dos eixos 'x' e 'y'
````

Neste caso, queremos especificar que tipos de variáveis queremos que apareçam nos eixos `x` e `y`; usemos as variáveis de ano e ID de registro como exemplo. O resultado dessa linha de código possui um pouco mais de sentido pois, a partir do gráfico, podemos avaliar a evolução das quantidades de amostragem conforme os anos considerados no *dataframe*.

![image-20210915183741265.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1631832122191/lV0a4jmP0.png)

Outro exemplo que podemos utilizar para explorar o gráfico de linhas, e que também envolve os anos de amostragem, tem a ver com agrupamentos. Nessa situação, veremos a contagem total de amostras feitas por cada ano, e a partir disso plotar um gráfico para acompanhar visualmente a evolução dessa amostragem. Para tanto, utilizaremos as funções `groupby`e `count` na mesma linha de código antes de plotarmos o gráfico, para organização do *frame* que será a base do gráfico.

````python
year = df.groupby('year')['record_id'].count() #Contagem de amostragens, com base em seus IDs, por ano
year.head() #Cinco primeiras entradas do frame
````
![image-20210915200426972.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1631832161805/5AnsTTH0E.png)

A partir disso, usaremos o objeto criado `year` para plotar um gráfico de linha:

````python
year.plot() #Gráfico de linha do objeto 'year'
````

![image-20210915200811721.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1631832192460/hrL0UKDeT.png)

> **Uma dica**: Por n+1 razões, haverá momentos em que a figura parecerá pequena para a quantidade de informação que está dentro dela. Quando ocorrer isso, podemos sempre lançar mão do argumento `figsize` para ajustar o tamanho da figura até que ela fique em um tamanho que se possa considerar razoável.

````python
year.plot(figsize=(17,3)) #Gráfico de linha do objeto 'year', com tamanho de figura (17,3)
````
![image-20210915200935736.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1631832225384/U6m8XzK-f.png)

### Avançando na função `plot()`: outros tipos de gráficos disponíveis

Como dito anteriormente, a função `plot()`, além dos gráficos de linha, possibilita ao usuário plotar uma série de gráficos. A documentação do pandas expõe, em detalhes, as capacidades de visualização de dados do pandas; aqui, serão expostos alguns baseados no *dataframe* que estamos utilizando como exemplo. 

#### Gráfico de barras

Enquanto um gráfico de linhas é mais utilizado para acompanhar a evolução de uma amostragem usando uma série contínua, geralmente temporal, o [gráfico de barras](https://pt.wikipedia.org/wiki/Gr%C3%A1fico_de_barras) é largamente recomendado para [avaliar as amostragens de um conjunto de dados categóricos](https://docs.tibco.com/pub/spotfire_web_player/6.0.0-november-2013/pt-BR/WebHelp/GUID-6023CECC-E502-4AE1-B5C5-FFE5DAF6FAE2.html). Usando o `df` ainda como exemplo, em vez de avaliarmos as amostragens de acordo com os anos de coleta, podemos observar a quantidade de coletas feitas de acordo com as espécies consideradas. Em vez de utilizarmos a variável `year`, dessa vez nos valeremos da variável `species_id`, e a partir da quantidade de IDs feitos, poderemos observar as diferenças entre espécies.

````python
count = df.groupby('species_id')['record_id'].count() #Contagem dos IDs das amostragens de acordo com os IDs de espécies
count.head() #As cinco primeiras entradas do objeto 'count'
````

![image-20210916110116609.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1631832259023/1kjG8Q2Dm.png)

````python
count.plot(kind='bar', figsize=(18,3)) #Plotagem de um gráfico de barras do objeto 'count', com tamanho (18, 3)
````
![image-20210916110245761.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1631832295691/1UYgeS-uv.png)

O resultado do plot é a amostragem de espécies em ordem alfabética. Aqui, já vemos a representatividade de algumas espécies, como 'DM', 'DO', 'OT', e 'PP' no número total de coletas. Se quisermos organizar os dados de forma ordenada, do maior para o menor, por exemplo, antes de usarmos a função `plot()` é preciso apenas usar a função `sorting.values()`. Assim, criaremos um novo objeto, `count2`, adicionando esse argumento.

````python
count2 = df.groupby('species_id')['record_id'].count().sort_values(ascending = False) #Contagem dos IDs das amostragens de acordo com os IDs de espécies, de forma ordenada. O (ascending = False) indica que a organização será feita de forma decrescente, do maior para o menor.
count2.head() #As cinco primeiras entradas do objeto 'count2'
````
![image-20210916123737876.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1631832338344/IPusGykUp.png)

````python
count2.plot(kind='bar', figsize=(18,3)); #Plotagem de um gráfico de barras do objeto 'count2', com tamanho (18, 3)
````
![image-20210916144219939.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1631832372209/_hQLuW2Yj.png)

Aqui já vemos um gráfico mais bem organizado, com uma ordenação decrescente da amostragem das espécies. Lembre-se que cada ID de espécies é associado com o nome desta; você pode ver isso com mais detalhes nas aulas anteriores, com o dicionário de variáveis, bem como no repositório da série no GitHub.

#### Gráfico de pizza

O [gráfico de pizza](https://docs.tibco.com/pub/spotfire_web_player/6.0.0-november-2013/pt-BR/WebHelp/GUID-8B1036A5-6BE9-4A84-B532-8E15060CABA9.html) é, sem dúvidas, um dos mais utilizados por qualquer profissional, independente da área. E, infelizmente, [é um dos gráficos mais mal utilizados](https://towardsdatascience.com/pie-charts-considered-harmful-36268a4e42e6); embora a proposta seja a exibição de dados de uma forma fácil de ler, [muitas vezes os resultados são horrendos](https://www.businessinsider.com/pie-charts-are-the-worst-2013-6) (em uma outra postagem envolvendo visualização de dados, escreverei mais sobre). 

Esse gráfico é muito usado para apresentar proporções entre os dados amostrados, mais frequentemente na forma de porcentagens. Plotá-lo com o pandas também é muito simples, ainda usando a função `plot()`. Comecemos separando os dados que utilizaremos aqui: observaremos a contagem total de três espécies, `'DM'`, `'DO'`, e `PP`, utilizando a função `count()`, e separando-as por um `groupby()`.

````python
dmXdoXpp = df.groupby('species_id')['record_id'].count()[['DO', 'DM', 'PP']] #Contagem da amostragem das espécies 'DM', 'DO', e 'PP', considerando seus IDs de registro
dmXdoXpp #Chamamento do objeto 'dmXdoXpp'
````
![image-20210916145641879.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1631832412900/Lkn40W14D.png)

````python
dmXdoXpp.plot(kind='pie') #Plotagem de um gráfico de pizza do objeto 'dmXdoXpp'
````
![image-20210916182302293.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1631832441813/0ahQu53xY.png)

#### Gráfico de caixa (*boxplot*)

Gráficos de caixa, ou [*boxplots*](https://pt.wikipedia.org/wiki/Diagrama_de_caixa), são largamente utilizados para avaliar a variação de um conjunto de dados através de um [sistema de máximos, mínimos, e quartis ou percentis](https://operdata.com.br/blog/como-interpretar-um-boxplot/). São ótimos para ver como se comportam as amostragens de um determinado grupo ou variável, propiciando inclusive a verificação de dados que são muito discrepantes, os chamados *outliers*. Esse tipo de plotagem é muito conhecido por estar presente em [Análises Exploratórias de Dados (AEDs)](https://pt.wikipedia.org/wiki/An%C3%A1lise_explorat%C3%B3ria_de_dados), que são as primeiras análises a serem feitas após a coleta de dados. No caso do *boxplot*, destacamos aqui uma função levemente distinta do simples `plot()`para fazê-lo, embora seja possível ir por esse caminho também.

Para mostrar como se faz um *boxplot* com o pandas, criaremos um novo objeto, `MxF`, uma vez que avaliaremos a variação do comprimento do retropé conforme o sexo de cada animal amostrado. Para isso, faremos uma nova tabela, com a função [`pivot_table()`](https://www.vooo.pro/insights/pivot-table-em-pandas-explicado/):

````python
MxF = df.pivot_table('hindfoot_length', 'record_id', 'sex') #Tabela com a variação do comprimento do retropé de acordo com o sexo das amostras consideradas no conjunto de dados
MxF
````
![image-20210916183825589.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1631832482426/yhZLm1MfnP.png)

Para fazer a plotagem do gráfico de caixas, usaremos aqui a função `boxplot()` a partir do novo objeto:

````python
MxF.boxplot(); #Gráfico de caixa do objeto 'MxF'
````
![image-20210916184010123.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1631832508522/N0Psfwbpt.png)

Neste gráfico, já podemos ter uma ideia da variação do comprimento em centímetros do retropé de cada amostragem considerada, com a separação por sexo. Repare que, quando chamada a função `boxplot()`, o gráfico aparece com um gradeamento. Há uma linha de código alternativa para criar um gráfico de caixas que usa a função `plot()`, só que essa sem gradeamento:

````python
MxF.plot(kind = 'box') #Gráfico de caixa do objeto 'MxF'
````
![image-20210916184320434.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1631832543331/GTyyKKETX.png)

#### Outros tipos de gráfico suportados pelo pandas

Além desses, há outros tipos de gráfico (área, *scatter plot*, etc.) que são suportados pela biblioteca pandas, que não são mencionados aqui; isso permite que o usuário possa fazer gráficos apresentáveis para seus relatórios, apresentações ou outras exposições usando uma só biblioteca. Para conhecer e praticar mais exaustivamente, é recomendada uma leitura atenta à documentação do pandas, onde se expõe, com exemplos práticos, todas as possibilidades que a biblioteca oferece para visualização de dados.

Outras bibliotecas, como o Matplotlib e o Seaborn, fazem parte do ecossistema do pandas e são especializados em visualização de dados. Em outro momento da série, esses recursos serão apresentados com mais detalhes, e haverá uma discussão mais extensa sobre a visualização de dados em Python, e como você pode utilizar essas ferramentas da melhor forma possível com seus dados.

---------

Por aqui, encerramos uma outra aula de apresentação da biblioteca pandas. Com o que já foi exposto aqui, você já tem conhecimento e referências para começar a fazer suas próprias análises de dados. Não esqueça de fazer duas coisas importantes: ler de forma exaustiva as documentações e referências expostas nas aulas, e praticar muito, com o *dataset* de exemplo e tantos outros. Com isso, você aprenderá a usar a linguagem Python para alçar posições de destaque na sua área profissional e/ou acadêmica, seja na Ecologia, em outras áreas da Biologia, ou com outros projetos de seu interesse. Aproveite para deixar um feedback das aulas e, caso surjam dúvidas ou curiosidades acerca dos temas expostos por aqui, estarei sempre à disposição para auxílio ou, até mesmo, uma motivação a mais. Siga buscando conhecimento!

Um grande abraço, até a próxima aula e, sobretudo, divirta-se com os gráficos!

---------

**Para ler mais**

- [**Data Visualization in Python | Data Visualization for Beginners**](https://www.analyticsvidhya.com/blog/2021/02/an-intuitive-guide-to-visualization-in-python/)
- [**10 Python Data Visualization Libraries for Any Field - Mode.com**](https://mode.com/blog/python-data-visualization-libraries/)
- [**How to create plots in pandas? — Documentação do pandas**](https://pandas.pydata.org/docs/getting_started/intro_tutorials/04_plotting.html)
- [**Plot With Pandas: Python Data Visualization for Beginners – Real Python**](https://realpython.com/pandas-plot-python/)
- [**How to Plot a DataFrame using Pandas - Data to Fish**](https://datatofish.com/plot-dataframe-pandas/)
- [**Pandas - Plotting - w3schools**](https://www.w3schools.com/python/pandas/pandas_plotting.asp)
- [**Pandas - Visualização inicial dos dados - Digital Innovation One**](https://digitalinnovation.one/artigos/pandas-visualizacao-inicial-dos-dados)
- [**Introdução à Análise de Dados - Python e pandas - Kaggle**](https://www.kaggle.com/joaoavf/introducao-a-analise-de-dados-python-e-pandas)
- [**Uma folha de dicas definitiva para visualização de dados em pandas - Ichi.pro**](https://ichi.pro/pt/uma-folha-de-dicas-definitiva-para-visualizacao-de-dados-em-pandas-272387423377719)
