数据预处理——样本分布(正态分布、偏态分布)

本文探讨了数据偏态分布的概念,解释了为何在构建模型时倾向于将数据转换为正态分布,以及如何通过Q-Q图进行正态性检验。同时介绍了数据转换方法如对数、平方根变换及Box-Cox变换,以实现数据分布的正态化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:
https://blog.csdn.net/lanchunhui/article/details/53239441
https://www.cnblogs.com/gczr/p/6802998.html

一、何为数据的偏态分布?

频数分布有正态分布和偏态分布之分。正态分布是指多数频数集中在中央位置,两端的频数分布大致对称。

偏态分布是指频数分布不对称,集中位置偏向一侧。若集中位置偏向数值小的一侧,称为正偏态分布;集中位置偏向数值大的一侧,称为负偏态分布。

如果频数分布的高峰向左偏移,长尾向右侧延伸称为正偏态分布,也称右偏态分布;同样的,如果频数分布的高峰向右偏移,长尾向左延伸则成为负偏态分布,也称左偏态分布。

峰左移,右偏,正偏 偏度大于0

峰右移,左偏,负偏 偏度小于0
在这里插入图片描述
在这里插入图片描述

二、构建模型时为什么要尽量将偏态数据转换为正态分布数据?

数据整体服从正态分布,那样本均值和方差则相互独立。正态分布具有很多好的性质,很多模型假设数据服从正态分布。例如线性回归(linear regression),它假设误差服从正态分布,从而每个样本点出现的概率就可以表示成正态分布的形式,将多个样本点连乘再取对数,就是所有训练集样本出现的条件概率,最大化这个条件概率就是LR要最终求解的问题。这里这个条件概率的最终表达式的形式就是我们熟悉的误差平方和。总之, ML中很多model都假设数据或参数服从正态分布。

三:如何检验样本是否服从正态分布?

可以使用Q-Q图来进行检验
https://baike.baidu.com/item/Q-Q图

统计学里Q-Q图(Q代表分位数)是一个概率图,用图形的方式比较两个概率分布,把他们的两个分位数放在一起比较。首先选好分位数间隔。图上的点(x,y)反映出其中一个第二个分布(y坐标)的分位数和与之对应的第一分布(x坐标)的相同分位数。因此,这条线是一条以分位数间隔为参数的曲线。
如果两个分布相似,则该Q-Q图趋近于落在y=x线上。如果两分布线性相关,则点在Q-Q图上趋近于落在一条直线上,但不一定在y=x线上。Q-Q图可以用来可在分布的位置-尺度范畴上可视化的评估参数。

由于P-P图和Q-Q图的用途完全相同,只是检验方法存在差异。要利用QQ图鉴别样本数据是否近似于正态分布,只需看QQ图上的点是否近似地在一条直线附近,而且该直线的斜率为标准差,截距为均值.

四 :如果不是正态分布怎么办?

数据右偏的话可以对所有数据取对数、取平方根等,它的原理是因为这样的变换的导数是逐渐减小的,也就是说它的增速逐渐减缓,所以就可以把大的数据向左移,使数据接近正态分布。
如果左偏的话可以取相反数转化为右偏的情况。

五、Box-Cox

https://blog.csdn.net/lcmssd/article/details/80179102?utm_source=blogxgwz0
参加kaggle比赛过程中,看到很多人在预处理阶段会对某些特征X做如下操作 Y = log(1+X), 说是可以把这个特征的分布正态化, 使其更加符合后面数据挖掘方法对数据分布的假设

y = (x**lmbda - 1) / lmbda,  for lmbda > 0
    log(x),                  for lmbda = 0

在这里插入图片描述

上图lambda取不同值时, (X,Y)的曲线, boxcox变换的工作原理就在这些曲线的斜率中: 曲线斜率越大的区域,则对应区域的X变换后将被拉伸, 变换后这段区域的方差加大; 曲线斜率越小的区域, 对应区域的X变换后将被压缩, 变换后这段区域的方差变小.
右图中看出lambda = 0时, 取值较小的部分被拉伸, 取值较大的部分被压缩; lambda > 1时则相反

http://onlinestatbook.com/2/transformations/box-cox.html

### 使用Python进行卡方检验以确定数据是否符合正态分布 为了通过卡方检验来判断一组数据是否符合正态分布,在Python中有多种库可以实现这一目标。然而,值得注意的是,卡方适合度检验通常用于离散分布而非连续分布正态分布。对于性的评估,更常用的方法包括Shapiro-Wilk测试、D'Agostino-Pearson omnibus测试以及Anderson-Darling测试等。 尽管如此,如果确实希望利用类似于卡方的思想来进行近似处理,则可以通过将连续的数据分箱成类别后再执行卡方检验的方式间接完成[^1]。具体操作如下: #### 数据准备与预处理 首先创建或加载待检测的数据集,并将其转换为适用于卡方检验的形式——即将数值型特征按照一定区间划分为多个类目。 ```python import numpy as np from scipy.stats import chi2_contingency import matplotlib.pyplot as plt np.random.seed(42) data = np.random.randn(1000) # 假设这里有一个标准正态分布的随机数列作为例子 plt.hist(data, bins='auto') plt.title("Histogram with 'auto' bins") plt.show() ``` 接着定义若干个合理的边界值构成直方图中的各个箱子(bin),并计算每个箱子内实际观测到的数量。 ```python bins_edges = [-3,-2,-1,0,1,2,3] observed_frequencies, _ = np.histogram(data, bins=bins_edges) print(f"Observed frequencies within each bin: {list(observed_frequencies)}") ``` #### 计算期望频率 根据理论上的正态分布概率密度函数PDF求得对应于上述各边界的累积分布函数CDF之差,从而得出理论上应该出现多少次落在该范围内的事件次数。 ```python mu, sigma = data.mean(), data.std() # 获取样本均值和标准差 expected_proportions = [] for i in range(len(bins_edges)-mu)/sigma upper_bound = (bins_edges[i+1]-mu)/sigma from scipy.stats import norm expected_prop = norm.cdf(upper_bound) - norm.cdf(lower_bound) expected_proportions.append(expected_prop * len(data)) print(f"Expected proportions under null hypothesis of normality: {list(map(round, expected_proportions))}") ``` #### 执行卡方检验 最后调用`chi2_contingency()`函数传入观察频数向量即可得到最终的结果。 ```python statistic, pvalue, dof, ex = chi2_contingency([observed_frequencies]) if pvalue < 0.05: print('Reject the Null Hypothesis that Data follows Normal Distribution.') else: print('Fail to reject the Null Hypothesis; Data may follow a Normal Distribution.') print(f"\nChi-squared statistic={statistic:.4f}, P-value={pvalue:.4f}") ``` 这种方法虽然能够提供一定的参考价值,但在实践中并不推荐用来严格验证性,因为其本质上还是针对分类变量设计的工具。相比之下,专门为此目的开发出来的统计测验会更加可靠有效[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值