Как выполнить преобразование бокса-кокса в 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *