如何进行数据变换(转)

如何对右偏数据进行变换

现在,我们需要分情况讨论一下。在实际生活中,最常见的情形是靠近正无穷的一侧有一个长尾巴(如图1左),习惯上称为「右偏」(right-skewed)或「正偏态」(positive skewness)。许多人会有点儿困惑,觉得图上分布的那个峰明明是向左边负数一侧偏的,怎么叫「右偏」「正偏态」呢?要记住,当我们描述偏态的方向时,说的是分布的尾巴,而不是峰。这本身没有什么大道理可讲,就是一种约定俗成而已。

图1 一个右偏(正偏态)的总体分布

右偏的分布之所以常见,是因为有许多变量的取值有一个明确的下界(通常是 0 )而没有上界。最典型的例子就是人均收入。这个例子我们在《数据到手了,第一件事先干啥?》里也提到过。首先,收入不可能是负的。其次,对于经济状况正常的社会,处于贫困状态的人相对较少,多数人都在小康水平上下浮动,这就保证了总体分布基本呈现中间高、两边低的形态。然而,总会有极少数像比尔盖茨、巴菲特那样的巨富,待在分布右侧很远的地方——而且更虐心的是,收入这事儿可是没有上限的。同样的讨论适用于许多其他情形,在生物医学中,很多变量的分布都有类似的性质,尤其是那些健康人群正常值比较小(因而峰值比较靠近下限)的生理指标。

相信你还记得我们在上上集《不是正态分布,t 检验还能用吗?》里说过的判断样本分布正态性的两个方法——频率直方图和 q-q 图。快速重温一下,假设我们有一个来自图 1 左边的总体分布的样本,如果对此样本画出频率直方图和 q-q 图(图 1 中、右),可以看到频率直方图大体和总体分布相似,样本分布右侧有个尾巴,而 q-q 图中各数据点并不完全在一条直线上,这些都说明样本分布不太正态。(忘了 q-q 图的意义和读法?戳此处回顾该集

好了,像这样一个分布,我们应该用怎样的函数来作变换?记得我们说过,函数的最基本条件需要是单调的。为了使数据点的大小次序不会颠倒过来,我们进一步把考虑范围缩小到单调增函数。为了要把分布右侧的尾巴缩短一点,我们需要这样一个函数,它在 y 比较小的时候增长得比较快,而在 y 比较大的时候增长得慢一些。这样一来,在原来分布右边相距较远的任意两个点之间的距离就会相对变小,从而分布的偏态就能得到改善了。

回想一下中学数学,有什么常见的单调增长函数是越涨越慢的呢?不难想到,对数函数 、平方根 、甚至三次方根 等函数都具备这样的性质(图 2)。满足这样性质的函数其实有无数个,这几个由于形式简单,因此比较常用。对数变换另外还有一个优良的性质,使其成为了比较受欢迎的选择,这个性质我们会在本文末尾提到。

图2 常见的用于右偏分布的变换函数

从图 2 中也能看到,这些变换函数对 y 较大时的压缩程度不同,变换后 f(y) 的取值范围也不同。到底哪一个效果更好(也可能效果都不好),取决于具体的问题和数据。通常的做法是尝试若干种变换函数,然后对变换后的新样本重新检验正态性(如频率直方图、q-q 图或夏皮罗-威尔克检验等方法),选择正态性最好的样本用于后续分析。

下面我们就分别用对数函数和平方根函数对图1中右偏的样本来做个变换,看看效果如何(对数变换的结果见图 3,平方根变换见图 4)。

图3 使用对数函数对图1中的右偏样本作变换

图 4 使用平方根函数对图1中的右偏样本作变换

如果把图 3、图 4 和前面的图 1 做比较,容易看到,这两个变换都对总体和样本的正态性起到了改善作用。不论从总体分布和频率直方图的对称性,还是从 q-q 图中数据点与直线的偏离程度来说,变换后的分布都变得更正态了。如果我们看得更仔细一点,在这个例子中对数函数的效果稍微更好一些,因为变换后总体和样本分布几乎完全是对称的,而平方根变换后分布还是有一点右偏。

要记住的是,这只是一个个别例子,我们并不能就此认为对数变换和平方根变换总能起到良好的效果。有时候,数据变换非但不能改善正态性,甚至还会引进原本没有的偏态(图 5)。因此,当我们对数据作变换时,千万不能想当然,觉得做了变换就一定能把分布给变正态了。做变换后,重新检查正态性是必不可少的步骤。

图5 一个对数变换的不成功例子

第一列:原数据的总体分布、样本频率直方图和 q-q 图(这个分布来自上一集《只有15 个标本,也能指望 t 检验吗?》中的倒数第二例)。

第二列:将样本进行对数变换后,新样本的频率直方图和 q-q 图(总体分布略)。可见样本从原来的右偏变成了左偏。

另外,你也许注意到,前面讨论的几个变换函数都要求原数据大于 0。如果数据里有负数或 0 怎么办?我们只需将所有数据加上一个正的常数,使得数据全部为正即可。

如何对左偏数据进行变换

前面我们讨论了对右偏数据的变换方法,那么左偏的数据又该如何?在现实生活中,左偏的分布比右偏稍微少见一些。最经典的例子当属人或动物的寿命(图 6)。在环境条件良好的情况下,动物在较低年龄就死亡的概率很低,但是当年龄达到该物种本身生物学特性所容许的某个最高水平前后,死亡率就会大幅升高,然后再迅速降低(因为已经没有什么个体能活那么长了),因而造成分布的左偏。

图6 人或动物的寿命的分布通常是左偏的

本图为 2010-12 年英国女性在各年龄每 100,000 人中的死亡人数的期望的分布。

不难想到,左偏和右偏的数据互为镜像关系,因此一种转换的办法是,先把数据取个负号(为了使数据重新变回正数,往往还要再加个常数),然后就按右偏数据的办法处理。另一种解决方案则是使用增长率越来越快的一类单调增函数,如等。与之前相似,没有一种变换是万能的,因此我们在数据变换后必须重新检查样本的正态性。

至此为止,我们提到了许多可用于数据变换的函数,它们各有所长,我们得根据实际问题的特点按需取用。选择最合理的变换形式,不是一件容易的事。大约 50 多年前,两位统计学家兼好基友 Box 和 Cox(不要问我为什么他俩的名字是押韵的)专门为深度懒人癌患者提出了一套变换方法,称为 Box-Cox 变换,可以根据一定的标准自动找出最佳的变换函数。

数据变换的局限性

在今天这一集里,我们讨论了利用数据变换来改善正态性的方法。虽然我们是针对 t 检验对于正态性的要求而引出的这个话题,但是这一方法可以用在许多需要总体或样本分布满足正态性的场合,比如我们以后将会讲到的方差分析、线性回归等。正如所有科学方法一样,它并不是全能的。要用好这个工具,我们还需要对其局限性有所了解。

第一,数据变换并不能解决所有非正态性的问题。从上面的一些例子里,我们已经能看到,对于特定的某组数据,一个变换方法并不一定能把数据变为服从正态分布。有些时候,即便我们穷尽所有不同形式的函数,一个分布也不可能被转化为正态分布——比如说离散型的分布。还有一些其他的分布(比如有不止一个峰的分布),可以通过一些奇形怪状的变换函数弄成正态的,但这会不可避免地对数据带来太多的扭曲,进一步的分析也就很成问题了。

第二,对数据进行变换后,重新进行原来计划的统计检验,其意义会发生变化。比如说,我们想要比较两组数据的均值是否有差别,但是发现样本分布并不正态,于是对数据做了一个平方根变换。当我们对变换后的数据使用 t 检验时,我们检验的不再是两组数据均值的差别,而是在检验样本中数据平方根的均值之间的差别。虽然对所有数据开平方根后取均值仍然是对数据大体趋势的一个概括,但是仍然与变换前数据的算术平均值有着不同的意义,也失去了我们曾经在《算术平均数:简单背后有乾坤》中讨论过的算术平均数的优点。对于其他更复杂的变换,我们到底是在检验什么就更加模糊了。

值得一提的是,这里有一个例外就是对数变换!我们来看看为什么。对数变换以后,新的数据的算术平均数是:

上面的推演运用了对数运算的基本性质。在最后一步对数符号里的,被称为几何平均数(geometric mean)。和我们熟悉的算术平均数一样,它也是表示样本数据集中趋势的一个统计量。换言之,如果进行对数变换后的数据平均值使用 t 检验,实际上是在对样本的几何平均数做统计推断。正是因为对数变换有相对明确的意义,它也成为了数据变换函数里比较流行的一种。

时间: 2024-08-08 17:52:36

如何进行数据变换(转)的相关文章

R学习笔记 第五篇:数据变换和清理

在使用R的分组操作之前,首先要了解R语言包,包实质上是实现特定功能的,预先写好的代码库(library),R拥有大量的软件包,许多包都是由某一领域的专家编写的,但并不是所有的包都有很高的质量的,在使用包之前,最好导社区中了解其他网友的反馈. 安装包,引用包和卸载包的命令分别是: install.packages("package-name") library(package-name)remove.packages("package-name") 数据分析的工作,8

数据变换

数据的变换 数据变换主要是对数据进行规范化处理,将数据转换成"适当的"形式,以适用于挖掘任务及算法的需求. 简单的函数变换:是对原始数据进行某些函数变换,常用的变换包括平方,开方,取对数,差分运算等 简单的函数变换常用来将不具有正太分布的数据变换成具有正太分布的数据.在时间序列分析中,有时简单的对数变换或者差分运算就可以将非平稳序列转换成平稳序列,在数据挖掘中,简单的函数变换可能更有必要,比如个人年收入的取值范围10000元到10亿元,这是一个很大的区间,使用对数变换对其进行压缩是常用

Rxjava2 Observable的数据变换详解及实例(二)

目录 1. Window 1.1 window(closingSelector) 1.2 window(openingIndicator, closingIndicator) 1.3 window(count) 1.4 window(count, skip) 1.5 window(timespan, TimeUnit) 1.6 window(timespan, TimeUnit, count) 1.7 window(timespan, timeskip, TimeUnit) 2. GroupBy

Rxjava2 Observable的数据变换详解及实例(一)

目录 简要: 1.1 buffer(count) 1.2 buffer(boundary) 1.3 buffer(count, skip) 1.4 buffer(timespan, TimeUnit) 1.5 buffer(timespan, TimeUnit, count) 1.6 buffer(timespan, timeskip, TimeUnit) 1.7 buffer(bufferClosingSelector) 2. Map 3. FlatMap 3.1 flatMap(mapper

kaggle数据挖掘竞赛初步--Titanic<数据变换>

缺失值填充之后,就要对其他格式有问题的属性进行处理了.比如Sex Embarked这些属性的值都是字符串类型的,而scikit learn中的模型都只能处理数值型的数据,需要将这些原始的字符串类型的数据转为数值型数据.所有数据通常可以分成两种类型:定量与定性.定量的属性(数值属性)通常蕴涵着可排序性,比如在泰坦尼克号数据集中,年龄就是一个定量属性.定性属性(标称 序数 二元属性)的值是一些符号或事务的名称,每个值代表某种类别编码或状态,不是可测量量,是不具有排序意义的,比如Embarked(登船

pytorch张量数据索引切片与维度变换操作大全(非常全)

(1-1)pytorch张量数据的索引与切片操作1.对于张量数据的索引操作主要有以下几种方式:a=torch.rand(4,3,28,28):DIM=4的张量数据a(1)a[:2]:取第一个维度的前2个维度数据(不包括2):(2)a[:2,:1,:,:]:取第一个维度的前两个数据,取第2个维度的前1个数据,后两个维度全都取到:(3)a[:2,1:,:,:]:取第一个维度的前两个数据,取第2个维度的第1个索引到最后索引的数据(包含1),后两个维度全都取到:(4)a[:2,-3:]:负号表示第2个维

地统计分析笔记——探索数据

来自:http://blog.csdn.net/kikitamoon/article/details/49925147 在执行地统计分析之前,浏览.熟悉.检查自己的数据是至关重要的.绘制和检查数据是地统计分析过程中的必要阶段,我们可以从这些工作中获得一些先验知识,指导后续的工作. Stage 1 绘制数据 通过ArcMap的图层渲染方案绘制数据,我们可以获得对数据的第一印象. 例如,使用单一符号渲染了解采样点的疏密分布,通过分类渲染了解采样点高值低值的分布,等等. Stage 2 检查数据 绘制

数据预处理(完整步骤)

原文:http://dataunion.org/5009.html 一:为什么要预处理数据?(1)现实世界的数据是肮脏的(不完整,含噪声,不一致)(2)没有高质量的数据,就没有高质量的挖掘结果(高质量的决策必须依赖于高质量的数据:数据仓库需要对高质量的数据进行一致地集成)(3)原始数据中存在的问题:不一致 —— 数据内含出现不一致情况重复不完整 —— 感兴趣的属性没有含噪声 —— 数据中存在着错误.或异常(偏离期望值)的数据高维度二:数据预处理的方法(1)数据清洗 —— 去噪声和无关数据(2)数

数据相似性和相异性

寻找数据之间的相似性是数据聚合.分类.拟合预测等应用中常见的场景:寻找数据之间的相异性是异常检测,排除离群点等数据操作必需的步骤.所以计算数据之间的相似度和相异度是数据处理的基本手段,常用的方法是计算数据之间的距离和密度. 相似度顾名思义就是两个对象相似程度的数值度量,常常在0(不相似)和1(完全相似)之间取值. 相异度就是两个对象之间差异程度的数值度量.相异度常常在[0,1]或[0,正无穷]之间取值. 通过数据变换,把属性值变换到相似度或相异度所在的区间: 标称属性:x = y , 相似度=1