Преобразование Бокса-Кокса — это широко используемый метод преобразования ненормально распределенного набора данных в более нормально распределенный .
Основная идея этого метода состоит в том, чтобы найти некоторое значение λ, чтобы преобразованные данные были как можно ближе к нормальному распределению, используя следующую формулу:
- 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