Pandas: Projeto: Análise de Dados

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

Após 22 lições de ferramentas e técnicas, é hora de juntar tudo. Esta lição simula um projeto de análise de dados do mundo real: você recebe a tarefa "Analise o comportamento de compra do usuário do Q1-Q3" e percorre o fluxo de trabalho completo desde o carregamento de CSV, exploração, limpeza, engenharia de features, agrupamento, visualização até as conclusões. Na análise de dados real, 80% do tempo vai para a limpeza e 20% para a análise, mas as conclusões dependem totalmente desses 20%.

⚠️ Nota: O código abaixo deve ser executado em um ambiente Python local.

1. O Que Você Vai Aprender


2. Contexto do Projeto: Análise do Comportamento de Compra do Usuário de E-Commerce

(1) A Tarefa

Charlie recebe uma atribuição: "Analise nosso comportamento de compra do usuário do Q1-Q3. Identifique usuários de alto valor, categorias populares e tendências de gasto, e forneça recomendações acionáveis para operações."

(2) Fluxo de Trabalho da Análise

100%
graph TB
    A["1. Carregar Dados"] --> B["2. Explorar (EDA)"]
    B --> C["3. Pipeline de Limpeza"]
    C --> D["4. Engenharia de Features"]
    D --> E["5. Agregação por Grupo"]
    E --> F["6. Relatório de Visualização"]
    F --> G["7. Conclusões & Recomendações"]
TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado. Por favor, instale localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

3. Carregamento e Exploração de Dados

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado. Por favor, instale localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: Carregamento de Dados e EDA (Dificuldade ⭐⭐)

PYTHON
import pandas as pd
import numpy as np

# ============================================
# Passo 1-2: Carregar e Explorar
# ============================================

# Simular dados de e-commerce (em projeto real: pd.read_csv)
np.random.seed(42)
n = 2000
users = pd.DataFrame({
    'user_id': range(1, n + 1),
    'name': [f'User_{i:04d}' for i in range(1, n + 1)],
    'age': np.random.randint(18, 70, n),
    'gender': np.random.choice(['M', 'F'], n),
    'city': np.random.choice(['NYC', 'LA', 'Chicago', 'Houston', 'Phoenix'], n),
    'join_date': pd.to_datetime(np.random.choice(
        pd.date_range('2023-01-01', '2024-09-30'), n
    ))
})

orders = pd.DataFrame({
    'order_id': [f'O{i:06d}' for i in range(1, 5001)],
    'user_id': np.random.randint(1, n + 1, 5000),
    'product_id': np.random.randint(1, 51, 5000),
    'category': np.random.choice(['Electronics', 'Clothing', 'Home', 'Sports', 'Books'], 5000),
    'amount': np.round(np.random.exponential(100, 5000), 2),
    'quantity': np.random.randint(1, 5, 5000),
    'order_date': pd.to_datetime(np.random.choice(
        pd.date_range('2024-01-01', '2024-09-30'), 5000
    ))
})

# Injetar problemas de qualidade dos dados
orders.loc[np.random.choice(5000, 200, replace=False), 'amount'] = np.nan
orders.loc[np.random.choice(5000, 100, replace=False), 'category'] = np.nan
duplicates = orders.sample(50)
orders = pd.concat([orders, duplicates], ignore_index=True)

# EDA: forma, dtypes, missing, duplicatas
print(f"Usuários: {users.shape}, Pedidos: {orders.shape}")
print(f"\nValores faltantes por coluna:\n{orders.isnull().sum()}")
print(f"\nPedidos duplicados: {orders.duplicated(subset='order_id').sum()}")
print(f"\nIntervalo de datas: de {orders['order_date'].min()} a {orders['order_date'].max()}")
print(f"\nEstatísticas do amount:\n{orders['amount'].describe()}")
TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado. Por favor, instale localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

4. Pipeline de Limpeza

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado. Por favor, instale localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: Pipeline de Limpeza com pipe (Dificuldade ⭐⭐⭐)

PYTHON
# ============================================
# Passo 3: Pipeline de Limpeza (pipe)
# ============================================

def remove_duplicates(df):
    """Remove pedidos duplicados, mantém o mais recente"""
    before = len(df)
    df = df.drop_duplicates(subset='order_id', keep='last')
    print(f"  Duplicatas removidas: {before - len(df)}")
    return df

def fill_missing(df):
    """Preenche valores faltantes com estratégias apropriadas"""
    df = df.copy()
    # Preencher amount com mediana por categoria
    df['amount'] = df.groupby('category')['amount'].transform(
        lambda x: x.fillna(x.median())
    )
    # Preencher category com moda
    df['category'] = df.fillna({'category': df['category'].mode()[0]})
    return df

def fix_types(df):
    """Corrige tipos de dados"""
    df = df.copy()
    df['order_date'] = pd.to_datetime(df['order_date'])
    df['category'] = df['category'].astype('category')
    return df

def add_derived(df):
    """Adiciona colunas derivadas"""
    df = df.copy()
    df['total_price'] = df['amount'] * df['quantity']
    df['month'] = df['order_date'].dt.to_period('M')
    return df

# Executar pipeline
clean_orders = (orders
    .pipe(remove_duplicates)
    .pipe(fill_missing)
    .pipe(fix_types)
    .pipe(add_derived)
)
print(f"\nPedidos limpos: {clean_orders.shape}")
print(f"Faltantes restantes: {clean_orders.isnull().sum().sum()}")
TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado. Por favor, instale localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

5. Engenharia de Features e Agregação

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado. Por favor, instale localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: Features RFM + Análise de Grupo (Dificuldade ⭐⭐⭐)

PYTHON
# ============================================
# Passo 4-5: Engenharia de Features + Agregação
# ============================================

# Análise RFM (Recência, Frequência, Monetário)
reference_date = clean_orders['order_date'].max() + pd.Timedelta(days=1)

rfm = clean_orders.groupby('user_id').agg(
    recency=('order_date', lambda x: (reference_date - x.max()).days),
    frequency=('order_id', 'count'),
    monetary=('total_price', 'sum')
).reset_index()

# Scoring RFM (baseado em quartis)
rfm['R_score'] = pd.qcut(rfm['recency'], 4, labels=[4, 3, 2, 1]).astype(int)
rfm['F_score'] = pd.qcut(rfm['frequency'].rank(method='first'), 4, labels=[1, 2, 3, 4]).astype(int)
rfm['M_score'] = pd.qcut(rfm['monetary'].rank(method='first'), 4, labels=[1, 2, 3, 4]).astype(int)
rfm['RFM_score'] = rfm['R_score'] + rfm['F_score'] + rfm['M_score']

# Segmentar usuários
rfm['segment'] = pd.cut(rfm['RFM_score'], bins=[0, 5, 8, 10, 12],
                         labels=['Em Risco', 'Médio', 'Bom', 'Campeões'])

print("=== Segmentos de Usuários ===")
print(rfm['segment'].value_counts())

# Tendência de receita mensal
monthly_rev = clean_orders.groupby('month')['total_price'].sum()
print(f"\n=== Receita Mensal ===\n{monthly_rev}")

# Análise por categoria
cat_stats = clean_orders.groupby('category').agg(
    orders=('order_id', 'count'),
    revenue=('total_price', 'sum'),
    avg_amount=('amount', 'mean')
).sort_values('revenue', ascending=False)
print(f"\n=== Estatísticas por Categoria ===\n{cat_stats}")
TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado. Por favor, instale localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

6. Relatório de Visualização e Conclusões

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado. Por favor, instale localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: Relatório de Visualização (Dificuldade ⭐⭐⭐)

PYTHON
# ============================================
# Passo 6-7: Visualização & Conclusões
# ============================================

import matplotlib.pyplot as plt

# Relatório resumido (sem gráficos reais — código para execução local)
print("=" * 50)
print("  RELATÓRIO DE ANÁLISE DE COMPORTAMENTO DE USUÁRIO DE E-COMMERCE")
print("=" * 50)

print(f"\n📊 Visão Geral do Dataset:")
print(f"  Usuários: {len(users):,}")
print(f"  Pedidos: {len(clean_orders):,}")
print(f"  Período: de {clean_orders['order_date'].min().date()} a {clean_orders['order_date'].max().date()}")

print(f"\n🏆 Top Categorias:")
for i, row in cat_stats.head(3).iterrows():
    print(f"  {i}: ${row['revenue']:,.0f} ({row['orders']} pedidos)")

print(f"\n👤 Segmentos de Usuários:")
for seg, count in rfm['segment'].value_counts().items():
    pct = count / len(rfm) * 100
    print(f"  {seg}: {count} ({pct:.1f}%)")

print(f"\n📈 Tendência Mensal:")
monthly_growth = monthly_rev.pct_change().dropna() * 100
print(f"  Crescimento mensal médio: {monthly_growth.mean():.1f}%")
print(f"  Mês de pico: {monthly_rev.idxmax()}")
print(f"  Mês mais baixo: {monthly_rev.idxmin()}")

print(f"\n💡 Recomendações:")
print(f"  1. Segmento Campeões ({(rfm['segment']=='Campeões').sum()} usuários) → Programa VIP")
print(f"  2. Segmento Em Risco ({(rfm['segment']=='Em Risco').sum()} usuários) → Campanha de reconquista")
print(f"  3. Eletrônicos é a categoria principal → expandir seleção")
print(f"  4. Focar em usuários com alto F_score para venda cruzada")
TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado. Por favor, instale localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

7. Validação de Dados e Relatório de Qualidade

▶ Exemplo

TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado. Por favor, instale localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

: Validação de Dados e Relatório de Qualidade (Dificuldade ⭐⭐)

PYTHON
# ============================================
# Passo: Validação de Dados & Relatório de Qualidade
# Calcular taxa de faltantes / taxa de duplicatas /
# taxa de outliers, gerar relatório de qualidade
# ============================================

# 1. Análise de taxa de faltantes
missing_count = orders.isnull().sum()
missing_rate = (missing_count / len(orders) * 100).round(2)
print("=== Relatório de Taxa de Faltantes ===")
for col in missing_count[missing_count > 0].index:
    print(f"  {col}: {missing_count[col]} linhas faltando ({missing_rate[col]}%)")

# 2. Análise de taxa de duplicatas
dup_count = orders.duplicated(subset='order_id').sum()
dup_rate = dup_count / len(orders) * 100
print(f"\n=== Relatório de Taxa de Duplicatas ===")
print(f"  Pedidos duplicados: {dup_count} ({dup_rate:.2f}%)")

# 3. Detecção de outliers (amount muito alto ou muito baixo)
q1 = orders['amount'].quantile(0.25)
q3 = orders['amount'].quantile(0.75)
iqr = q3 - q1
lower_bound = q1 - 1.5 * iqr
upper_bound = q3 + 1.5 * iqr
outliers = orders[(orders['amount'] < lower_bound) | (orders['amount'] > upper_bound)]
outlier_rate = len(outliers) / len(orders) * 100
print(f"\n=== Relatório de Outliers ===")
print(f"  Outliers de amount: {len(outliers)} linhas ({outlier_rate:.2f}%)")
print(f"  Faixa normal: ${lower_bound:.2f} ~ ${upper_bound:.2f}")

# 4. Pontuação geral de qualidade dos dados
quality_score = 100 - (missing_rate.sum() + dup_rate + outlier_rate) / 3
print(f"\n=== Pontuação de Qualidade dos Dados: {quality_score:.1f}/100 ===")
print(f"  {'✅ Boa qualidade' if quality_score > 90 else '⚠️ Necessita atenção'}")
TEXT 📖 Somente leitura
> **Saída:** Execute em um ambiente Python local (pandas 2.x). O servidor Piston não tem pandas pré-instalado. Por favor, instale localmente (`pip install pandas`) e acompanhe. Os valores reais podem variar ligeiramente dependendo da versão do pandas.

❓ Perguntas Frequentes

Q: Onde devo começar a análise? R: Comece com EDA (Análise Exploratória de Dados). Após o carregamento, verifique shape/dtypes/faltantes/descrição primeiro para construir intuição sobre os dados. Não pule direto para modelagem ou gráficos. 80% dos problemas de análise podem ser capturados durante a EDA (valores faltantes, outliers, tipos errados). Uma boa EDA determina a qualidade da sua análise.

Q: Quão limpo é limpo o suficiente? R: Limpe até que os dados "não afetem mais suas conclusões". Campos críticos (IDs, amounts, datas) devem estar impecáveis; campos secundários podem tolerar pequenas faltas. Regra prática: 0% de faltantes em colunas principais, menos de 5% em colunas não principais. Limpeza não é sobre perfeição; é sobre eliminar ruído.

Q: O que envolve a engenharia de features? R: Derivar colunas úteis dos dados brutos para análise. Exemplos comuns: features temporais (mês/trimestre/dia da semana), features agregadas (RFM), features de razão (margem de lucro) e features categóricas (faixa de preço). Engenharia de features é "criar informação a partir do conhecimento de negócios" -- boas features são mais valiosas que modelos complexos.

Q: Como valido os resultados da análise? R: Validação em três passos: (1) Consistência numérica (receita total = soma das categorias = soma dos meses); (2) Plausibilidade lógica (o crescimento mensal não deve exceder 200%, a menos que haja promoção); (3) Validação cruzada (calcule a mesma métrica com métodos diferentes e confirme que concordam). Se qualquer passo falhar, rastreie.

Q: Como devo estruturar o relatório? R: Estrutura: conclusão primeiro, depois dados de suporte, depois recomendações. Formato: resumo executivo (um parágrafo), achados principais (3-5 pontos com dados), análise detalhada (gráficos + interpretação), recomendações (acionáveis). Evite "despejo de dados" -- cada gráfico deve ter uma mensagem, e cada mensagem deve ser sustentada por dados.

Q: O que é RFM? R: Recência (dias desde a última compra), Frequência (número de compras), Monetário (gasto total) -- três dimensões para medir o valor do usuário. R baixo + F alto + M alto = Campeões (mais valiosos); R alto + F baixo + M baixo = Em Risco (prestes a cancelar). RFM é o método mais clássico e prático de segmentação de usuários.

Q: Quais são os benefícios do pipe? R: O pipe transforma uma limpeza de múltiplos passos em um pipeline legível de cima para baixo, onde cada função tem uma única responsabilidade, é testável e reutilizável. É mais claro que chamadas aninhadas como f3(f2(f1(df))) ou reatribuições repetidas como df = df.... Quanto mais passos de limpeza você tiver, mais o pipe brilha.


📖 Resumo


📝 Exercícios

  1. Básico (Dificuldade ⭐): Carregue os dados de e-commerce simulados, complete a EDA (shape/faltantes/descrição) e anote 3 achados sobre a qualidade dos dados.
  2. Intermediário (Dificuldade ⭐⭐): Construa um pipeline de limpeza com 3 passos usando pipe (deduplicar, preencher, corrigir tipos), e então verifique que faltantes = 0 e duplicatas = 0 após a limpeza.
  3. Desafio (Dificuldade ⭐⭐⭐): Complete uma análise de ponta a ponta completa: carregar, limpeza com pipe, features RFM, classificação de segmentos, agregação mensal/por categoria, e produza um relatório de conclusões e recomendações.

← Anterior: Estilizando Saída · Próximo: Projeto - Séries Temporais →

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%