Jak wykonać transformację boxa-coxa w pythonie


Transformacja Boxa-Coxa jest powszechnie stosowaną metodą przekształcania zbioru danych o rozkładzie normalnym w zbiór o bardziej normalnym rozkładzie.

Podstawową ideą tej metody jest znalezienie takiej wartości λ, aby przekształcone dane były jak najbardziej zbliżone do rozkładu normalnego, korzystając ze wzoru:

  • y(λ) = (y λ – 1) / λ jeśli y ≠ 0
  • y(λ) = log(y), jeśli y = 0

Transformację box-cox możemy wykonać w Pythonie za pomocą funkcji scipy.stats.boxcox() .

Poniższy przykład pokazuje, jak w praktyce wykorzystać tę funkcję.

Przykład: transformacja Boxa-Coxa w Pythonie

Załóżmy, że generujemy losowy zbiór 1000 wartości z rozkładu wykładniczego :

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

Widzimy, że rozkład nie wydaje się normalny.

Możemy użyć funkcji boxcox() , aby znaleźć optymalną wartość lambda, która daje bardziej normalny rozkład:

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

Transformacja Boxa-Coxa w Pythonie

Widzimy, że przekształcone dane mają znacznie bardziej normalny rozkład.

Możemy również znaleźć dokładną wartość lambda użytą do wykonania transformacji Boxa-Coxa:

 #display optimal lambda value
print (best_lambda)

0.2420131978174143

Stwierdzono, że optymalna lambda wynosi około 0,242 .

Zatem każdą wartość danych przekształcono przy użyciu następującego równania:

Nowy = (stary 0,242 – 1) / 0,242

Możemy to potwierdzić, patrząc na wartości danych oryginalnych w porównaniu z danymi przekształconymi:

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

Pierwsza wartość w oryginalnym zbiorze danych wynosiła 0,79587 . Zastosowaliśmy więc następujący wzór do przekształcenia tej wartości:

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

Możemy potwierdzić, że pierwsza wartość w przekształconym zbiorze danych rzeczywiście wynosi -0,222 .

Dodatkowe zasoby

Jak utworzyć i zinterpretować wykres QQ w Pythonie
Jak wykonać test normalności Shapiro-Wilka w Pythonie

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *