Skip to main content
06 May 2019
Follow Us

Calcular e analisar taxas de crescimento com a linguagem DAX

A taxa de crescimento do volume de negócios é um dos indicadores mais importantes para a maioria das empresas. No entanto, em muitas, parece existir uma certa dificuldade em definir e calcular essa taxa, seja porque estão em setores de atividade expostos a altos e baixos que a fazem oscilar com muita volatilidade, seja porque se reportam a períodos temporais ainda a decorrer e que, por conseguinte, não fornecem a base completa para o cálculo. Neste artigo, vamos ver como usar a linguagem DAX e efetuar o cálculo com referência aos últimos doze meses como uma alternativa melhor.

O nosso simples modelo de dados considera as vendas no período entre janeiro de 2016 e o dia 6 de maio de 2019.

Calcular a taxa de crescimento com DAX

Uma primeira abordagem ao cálculo poderia ser a seguinte:

Taxa de crescimento =
VAR VendasAnoAnterior =
CALCULATE ( SUM ( Vendas[Vendas] ); SAMEPERIODLASTYEAR ( 'Calendário'[Date] ) )
RETURN
IF (
VendasAnoAnterior && SUM ( Vendas[Vendas] );
DIVIDE ( SUM ( Vendas[Vendas] ); VendasAnoAnterior ) - 1
)

Nesta expressão, a taxa de crescimento calcula-se dividindo as vendas do período corrente, definido em contexto de filtro, pelas vendas do período homólogo. A este rácio subtrai-se um.

Note-se que o contexto de filtro é essencial à determinação do valor correto. Num modelo de dados

A expressão recorre à variável VendasAnoAnterior definida à cabeça e posteriormente reutilizada no teste lógico que se segue a RETURN, assim como no denominador da função DIVIDE. A utilização da variável é interessante pois simplifica a redação e posterior leitura da expressão.

O teste lógico valida a existência simultânea de vendas no numerador e no denominador do rácio. Note-se que sem este teste lógico, a expressão resultaria em taxas de crescimento de -100% e 100% para os períodos em que, respetivamente, não ocorreram ainda vendas (ou seja, posteriores a 6 de maio de 2019) e no primeiro ano em análise (ou seja, em 2016).

Portanto, sem este teste lógico teríamos visualizações pouco apelativas com gráficos de colunas a apontar para valores extremamente negativos ou positivos.

No nosso exemplo, o resultado seria o seguinte:

dax1Como vemos, é difícil analisar a taxa de crescimento das vendas desta empresa. Apesar de tecnicamente correta, a expressão acima apresenta taxas de crescimento com fortes oscilações, o que de resto é normal em diversos setores de atividade.

Assim, para evitar fenómenos de bipolaridade nos gestores desta empresa, é possível optar por uma solução alternativas que suaviza o ruído de curto prazo na evolução das vendas e é igualmente válida.

TTM - Trailing twelve months

Em primeiro lugar, é necessário compreender o conceito de TTM – Trailing twelve months. Este indicador soma as vendas (ou outra medida de agregação) dos últimos doze meses e é uma medida deslizante que incorpora um ano inteiro eliminando quaisquer altos e baixos ou efeitos de sazonalidade nas vendas.

Para calcular as vendas TTM recorrendo à DAX, teríamos:

Vendas TTM = 
IF (
SUM ( Vendas[Vendas] )
&& CALCULATE ( SUM ( Vendas[Vendas] ); SAMEPERIODLASTYEAR ( 'Calendário'[Date] ) );
CALCULATE (
SUM ( Vendas[Vendas] );
DATESINPERIOD ( 'Calendário'[Date]; MAX ( 'Calendário'[Date] ); -12; MONTH )
)
)

Assim, recorremos mais uma vez a um teste lógico que valida a existência de vendas no período corrente e no período anterior. No entanto, desta vez o cálculo das vendas é “embrulhado” numa função CALCULATE que efetua a soma das vendas no contexto da tabela devolvida pela função DATESINPERIOD.

Esta função, por sua vez baseia-se num ponto de referência, dado pela data mais recente (a máxima) do contexto de filtro em causa. Por isso, o segundo argumento da DATESINPERIOD é precisamente MAX(‘Calendário’[Date]). No terceiro argumento, -12 significa que pretendemos deslocar 12 períodos para trás e no último argumento indicamos que se trata de meses. Traduzida para português, esta expressão soma as vendas dos últimos doze meses.

As vendas TTM são o numerador no cálculo da taxa de crescimento das vendas. O denominador poderia ser expresso da seguinte forma:

Vendas TTM ano anterior =
CALCULATE ( Vendas[Vendas TTM]; SAMEPERIODLASTYEAR ( 'Calendário'[Date] ) )

A expressão anterior é agora o primeiro da CALCULATE que utilizamos nesta expressão. A SAMEPERIODLASTYEAR devolve uma tabela com o período homólogo. 

TTM vs TTM ano anterior

Portanto, para calcular a taxa de crescimento das vendas dos últimos doze meses em relação as vendas do ano anterior, podemos combinar as duas expressões anteriores com uma função DIVIDE da seguinte forma:

Taxa de crescimento TTM = 
IF (
Vendas[Vendas TTM] && Vendas[Vendas TTM ano anterior];
DIVIDE ( Vendas[Vendas TTM]; Vendas[Vendas TTM ano anterior] ) - 1
)

Mais uma vez, recorremos a um teste lógico que valida a existência de vendas TTM no ano corrente e no ano anterior para evitar que sejam calculadas taxas de crescimento para períodos em que não existem pelo menos doze meses de histórico de vendas no denominador nem em períodos que ainda não ocorreram.

Claramente, os resultados parecem agora bastante mais estáveis do que os obtidos com a medida de crescimento anterior:


dax2

Ainda não chegamos ao resultado correto…

Estes resultados são mais fiáveis enquanto forma de eliminar a sazonalidade e o ruído de curto prazo nas vendas. No entanto, como o período de 2019 ainda se encontra a decorrer, não temos base de cálculo para todo o ano. Em boa verdade, o mesmo se poderia apontar ao mês de maio de 2019, que contém apenas 6 dias. Por isso, as taxas de crescimento TTM para estes períodos estão erradas.

Recorde-se que no cálculo dos valores TTM, a função DATESINPERIOD apoiou-se numa data de referência cujo valor é a data máxima de cada período. Ora, esta data não tem em conta se o período em questão está a decorrer ou se já se encontra fechado.

Assim, seria razoável criar-se um teste lógico que averiguasse se, estando um determinado período aberto ou fechado, a data de referência da DATESINPERIOD fosse respetivamente a data da última venda (6 de maio de 2019) ou a data final do período em causa.

Para facilitar a análise e para assegurar que definimos uma expressão que funcione em qualquer contexto de data, vamos criar uma medida intermédia para definir precisamente essa data de referência:

Data de referência =
VAR DataMax =
CALCULATE ( MAX ( 'Vendas'[Data] ); ALL ( 'Calendário' ) )
RETURN
IF ( MAX ( 'Calendário'[Date] ) < DataMax; MAX ( 'Calendário'[Date] ); DataMax )

Como vemos, o teste lógico desta expressão é bastante simples: se a última data do período corrente for inferior à data máxima das vendas (6 de maio de 2019), então é porque o período está fechado e a data de referência deverá ser exatamente a última data do período corrente. Caso contrário, o período está aberto e a data de referência será a data máxima com vendas:

dax3
Repare-se que o dia 6 de maio de 2019 figura para os períodos 2019 (ano) e para o mês de maio desse ano, porque ainda estão a decorrer. Para todos os outros períodos, a data de referência corresponde ao último dia do período em questão.

Armados com esta medida intermédia, poderíamos corrigir as datas de referência da função DATESINPERIOD anteriormente calculada na expressão Vendas TTM e obter os seguintes resultados:

dax4
Claramente, a taxa de crescimento das vendas em 2019 não é afinal de -55,3%, como apresentado anteriormente, mas sim de 11,3%! Um resultado significativamente melhor.


Assine a nossa newsletter e receba o nosso conteúdo diretamente no seu email