Ciência de dados com pandas
Na postagem anterior, fizemos uma pequena introdução à ciência de dados e ao pandas, o pacote Python mais importante para a área. Neste post, nos dedicaremos a explorar o pandas em código. Para acompanhar a postagem, é preciso instalar a biblioteca:
pip install pandas
A instalação com conda pode ser feita com o comando:
conda install anaconda::pandas
Para explorar o pandas para ciência de dados, precisamos de alguns dados. Usaremos o conjunto de dados iris, disponível nesse site. Acesse o conjunto de dados aqui, faça o download e descompacte (unzip) o arquivo na localização desejada. Na pasta descompactada, você encontrará vários arquivos.
O conjunto de dados iris consiste em 50 amostras (exemplos) de cada uma das três espécies de iris (Iris setosa, Iris virginica e Iris versicolor). Ele possui quatro características de cada amostra: o comprimento e a largura das sépalas e pétalas, em centímetros. Esse conjunto é tipicamente usado como um exemplo didático para algoritmos de machine learning.
Abrindo arquivos CSV
Para usar o pandas, o primeiro passo é importá-lo no nosso código Python. Crie um código Python com o nome que desejar e insira a linha abaixo.
import pandas as pd
Depois, precisamos abrir nossos dados. O pandas trabalha com vários formatos de dados. Nosso exemplo está em CSV. Para abrir um arquivo CSV como os dados da iris, usamos o comando read_csv(). O arquivo que usaremos está na pasta chamada iris e se chama iris.data. Não se esqueça de inserir no comando abaixo a localização correta do seu arquivo.
O arquivo iris não está com os nomes dos atributos. Por isso, eles serão inseridos explicitamente como mostrado abaixo (na linha 2 definimos os nomes, na linha 3 eles são indicados para serem usados no arquivo). Essa passagem não é essencial, mas é importante para manter os dados organizados.
filename = 'Sua Locação/iris/iris.data'
names = ["sepal length", "sepal width", "petal length", "petal width", "Class"]
df = pd.read_csv(filename, names = names)
Com a execução desses comandos, o arquivo de dados do conjunto iris já estará disponível através do pandas para ser analisado e manipulado.
Como mencionado acima, o pandas não lida apenas com dados CSV. Para abrir dados do excel, por exemplo, ao invés de read_cvs() basta mudar o comando para read_excel(). Veja mais sobre os inputs que o pandas aceita aqui.
O mais básico
Em ciência de dados, a exploração mais básica de um conjunto de dados pode ser feita com as funcionalidades head() e tail(). Elas mostram, respectivamente, as primeiras (cabeça) ou as últimas (cauda) linhas do DataFrame. Note que, no nosso exemplo, o DataFrame é tratado como df, terminologia comum na área.
print(df.head())
Os resultados do comando head() sao mostrados abaixo. Veja que a primeira coluna se refere a índices inseridos automaticamente pelo pandas.
sepal length sepal width petal length petal width Class
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa
print(df.tail())
Resultados do comando tail()
sepal length sepal width petal length petal width Class
145 6.7 3.0 5.2 2.3 Iris-virginica
146 6.3 2.5 5.0 1.9 Iris-virginica
147 6.5 3.0 5.2 2.0 Iris-virginica
148 6.2 3.4 5.4 2.3 Iris-virginica
149 5.9 3.0 5.1 1.8 Iris-virginica
O comando shape mostra as dimensões (linhas, colunas) do DataFrame.
print(df.shape)
(150, 5)
O conjunto iris possui 4 colunas de recursos e uma coluna com os rótulos, ou seja, 5 colunas no total. Ele tem 150 linhas, cada uma contendo os recursos e classificações de um exemplar diferente.
Exploração inicial
Talvez os comandos mais importantes para adquirir uma compreensão rápida sobre um conjunto de dados sejam o info() e describe(). O comando info() retorna um resumo sobre o conjunto de dados, incluindo os tipos de dados presentes e contagens não nulas.
print(df.info())
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 sepal length 150 non-null float64
1 sepal width 150 non-null float64
2 petal length 150 non-null float64
3 petal width 150 non-null float64
4 Class 150 non-null object
dtypes: float64(4), object(1)
memory usage: 6.0+ KB
None
Já a funcionalidade describe() realiza cálculos estatísticos básicos como contagem, média, desvio padrão, etc.
print(df.describe())
sepal length sepal width petal length petal width
count 150.000000 150.000000 150.000000 150.000000
mean 5.843333 3.054000 3.758667 1.198667
std 0.828066 0.433594 1.764420 0.763161
min 4.300000 2.000000 1.000000 0.100000
25% 5.100000 2.800000 1.600000 0.300000
50% 5.800000 3.000000 4.350000 1.300000
75% 6.400000 3.300000 5.100000 1.800000
max 7.900000 4.400000 6.900000 2.500000
loc() e iloc()
Os comandos loc() e iloc() permitem acessar os dados por nomes (loc) ou posições (iloc). Ilustraremos seus usos a seguir.
Na linha abaixo, usamos o loc() para obter os valores de sepal width das cinco primeiras amostras. Como mostrado abaixo, o comando loc() permite que o nome de uma coluna seja diretamente usado para acessar seus valores.
print(df.loc[0:5, 'sepal width'])
0 3.5
1 3.0
2 3.2
3 3.1
4 3.6
5 3.9
Name: sepal width, dtype: float64
Diferentemente do comando loc(), o iloc() possibilita acessar dados através de suas posições ou índices. Por exemplo, na linha abaixo, o comando iloc() é usado para retornar os dez primeiros dados apenas da coluna 2.
print(df.iloc[:10,2])
0 1.4
1 1.4
2 1.3
3 1.5
4 1.4
5 1.7
6 1.4
7 1.5
8 1.4
Name: petal length, dtype: float64
iloc().value
Uma variação do iloc muito usada em machine learning é o iloc().value. Esse comando é usado para isolar apenas os valores dos dados para o treinamento de algoritmos. Para o nosso exemplo do conjunto iris, se fossemos treinar um classificador, seus atributos seriam usados para criar o conjunto X das variáveis independentes. Já os rótulos das iris seriam usados para criar o conjunto y (variáveis dependentes). Você pode ler mais sobre variáveis dependentes e independentes em machine learning aqui. A extração dos valores dos dados para criar os conjuntos X e y com iloc().value pode ser feita assim:
X = df.iloc[:,:-1].values
y = df.iloc[:,-1].values
Nas linhas acima, o conjunto X é criado com todas as colunas, menos a última que inclui as classificações (rótulos). Já o y é formado apenas pela última coluna.
Com isso, encerramos o post. Na próxima postagem, exploraremos como o pandas lida com dados ausentes.