如何规范非正态分布?

时间:2018-12-05 03:36:21

标签: python graph normalization normal-distribution

n a

我具有上述分布,平均值为-0.02,标准偏差为0.09,样本大小为13905

我不确定在样本量大的情况下为什么分布偏左。从容器[-2.0到-0.5],该容器中只有10个样本计数/异常值,这说明了形状。

我只是想知道是否有可能进行标准化以使其更加平滑和“正常”分布。目的是将其输入模型,同时减少预测变量的标准误差。

1 个答案:

答案 0 :(得分:1)

您在这里有两个选择。您可以使用Box-Cox变换或Yeo-Johnson变换。 Box-Cox变换的问题在于它仅适用于正数。要使用Box-Cox变换,您必须进行指数运算,执行Box-Cox变换,然后获取对数以获取原始比例的数据。 Box-Cox转换在scipy.stats

中可用

您可以避免这些步骤,而只需使用Yeo-Johnson变换。 sklearn为此提供了一个API

from matplotlib import pyplot as plt
from scipy.stats import normaltest
import numpy as np
from sklearn.preprocessing import PowerTransformer

data=np.array([-0.35714286,-0.28571429,-0.00257143,-0.00271429,-0.00142857,0.,0.,0.,0.00142857,0.00285714,0.00714286,0.00714286,0.01,0.01428571,0.01428571,0.01428571,0.01428571,0.01428571,0.01428571,0.02142857,0.07142857])

pt = PowerTransformer(method='yeo-johnson')
data = data.reshape(-1, 1)
pt.fit(data)
transformed_data = pt.transform(data)

我们已经转换了数据,但是我们需要一种方法来衡量并查看我们是否朝着正确的方向发展。由于我们的目标是朝着正态分布迈进,因此我们将使用正态性检验。

k2, p = normaltest(data)
transformed_k2, transformed_p = normaltest(transformed_data)

测试返回两个值k2pp的值在这里与我们有关。 如果p大于某个阈值(例如0.001左右),我们可以说拒绝data来自正态分布的假设。

在上面的示例中,您将看到p大于0.001,而transformed_p小于此阈值表明我们正在朝着正确的方向前进。