Projeto do semestre: Data Warehouse do zero ao dashboard
O roteiro do projeto do semestre de Data Warehouse, do zero ao dashboard: dados reais do Kaggle, modelagem dimensional snowflake e star no PostgreSQL, ETL com Python e Pandas, consultas analíticas em SQL e dashboards no Power BI.
1. Visão geral
Da teoria à prática com PostgreSQL, Python e Power BI. Ao longo do semestre, vamos construir um pipeline completo de dados do zero, passando por todas as etapas que um engenheiro/analista de dados enfrenta no mercado real:
- Obtenção de dados reais do Kaggle — download e exploração de datasets reais
- Modelagem de um Data Warehouse — criação do modelo dimensional completo
- Carga e pré-processamento com Python — tratamento e transformação dos dados
- Armazenamento em PostgreSQL — implementação do banco de dados analítico
- Geração de insights com SQL — queries complexas para análise de negócio
- Visualização com Power BI — dashboards interativos e storytelling
O que você vai aprender
- Fundamentos de Data Warehouse — modelagem dimensional completa
- OLTP vs OLAP — diferenças entre sistemas transacionais e analíticos
- ETL vs ELT — abordagens de integração de dados
- Star e Snowflake — modelagem na prática com trade-offs reais
- Python e Pandas — engenharia de dados profissional
- PostgreSQL — armazenamento analítico robusto
- SQL avançado — JOINs complexos e queries analíticas
- Power BI — visualização e storytelling com dados
O que você vai precisar
| Tecnologia | Papel no projeto |
|---|---|
| Python 3 | Pandas + SQLAlchemy para ETL |
| PostgreSQL | Banco de dados analítico |
| Jupyter Notebook | Ambiente de desenvolvimento |
| Power BI Desktop | Visualização de dados |
| Kaggle API | Obtenção de datasets |
| Git | Versionamento de código |
2. Conceitos: DW, OLTP e OLAP
O que é um Data Warehouse?
Data Warehouse
Um repositório central de dados integrados, históricos e organizados para fins de análise e tomada de decisão. Diferente de bancos de dados transacionais (OLTP), o DW é otimizado para consultas analíticas complexas.
Características fundamentais:
- Orientado por assunto — organizado por temas de negócio (vendas, clientes, produtos).
- Integrado — dados de múltiplas fontes consolidados com padrão único.
- Variante no tempo — histórico preservado para análise temporal.
- Não volátil — dados não são apagados, apenas adicionados.
OLTP vs OLAP
OLTP (Online Transaction Processing) é usado em sistemas operacionais do dia a dia. Muitas transações pequenas e rápidas. Exemplos:
- Sistema de vendas
- ERP
- E-commerce
OLAP (Online Analytical Processing) é usado para análise de grandes volumes de dados históricos. Consultas complexas com agregações, filtros e comparações temporais. É aqui que o Data Warehouse vive. Exemplos de perguntas OLAP:
- Qual foi o produto mais vendido no último trimestre por região?
- Como evoluiu o ticket médio nos últimos 3 anos?
- Quais clientes têm maior risco de churn?
3. Conceitos: ETL, fato e dimensões
ETL vs ELT
Duas abordagens diferentes para integração de dados no Data Warehouse, cada uma com suas vantagens dependendo do contexto tecnológico.
| ETL (Extract, Transform, Load) | ELT (Extract, Load, Transform) |
|---|---|
| Extrai, transforma e carrega dados antes do DW | Extrai, carrega no DW e transforma lá |
| Extrai dados das fontes | Extrai e carrega primeiro no DW (dados brutos) |
| Transforma (limpa, normaliza, enriquece) antes de carregar | Transforma dentro do próprio DW usando SQL ou ferramentas como dbt |
| Carrega os dados já prontos no DW | Mais moderno, usado em ambientes cloud com grande poder computacional (BigQuery, Snowflake, Redshift) |
| Mais tradicional, usado quando o DW tem capacidade limitada |
Modelagem dimensional: tabela fato e dimensões
A tabela FATO é o coração do DW. Ela armazena os eventos do negócio (vendas, pedidos, transações) com métricas numéricas e chaves estrangeiras para as dimensões.
As tabelas DIMENSÃO descrevem o contexto desses eventos: quem comprou, quando, onde, qual produto.
Exemplo clássico de vendas:
| Tabela | Colunas |
|---|---|
| Fato_Vendas | id_venda, valor, quantidade, id_cliente, id_produto, id_tempo, id_loja |
| Dim_Cliente | id_cliente, nome, cidade, segmento |
| Dim_Produto | id_produto, nome, categoria, preço |
| Dim_Tempo | id_tempo, data, mês, trimestre, ano |
| Dim_Loja | id_loja, nome, região |
4. Star schema e snowflake schema
Modelo estrela (star schema)
No star schema, a tabela fato fica no centro conectada diretamente a todas as dimensões. As dimensões são desnormalizadas — todos os atributos em uma única tabela, mesmo com alguma redundância.
| Vantagens | Desvantagens |
|---|---|
| Queries simples com poucos JOINs | Redundância de dados |
| Melhor performance de leitura | Maior uso de espaço em disco |
| Mais fácil para ferramentas de BI |
Modelo floco de neve (snowflake schema)
No snowflake schema, as dimensões são normalizadas e se ramificam em subtabelas. Por exemplo, Dim_Produto se conecta a Dim_Categoria, que se conecta a Dim_Subcategoria.
| Vantagens | Desvantagens |
|---|---|
| Menor redundância de dados | Queries mais complexas com mais JOINs |
| Mais integridade referencial | Menor performance de leitura |
5. As etapas do projeto
| Etapa | O que é feito |
|---|---|
| 1. Obtenção da base no Kaggle | Download de dataset real via API |
| 2. Construção do DER | Diagrama Entidade-Relacionamento com fato e dimensões |
| 3. Implementação snowflake | Modelo normalizado no PostgreSQL |
| 4. Carga dos dados brutos | Python e Pandas para importação |
| 5. Pré-processamento | Normalização, padronização, nulos, one-hot encoding |
| 6. Armazenamento no DW | Inserção dos dados tratados |
| 7. Queries SQL snowflake | Insights com muitos JOINs |
| 8. Migração para star | Desnormalização das dimensões |
| 9. Queries SQL star | Mesmas queries com menos JOINs |
| 10. Dashboards Power BI | Visualização e relatórios finais |
6. Etapa 1: dados do Kaggle
O Kaggle é uma plataforma com milhares de datasets reais e gratuitos. Usaremos a API do Kaggle para baixar a base diretamente via Python.
O dataset escolhido será de um contexto de negócio real com múltiplas entidades, como vendas de e-commerce, dados hospitalares ou logística — garantindo riqueza para modelagem dimensional.
Terminal
# Instalação da API do Kaggle
pip install kaggle
# Download do dataset
kaggle datasets download -d nome-do-dataset
Python
# Descompactação
import zipfile
with zipfile.ZipFile('dataset.zip', 'r') as zip_ref:
zip_ref.extractall('data/')
7. Etapas 2 e 3: DER e PostgreSQL
Vamos modelar o Diagrama Entidade-Relacionamento identificando:
- Entidade central (fato) — a tabela que registra os eventos do negócio.
- Entidades de contexto (dimensões) — as tabelas que descrevem os atributos dos eventos.
- Relacionamentos e chaves — chaves primárias e estrangeiras que conectam as tabelas.
Em seguida, implementamos o modelo no PostgreSQL com scripts SQL completos de criação de tabelas, constraints e índices.
PostgreSQL · exemplo
CREATE TABLE dim_cliente (
id_cliente SERIAL PRIMARY KEY,
nome VARCHAR(100),
cidade VARCHAR(50),
segmento VARCHAR(30)
);
CREATE TABLE fato_vendas (
id_venda SERIAL PRIMARY KEY,
valor DECIMAL(10,2),
quantidade INTEGER,
id_cliente INTEGER REFERENCES dim_cliente(id_cliente),
id_produto INTEGER REFERENCES dim_produto(id_produto),
id_tempo INTEGER REFERENCES dim_tempo(id_tempo)
);
8. Etapas 4 e 5: Python e pré-processamento
Com Pandas, vamos realizar todas as transformações necessárias antes de carregar os dados no banco:
- Carregar CSV/JSON — importação do Kaggle
- Tratar nulos — remoção ou imputação
- Normalizar — variáveis numéricas
- One-Hot Encoding — variáveis categóricas
- Padronizar — datas e strings
Todo esse processo ocorre em memória antes de tocar o banco de dados.
Python · exemplo de pré-processamento
import pandas as pd
from sklearn.preprocessing import StandardScaler
# Carregar dados
df = pd.read_csv('vendas.csv')
# Tratar nulos
df['valor'].fillna(df['valor'].mean(), inplace=True)
# Normalização
scaler = StandardScaler()
df['valor_norm'] = scaler.fit_transform(df[['valor']])
# One-Hot Encoding
df = pd.get_dummies(df, columns=['categoria'])
9. Etapas 6 e 7: carga no DW e queries SQL
Carga no PostgreSQL
Após o pré-processamento, inserimos os dados no PostgreSQL usando SQLAlchemy ou psycopg2.
Python · carga com SQLAlchemy
from sqlalchemy import create_engine
engine = create_engine(
'postgresql://user:pass@localhost/dw'
)
df.to_sql(
'fato_vendas',
engine,
if_exists='append',
index=False
)
Queries SQL analíticas
Com o DW populado no modelo snowflake, escrevemos queries SQL para gerar insights de negócio — explorando JOINs entre fato e múltiplas dimensões normalizadas. Exemplo: ranking de produtos por receita por trimestre por região.
PostgreSQL
SELECT
p.nome_produto,
t.trimestre,
l.regiao,
SUM(f.valor) as receita_total
FROM fato_vendas f
JOIN dim_produto p ON f.id_produto = p.id_produto
JOIN dim_tempo t ON f.id_tempo = t.id_tempo
JOIN dim_loja l ON f.id_loja = l.id_loja
GROUP BY p.nome_produto, t.trimestre, l.regiao
ORDER BY receita_total DESC;
10. Etapas 8 e 9: migração para star e comparação
Desnormalizamos as tabelas dimensão, consolidando subtabelas em dimensões únicas e mais largas.
- Desnormalização — consolidamos Dim_Produto + Dim_Categoria + Dim_Subcategoria em uma única Dim_Produto expandida.
- Reescrita de queries — mesmas análises agora com menos JOINs e código SQL mais simples.
- Comparação de performance — medimos tempo de execução, complexidade e facilidade de manutenção.
Esta etapa é fundamental para entender o trade-off entre os dois modelos.
Query snowflake (5 JOINs) · trecho
SELECT p.nome, c.categoria, sc.subcategoria
FROM fato_vendas f
JOIN dim_produto p ON f.id_produto = p.id_produto
JOIN dim_categoria c ON p.id_categoria = c.id_categoria
JOIN dim_subcategoria sc ON c.id_subcat = sc.id_subcat
...
Query star (2 JOINs) · trecho
SELECT p.nome, p.categoria, p.subcategoria
FROM fato_vendas f
JOIN dim_produto p ON f.id_produto = p.id_produto
...
11. Etapa 10: Power BI
Conectamos o Power BI diretamente ao PostgreSQL e criamos visualizações profissionais para comunicar os insights:
- Dashboards com KPIs principais — métricas de negócio em destaque
- Gráficos de evolução temporal — tendências ao longo do tempo
- Rankings e comparativos — análise por dimensão
- Filtros interativos (slicers) — exploração dinâmica dos dados
12. Bora começar!
"Sem dados, você é apenas mais uma pessoa com uma opinião."
— W. Edwards Deming
Este projeto vai te transformar em alguém que trabalha com dados de verdade.
- Mãos à obra — prepare seu ambiente de desenvolvimento e vamos começar a construir!
- Aprendizado prático — cada etapa será uma experiência real de mercado.
- Portfólio profissional — ao final, você terá um projeto completo para mostrar.
Para ver na prática a construção de um DW, com star schema, camadas e consultas analíticas no PostgreSQL, faça o codelab Data Warehouse com PostgreSQL: star schema passo a passo.