Transformação Box-Cox

Em estatística, uma transformação de potência é uma família de funções que são aplicadas para criar a transformação monotônica de dados usando funções de potência. Esta é uma técnica de transformação de dados útil usada para estabilizar a variância, tornar os dados mais semelhantes à distribuição normal, melhorar a validade das medidas de associação (como a correlação de Pearson entre as variáveis) e para outros procedimentos de estabilização de dados.

Histogramas de um conjunto de dados original e sua tranformação, gráfico para escolha de lambda e probabilidade normal. Fonte: Engineering Statistics

Tanto a forma linear quanto a logarítmica são dois casos particulares de uma família mais extensa de transformações não-lineares. A transformação de potência é definida como uma função de variação contínua, em relação ao parâmetro de potência λ (lambda), ou seja, xλ. Uma classe geral de transformação que pode ser utilizada é a de Box-Cox, definida por:

\(f_\lambda(x)=\frac{x^\lambda-1}{\lambda}\) para \(\lambda\neq0\)

\(f_0(x)=log(x)\) para \(\lambda=0\)

A transformação de Box-Cox recebeu o nome dos estatísticos que a formularam, George E. P. Box y David Cox, em artigo de 1964 (“An Analysis of Transformations”). É bastante conhecida no meio econométrico e usada para enfrentar problemas de heterocedasticidade (quando o modelo de hipótese matemático apresenta variâncias para Y e X(X1, X2, X3,…, Xn) não iguais para todas as observações) e/ou falta de normalidade.

A escolha do melhor valor de lambda pode ser automatizada. Na linguagem R, sua implementação pode ser feita através do pacote “forecast”, através da função “BoxCox.lambda()”. Veja esse exemplo de uso envolvendo modelagem e previsão de série temporal usando modelo ARIMA:

No python, o pacote “scipy” possui a função “boxcox()” para transformar os dados e “inv_boxcox()” para inverter a transformação – mais informações na documentação do scipy (stats.boxcox e stats.inv_boxcox). Veja esse exemplo de uso baseado no script em R:

É indicado deixar o valor de lambda restrito entre 0 e 1 (ou 0,5 e 1,0 se os dados incluíssem valores de zero), caso contrário podem resultar em previsões muito erráticas (principalmente quando os valores de lambda estavam abaixo de 0,5).

Fontes