Transformação Box-Cox – Monolito Nimbus
12 de fevereiro de 2019 Vinicius Informática
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:
# Calcular melhor valor de lambda para a série temporal
lambda = BoxCox.lambda(serie_temporal)
# Calcular modelo ARIMA via decomposição STL e fazer previsão para os próximos 5 tempos
model = stlf(serie_temporal, lambda = lambda, h = 5, method = 'arima', s.window = 'periodic')
# Selecionar previsão
forecast = model$mean
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:
serie_temporal2, lambda_boxcox = boxcox(serie_temporal)
# Calcular modelo ARIMA
model = auto_arima(serie_temporal)
# Fazer previsão para os próximos 5 tempos
forecast = model.predict(n_periods=5)
# Inverter transformação
final_forecast = inv_boxcox(forecast[0], lambda_boxcox)
É 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).
Wikipedia – Power transform
R-bloggers – Does seasonally adjusting first help forecasting?
Machine Learning Mastery – How to Use Power Transforms for Time Series Forecast Data with Python
mode – Forecasting in Python with Prophet
Modelo ARIMA e previsão no python Modelo ARIMA e previsão no R Interpolação de dados Redes neurais de séries temporais no R