Come eseguire una trasformazione box-cox in python


Una trasformazione box-cox è un metodo comunemente utilizzato per trasformare un set di dati non distribuito normalmente in un set distribuito più normalmente .

L’idea alla base di questo metodo è trovare un valore per λ tale che i dati trasformati siano il più vicino possibile alla distribuzione normale, utilizzando la seguente formula:

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

Possiamo eseguire una trasformazione box-cox in Python utilizzando la funzione scipy.stats.boxcox() .

L’esempio seguente mostra come utilizzare questa funzione nella pratica.

Esempio: trasformazione di Box-Cox in Python

Supponiamo di generare un insieme casuale di 1000 valori da una distribuzione esponenziale :

 #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 ) 

Possiamo vedere che la distribuzione non sembra normale.

Possiamo usare la funzione boxcox() per trovare un valore ottimale di lambda che produca una distribuzione più normale:

 #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 ) 

Trasformazione di Box-Cox in Python

Possiamo vedere che i dati trasformati seguono una distribuzione molto più normale.

Possiamo anche trovare l’esatto valore lambda utilizzato per eseguire la trasformazione di Box-Cox:

 #display optimal lambda value
print (best_lambda)

0.2420131978174143

Il lambda ottimale è risultato essere intorno a 0,242 .

Pertanto, ciascun valore dei dati è stato trasformato utilizzando la seguente equazione:

Nuovo = (vecchio 0,242 – 1) / 0,242

Possiamo confermarlo osservando i valori dei dati originali rispetto ai dati trasformati:

 #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])

Il primo valore nel set di dati originale era 0.79587 . Quindi, abbiamo applicato la seguente formula per trasformare questo valore:

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

Possiamo confermare che il primo valore nel set di dati trasformato è effettivamente -0.222 .

Risorse addizionali

Come creare e interpretare un grafico QQ in Python
Come eseguire un test di normalità di Shapiro-Wilk in Python

Aggiungi un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *