Projetos
BanVic · Padroes Temporais (dim_dates)

Analises Temporais com uma Dimensao de Datas

O desafio pedia uma dim_dates para sustentar o Data Warehouse. Construi a dimensao de datas e respondi as perguntas de negocio sobre o tempo — com um tratamento honesto dos dados: os dias de dump artificial foram excluidos para nao distorcer os padroes.

Ano 2024 Papel Analytics Engineer Base 49.315 tx reais
Contexto

Por que uma dimensao de datas

Uma dimensao de datas (dim_dates) bem construida viabiliza analises temporais robustas sem recalcular atributos de calendario a cada consulta. Montei uma tabela com uma linha por dia, contendo trimestre, mes, dia da semana, semana do ano, se o mes tem a letra “R” no nome, se e par ou impar, e marcadores de inicio/fim de mes.

Tratamento honesto (regra de ouro): ao explorar as transacoes descobri que os dias 29 e 30/12/2022 concentram um “dump” artificial de ~20 mil registros — impossivel para um banco de ~1.000 contas, cuja media real e de ~12 transacoes/dia. Esses dias de outlier foram excluidos das analises de padrao temporal; caso contrario, Q4, dezembro e sexta-feira ficariam falsamente inflados. Restam 49.315 transacoes reais (de 71.999).

A dimensao

Como a dim_dates foi construida

No PostgreSQL, gerei o calendario com generate_series (1 linha por dia, 2010–2022) e derivei os atributos com funcoes de data nativas. As transacoes se ligam a dimensao por data_transacao::date, e as analises usam HAVING COUNT(*) <= 200 por dia para descartar o dump.

CREATE TABLE stg_banvic.dim_dates AS
SELECT data,
  EXTRACT(QUARTER FROM data)::int            AS trimestre,
  EXTRACT(MONTH   FROM data)::int            AS mes,
  EXTRACT(ISODOW  FROM data)::int            AS dia_semana_num,
  INITCAP(TO_CHAR(data,'TMDay'))             AS dia_semana_nome,
  (EXTRACT(MONTH FROM data)::int % 2 = 0)    AS mes_par,
  (EXTRACT(MONTH FROM data)::int
        IN (1,2,3,4,9,10,11,12))             AS mes_tem_r   -- janeiRo, abRil...
FROM generate_series(DATE '2010-01-01', DATE '2022-12-31', INTERVAL '1 day') AS data;
As perguntas do desafio

Respostas com a dim_dates

Resumo

Placar das hipoteses

Q4
trimestre lider (transacoes e volume)
Quinta
dia da semana de maior media
Sazonal
o efeito do “R” e calendario, nao a letra
Impares
tem volume maior (hipotese refutada)

Outras 4 analises propostas com a dim_dates: (3) dia da semana e (4) par/impar acima; (5) sazonalidade mensal e efeito de feriados; (6) comportamento de inicio vs fim de mes (salarios, contas, propostas de credito). Todas exploram a mesma dimensao para gerar valor de negocio.

Ferramentas

Stack

PostgreSQL · SQL dim_dates Python · Pandas Teste de hipotese (t-test) Limpeza de dados Matplotlib