R 中进行对数变换
说明:这篇文章是我在学习 R 时看到的,感觉很有用,就翻译了过来~~
—– 正文分割线 —–
当数据分布大致对称时,用均值和标准差对数据进行归一化是非常有意义的。在本文中,基于第4章 实用数据科学与R,作者展示了一种可以使某些分布更加对称的转换。
是否对数据进行转换可能取决于你要使用的建模方法。例如,对于线性回归和逻辑回归,理想情况下你希望输入变量和输出变量之间的关系近似为线性,也就是说,输入变量近似为正态分布,输出变量的方差为常数(即,输出变量的方差与输入变量无关)。你可能需要转换一些输入变量才能更好地满足这些假设。
在本文中,我们将介绍对数转换以及何时使用。
货币量——收入,客户价值,账户或购买规模等——是数据科学应用中最常遇到的偏差分布的来源。事实上,正如我们在 附录B:重要统计概念 中所讨论的那样,货币金额通常是对数正态分布——也就是说,数据的对数呈正态分布。这让我们想到 对数据取log 可以恢复其对称性。下图就证明了这一点:
出于建模的目的,你使用的对数(不管是自然对数,以10为底的对数 或 以2为底的对数)通常都不是关键。例如在回归中,对数的选择会影响和 进行对数变换的变量 对应的系数的大小,但它不会影响结果的值。我喜欢使用 以10为底 对货币金额进行对数变换,因为 以10为基准的数量级 看起来很自然:100美元,1000美元,10,000美元等等。转换后的数据易于阅读。
关于作图
使用 ggplot 的 scale_x_log10 层和 log10(income) 之间的区别主要在于轴标记。使用 scale_x_log10 将以美元金额标记x轴,而不是对数。
通常,使用范围超过几个数量级的值进行 数据的对数变换 是一个好主意。首先,因为建模技术通常具有非常宽的数据范围,其次,这样的数据通常来自乘法过程,所以用对数做单位在某种意义上更自然。
例如,当你研究减肥时,自然单位通常是磅或公斤。如果我体重150磅,我的朋友体重200,我们同等程度地活跃,我们都采用完全相同的热量限制饮食,那么我们可能会损失相同的体重 —— 换句话说,我们减轻多少重量并不取决于我们初始的体重,而取决于卡路里的摄入量。这是一个添加过程。
另一方面,如果管理层要给部门中的每个人加薪,可能并不是给每个人增加5000美元,而是每个人都获得2%的加薪:最终的薪水取决于初始工资。这是一个乘法过程,自然的度量单位是百分比,而不是绝对的美元。乘法过程的其他示例:对在线零售网站的变更会使每个项目的转换(购买)增加2%(而不是通过两次购买);改变餐厅菜单使得每晚增加5%的主顾(不是每晚五个顾客)。当过程是乘法时,对过程数据进行对数变换可以使建模更容易。
当然,只有在数据为非负数时才能采用对数变换。如果有零值或负值,可以使用其他变换(例如arcsinh)来减少数据范围。我不喜欢使用arcsinh,因为我没有发现转换数据的意义。在偏斜数据是货币的应用(如帐户余额或客户价值)中,我使用我称之为“符号对数”的东西。带符号的对数取变量绝对值的对数,并乘以适当的符号。绝对值小于1的值将映射为零。对数和符号对数之间的区别如下图所示。
以下是在R中计算以10为底的符号对数:
signedlog10 = function(x) {
ifelse(abs(x) <= 1, 0, sign(x)*log10(abs(x)))
}
显然,如果低于单位幅度的值很重要,则无效。但是对于所有实际目的而言,对于许多货币变量(以美元计价),小于1美元的价值与零(或一)没有太大差别。因此,例如,将小于1美元的帐户余额映射到1美元(相当于每个帐户的最低余额为1美元)可能没问题。
一旦你对数据进行了适当的清理和转换,你几乎已准备好开始建模阶段。
总结
在某些时候,你将拥有尽可能高质量的数据。你解决来数据丢失的问题,并执行了所需的转换。你已准备好进入建模阶段。但请记住,数据科学是一个迭代过程。你可能会在建模过程中发现需要进行其他数据清理或转换。