数据预处理—4.为什么要趋近于正态分布?详解
文章目录1.为什么变量分布要呈现正态分布?2.判断数据是否服从正态分布的指标:偏态与峰度3.如何调整原始分布趋于正态分布?正态性当谈论正态性时,即数据应该看起来像正态分布。这很重要,因为几个统计检验都依赖于此(例如t统计)。单变量正态性虽然不能确保多变量正态性(这是我们想要的),但它有帮助。在大样本数据中,如果我们解决正态性,我们就避免了很多其他问题(例如异方差),所以这就是我们进行这种分析的主要
多变量分析统计基于的假设
- 正态性
当谈论正态性时,即数据应该看起来像正态分布。这很重要,因为几个统计检验都依赖于此(例如t统计)。单变量正态性虽然不能确保多变量正态性(这是我们想要的),但它有帮助。在大样本数据中,如果我们解决正态性,我们就避免了很多其他问题(例如异方差),所以这就是我们进行这种分析的主要原因。 - 同方差
同方差性是指“假设因变量在预测变量范围内的方差水平相等。同方差是可取的,因为我们希望误差项在所有自变量的值上都是相同的。 - 线性度
评估线性度最常见的方法是检查散点图并寻找线性模式。如果模式不是线性的,那么研究数据转换是值得的。 - 无相关误差。
相关错误是在一个错误与另一个错误相关联时发生的。
例如,如果一个正误差系统地产生一个负误差,则意味着这些变量之间存在关联。
这通常发生在时间序列中,其中某些模式与时间相关。
1.为什么变量分布要呈现正态分布?
我不是统计学科班,对于这些统计上的概念不是很理解。在特征工程中,我们为什么想要变量分布呈现正态分布?我觉得可以这么理解:单变量正态性虽然不能保证多变量的正态性,但是它是有帮助的。并且一般解决了正态性问题的话,就可以解决异方差或者线性度的问题。而且很多模型假设数据服从正态分布后,它的样本均值和方差就相互独立,这样就能更好的进行统计推断和假设验证。
2.判断数据是否服从正态分布的指标:偏态与峰度
这里就不详细介绍了,可参考其他博客偏态与分布。
正态分布是指多数频数集中在中央位置,两端的频数分布大致对称。偏态分布是指频数分布不对称,集中位置偏向一侧。若集中位置偏向数值小的一侧,称为正(右)偏态分布;集中位置偏向数值大的一侧,称为负(左)偏态分布。与正态分布相对而言,偏态分布有两个特点:
- 左右不对称(即所谓偏态);
- 当样本增大时,其均数趋向正态分布
df[var].kurtosis(),df[var].skew()
在pandas中有skew()方法来表示偏态,大于0右偏,小于0左偏。在pandas中使用kurtosis()方法来表示峰度,kurtosis>0,尖峰态(leptokurtic),数据集比较分散,极端数值较多。kurtosis<0,低峰态(platykurtic),数据集比较集中,两侧的数据比较少
3.如何调整原始分布趋于正态分布?
数据右偏的话可以对所有数据取对数、取平方根等,它的原理是因为这样的变换的导数是逐渐减小的,也就是说它的增速逐渐减缓,所以就可以把大的数据向左移,使数据接近正态分布。 如果左偏的话可以取相反数转化为右偏的情况。
通常来说,可以尝试一下几种方法:
如果数据高度偏态,则使用对数变换
-
对数变换 即将原始数据X的对数值作为新的分布数据:
x = np.log(x)
当原始数据中有小值及零时,
x = np.log1p(x)
如果数据轻度偏态,则使用平方根变换
- 平方根变换 即将原始数据X的平方根作为新的分布数据
x = np.sqrt(x)
如果数据的两端波动较大,则使用倒数变换
-
倒数变换 即将原始数据X的倒数作为新的分析数据
x = 1 / x
平方根反正弦变换
方差分析的一个重要前提就是数据要符合正态分布,但是如果我们分析的数据是比值的时候,因为比值一般都不符合正态分布,所以为了使数据符合方差分析的要求,我们会对百分比的平方根取反正弦变化以改善分布的正态性,获得一个比较一致的方差。
- 平方根反正弦变换 即将原始数据X的平方根反正弦值作为新的分析数据
对于双峰偏态数据,可以参考下面一篇文章。
双峰偏态数据如何转变为正态分布数据
它好像仅限双峰,我试了一下三峰
转换前
转换后
代码
dfg = QuantileTransformer(n_quantiles = 300,output_distribution='normal', random_state=0).fit_transform(df['GarageArea'].values.reshape(-1,1))
dfg = pd.Series(dfg.flatten())
# 画直方图与连续概率估计,fit参数传入norm-标准正态分布
sns.distplot(dfg, fit=norm);
fig = plt.figure()
# probplot,样本数据相对于指定的理论分布(默认为正态分布)的分位数的概率。probplot可以计算出数据的最佳拟合线。这个图是用来看线性度的
res = probplot(dfg, plot=plt)
如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论留言!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)