Pular para o conteúdo
</>RoByte

Buscar cursos e aulas

Aulas do curso

Vídeo em breve

Por enquanto, esta aula está disponível só em texto — o vídeo entra assim que ficar pronto.

Fundamentos

Visualizando e limpando dados

Gráficos com Matplotlib para entender os dados e as etapas de limpeza que todo projeto de ML precisa: ausentes, duplicados, outliers e variáveis categóricas. · 18 min

Antes de treinar qualquer modelo, você precisa olhar os dados. Gráficos mostram padrões, erros e absurdos que uma tabela de números esconde. Esta aula fecha o módulo de fundamentos com visualização e limpeza, o que se costuma chamar de análise exploratória.

Gráficos com Matplotlib

Vamos usar o dataset da íris, que já vem com o scikit-learn. O parâmetro as_frame=True entrega os dados direto como DataFrame:

import matplotlib.pyplot as plt
from sklearn.datasets import load_iris

iris = load_iris(as_frame=True)
df = iris.frame     # 4 medidas das flores + a coluna "target" (a espécie)
print(df.head())

Histograma: mostra como os valores de uma coluna se distribuem.

plt.hist(df["sepal length (cm)"], bins=15)
plt.xlabel("Comprimento da sépala (cm)")
plt.ylabel("Quantidade de flores")
plt.title("Distribuição do comprimento da sépala")
plt.show()

Gráfico de dispersão (scatter): mostra a relação entre duas colunas, colorindo os pontos pela espécie.

plt.scatter(df["petal length (cm)"], df["petal width (cm)"], c=df["target"])
plt.xlabel("Comprimento da pétala (cm)")
plt.ylabel("Largura da pétala (cm)")
plt.show()

Dica

Repare que no scatter as três espécies formam grupos bem separados. É por isso que um modelo simples consegue classificá-las bem. Gráficos assim ajudam a prever, antes de treinar, se o problema é fácil ou difícil.

Limpeza de dados

Considere esta tabela com problemas típicos:

import pandas as pd

df = pd.DataFrame({
    "idade": [22, None, 31, 28, 250, 22],
    "cidade": ["SP", "RJ", "SP", None, "MG", "SP"],
    "plano": ["basico", "premium", "basico", "premium", "basico", "basico"],
})

1. Valores ausentes: vimos na aula de Pandas.

print(df.isna().sum())
df["idade"] = df["idade"].fillna(df["idade"].median())

2. Duplicados: linhas repetidas distorcem o treino.

df = df.drop_duplicates()

3. Outliers: valores muito fora do padrão, como a idade 250. Uma regra comum é o método do IQR:

q1, q3 = df["idade"].quantile([0.25, 0.75])
iqr = q3 - q1
limite_superior = q3 + 1.5 * iqr

print(df[df["idade"] > limite_superior])   # mostra os suspeitos
df = df[df["idade"] <= limite_superior]     # remove

Atenção

Outlier nem sempre é erro. Uma idade de 250 é claramente um erro de digitação, mas uma compra de R$ 50.000 numa loja pode ser real e importante. Antes de remover, entenda de onde o valor veio.

4. Variáveis categóricas: os modelos só entendem números, então textos como "basico" e "premium" precisam ser convertidos. O jeito mais comum é o one-hot encoding, que cria uma coluna para cada categoria:

print(pd.get_dummies(df["plano"]))
#    basico  premium
# 0    True    False
# 1   False     True

Um último cuidado: escala

Se uma feature vai de 0 a 1 e outra de 0 a 100.000, alguns modelos dão peso demais à segunda só por causa da escala. Existem técnicas para padronizar isso, como a normalização min-max que você fez no desafio da aula de NumPy. Mais à frente veremos o StandardScaler do scikit-learn.

Exercícios

Exercício

1. Aquecimento. Carregue o dataset da íris como DataFrame e faça o histograma da coluna petal length (cm). O que você percebe na distribuição?

Exercício

2. Comparando. Faça um scatter entre sepal length (cm) e sepal width (cm), colorido por target. As espécies ficam tão separadas quanto no gráfico das pétalas? O que isso sugere sobre qual feature é mais útil?

Exercício

3. Desafio. Monte um DataFrame de 10 linhas com pelo menos um valor ausente, uma linha duplicada, um outlier numérico e uma coluna categórica. Limpe tudo usando as quatro técnicas da aula e imprima o DataFrame final, já com o one-hot encoding aplicado.