Aula 5 - Análise e visualização de dados em Python - Biblioteca pandas (Parte 1)

Aula 5 - Análise e visualização de dados em Python - Biblioteca pandas (Parte 1)

Começando pra valer a parte prática da série

Após quatro aulas de introdução teórica e apresentação de bibliotecas, podemos ir à parte prática propriamente dita da série. Iniciaremos utilizando a biblioteca pandas, que é uma biblioteca essencial na análise de dados.

Nessa aula, então, veremos:

  • Como importar os dados para um notebook Jupyter através do pandas;
  • Primeiras análises com o pandas: resumo estatístico, medidas de tendência central e dispersão.
  • Agrupamentos e fatiamentos no pandas

Mas antes, algumas considerações sobre os dados

Os dados que utilizaremos durante as aulas estarão sempre disponíveis no repositório da série no GitHub, para que vocês possam baixar e explorá-los offline, assim como trabalhar com eles na nuvem, através do Google Colaboratory. Além disso, todos os códigos e as respostas dos desafios estarão em uma pasta de notebooks do mesmo repositório; você pode acessá-las quando quiser para ver os outputs e respostas dos desafios. Aproveite também para explorar os notebooks no Google Colab; sempre haverá um botão 'Open in Colab' ou um link para a plataforma nos notebooks do GitHub. Usaremos sempre o Google Colab para as práticas.

Os dados que utilizaremos nessa primeira parte são originados do curso "Data Analysis and Visualization in Python for Ecologists", aula Starting with Data. Os arquivos são do Portal Project Teaching Database e podem ser encontrados originalmente aqui. Ressalto aqui que os arquivos estão disponibilizados no repositório do GitHub na íntegra, e estão em domínio público; logo, é possível usar os dados livremente. O dicionário de variáveis pode ser consultado tanto na aula original, quanto no notebook dessa aula.

Vamos logo à parte prática?

Instalação e importação do Pandas para um notebook Jupyter (ou do Google Colaboratory)

Acesse os notebooks práticos por aqui: GitHub e Google Colab

A instalação do pandas pode ser necessária se você estiver usando alguma plataforma à parte o Google Colaboratory, que já possui a biblioteca instalada. Para fazer isso, é possível usar o !pip install. Considerada essa parte, podemos fazer a importação usando o comando import.

!pip install pandas #Para instalar
import pandas as pd #Para importar ao notebook

Importação de dados

O pandas, como já foi relatado em aulas anteriores, possui suporte para importação de vários arquivos de dados (.xlsx, .csv, e .json são alguns exemplos); para cada um deles, existe uma função específica, mas que segue um mesmo padrão: pd.read_type(). O pd é o alias do pandas, e a função que estaremos chamando é read_type(), sendo que é preciso mencionar o tipo de arquivo onde estão os dados. No caso do nosso exemplo, como usaremos o arquivo surveys.csv, é preciso chamar a função pd.read_csv("local do arquivo").

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

Assim foi feita a importação dos dados para o notebook; repare que estamos criando um novo objeto através do comando df =. Isso quer dizer que estamos criando um objeto do conjunto de dados que importamos. É importante fazer isso para prosseguirmos aos próximos passos.

Primeiras visualizações com pandas

A primeira coisa que podemos fazer com o dataframe e o pandas importados ao nosso notebook é verificar como os dados foram importados e como estão dispostos no objeto que criamos anteriormente. Para tanto, podemos usar duas funções: a função head() nos permite ver as cinco primeiras entradas do df; além disso, a função info() nos dá a informação de que tipos de dados há no dataframe e quantos dados são considerados como não-nulos.

df.head() #Cinco primeiras entradas
df.info() #Tipos de dados existentes

Após isso, podemos obter também um resumo estatístico dos dados. Isso pode valer tanto para todo o dataframe, quanto para apenas uma coluna ou variável dele. Para isso, usamos a função describe().

Que tal fazer você mesmo?

(1) Vimos aqui que a função head() aponta as cinco primeiras entradas do nosso dataframe. Há também uma outra função relacionada a essa chamada tail() O que ela faz?

(2) Ainda sobre a função head(): se quisermos exibir mais de 5 linhas, o que devemos fazer? Será que podemos fazer o mesmo para exibir menos que isso?

Você pode usar o mesmo objeto df para descobrir. As respostas estarão no repositório da série no GitHub e no notebook do Google Colab.

df.describe() #Resumo estatístico de todo o dataframe
df['weight'].describe() #Resumo estatístico da variável 'weight'

Medidas de tendência central e dispersão (média, mediana, moda, desvio-padrão)

O resumo estatístico, tanto do dataframe inteiro, quanto de uma variável específica, aponta algumas medidas interessantes, tanto de tendência central, quanto de dispersão. Essas medidas são essenciais para começarmos a analisar a variância do conjunto de dados que temos. Mas, e se quisermos fazer uma análise de apenas uma dessas medidas? No pandas, é simples de apontar esses índices em separado: basta usar a fórmula dataframe['variável'].medida(). A seguir há alguns exemplos para que você possa entender melhor:

df['weight'].mean() #Para descobrir a média
df['weight'].median() #Para descobrir a mediana
df['weight'].std() #Para descobrir o desvio-padrão

Agrupamentos no pandas

Algumas variáveis dentro do nosso dataset de exemplo são consideradas como categóricas; a partir disso, podemos fazer alguns exercícios envolvendo essas variáveis utilizando o método de agrupamento no pandas.

Por exemplo: sabendo da existência da variável sex dentro do dataset e, importada essa mesma variável pro nosso dataframe, quantos registros de cada sexo biológico constam no nosso conjunto de dados? Para descobrir isso, podemos utilizar a função value_counts(), assim:

df['sex'].value_counts()

No entanto, também temos outro recurso do pandas com o qual podemos trabalhar com agrupamentos de variáveis categóricas: o groupby(). Com ele, podemos ir mais além da contagem e usar medidas de tendência central e dispersão para observar variâncias de uma variável por outra. A fórmula fica assim: dataframe.groupby('variável1')['variável2'].medida().

Para entender melhor: imagine que queremos descobrir a média dos pesos das nossas amostragens, agrupando-as por sexo. Para descobrir isso, podemos utilizar a fórmula citada antes, assim:

df.groupby('sex')['weight'].mean()

Perceba como as variáveis estão posicionadas na linha de código; a variável sex, que é a que agruparemos, está na primeira posição, em parênteses, associada com a função groupby(), enquanto que a variável weight, de onde tiraremos as médias, vem logo depois, em colchetes. A mesma fórmula pode ser usada para tirar outras medidas com outros agrupamentos.

Que tal fazer você mesmo?

Com o mesmo dataframe podemos então comparar mais medidas agrupando as amostras por sexo. Será que você consegue comparar essa categoria:

  • por medianas de peso?
  • por médias de comprimento do retropé (hindfoot)? E qual o máximo do comprimento para cada sexo?

Você pode ainda usar o objeto df para descobrir. As respostas estarão no repositório da série no GitHub e no notebook do Google Colab.

Filtragem do conjunto de dados por fatiamento

Na ciência de dados, há uma prática conhecida por slicing ou fatiamento, onde há a possibilidade de fazermos uma filtragem do conjunto de dados, podendo criar inclusive subsets do conjunto para que possamos explorar e visualizar melhor os dados mais adiante. Esse fatiamento pode ser feito tanto com linhas, quanto por colunas de uma certa tabela.

Usemos o nosso objeto df para entender melhor essa prática. Se quisermos fazer um fatiamento por linhas do dataframe, podemos utilizar uma fórmula simples: df[linha início: linha fim +1] Um detalhe importante a ser mencionado aqui é que a indexação do Python, ao contrário de algumas outras linguagens, começa pelo 0. Então, se quisermos fatiar o dataframe da primeira até a sétima linha, podemos fazer assim:

df_linha = df[0:7] #Linha de início (0): linha final (6)+1

O fatiamento de colunas também é fácil; apenas em vez de usarmos números, mencionaremos os nomes das colunas. A fórmula é df['nome da coluna'] para fatiar apenas uma coluna, e df[['col1', 'col2', 'col3'...'colN']] para uma lista de colunas. Repare na duplicação de colchetes quando usamos a segunda fórmula; isso porque estamos usando o caractere de lista do Python para fazer isso, o que não é necessário quando queremos separar apenas uma coluna.

df_coluna = df['weight'] #Uma coluna
df_coluna = df[['weight', 'sex']] #Mais de uma coluna

Até agora, vimos um pouco de análise de dados com o pandas, assunto no qual nos estenderemos por mais aulas. Nas referências abaixo, assim como no hyperlinks ao longo do texto, terá mais conteúdo para você poder praticar os conceitos apresentados, além de poder avançar um pouco mais na biblioteca pandas. Não se esqueça de dar uma olhada no notebook das aulas, onde você pode ver os outputs de cada bloco de código citado, as resoluções dos desafios e explorar a linguagem Python por si.

Um grande abraço e até a próxima aula!

Leia mais: