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.