Hoe u een box-cox-transformatie uitvoert in python


Een box-cox-transformatie is een veelgebruikte methode voor het transformeren van een niet-normaal verdeelde dataset naar een meernormaal verdeelde set.

Het basisidee achter deze methode is om een waarde voor λ te vinden zodat de getransformeerde gegevens zo dicht mogelijk bij de normale verdeling liggen, met behulp van de volgende formule:

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

We kunnen een box-cox-transformatie uitvoeren in Python met behulp van de functie scipy.stats.boxcox() .

Het volgende voorbeeld laat zien hoe u deze functie in de praktijk kunt gebruiken.

Voorbeeld: Box-Cox-transformatie in Python

Stel dat we een willekeurige set van 1000 waarden genereren uit een exponentiële verdeling :

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

We kunnen zien dat de verdeling niet normaal lijkt.

We kunnen de functie boxcox() gebruiken om een optimale waarde van lambda te vinden die een meer normale verdeling oplevert:

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

Box-Cox-transformatie in Python

We kunnen zien dat de getransformeerde gegevens een veel normalere verdeling volgen.

We kunnen ook de exacte lambdawaarde vinden die is gebruikt om de Box-Cox-transformatie uit te voeren:

 #display optimal lambda value
print (best_lambda)

0.2420131978174143

De optimale lambda bleek rond de 0,242 te liggen.

Elke gegevenswaarde werd dus getransformeerd met behulp van de volgende vergelijking:

Nieuw = (oud 0,242 – 1) / 0,242

We kunnen dit bevestigen door te kijken naar de waarden van de originele gegevens versus de getransformeerde gegevens:

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

De eerste waarde in de oorspronkelijke gegevensset was 0.79587 . Daarom hebben we de volgende formule toegepast om deze waarde te transformeren:

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

We kunnen bevestigen dat de eerste waarde in de getransformeerde dataset inderdaad -0,222 is.

Aanvullende bronnen

Hoe u een QQ-plot in Python maakt en interpreteert
Hoe u een Shapiro-Wilk-normaliteitstest uitvoert in Python

Einen Kommentar hinzufügen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert