Data Science Academy - Python Fundamentos - Capítulo 9

Download: http://github.com/dsacademybr


In [1]:
# Versão da Linguagem Python
from platform import python_version
print('Versão da Linguagem Python Usada Neste Jupyter Notebook:', python_version())


Versão da Linguagem Python Usada Neste Jupyter Notebook: 3.7.6

Exercício: Análise Exploratória de Dados com Python

Neste exercício, você vai realizar uma análise exploratória em um dos mais famosos datasets para Machine Learning, o dataset iris com informações sobre 3 tipos de plantas. Esse dataset é comumente usado em problemas de Machine Learning de classificação, quando nosso objetivo é prever a classe dos dados. No caso deste dataset, prever a categoria de uma planta a partir de medidas da planta (sepal e petal).

Em cada célula, você encontra a tarefa a ser realizada. Faça todo o exercício e depois compare com a solução proposta.

Dataset (já disponível com o Scikit-Learn): https://archive.ics.uci.edu/ml/datasets/iris


In [2]:
# Imports
import time
import numpy as np
import pandas as pd
import matplotlib as mat
from matplotlib import pyplot as plt
from sklearn.datasets import load_iris
%matplotlib inline

fontsize = 14
ticklabelsize = 14

In [3]:
np.__version__


Out[3]:
'1.18.2'

In [4]:
pd.__version__


Out[4]:
'1.0.3'

In [5]:
mat.__version__


Out[5]:
'3.2.1'

In [6]:
# Carregando o dataset
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
print(len(df))
df.head()


150
Out[6]:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm)
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2

Extração e Transformação de Dados


In [7]:
# Imprima os valores numéricos da Variável target (o que queremos prever), 
# uma de 3 possíveis categorias de plantas: setosa, versicolor ou virginica
iris.target_names


Out[7]:
array(['setosa', 'versicolor', 'virginica'], dtype='<U10')

In [8]:
# Imprima os valores numéricos da Variável target (o que queremos prever), 
# uma de 3 possíveis categorias de plantas: 0, 1 ou 2
iris.target


Out[8]:
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

In [9]:
# Adicione ao dataset uma nova coluna com os nomes das espécies, pois é isso que vamos tentar prever (variável target)
df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names)
df.head()


Out[9]:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa

In [10]:
# Inclua no dataset uma coluna com os valores numéricos da variável target
df['target'] = iris.target
df.head()


Out[10]:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) species target
0 5.1 3.5 1.4 0.2 setosa 0
1 4.9 3.0 1.4 0.2 setosa 0
2 4.7 3.2 1.3 0.2 setosa 0
3 4.6 3.1 1.5 0.2 setosa 0
4 5.0 3.6 1.4 0.2 setosa 0

In [11]:
# Extraia as features (atributos) do dataset e imprima 
features = df.columns[:4]
features


Out[11]:
Index(['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)',
       'petal width (cm)'],
      dtype='object')

In [12]:
# Calcule a média de cada feature para as 3 classes
df.groupby('target').mean().T


Out[12]:
target 0 1 2
sepal length (cm) 5.006 5.936 6.588
sepal width (cm) 3.428 2.770 2.974
petal length (cm) 1.462 4.260 5.552
petal width (cm) 0.246 1.326 2.026

Exploração de Dados


In [13]:
# Imprima uma Transposta do dataset (transforme linhas e colunas e colunas em linhas)
df.head(10).T


Out[13]:
0 1 2 3 4 5 6 7 8 9
sepal length (cm) 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9
sepal width (cm) 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1
petal length (cm) 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5
petal width (cm) 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1
species setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
target 0 0 0 0 0 0 0 0 0 0

In [14]:
# Utilize a função Info do dataset para obter um resumo sobre o dataset 
df.info()


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 6 columns):
 #   Column             Non-Null Count  Dtype   
---  ------             --------------  -----   
 0   sepal length (cm)  150 non-null    float64 
 1   sepal width (cm)   150 non-null    float64 
 2   petal length (cm)  150 non-null    float64 
 3   petal width (cm)   150 non-null    float64 
 4   species            150 non-null    category
 5   target             150 non-null    int64   
dtypes: category(1), float64(4), int64(1)
memory usage: 6.2 KB

In [15]:
# Faça um resumo estatístico do dataset
df.describe()


Out[15]:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) target
count 150.000000 150.000000 150.000000 150.000000 150.000000
mean 5.843333 3.057333 3.758000 1.199333 1.000000
std 0.828066 0.435866 1.765298 0.762238 0.819232
min 4.300000 2.000000 1.000000 0.100000 0.000000
25% 5.100000 2.800000 1.600000 0.300000 0.000000
50% 5.800000 3.000000 4.350000 1.300000 1.000000
75% 6.400000 3.300000 5.100000 1.800000 2.000000
max 7.900000 4.400000 6.900000 2.500000 2.000000

In [16]:
# Verifique se existem valores nulos no dataset
df.isnull().sum(axis=0)


Out[16]:
sepal length (cm)    0
sepal width (cm)     0
petal length (cm)    0
petal width (cm)     0
species              0
target               0
dtype: int64

In [17]:
# Faça uma contagem de valores de sepal length
df['sepal length (cm)'].value_counts(dropna=False)


Out[17]:
5.0    10
6.3     9
5.1     9
6.7     8
5.7     8
5.5     7
5.8     7
6.4     7
6.0     6
4.9     6
6.1     6
5.4     6
5.6     6
6.5     5
4.8     5
7.7     4
6.9     4
5.2     4
6.2     4
4.6     4
7.2     3
6.8     3
4.4     3
5.9     3
6.6     2
4.7     2
7.6     1
7.4     1
4.3     1
7.9     1
7.3     1
7.0     1
4.5     1
5.3     1
7.1     1
Name: sepal length (cm), dtype: int64

Plot


In [18]:
# Crie um Histograma de sepal length
exclude = ['Id', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)', 'target']
df.loc[:, df.columns.difference(exclude)].hist() 
plt.figure(figsize=(15,10))
plt.show()


<Figure size 1080x720 with 0 Axes>

In [19]:
# Crie um Gráficos de Dispersão (scatter Plot) da variável sepal length versus número da linha, 
# colorido por marcadores da variável target
plt.figure(figsize=(12, 8), dpi=80)
plt.scatter(range(len(df)), df['petal width (cm)'], c=df['target'])
plt.xlabel('Número da Linha', fontsize=fontsize)
plt.ylabel('Sepal length (cm)', fontsize=fontsize)
plt.title('Gráfico de Dispersão dos Atributos, colorido por marcadores da classe alvo', fontsize=fontsize)
#plt.title('Scatter plot of features, colored by target labels', fontsize=fontsize)


Out[19]:
Text(0.5, 1.0, 'Gráfico de Dispersão dos Atributos, colorido por marcadores da classe alvo')

In [20]:
# Crie um Scatter Plot de 2 Features (atributos)
plt.figure(figsize=(12, 8), dpi=80)
plt.scatter(df['petal length (cm)'], df['petal width (cm)'], c=df['target'])
plt.xlabel('petal length (cm)', fontsize=fontsize)
plt.ylabel('petal width (cm)', fontsize=fontsize)


Out[20]:
Text(0, 0.5, 'petal width (cm)')

In [21]:
# Crie um Scatter Matrix das Features (atributos)
attributes = ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
pd.plotting.scatter_matrix(df[attributes], figsize=(16, 12))


Out[21]:
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7fae78a279d0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7fae78a5f9d0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7fae988b4b90>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7fae98900710>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7fae98935d90>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7fae58c61450>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7fae58c97b50>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7fae58cdc150>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7fae58cdc190>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7fae58d11910>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7fae71000550>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7fae690f6bd0>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7fae69139290>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7fae6916e910>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7fae691a6f90>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7fae883d8650>]],
      dtype=object)

In [22]:
# Crie um Histograma de todas as features
df.hist(figsize=(12,12))


Out[22]:
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7fae9867bc10>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7fae481a1650>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7fae71087c90>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7fae58dcf350>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7fae884ae9d0>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7fae28002b90>]],
      dtype=object)

Conheça a Formação Cientista de Dados, um programa completo, 100% online e 100% em português, com 400 horas, mais de 1.200 aulas em vídeos e 26 projetos, que vão ajudá-lo a se tornar um dos profissionais mais cobiçados do mercado de análise de dados. Clique no link abaixo, faça sua inscrição, comece hoje mesmo e aumente sua empregabilidade:

https://www.datascienceacademy.com.br/pages/formacao-cientista-de-dados

Fim

Obrigado - Data Science Academy - facebook.com/dsacademybr