Як виконати перетворення бокса-кокса в python


Перетворення боксу-Кокса є широко використовуваним методом для перетворення ненормально розподіленого набору даних у більш нормально розподілений набір.

Основна ідея цього методу полягає в тому, щоб знайти таке значення для λ, щоб перетворені дані були якнайближчими до нормального розподілу, використовуючи таку формулу:

  • y(λ) = (y λ – 1) / λ, якщо y ≠ 0
  • y(λ) = log(y), якщо y = 0

Ми можемо виконати перетворення box-cox у Python за допомогою функції scipy.stats.boxcox() .

У наступному прикладі показано, як використовувати цю функцію на практиці.

Приклад: перетворення Бокса-Кокса в Python

Припустимо, ми генеруємо випадковий набір із 1000 значень з експоненціального розподілу :

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

Ми бачимо, що розподіл не здається нормальним.

Ми можемо використати функцію boxcox() , щоб знайти оптимальне значення лямбда, яке дає більш нормальний розподіл:

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

Перетворення Бокса-Кокса в Python

Ми бачимо, що перетворені дані мають набагато більш нормальний розподіл.

Ми також можемо знайти точне значення лямбда, яке використовується для виконання перетворення Бокса-Кокса:

 #display optimal lambda value
print (best_lambda)

0.2420131978174143

Виявлено, що оптимальна лямбда становить близько 0,242 .

Таким чином, кожне значення даних було перетворено за допомогою наступного рівняння:

Новий = (старий 0,242 – 1) / 0,242

Ми можемо підтвердити це, подивившись значення вихідних даних у порівнянні з перетвореними даними:

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

Перше значення в оригінальному наборі даних було 0,79587 . Отже, ми застосували наступну формулу для перетворення цього значення:

Нове = (0,79587 0,242 – 1) / 0,242 = -0,222

Ми можемо підтвердити, що перше значення в перетвореному наборі даних справді дорівнює -0,222 .

Додаткові ресурси

Як створити та інтерпретувати графік QQ у Python
Як виконати тест нормальності Шапіро-Вілка в Python

Додати коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *