Pular para o conteúdo
Fynx
Business Intelligence13 min de leitura

Média móvel em DAX: o que faz e quando usar (com exemplos)

Aprenda a calcular média móvel DAX com AVERAGEX, DATESINPERIOD e DATESBETWEEN: escolha da janela, tabela de datas e o tratamento de períodos incompletos.

F
Fynx

Um número que sobe e desce todo dia não conta tendência nenhuma

Quem abre um gráfico de vendas diárias esbarra sempre no mesmo problema: a linha pula para cima e para baixo o tempo todo. Segunda vende pouco, sábado vende muito, um feriado zera tudo, uma promoção estoura o pico. No meio desse serrote, ninguém responde à pergunta que importa, que é se o negócio está subindo ou descendo. É para resolver isso que existe a média móvel, e escrever uma média móvel DAX bem feita separa um gráfico que informa de um gráfico que só assusta a diretoria.

A boa notícia é que média móvel não é bicho de sete cabeças em DAX. O padrão é quase sempre o mesmo: AVERAGEX iterando uma janela de datas gerada com DATESINPERIOD ou DATESBETWEEN. A má notícia são os detalhes que ninguém conta, a escolha da janela, a tabela de datas contínua, as lacunas e os períodos incompletos, que fazem a diferença entre uma leitura confiável e um número que engana. Neste artigo mostro o padrão, trago exemplos reais de código e aponto onde a média móvel mente se você não tomar cuidado.

A média móvel troca o ruído do dia a dia por tendência

A ideia é simples de explicar. Em vez de mostrar o valor de um único dia, você mostra a média dos últimos N dias em cada ponto do gráfico. Se hoje é dia 20, o ponto de hoje é a média dos dias 14 a 20. Amanhã, dia 21, o ponto passa a ser a média dos dias 15 a 21. A janela desliza, um dia entra e o mais antigo sai, e por isso se chama média móvel.

O efeito prático é que o ruído de curto prazo some. Um sábado excepcional deixa de ser um pico assustador e vira só mais um dia dentro de uma média de sete. O que sobra na linha é o movimento de fundo: a tendência. É isso que a média móvel faz e só isso que ela promete. Ela não prevê o futuro, não corrige dado errado e não substitui a análise. Ela suaviza a curva para você enxergar a direção sem ser enganado pela variação natural do dia a dia.

Vale reforçar uma verdade que muita gente ignora: a média móvel atrasa o sinal. Como ela olha para trás, uma queda que começou hoje só aparece com força na média de sete dias uns dias depois. É o preço da suavização, e quase sempre vale a pena pagá-lo para ler tendência.

AVERAGEX com DATESINPERIOD é o padrão de média móvel DAX que você mais vai usar

Para janelas contadas em dias, o padrão canônico usa duas funções. A DATESINPERIOD gera a tabela de datas da janela: você diz a data final, quantas unidades voltar e a unidade de tempo, e ela devolve o intervalo. A AVERAGEX itera essa tabela e calcula a média da sua medida diária avaliada em cada uma daquelas datas. Supondo uma medida [Vendas Diárias] e uma tabela de calendário chamada Calendario, a média móvel de sete dias fica assim:

Média Móvel 7 dias =
VAR DiasNaJanela = 7
VAR UltimaData = MAX( Calendario[Data] )
VAR Janela =
    DATESINPERIOD(
        Calendario[Data],
        UltimaData,
        -DiasNaJanela,
        DAY
    )
RETURN
    AVERAGEX( Janela, [Vendas Diárias] )

Leia de dentro para fora. MAX( Calendario[Data] ) pega a última data do contexto, o dia daquele ponto do gráfico. DATESINPERIOD volta sete dias a partir dele e devolve as sete datas da janela. AVERAGEX percorre essas datas, calcula [Vendas Diárias] em cada uma e tira a média. O sinal negativo em -DiasNaJanela diz para a função olhar para trás. Se fosse positivo, a janela olharia para a frente, o que raramente é o que você quer.

Um detalhe que muda resultado: AVERAGEX ignora as linhas em que a expressão retorna vazio. Se um dia da janela não tem venda e [Vendas Diárias] devolve BLANK, esse dia não entra na conta da média. Às vezes é o que você quer, às vezes não, e essa é a raiz do problema das lacunas que discuto adiante.

DATESBETWEEN entra quando a janela não fecha em dias exatos

DATESINPERIOD é ótima para janelas em dias. Só que nem toda média móvel é diária. Uma média de três meses sobre faturamento mensal pede outra abordagem, porque você não quer a média dos dias e sim a média dos meses. Aí entra a DATESBETWEEN, que recebe uma data inicial e uma data final explícitas e devolve todas as datas entre elas.

O padrão para três meses móveis fica assim, iterando sobre os meses e não sobre os dias:

Média Móvel 3 Meses =
VAR MesAtual = MAX( Calendario[Data] )
VAR Janela =
    DATESBETWEEN(
        Calendario[Data],
        STARTOFMONTH( EDATE( MesAtual, -2 ) ),
        ENDOFMONTH( MesAtual )
    )
RETURN
    CALCULATE(
        AVERAGEX( VALUES( Calendario[AnoMes] ), [Faturamento] ),
        Janela
    )

Aqui a lógica é diferente. EDATE( MesAtual, -2 ) recua dois meses, STARTOFMONTH e ENDOFMONTH garantem os três meses inteiros, do primeiro dia do mês mais antigo ao último dia do mês atual. O CALCULATE aplica essa janela como filtro e, dentro dela, AVERAGEX itera sobre os valores distintos de Calendario[AnoMes], calculando [Faturamento] de cada mês e tirando a média dos três. É uma média de três valores mensais, não de noventa valores diários, e a diferença é enorme.

A tabela abaixo resume quando pegar cada função.

CritérioDATESINPERIODDATESBETWEEN
Como você define a janelaData final + quantidade + unidadeData inicial e data final explícitas
Melhor paraJanelas em dias ou contagem fixa de unidadesJanelas de mês ou trimestre fechado
DireçãoControlada pelo sinal do númeroSempre do início ao fim informados
LegibilidadeCurta e diretaMais verbosa, porém explícita

Não existe função certa e errada aqui, existe a que descreve melhor a janela que você precisa. Para média diária, DATESINPERIOD é mais enxuta. Para janelas mensais fechadas, DATESBETWEEN deixa a intenção mais clara.

A escolha da janela decide a história que o gráfico conta

Este é o ponto que mais gera discussão em projeto, e onde a opinião do consultor pesa mais que a sintaxe. O tamanho da janela não é detalhe técnico, é decisão de negócio. Janela curta reage rápido e suaviza pouco. Janela longa suaviza muito e reage devagar. Escolher errado faz a mesma série contar histórias opostas.

A regra de ouro para dados diários é casar a janela com o ciclo do negócio. Se o faturamento tem forte efeito de dia da semana, a média móvel de sete dias é quase obrigatória, porque cada janela contém uma semana completa, com um de cada dia, e isso neutraliza o efeito de calendário de graça. Janelas que não são múltiplas do ciclo semanal deixam resíduo de sazonalidade e a linha continua ondulando sem motivo aparente.

JanelaO que ela suavizaQuando faz sentido
7 diasEfeito de dia da semanaVendas, tráfego, operações com ciclo semanal claro
30 diasRuído diário e picos pontuaisLeitura de tendência de médio prazo em séries diárias
3 mesesVariação mês a mêsFaturamento e metas com sazonalidade mensal
12 mesesToda a sazonalidade anualReceita recorrente, indicadores anuais, visão de fundo

A média móvel de doze meses merece destaque. Como cobre um ano inteiro, elimina qualquer sazonalidade anual e mostra o crescimento estrutural do negócio, sem o barulho de dezembro forte ou fevereiro fraco. É a janela que a diretoria quer ver quando pergunta se a empresa está crescendo de verdade. Já a operação que precisa reagir rápido prefere sete dias. Não há janela universal, há a que responde à pergunta de quem vai olhar o gráfico.

Sem uma tabela de datas contínua, a média móvel simplesmente não fecha

Aqui está o erro mais comum e mais silencioso. Toda função de inteligência de tempo do DAX, DATESINPERIOD e DATESBETWEEN incluídas, assume que existe uma tabela de datas dedicada, contínua e marcada como tabela de datas do modelo. Contínua significa uma linha por dia, sem buracos. Se o seu calendário pula datas, a janela da média móvel pula junto, e a média passa a ser calculada sobre menos dias do que você imagina.

O sintoma é traiçoeiro porque o número aparece, ele só está errado. Uma média de sete dias que pegou cinco datas porque faltavam dois dias no calendário devolve um valor plausível, e ninguém desconfia até conferir na mão e a conta não bater. Por isso a base é usar a data da tabela de calendário nas funções, nunca a da tabela fato, e garantir que esse calendário seja completo.

Se você ainda não tem uma tabela de datas decente, resolva isso antes de escrever qualquer média móvel. A gente trata desse alicerce no guia de boas práticas de modelagem DAX, e ele é pré-requisito para praticamente tudo que envolve tempo em Power BI. Média móvel sobre um modelo sem tabela de datas contínua é construir na areia.

Lacunas e períodos incompletos são onde a média móvel mente

Dois problemas próximos, mas diferentes, derrubam a confiança na média móvel: as lacunas de dado dentro da janela e os períodos incompletos nas pontas da série.

A lacuna acontece quando um dia da janela não tem valor. Lembra que AVERAGEX ignora linhas vazias? Sem tratamento, um domingo sem venda some da conta e a média de sete dias vira média de seis, inflando o resultado. Se o correto é tratar domingo sem venda como zero, force o zero com [Vendas Diárias] + 0 ou um COALESCE. Se é ignorar o dia mesmo, o padrão já serve. O ponto é decidir de forma consciente, não deixar o motor decidir por você.

O período incompleto é o que mais engana quem olha. No começo da série, os primeiros seis dias não têm sete dias atrás deles, então a média de sete é calculada sobre menos dias e desenha uma rampa de subida artificial que não existe no negócio. O mesmo vale para o mês corrente ainda em andamento numa média mensal. A solução honesta é só mostrar a média quando a janela está completa:

Média Móvel 7 dias (janela cheia) =
VAR DiasNaJanela = 7
VAR UltimaData = MAX( Calendario[Data] )
VAR Janela =
    DATESINPERIOD( Calendario[Data], UltimaData, -DiasNaJanela, DAY )
VAR DiasDisponiveis = COUNTROWS( Janela )
VAR Media = AVERAGEX( Janela, [Vendas Diárias] )
RETURN
    IF( DiasDisponiveis = DiasNaJanela, Media )

O truque está no COUNTROWS( Janela ), que conta quantas datas a janela realmente tem. Se forem menos que sete, você está numa ponta da série sem histórico suficiente, e o IF devolve vazio em vez de um número enganoso. O gráfico começa só a partir do primeiro ponto com janela cheia, e a rampa falsa desaparece. Uma linha a mais de código que salva a leitura inteira.

Quando a média móvel ajuda a ler tendência, e quando ela atrapalha

A média móvel é ferramenta de tendência, não de tudo. Usar no lugar errado polui o relatório. A tabela abaixo é o resumo honesto de onde ela rende e onde ela atrapalha.

CenárioMédia móvel ajuda?
Ler direção de vendas ruidosas dia a diaSim, é o caso clássico
Neutralizar efeito de dia da semanaSim, com janela de 7 ou 14 dias
Comparar crescimento estrutural ano a anoSim, com janela de 12 meses
Detectar o valor exato de um pico ou anomaliaNão, ela esconde o pico de propósito
Reagir a uma mudança no mesmo diaNão, ela atrasa o sinal
Fechar um número contábil oficial do mêsNão, use o total do período, não a média

Traduzindo em conselho de consultor: use média móvel para ver para onde a coisa vai, e use o valor bruto ou o total do período para saber exatamente quanto foi. Muitos dashboards mostram as duas linhas juntas, o valor real em tom claro ao fundo e a média móvel em destaque por cima, e assim cada linha responde à pergunta que sabe responder. Se você quer levar essa leitura para além da média simples, com sazonalidade e previsão, é assunto de analytics avançado, uma camada acima do que a média móvel entrega.

Perguntas frequentes

Qual a diferença entre média móvel e a média do período no DAX? A média do período usa uma janela fixa, por exemplo o mês inteiro, e dá um número só por período. A média móvel usa uma janela que desliza a cada ponto do gráfico, sempre olhando os últimos N dias ou meses a partir dali. A do período responde quanto foi a média daquele mês. A móvel responde como a tendência se move ao longo do tempo.

Por que minha média móvel só começa depois de alguns pontos no gráfico? Provavelmente você colocou o filtro de janela cheia, e ele está fazendo o certo. Nos primeiros dias da série não existe histórico para preencher a janela, então a medida devolve vazio de propósito para não desenhar uma rampa artificial. Se quiser algo desde o primeiro dia, remova a verificação de COUNTROWS, sabendo que os primeiros pontos serão médias parciais e não comparáveis com o resto.

Preciso mesmo de uma tabela de datas para calcular média móvel? Sim, não é opcional. DATESINPERIOD e DATESBETWEEN operam sobre a coluna de data de uma tabela de calendário contínua e marcada como tabela de datas. Sem ela, ou com uma tabela furada, as janelas não fecham e a média sai calculada sobre menos períodos do que deveria. É o primeiro item a resolver antes de qualquer fórmula de tempo.

Uso DATESINPERIOD ou DATESBETWEEN? Use DATESINPERIOD quando a janela é uma contagem a partir de uma data, tipicamente médias diárias como sete ou trinta dias, porque a sintaxe é mais curta. Use DATESBETWEEN quando precisa de uma janela de meses ou trimestres fechados, com início e fim explícitos, porque deixa a intenção mais clara e evita confusão entre média de dias e média de meses.

Como faço a média móvel tratar dias sem venda como zero? Por padrão, AVERAGEX ignora os dias em que a medida retorna vazio, o que encurta a janela. Se no seu negócio um dia sem venda vale zero, force o valor com [Vendas Diárias] + 0 ou um COALESCE( [Vendas Diárias], 0 ) dentro do AVERAGEX. Se o dia sem venda deve mesmo sair da conta, o comportamento padrão já resolve. O importante é escolher, não descobrir depois.

Média móvel serve para previsão? Não, e é bom deixar isso claro para quem pede. A média móvel descreve o passado suavizado e atrasa a reação a mudanças, então é péssima como previsão pura. Ela ajuda a enxergar tendência, um insumo para previsão, mas previsão de verdade envolve sazonalidade, ciclos e modelos estatísticos. Se a demanda é prever, o caminho é um projeto de Power BI com modelagem própria, não uma média móvel esticada além do que aguenta.

Fechando

Média móvel em DAX é um dos padrões de melhor retorno que existe: pouca fórmula, muito valor de leitura. O segredo não está na sintaxe, quase sempre AVERAGEX sobre DATESINPERIOD ou DATESBETWEEN, e sim nas decisões ao redor. Escolha a janela pelo ciclo do negócio, garanta uma tabela de datas contínua, trate as lacunas com intenção e esconda os períodos incompletos para não desenhar tendência que não existe. Faça esses quatro pontos e a sua linha passa a contar a história certa.

Se a sua equipe está afogada em gráficos que sobem e descem sem contar nada, ou se as médias móveis do relatório não batem com a planilha de conferência, quase sempre o problema está no modelo por baixo. Fale com a gente e a gente ajuda a colocar o seu Power BI em ordem, da tabela de datas à medida.

Quer aplicar isso na sua empresa?

A Fynx implementa BI, Power BI e Power Platform de ponta a ponta. Conte seu cenário e devolvemos um diagnóstico direto ao ponto.

Falar com um especialista

Vamos transformar seus dados em decisão?

Conte seu cenário. Devolvemos um diagnóstico e uma proposta com faixa de investimento em poucos dias úteis, sem folheto, direto ao ponto.