AI: Fundamentos de Dados

Última atualização: 2026-08-26

Os dados são o combustível da IA—sem dados, nem mesmo os melhores algoritmos podem treinar modelos eficazes. Este capítulo ajudará você a entender os tipos de dados, a engenharia de recursos, a divisão de conjuntos de dados e a regra inabalável de "Garbage In, Garbage Out."

1. O Que Você Vai Aprender



2. Uma História Real de um Projeto de Aprendizado de Máquina

(1) Ponto de Dor: Após um mês de treinamento, a acurácia é 60%

A equipe de Bob passou um mês treinando um modelo de classificação de imagens, mas sua acurácia era de apenas 60%. Ao investigar, eles descobriram que 70% dos dados de treinamento consistiam em imagens tiradas em dias ensolarados, enquanto os cenários do mundo real incluíam uma variedade de condições climáticas—chuva, neblina e noite. Como o modelo nunca tinha "visto" essas condições, naturalmente era incapaz de reconhecê-las.

(2) Soluções Orientadas por Dados

Charlie disse: "Isso é 'Lixo Entra, Lixo Sai'—a IA só pode aprender o que você alimenta ela. Em vez de ajustar os parâmetros do algoritmo, você deveria corrigir a distribuição dos dados primeiro."

▶ Exemplo: Verificando a Distribuição dos Dados—Identificando Inclinação (Dificuldade: ⭐⭐)

PYTHON
# Verifica a distribuição dos dados — primeiro passo antes de qualquer projeto de IA
import pandas as pd

df = pd.DataFrame({
    'weather': ['sunny'] * 70 + ['rainy'] * 15 + ['foggy'] * 10 + ['night'] * 5,
    'label': ['car'] * 50 + ['car'] * 5 + ['car'] * 3 + ['car'] * 2 +
             ['truck'] * 20 + ['truck'] * 10 + ['truck'] * 7 + ['truck'] * 3
})

print("Distribuição do clima:")
print(df['weather'].value_counts())
print(f"\nImagens ensolaradas: {70/100*100:.0f}% — Isso é um problema!")
💻 Saída:

TEXT 📖 Somente leitura
Distribuição do clima:
sunny    70
rainy    15
foggy    10
night     5
Name: weather, dtype: int64

Imagens ensolaradas: 70% — Isso é um problema!

(3) Benefícios: Uma Mentalidade de Dados em Primeiro Lugar

Depois que Bob adicionou imagens para cada condição climática, a taxa de acurácia subiu de 60% para 85%. Ele concluiu que existe uma regra inabalável: "Ajustar o modelo não é tão eficaz quanto ajustar os dados."


3. Tipos de Dados

(1) Classificação por Estrutura

Tipo Descrição Exemplo Método de Processamento por IA
Estruturado Possui formato fixo (linhas e colunas) CSV, tabelas SQL, Excel Entrada direta em modelos tradicionais de ML
Semi-estruturado Parcialmente estruturado, mas com formato flexível JSON, XML, HTML, logs Entrada no modelo após extração de campos
Não estruturado Sem formato fixo Imagens, áudio, vídeo, linguagem natural Aprendizado profundo (CNN/RNN/Transformer)

(2) Classificação por Tipo Numérico

Tipo Descrição Exemplo Processamento do Modelo
Numérico Números contínuos ou discretos Preço, área, idade Usado diretamente
Categórico Número finito de valores discretos Gênero, Cidade, Ocupação Requer codificação (One-Hot)
Tipo Texto Strings de linguagem natural Comentários, corpo de e-mails Requer incorporação (embedding)
Baseado em Tempo Data e Hora Hora do Pedido, Hora do Log Recursos a extrair (Ano/Mês/Hora)


4. Características e Rótulos

As características são as entradas do modelo, e os rótulos são os alvos que o modelo prevê.

100%
graph LR
    A[Característica 1<br/>Área 120 m²] --> C[Modelo de IA]
    B[Característica 2<br/>Quartos 4] --> C
    D[Característica 3<br/>Pontuação da Localização 8] --> C
    C --> E[Rótulo<br/>Preço R$350.000]

(1) O que é uma Característica?

Uma característica é um atributo nos dados que é "útil para fazer previsões":

Conjunto de Dados Características Possíveis Rótulo
Dados de Preços de Imóveis Tamanho, Número de Quartos, Classificação da Localização, Andar Preço do Imóvel
Dados de E-mail Remetente, Frequência de Palavras-chave, Número de Anexos É Spam?
Dados de Usuário Idade, Número de Visualizações de Página, Histórico de Compras Probabilidade de Compra
Dados de Imagem Valores de Pixel (Características Extraídas Automaticamente por Aprendizado Profundo) Categoria da Imagem

(2) Engenharia de Características—Extração Manual vs. Automática

▶ Exemplo: Engenharia de Características Manual—Extraindo Características de Texto (Dificuldade: ⭐⭐)

PYTHON
# Example: Manual feature engineering
import pandas as pd

df = pd.DataFrame({
    'text': ['Free iPhone winner!', 'Meeting at 3pm', 'URGENT: Claim now'],
    'label': ['spam', 'ham', 'spam']
})

# Manual feature extraction: count specific words
df['has_free'] = df['text'].str.lower().str.contains('free').astype(int)
df['has_urgent'] = df['text'].str.lower().str.contains('urgent').astype(int)
df['exclamation_count'] = df['text'].str.count('!')
df['text_length'] = df['text'].str.len()

print(df)
💻 Saída:

TEXT 📖 Somente leitura
                  text label  has_free  has_urgent  exclamation_count  text_length
0  Free iPhone winner!  spam         1           0                  1           19
1     Meeting at 3pm    ham         0           0                  0           14
2  URGENT: Claim now   spam         0           1                  0           17
💡 Dica: O aprendizado de máquina tradicional requer o design manual de características (engenharia de características), enquanto o aprendizado profundo pode aprender características automaticamente a partir dos dados brutos. Essa é uma das principais vantagens da revolução do aprendizado profundo.



5. Divisão do Conjunto de Dados

Ao treinar um modelo de IA, os dados devem ser divididos em três conjuntos mutuamente exclusivos:

100%
graph TB
    A[Conjunto Completo<br/>1000 amostras] --> B[Conjunto de Treino<br/>800 amostras<br/>80%]
    A --> C[Conjunto de Validação<br/>100 amostras<br/>10%]
    A --> D[Conjunto de Teste<br/>100 amostras<br/>10%]
    
    B --> E[Treinar o modelo]
    C --> F[Ajustar hiperparâmetros]
    D --> G[Avaliação final<br/>nunca usado durante o treino]
Conjunto Operação Proporção Regras Principais
Conjunto de Treino Treinar o modelo (aprender parâmetros) 60–80% O modelo aprende diretamente a partir deste conjunto
Conjunto de Validação Ajuste de hiperparâmetros (selecionar a configuração ideal) 10–20% Afeta indiretamente o modelo, mas não é aprendido diretamente
Conjunto de Teste Avaliação Final (Desempenho Reportado) 10–20% Não deve ser usado durante o treino

(1) Dividindo o Conjunto de Dados Usando Python

▶ Exemplo: Dividindo os Dados em Conjuntos de Treino, Validação e Teste (Dificuldade: ⭐⭐)

PYTHON
# Dividir o conjunto de dados em conjuntos treino/validação/teste
from sklearn.model_selection import train_test_split
import pandas as pd

# Conjunto de dados de exemplo
df = pd.DataFrame({
    'area_sqm': [50, 80, 120, 65, 200, 90, 55, 110, 75, 150,
                 60, 85, 130, 95, 180, 70, 100, 45, 140, 105],
    'price_usd': [150000, 280000, 350000, 220000, 500000, 260000,
                  165000, 320000, 240000, 420000, 175000, 270000,
                  380000, 290000, 460000, 210000, 300000, 135000,
                  400000, 310000]
})

# Primeira divisão: 80% treino+validação, 20% teste
train_val, test = train_test_split(df, test_size=0.2, random_state=42)

# Segunda divisão: 75% do train_val = 60% total para treino, 25% = 20% total para validação
train, val = train_test_split(train_val, test_size=0.25, random_state=42)

print(f"Conjunto completo: {len(df)} amostras")
print(f"Conjunto de treino: {len(train)} amostras ({len(train)/len(df)*100:.0f}%)")
print(f"Conjunto de validação: {len(val)} amostras ({len(val)/len(df)*100:.0f}%)")
print(f"Conjunto de teste: {len(test)} amostras ({len(test)/len(df)*100:.0f}%)")
💻 Saída:

TEXT 📖 Somente leitura
Conjunto completo: 20 amostras
Conjunto de treino: 12 amostras (60%)
Conjunto de validação: 4 amostras (20%)
Conjunto de teste: 4 amostras (20%)
⚠️ Nota: O conjunto de teste nunca deve ser usado durante o treino. Se o modelo "viu" os dados do conjunto de teste, os resultados da avaliação não serão objetivos – da mesma forma que, se você olhasse as respostas antes de fazer uma prova, sua nota não refletiria sua verdadeira habilidade.



6. Qualidade dos Dados — Entrada Lixo, Saída Lixo

A qualidade dos dados determina diretamente o limite máximo de desempenho da IA. Não importa o quão bom seja o algoritmo, ele não consegue compensar dados de baixa qualidade:

Problema de Qualidade Descrição Impacto Método de Teste
Valores Faltantes Certos campos estão vazios O modelo não consegue processar entradas faltantes df.isnull().sum()
Dados Duplicados O mesmo registro aparece múltiplas vezes O modelo se sobrepõe a amostras duplicadas df.duplicated().sum()
Desequilíbrio de Classes Uma classe tem muito mais amostras que as outras O modelo favorece a classe majoritária df[label].value_counts()
Ruído/Erros Os valores dos dados são claramente irracionais O modelo aprendeu o padrão errado Detecção de outliers estatísticos
Erro de Rótulo Rotulação incorreta O modelo aprendeu um mapeamento incorreto Verificação manual pontual

(1) Identificando Problemas de Qualidade dos Dados

▶ Exemplo: Relatório de Inspeção de Qualidade dos Dados (Dificuldade: ⭐⭐)

PYTHON
# Checklist de verificação de qualidade dos dados
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'age': [25, 30, np.nan, 45, 200, 28, 30, 30, 35, np.nan],
    'income': [50000, 60000, 45000, np.nan, 80000, 55000, 60000, 62000, 70000, 48000],
    'label': ['buy', 'no', 'buy', 'no', 'buy', 'no', 'no', 'no', 'buy', 'no']
})

print("=== Relatório de Qualidade dos Dados ===")
print(f"Total de linhas: {len(df)}")
print(f"\nValores faltantes por coluna:")
print(df.isnull().sum())
print(f"\nLinhas duplicadas: {df.duplicated().sum()}")
print(f"\nDistribuição dos rótulos:")
print(df['label'].value_counts())
print(f"\nValores suspeitos (idade > 120):")
print(df[df['age'] > 120])
💻 Saída:

TEXT 📖 Somente leitura
=== Relatório de Qualidade dos Dados ===
Total de linhas: 10

Valores fantantes por coluna:
age       2
income    1
label     0
dtype: int64

Linhas duplicadas: 0

Distribuição dos rótulos:
no     6
buy    4
Name: label, dtype: int64

Valores suspeitos (idade > 120):
   age  income label
4  200   80000   buy
💡 Dica: age=200 é claramente um dado incorreto. Se outliers como este não forem limpos, o modelo "aprenderá" uma regra absurda como "pessoas com 200 anos farão uma compra."



7. Conjuntos de Dados Públicos Comumente Usados

Conduzir experimentos de IA não necessariamente requer coletar seus próprios dados; muitos conjuntos de dados públicos de alta qualidade estão disponíveis para uso imediato:

Conjunto de Dados Tarefa Número de Amostras Características
Iris Categoria 150 O conjunto de dados de ML introdutório mais simples
Titanic Categoria 891 Desafio Introductory Clássico do Kaggle
MNIST Classificação de Imagens 70,000 Dígitos manuscritos, Introdução à Visão Computacional
CIFAR-10 Classificação de imagens 60,000 10 classes de imagens coloridas; mais desafiador que MNIST
California Housing Regressão 20,640 Previsão do Preço de Habitação na Califórnia
IMDb Reviews Análise de Sentimento 50,000 Classificação de Avaliações de Filmes como Positivas ou Negativas


8. Exemplo Completo: Pipeline de Preparação de Dados do Titanic

No conjunto de dados do Titanic, complete as seguintes etapas: visão geral dos dados → verificação de valores ausentes → estatísticas de distribuição de categorias → divisão em conjuntos de treinamento e teste, para formar um "pipeline de preparação de dados" completo:

▶ Exemplo: Pipeline de Preparação de Dados Completo para o Conjunto de Dados do Titanic (Dificuldade: ⭐⭐⭐)

PYTHON
# ============================================
# Pipeline de Preparação de Dados Completo
# Conjunto de Dados: Titanic (simulado)
# ============================================
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split

# Conjunto de dados simulado semelhante ao Titanic
np.random.seed(42)
df = pd.DataFrame({
    'pclass': np.random.choice([1, 2, 3], 100, p=[0.2, 0.3, 0.5]),
    'sex': np.random.choice(['male', 'female'], 100, p=[0.6, 0.4]),
    'age': np.where(np.random.rand(100) > 0.15,
                    np.random.randint(1, 80, 100), np.nan),
    'fare': np.round(np.random.uniform(10, 500, 100), 2),
    'survived': np.random.choice([0, 1], 100, p=[0.6, 0.4])
})

# Etapa 1: Visão geral
print("=== Etapa 1: Visão Geral dos Dados ===")
print(f"Formato: {df.shape}")
print(df.head(5))

# Etapa 2: Valores ausentes
print("\n=== Etapa 2: Valores Ausentes ===")
missing = df.isnull().sum()
missing_pct = (df.isnull().sum() / len(df) * 100).round(1)
print(pd.DataFrame({'contagem': missing, 'percentual': missing_pct}))

# Etapa 3: Distribuição do rótulo
print("\n=== Etapa 3: Distribuição do Rótulo ===")
print(df['survived'].value_counts())
print(f"Taxa de sobrevivência: {df['survived'].mean()*100:.1f}%")

# Etapa 4: Divisão treinamento/teste
train, test = train_test_split(df, test_size=0.2, random_state=42, 
                                stratify=df['survived'])
print(f"\n=== Etapa 4: Divisão dos Dados ===")
print(f"Treinamento: {len(train)} amostras, taxa de sobrevivência: {train['survived'].mean()*100:.1f}%")
print(f"Teste:       {len(test)} amostras, taxa de sobrevivência: {test['survived'].mean()*100:.1f}%")
print(f"\nA divisão estratificada garante a mesma taxa de sobrevivência em ambos os conjuntos!")
💻 Saída:

TEXT 📖 Somente leitura
=== Etapa 1: Visão Geral dos Dados ===
Formato: (100, 5)
   pclass     sex   age    fare  survived
0       3  female  47.0  339.89         1
1       3  female  63.0  361.38         0
2       1  female  44.0  309.18         0
3       3    male  28.0  385.59         0
4       1    male   8.0  477.95         0

=== Etapa 2: Valores Ausentes ===
         contagem  percentual
pclass          0         0.0
sex             0         0.0
age            14        14.0
fare            0         0.0
survived        0         0.0

=== Etapa 3: Distribuição do Rótulo ===
0    58
1    42
Name: survived, dtype: int64
Taxa de sobrevivência: 42.0%

=== Etapa 4: Divisão dos Dados ===
Treinamento: 80 amostras, taxa de sobrevivência: 42.5%
Teste:       20 amostras, taxa de sobrevivência: 40.0%

A divisão estratificada garante a mesma taxa de sobrevivência em ambos os conjuntos!

❓ Perguntas Frequentes

Q: A IA fica mais precisa conforme a quantidade de dados aumenta? R: Não necessariamente. A qualidade dos dados é mais importante do que a quantidade. 10.000 registros limpos podem superar 1 milhão de registros ruidosos no treinamento de um modelo melhor. Fatores-chave: volume de dados, qualidade, diversidade e representatividade—todos são essenciais.

Q: Por que o conjunto de treino e teste não podem se sobrepor? R: Porque o conjunto de teste é usado para avaliar a "capacidade real" do modelo. Se o modelo "viu" dados do conjunto de teste durante o treinamento, ele memorizará as respostas em vez de aprender o método—isso é chamado de vazamento de dados e levará a resultados de avaliação inflados.

Q: O que é desequilíbrio de dados? Como pode ser tratado? R: Desequilíbrio de dados refere-se a uma diferença significativa no número de amostras entre diferentes classes (por exemplo, 99% normais vs. 1% anormais). Soluções incluem: ① Coletar mais dados da classe minoritária; ② Sobreamostrar a classe minoritária (SMOTE); ③ Subamostrar a classe majoritária; ④ Ajustar os pesos das classes; ⑤ Usar F1 score em vez de acurácia para avaliação.

Q: O que é engenharia de recursos? Por que é feita? R: Engenharia de recursos é o processo de extrair ou construir novos recursos a partir de dados brutos que sejam úteis para a previsão. Por exemplo, recursos como "se é fim de semana" ou "se é noite" podem ser derivados de "hora do pedido". Uma boa engenharia de recursos pode permitir que modelos simples alcancem resultados comparáveis a modelos complexos, sendo crucial no aprendizado de máquina tradicional. O aprendizado profundo pode realizar automaticamente a extração de recursos, reduzindo a necessidade de engenharia de recursos manual.

Q: Onde posso encontrar conjuntos de dados gratuitos? R: Kaggle (kaggle.com/datasets), UCI Machine Learning Repository, Google Dataset Search, Hugging Face Datasets e plataformas de dados abertos governamentais. Este tutorial usa os conjuntos de dados incluídos com o sklearn, portanto não é necessário download adicional.

Q: O que é divisão estratificada? R: Uma divisão aleatória padrão pode resultar em um desequilíbrio nas proporções de classes entre os conjuntos de treino e teste. Uma divisão estratificada garante que as proporções de classes em cada conjunto correspondam às dos dados originais. Para conjuntos de dados desequilibrados (como 90% vs. 10%), uma divisão estratificada é praticamente essencial.


📖 Resumo


📝 Exercícios

  1. Exercício Básico (Dificuldade ⭐): Carregue um conjunto de dados CSV (ou um conjunto de dados incluído com o sklearn) usando Python, e use df.info() e df.describe() para resumir as informações básicas.
  2. Problema Avançado (Dificuldade ⭐⭐): Verifique a existência de valores ausentes e examine a distribuição das categorias nos dados, depois plote um histograma de uma coluna específica (Dica: df[column].hist()).
  3. Problema Desafiador (Dificuldade ⭐⭐⭐): Use train_test_split para dividir os dados de acordo com a regra 80/20, e compare se as proporções das categorias são as mesmas após uma divisão padrão e uma divisão estratificada.
Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%