Python 如何规范化非正态分布?

Python 如何规范化非正态分布?,python,graph,normalization,normal-distribution,Python,Graph,Normalization,Normal Distribution,我的上述分布的平均值为-0.02,标准偏差为0.09,样本量为13905 我只是不知道为什么在大样本的情况下,分布是左偏的。从bin[-2.0到-0.5],该bin中只有10个样本计数/异常值,这解释了形状 我只是想知道是否有可能正常化,使其更平滑和'正态'分布。目的是将其输入到模型中,同时减少预测值的标准误差。这里有两个选项。您可以使用Box-Cox变换或Yeo-Johnson变换。Box-Cox变换的问题在于它只适用于正数。要使用Box-Cox变换,您必须取一个指数,执行Box-Cox变换,

我的上述分布的平均值为
-0.02
,标准偏差为
0.09
,样本量为
13905

我只是不知道为什么在大样本的情况下,分布是左偏的。从bin[-2.0到-0.5],该bin中只有10个样本计数/异常值,这解释了形状


我只是想知道是否有可能正常化,使其更平滑和'正态'分布。目的是将其输入到模型中,同时减少预测值的标准误差。

这里有两个选项。您可以使用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)
测试返回两个值
k2
p
。这里我们感兴趣的是
p
的值。 如果
p
大于某个阈值(ex
0.001
左右),我们可以说拒绝
数据
来自正态分布的假设

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