Lab01 - Dataframe
Objetivos¶
- Apresentar e utilizar o pacote pandas
- Como carregar uma base dados
- Como visualizar os dados
- Intuição de análise exploratória de dados
Introdução¶
Vamos começar pelo começo! Vamos escolher um dataset (conjunto de dados) para analisar.
Vamos utilizar um pacote do python capaz de trabalhar com tabelas de dados chamada pandas, para essas tabelas chamamos de dataframe.
Veja mais em: https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html
import pandas as pd
# Cria uma dataframe
data = {
"Nome": ["Riu", "Mário", "Gogu"],
"Idade": [50, 40, 45]
}
# Carrega o dataframe
df = pd.DataFrame(data)
print(df)
Nome Idade 0 Riu 50 1 Mário 40 2 Gogu 45
import pandas as pd
# Cria uma dataframe
data = [["Riu", 50],["Gogu",15],["Mário",80]]
# Carrega o dataframe
df = pd.DataFrame(data)
print(df)
0 1 0 Riu 50 1 Gogu 15 2 Mário 80
Para instalar
- pandas:
pip3 install pandas
LEIA A DOCUMENTAÇÃO: https://pandas.pydata.org/docs/index.html
# Inicializção das bibliotecas
%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
Dataset¶
Podemos escolher qualquer base de dados disponivel na internet, ou até mesmo criar nosso proprio dataset.
Vamos simplificar essa etapa e começar analisando uma base pequena e muito famosa chamada iris que esta disponivel em:
ref: https://archive.ics.uci.edu/ml/datasets/Iris
Conheça outros datasets: https://archive.ics.uci.edu/ml/datasets.php
# Caminho do arquivo
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data"
# Lê e carrega o arquivo para a memória
df = pd.read_csv(url)
Conhecendo os dados¶
Essa etapa é muito importante, CONHECER OS DADOS!
Quanto mais você conhece a base de DADOS maior a possibilidade de extrair INFORMAÇÕES úteis para tomada de decisão.
df.head()
5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa | |
---|---|---|---|---|---|
0 | 4.9 | 3.0 | 1.4 | 0.2 | Iris-setosa |
1 | 4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa |
2 | 4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa |
3 | 5.0 | 3.6 | 1.4 | 0.2 | Iris-setosa |
4 | 5.4 | 3.9 | 1.7 | 0.4 | Iris-setosa |
Note que a primeira linha não é com os nomes das colunas ou atributos(variaveis) e sim de dados (valores). Por padrão os dados da primeira linha são importados como atributos.
Vamos adicionar um cabeçario ao nosso dataframe. No repositório oficial é dito que as variaveis são:
Attribute Information:
1. sepal length in cm
2. sepal width in cm
3. petal length in cm
4. petal width in cm
5. class:
-- Iris Setosa
-- Iris Versicolour
-- Iris Virginica
# Define o nome das colunas
header = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species']
# Lê e carrega o arquivo para a memória
df = pd.read_csv(url, header=None, names=header)
# Retorna um trecho com as 5 primeiras linhas do dataframe
df.head()
sepal_length | sepal_width | petal_length | petal_width | species | |
---|---|---|---|---|---|
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 |
# Mostra informações sobre o dataframe em si
df.info()
<class 'pandas.core.frame.DataFrame'> 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 species 150 non-null object dtypes: float64(4), object(1) memory usage: 6.0+ KB
# exibe o shape (dimensoẽs) do dataframe
df.shape
(150, 5)
# class distribution
print(df.groupby('species').size())
species Iris-setosa 50 Iris-versicolor 50 Iris-virginica 50 dtype: int64
Desafio 1¶
Analisando as informações do df e no repositorio do dataset, responda:
Quantos dados existem nesse dataset?
Qual a quantidade de atributos?
Existe valores faltantes?
De que tipo são os dados (dtype)?
## Suas respostas....
Análisando dos dados mais a fundo¶
São 150 exemplares de flor de íris, pertencentes a três espécies diferentes: setosa, versicolor e virginica, sendo 50 amostras de cada espécie. Os atributos de largura e comprimento de sépala e largura e comprimento de pétala de cada flor fooram medidos manualmente.
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 |
Note que o método describe() não exibe a coluna species, pois se trata de uma coluna não-numérica. Apenas as colunas numéricas estão presentes, e a coluna *species** indica rótulos - trata-se de dados categóricos.
df.species.unique()
array(['Iris-setosa', 'Iris-versicolor', 'Iris-virginica'], dtype=object)
Analisando informações em gráficos¶
Uma análise gráfica pode ajudar a compreeder melhor os dados que estamos trabalhando....
# box and whisker plots
df.plot(kind='box', subplots=True, layout=(2,2), sharex=False, sharey=False, figsize=(15, 15))
plt.show()
# Lembra de histograma, que exibe uma gráfico de frequência.
df.hist(bins=100, figsize=(15, 15))
plt.show()
# scatter plot matrix
from pandas.plotting import scatter_matrix
scatter_matrix(df,figsize=(15, 15))
plt.show()
Vamos instalar o pacote seaborn para visualizar gráficos de dispersão entre todos os campos da tabela
- seaborn:
pip3 install seaborn
import matplotlib.pyplot as plt
import seaborn as sns
# A cor vem do campo `species` do dataframe
sns.pairplot(df, hue='species', height=5)
plt.show()
O Violin plot é similar ao box plot, exibe a distribuição de variaveis numéricas em niveis, pode ser configurada de muitas formas e é uma forma de visualização interessante de dados.
Saiba mais em: https://seaborn.pydata.org/generated/seaborn.violinplot.html
# Violin plot
g = sns.violinplot(y='species', x='sepal_length', data=df, inner='quartile')
plt.show()
g = sns.violinplot(y='species', x='sepal_width', data=df, inner='quartile')
plt.show()
g = sns.violinplot(y='species', x='petal_length', data=df, inner='quartile')
plt.show()
g = sns.violinplot(y='species', x='petal_width', data=df, inner='quartile')
plt.show()
Correlação entre atributos¶
A matriz de correlação avalia a relação entre duas ou mais variaveis (correlação).
valores:
- 0.9 a 1 positivo ou negativo indica uma correlação muito forte.
- 0.7 a 0.9 positivo ou negativo indica uma correlação forte.
- 0.5 a 0.7 positivo ou negativo indica uma correlação moderada.
- 0.3 a 0.5 positivo ou negativo indica uma correlação fraca.
0 a 0.3 positivo ou negativo indica uma correlação desprezível.
lembre-se que: alta correlação não implica em causa. (causa e consequência). Para entender melhor vale a pena dar uma olhada nesse site que mostra correlações absurdas...'spurious correlations'
cols = ['sepal_length', 'sepal_width', 'petal_length','petal_width']
corr_matx = df[cols].corr()
heatmap = sns.heatmap(corr_matx,cbar=True,annot=True,square=True,fmt='.2f',annot_kws={'size': 15},yticklabels=cols,xticklabels=cols,cmap='Dark2')
Desafio 2¶
Analise os gráficos gerados até o momento para responder as questões abaixo:
A especie que possui na média a menor sepala é a mesma que possui a menor petala?
Existe sobreposição entre as medições, ou seja, uma petala de tamanho x pode ser tanto da especie versicolor ou da virginica?
É possivel classificar as especies de iris com base apenas em suas dimensões?
### Implemente sua solução e apresente sua análise....
Acessando dados de um Dataframe¶
Há várias maneiras de acessar o conteúdo de um DataFrame
. Os mais simples são aqueles que usam a notação de colchetes.
Primeiramente, podemos acessar uma coluna através do seu índice, retornando uma Series
, ou seja, uma coluna do dataframe.
df['petal_length'].head()
0 1.4 1 1.4 2 1.3 3 1.5 4 1.4 Name: petal_length, dtype: float64
Por outro lado, se dentro dos colchetes passamos uma lista de nomes de coluna, o reultado é outro DataFrame
contendo aquelas colunas. Isso vale inclusive para uma coluna simples:
# Mostra apenas a coluna petal_len
df[['petal_length']].head()
petal_length | |
---|---|
0 | 1.4 |
1 | 1.4 |
2 | 1.3 |
3 | 1.5 |
4 | 1.4 |
# Mostra as colunas petal_length e petal_width
df[['petal_length', 'petal_width']].head()
petal_length | petal_width | |
---|---|---|
0 | 1.4 | 0.2 |
1 | 1.4 | 0.2 |
2 | 1.3 | 0.2 |
3 | 1.5 | 0.2 |
4 | 1.4 | 0.2 |
Desafio 3¶
Faça agora uma exploração de dados em outra base, conheça a base, e crie hipoteses de teste.
- Importar os dados do dataset Breast Cancer Data Set:
https://archive.ics.uci.edu/ml/datasets/breast+cancer
- Nomear as colunas de acordo com o arquivo
breast-cancer.names
- Criar um subdataframe contendo apenas o conteúdo das colunas
Class
,age
,menopause
etumor-size
- Visualizar os dados usando pelo menos
head()
epairplot()
### Implemente sua sua solução e análise de dados. :)