Projetos
Projeto Completo · End-to-End · Desenvolvimento

LH Nautical — Como foi feito (explicado fácil)

Imagina que a LH Nautical era uma oficina mecânica desorganizada: ferramentas espalhadas, peças sem etiqueta, cada caixa numa língua diferente. Antes de "ler" o que tava acontecendo no negócio, eu precisava arrumar a oficina. Esse projeto é a história desse "antes e depois" — só que com dados.

Nível Intermediário a avançado Stack Python · Pandas · SQL · Power BI Tipo Projeto end-to-end
Visão geral

O que é isso, em uma frase?

É um projeto que pega 4 bases brutas e bagunçadas de uma rede de varejo náutico (loja física + e-commerce), arruma tudo num pipeline em 3 camadas, e em cima disso entrega: análise de vendas, segmentação de clientes, previsão de demanda e recomendação de produtos. R$ 2,61 bilhões de receita passaram por essa "esteira".

O nome técnico do método é arquitetura medallion — três camadas, como medalhas: bronze (dado cru), prata (dado limpo), ouro (dado pronto pra análise). Quem usa Databricks ou Snowflake conhece esse padrão de cor.

Por que importa? Porque qualquer análise feita em cima de dado sujo é mentira bonita. A arquitetura medallion é a forma "industrial" de garantir que toda análise parte de fonte confiável — e que, se a fonte mudar, dá pra rastrear o que foi afetado.

Passo a passo

Bronze · Prata · Ouro

1 · Bronze (dado cru, do jeito que chegou). Recebi 4 bases: vendas do e-commerce (JSON), vendas da loja física (CSV), cadastro de clientes (Excel), cadastro de produtos (CSV). Aqui não toco em nada — só salvo "como é", com timestamp e nome da origem. Se der ruim mais tarde, eu volto aqui.

import pandas as pd
from datetime import datetime

stamp = datetime.now().strftime("%Y%m%d")
pd.read_json("ecommerce_vendas.json").to_parquet(f"bronze/vendas_ecom_{stamp}.parquet")
pd.read_csv("loja_vendas.csv").to_parquet(f"bronze/vendas_loja_{stamp}.parquet")
# ... idem clientes e produtos

2 · Prata (dado limpo e padronizado). Aqui eu corrijo os 7 problemas que o cliente nem sabia que tinha: datas em formato diferente, preço armazenado como texto ("R$ 1.299,90"), e-mails inválidos, duplicatas, valores negativos onde não pode haver, encoding bagunçado, espaços invisíveis. Cada correção é uma função pequena, testável.

def normaliza_preco(s: str) -> float:
    return float(s.replace("R$", "").replace(".", "").replace(",", ".").strip())

def normaliza_email(s: str) -> str | None:
    s = s.strip().lower()
    return s if "@" in s and "." in s.split("@")[1] else None

vendas["preco"]  = vendas["preco"].apply(normaliza_preco)
vendas["data"]   = pd.to_datetime(vendas["data"], errors="coerce")
clientes["email"] = clientes["email"].apply(normaliza_email)

vendas = vendas.drop_duplicates(subset=["order_id", "produto"])
vendas = vendas[vendas["preco"] > 0]   # remove valores negativos/zero

O resultado: tabelas no padrão "1 linha = 1 fato real". Daqui pra frente, toda análise vai dar o mesmo número.

3 · Ouro (dado pronto pra negócio). A camada ouro agrupa, junta e cria views específicas pro pessoal do negócio. Tem a fato_vendas (uma linha por item de pedido), dim_cliente com o LTV calculado, dim_produto com margem por SKU. Cada dashboard puxa direto daqui — rápido, e sempre com o mesmo número.

# cria dim_cliente com LTV
dim_cliente = (
    fato_vendas.groupby("customer_id")
        .agg(
            ltv=("valor", "sum"),
            n_pedidos=("order_id", "nunique"),
            primeira_compra=("data", "min"),
            ultima_compra=("data", "max"),
        )
        .reset_index()
)
dim_cliente.to_parquet("gold/dim_cliente.parquet")

4 · Em cima do ouro, 6 frentes de entrega:

  • Vendas — KPIs, evolução mensal, alerta de produtos vendidos abaixo do custo (R$ 22 mi descobertos)
  • Clientes — Pareto, segmentação, identificação dos 49 clientes B2B críticos
  • Previsão — Média Móvel + Regressão Linear, com nota explícita sobre limitações (R² baixo)
  • Recomendação — Apriori sobre carrinhos, regras de associação por lift
  • Dashboards — Power BI consumindo a camada ouro
  • Qualidade — script de checagem diária da prata, alerta automático se algo regredir
Resultado

A "esteira" do dado

O que dá pra levar daqui

Em uma linha: o que esse projeto ensina

Que dado bom não nasce — se constrói por etapas. Pular a prata pra ir direto pro dashboard é o erro mais comum (e o mais caro): toda divergência futura vai obrigar a refazer tudo do zero. Medallion existe pra isso ser reproduzível.

Coisas técnicas que apareceram aqui: arquitetura medallion (bronze/prata/ouro), Pandas para ETL, Parquet (formato colunar), normalização de tipos, deduplicação, regras de qualidade, modelagem dimensional (fato/dimensões), LTV, Pareto, Power BI sobre camada ouro.