Как выполнить преобразование Бокса-Кокса в 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
np.random.seed (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 ) 

Мы видим, что преобразованные данные следуют гораздо более нормальному распределению.

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

#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