Como realizar uma transformação box-cox em python


Uma transformação box-cox é um método comumente usado para transformar um conjunto de dados distribuído não normalmente em um conjunto distribuído mais normalmente .

A ideia básica por trás deste método é encontrar um valor para λ tal que os dados transformados estejam o mais próximo possível da distribuição normal, usando a seguinte fórmula:

  • y(λ) = (y λ – 1) / λ se y ≠ 0
  • y(λ) = log(y) se y = 0

Podemos realizar uma transformação box-cox em Python usando a função scipy.stats.boxcox() .

O exemplo a seguir mostra como usar esta função na prática.

Exemplo: transformação Box-Cox em Python

Suponha que geramos um conjunto aleatório de 1.000 valores a partir de uma distribuição exponencial :

 #load necessary packages
import numpy as np 
from scipy. stats import boxcox 
import seaborn as sns 

#make this example reproducible
n.p. random . seeds (0)

#generate dataset
data = np. random . exponential (size= 1000 )

#plot the distribution of data values
sns. distplot (data, hist= False , kde= True ) 

Podemos ver que a distribuição não parece normal.

Podemos usar a função boxcox() para encontrar um valor ideal de lambda que produza uma distribuição mais normal:

 #perform Box-Cox transformation on original data
transformed_data, best_lambda = boxcox(data) 

#plot the distribution of the transformed data values
sns. distplot (transformed_data, hist= False , kde= True ) 

Transformação Box-Cox em Python

Podemos ver que os dados transformados seguem uma distribuição muito mais normal.

Também podemos encontrar o valor lambda exato usado para realizar a transformação Box-Cox:

 #display optimal lambda value
print (best_lambda)

0.2420131978174143

O lambda ideal foi encontrado em torno de 0,242 .

Assim, cada valor de dados foi transformado usando a seguinte equação:

Novo = (antigo 0,242 – 1) / 0,242

Podemos confirmar isso observando os valores dos dados originais versus os dados transformados:

 #view first five values of original dataset
data[0:5]

array([0.79587451, 1.25593076, 0.92322315, 0.78720115, 0.55104849])

#view first five values of transformed dataset
transformed_data[0:5]

array([-0.22212062, 0.23427768, -0.07911706, -0.23247555, -0.55495228])

O primeiro valor no conjunto de dados original foi 0,79587 . Então, aplicamos a seguinte fórmula para transformar esse valor:

Novo = (0,79587 0,242 – 1) / 0,242 = -0,222

Podemos confirmar que o primeiro valor no conjunto de dados transformado é de fato -0,222 .

Recursos adicionais

Como criar e interpretar um gráfico QQ em Python
Como realizar um teste de normalidade Shapiro-Wilk em Python

Add a Comment

O seu endereço de email não será publicado. Campos obrigatórios marcados com *