【翻译】原文:A Comprehensive guide to Data Exploration,作者: Sunil Ray
前言
数据探索没有捷径。如果你现在认为只要数据足够多,思想有多远,机器学习就能带你走多远,那么很不幸的告诉你,机器学习做不到。如果有一天,你突然意识到你正在努力提高模型的准确性却毫无进展,这时你会发现,算法已经无能为力,在这种情况下,数据探索技术将可能对你有些帮助。
我可以很自信地说,因为我经历过这样的情况,很多很多。
我做业务分析已经近三年了。在刚开始的时候,我的一个导师建议我一定要花大量时间和精力在探索和分析数据上。他的忠告确实帮我少走很多弯路。
我创建这个教程,以帮助您了解数据探索的基本技术。一如既往,我已经尽我所能用最简单的方式解释这些概念。为了更好的理解,我举了几个例子来演示复杂的概念。
目录
数据探索的步骤
数据准备工作
- 变量识别
- 单变量分析
- 双变量分析
缺失值的处理
- 为什么要处理缺失值?
- 为什么我的数据会有缺失值?
- 处理缺失值的方法有哪些?
异常值检测与处理技术
- 什么是异常值?
- 异常值(离群点)有哪几种类型?
- 什么导致的异常值?
- 数据集中的异常值有什么影响?
- 如何检测异常值?
- 如何去掉异常值?
特征工程的艺术
- 什么是特征工程?
- 特征工程如何做?
- 什么是变量转换?
- 我们什么时候应该做变量转换?
- 变量转换的常用方法有哪些?
- 什么是变量/特征创建?它有什么好处?
0. 数据探索的步骤
记住,你的输入质量决定你的输出质量。所以,花多少时间和精力在数据探索上都是有意义的。就我看,数据探索,清洗和预处理需要占用您项目总时间的70%左右。
以下是探索,清洗和准备数据的步骤:
- 变量识别
- 单变量分析
- 双变量分析
- 缺失值的处理
- 异常值处理
- 变量变换
- 创建新变量
最后,我们将需要重复步骤4–7多遍,最终才能得到比较好的模型。
现在,让我们详细研究一下每个阶段。
1. 数据准备工作
变量识别
首先,识别预测(输入)和目标(输出)变量。然后,确定变量的数据类型和类别。
让我们以一个例子来更清楚地了解这一步。
例如:假设,我们要预测,学生是否会玩板球(参考下面的数据集)。在这里,您需要确定预测变量、目标变量、变量的数据类型和变量的类别。
下图,将上面这些变量按预测/目标、数据类型和变量类别三个维度进行了划分:
单变量分析
在这个阶段中,我们将一个个地探索每个变量。进行单变量分析的方法取决于变量的类型是分类变量(Categorical)还是连续变量(Continuous)。让我们来分别看一下不同类型的变量的探索方法:
连续变量: 对于连续变量,我们需要了解变量的集中趋势(如匀数、中数与众数)和分散程度。可以使用如下统计指标和可视化方法:
注:单变量分析也被用来突出显示缺失值和异常值。在后面的章节,我们将介绍处理缺失值和异常值的一些方法。要更深入了解这些方法,你可以参考课程descriptive statistics from Udacity。
分类变量: 对于分类变量,我们将使用频率表来展现每个类别的分布。它可以使用2个度量:计数和占比。另外,条形图可以用作可视化的方法。
双变量分析
双变量分析是为了发现两个变量之间的关系。我们可以对分类变量和连续变量的任何组合进行双变量分析。可能的组合有:分类变量与分类变量,分类变量与连续变量,连续变量和连续变量。在分析过程中,需要对不同的组合使用不同的方法来分析。
让我们来详细看看处理不同组合的方法:
连续变量与连续变量: 在对两个连续变量进行双变量分析时,我们应该看散点图,它是发现了两个变量之间的关系的一个极好的方式。散点图表示变量之间的关系。关系可以是线性的或非线性的。
散点图可以显示两个变量之间的相关关系,但没有办法显示它们之间的相关程度。一般情况下,我们可以用相关性因子表示这种相关程度。相关性因子是在-1到1之间的一个值:
- -1:完美负线性相关
- 1:完美正线性相关
- 0:不相关
相关性因子使用以下公式计算得出:
Correlation = Covariance(X,Y) / SQRT( Var(X) Var(Y))*
各种工具都有计算变量之间相关性的函数。比如在Excel中,CORREL()用于返回两变量之间的相关性;在SAS中,PROC CORR用于计算相关性。这些函数都是返回皮尔森相关因子,以确定变量之间的关系:
在上面的例子中,变量X和Y有良好的正相关关系(0.65)。
分类变量与分类变量: 我们可以使用下面的方法探索两个分类变量之间的关系:
双向表: 一个双向表就是一个二维表,其中行是一个类型变量的所有值,列是另一个类型变量的所有值,每个单元格可以计算两个类型变量每种组合出现的次数或百分比。我们可以用一个双向表分析两个类型变量的关系。
堆叠柱图: 这个方法比双向表有更好的可视化效果。
-
卡方检验: 本检验用来推导两个变量之间在统计意义上的关系。更进一步,根据样本的情况,它还可以检验这种相关程度的可信度。卡方值其实就是预期的和观察到的频率在一个或多个类别中之间的差异程度。卡方检验得到的就是在一定自由度下卡方值分布的概率。
卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合,若两个值完全相等时,卡方值就为0,表明理论值完全符合。注意:卡方检验针对分类变量。
- 概率0:表明这两个分类变量是相互依赖的。
- 概率1:表明这两个变量是独立的。
- 概率小于0.05:表明有95%的可能性这两个变量之间的关系是相互依赖的。2分类变量独立性检验统计量的检验统计量:
其中,O代表观察到频率,E代表在零假设的情况下的预期的频率,可用如下方法计算得到:
拿上面的双向表的例子来说,Product Category为(1,Small)的预期的频率为0.22。计算方法:row total(9)和column total(2)的乘积,然后除以样本总量(81)。这是每个单元格计算E的过程。用于分析关系强弱的统计方法有:
- 用于名称分类变量的:Cramer’s V
- 用于有序分类变量的:Mantel-Haenszed Chi-Square
不同的数据科学语言和工具都有具体的方法来进行卡方检验。
分类变量和连续变量: 在同时探索分类和连续变量之间的关系的时候,我们可以为每个分类绘制箱线图(boxplot)。但是如果分类上的连续数值量很小,它不会显示出明显的统计意义。为了在统计意义上进行分析,我们可以进行Z-test,T-test或方差分析(Analysis of Variance,简称ANOVA)。
-
Z-test/T-test: 这两个检验都是用来评估来自两个不同总体的两个样本平均数,看它们各自代表的总体的差异是否显著。
Z的概率越小,平均值的差异就越显著。T检验与Z检验很类似,只是它应用于样本数小于30的情况。
T检验,亦称student t检验(Student's t test),主要用于样本含量较小(例如n<30),总体标准差σ未知的正态分布资料。T检验是用t分布理论来推论差异发生的概率,从而比较两个平均数的差异是否显著。它与z检验、卡方检验并列。
Z检验(Z Test)是一般用于大样本(即样本容量大于30)平均值差异性检验的方法。它是用标准正态分布的理论来推断差异发生的概率,从而比较两个平均数的差异是否显著。在国内也被称作u检验。当已知标准差时,验证一组数的均值是否与某一期望值相等时,用Z检验。
-
ANOVA: 评估两组的平均值是否有差异。
方差分析(Analysis of Variance,简称ANOVA),又称“变异数分析”,是R.A.Fisher发明的,用于两个及两个以上样本均数差别的显著性检验。 由于各种因素的影响,研究所得的数据呈现波动状。造成波动的原因可分成两类,一是不可控的随机因素,另一是研究中施加的对结果形成影响的可控因素。
方差分析的基本思想是:通过分析研究不同来源的变异对总变异的贡献大小,从而确定可控因素对研究结果影响力的大小。
例子: 假设,我们要测试五种不同的训练的效果。为此,我们招募了20名男子,并将他们分为5组,每组4个人,每组进行一种运动。训练几周后,记录下他们的体重。现在我们就可以通过比较5组中每个男子的体重确定这些练习对他们的影响是否显著。
到目前为止,我们已经学习了数据探索的前三步:变量识别,单变量和双变量分析。我们还学习了各种统计方法和可视化方法来确定变量之间的关系。
现在,我们将看看处理缺失值的方法。更重要的是,我们也将探讨一下我们的数据为什么会出现缺失值,以及为什么必须要处理这些缺失值。
2. 缺失值的处理
为什么要处理缺失值?
训练集中的缺失值会减弱模型的效果,甚至导致模型错误。因为我们没有正确的分析这个变量本身以及它和其他变量的关系,这有可能导致预测或分类错误。
注意上图中的缺失值:在左边的图中,我们没有处理缺失值。从这个数据集得到的推论是,男性玩板球的概率于女性一样。而在右边的图中,这是我们处理了缺失值后的数据(根据称呼),可以看到,女性玩板球的概率高于男性。
为什么我的数据会有缺失值?
上面,我们讲了数据集中缺失值处理的重要性。现在,让我们看看这些缺失值发生的原因。他们可能发生在2个阶段:
数据提取: 提取过程中可能存在问题。在这种情况下,我们应该仔细检查数据的正确性。一些哈希程序也可以用来确保数据提取是正确的。在数据提取阶段的错误通常比较容易找到,并且也很容易纠正。
-
数据采集: 缺失发生在数据采集时,这种情况纠正起来比较难。这种缺失可以分为四种类型:
完全随机缺失: 发生缺失的概率对所有观测的值是相同的。例如:数据收集过程中的被调查者扔硬币来决定是否填写他们的收入。如果扔到的是正面,被调查者就填写他/她的收入,反之亦然。这里每个观测值都有相同的缺失值概率。
随机缺失: 变量缺失是随机的,但是对于不同的其他输入变量,他们的丢失概率是不同的。例如:我们收集年龄数据,女性比男性有更高的缺失值。
由未被观察的因素导致的缺失: 缺失值不是随机的,而是与某种未被观察的因素相关。例如:在医学研究中,如果一个患者感到不适,那么他很有可能退出此研究。这个缺失值不是随机的,除非我们有“不适”作为所有患者的一个输入变量。
由缺失值本身导致的缺失: 缺失值发生的概率与缺失值本身直接相关。例如:有较高或较低收入的人有可能不会提供他们的收入。
处理缺失值的方法有哪些?
-
删除法: 删除法分两种:行删除(List Wise Deletion)和成对删除(Pair Wise Deletion)。
- 行删除:只要一行中有缺失值,我们就把整行删除。这种方法的主要优点就是简单。但因为这种方法减少了样本量,所以会降低模型的效果。
- 成对删除:我们对每一个变量就用它不缺失的样本进行分析。这种方法的优点是,它尽可能多的保存了用于分析的样本数据。它的缺点是,不同的变量有不同的样本量。
- 注意:只有当缺失值属于“完全随机缺失”的情况下,才能使用删除法,否则非随机缺失的样本会导致模型错误。
-
均值/众数/中位数插补法: 插补是一种用估计值填充缺失值的方法。目的是利用数据集中有效数据的性质,估计缺失值的值。均值/众数/中位数插补法是最常用的方法之一,即使用变量的所有已知值的平均值、中位数或众数,替换缺失值。具体可以分为2种类型:
- 一般插补: 在这种情况下,我们计算该变量所有已知值的平均值或中位数,然后用平均值或中位数替换缺失值。例如在上述表格中,变量“Manpower”存在缺失值,我们计算所有已知的值的平均值(28.33),然后用它替换所有缺失值。
- 相似样本插补: 我们分别计算“男性”(29.75)的平均值和“女性”的平均值(25),然后按照不同的性别分别替换缺失值。是“男”的话,我们用29.75替换缺失值,是“女”的话,我们用25替换缺失值。
-
预测模型法: 预测模型法是处理缺失值的方法中比较复杂的一种。它是指创建一个预测模型来估计缺失值,然后取代缺失值。在这种情况下,我们将我们的数据集分为2组:一组没有缺失值,另一组全是缺失值。第一组数据集成为模型的训练集,而二组数据集是测试集,变量中的缺失值被视为目标变量。接下来,我们根据训练集的其他属性建立了一个模型来预测目标变量,并填充测试集中的缺失值,我们可以用回归,方差分析,逻辑回归等各种建模技术来建立这个模型。这种方法有2个缺点:
- 模型估计值相比真正的值,通常太过于循规蹈矩。
- 如果数据集中的属性和缺失值之间没有关系,那么该模型估计的缺失值将不准。
-
KNN 插补法: 这种方法,是使用指定个数(K)的与缺失值的样本相似的样本的值,填补缺失值。利用距离函数确定了2个属性的相似性。这个方法优缺点如下:
-
优点:
- 无论是定性还是定量的属性,K近邻算法都可以预测。
- 不需要给每个含有缺失值的属性创建预测模型。
- 很容易处理多个属性都有缺失值的情况。
- 考虑了数据的相关性
-
缺点:
- KNN算法在所有的数据中寻找最相似的实例,在分析大量数据时非常耗时。
- 选择K值很关键也很难。K过大会包含一些与我们不相似甚至显著不同的样本,而K太小意味着错过了重要的属性。
-
优点:
处理完缺失值之后,下一个任务是处理异常值。在我们创建模型时,常常忽视了异常值。这是一个悲剧的做法。异常值常常会使您的数据倾斜,并降低模型的精度。下面,让我们看看如何处理异常值。
3. 异常值检测与处理技术
什么是异常值?
异常值(离群点)是数据分析师和数据科学家一种常用的术语,数据分析需要密切关注它,因为它可能会导致错误的估计。简单的说,异常值(离群点)就是大大偏离样本总体格局的值。
举个例子来说,我们做客户分析,发现客户的平均年收入是80万美元。但是,有两个客户的年收入为400万和420万美元。这两个客户的年收入比其他人高出很多。这两点就被视为异常值(离群点)。
异常值(离群点)有哪几种类型?
异常值有两种:单变量和多变量。上面的例子是单变量离群的例子。我们可以通过观察单一变量的分布发现这些异常值。多变量异常是一个n维空间的离群点。为了找到这种异常值,你必须观察多维分布。
让我们以一个例子来说明这个问题。比如我们研究高度和重量之间的关系。下图,展示了高度,重量的一元和二元分布。看前两个箱图。我们没有任何异常值(上端和下端是1.5*IQR,这是很常用的方法)。再看散点图。其中有2个值在平均以下,一个在平均以上。
什么导致的异常值?
我们解决异常值问题的最好方法就是找出有导致这些异常值的原因。对付他们的方法取决于他们发生的原因。异常值出现的原因可以分为两大类:
- 人工(错误)/非自然因素
- 自然因素
让我们更详细的看看各种类型的异常值:
数据输入错误: 数据收集,记录或输入过程中的人为错误导致的异常数据。例如:客户的年收入是100000美元。数据输入操作员不小心多输入了一个零。现在的收入是1000000美元,比原来高10倍。显然,与其他正常值相比,这个是离群值(异常值)。
测量误差: 这是最常见的异常值。一般是由使用的测量仪器有故障造成的。例如:有10个体重计。其中9个是正常的,1个是有故障的。有故障的体重计上测量的人重量会比该组其他人高/低。在故障体重计上测量的体重可以导致异常值。
实验误差: 造成异常值的另一个原因是实验误差。例如:在7个百米跑比赛的运动员中,一个运动员没听到哨声,导致他起步晚了,进而导致他的跑步时间比其他赛跑者要多。他的用时就是一个异常值。
故意离群: 这是一种在自我报告(如用户自己填写)涉及敏感数据时常见的一种异常。例如:青少年在报告他们消费的酒精量时会少报。只有一小部分报告的是真实值。这里真实值可能看起来像离群值(异常值),因为其他人都少报了。
数据处理错误: 当我们进行数据挖掘时,我们经常从多个数据源提取数据。一些操作或提取错误可能会导致异常值。
抽样误差: 例如,我们测量田径运动员的身高,结果在我们样本中包含了几个篮球运动员。这可能会导致我们数据集中出现异常值。
自然异常值: 如果一个异常值不是人为的(由于错误),那它就是一个自然异常值。例如:在我的最近给一个著名的保险公司做的项目中,我注意到,前50名财务顾问的绩效远远高于其他人。令人惊讶的是,这并不是因为任何错误。因此,每当我们对财务顾问进行任何数据挖掘的时候,我们都将这部分人分开处理。
数据集中的异常值有什么影响?
异常值可以极大地改变数据分析和统计模型的结果。数据集中的异常值有许多不利的影响:
- 它增加了误差方差,并且降低了统计检验的效果
- 如果异常值不是随机分布的,它会使正常样本减少
- 他们会影响最终的预测结果估计,使得预测是错误的
- 他们还会影响回归、方差分析以及其他统计模型的基本假设,造成结果错误
为了深入了解这一影响,让我们以一个例子来看看数据集里带异常值和不带异常值会有什么不同的效果。
** 例子:**
正如你所见,有异常值的数据集有着显著不同的平均值和标准偏差。在没有异常值的情况下,平均值是5.45。但有异常值的情况下,平均值上涨为30。这将完全改变预测结果。
如何检测异常值?
最常用的检测异常值的方法是可视化。我们可使用各种可视化方法,如箱形图,直方图,散点图(上面,我们就使用了箱形图和散点图)。一些分析师也凭一些经验来检测异常值。例如:
- 超出-1.5 x IQR 和 1.5 x IQR的值视为异常值
- 使用上限法。任何不在5%到95%之内的值都被视为异常值
- 与平均值相差三个或更多个标准方差的数据点,认为是异常值
- 异常值检测只是一般数据检测的一个特例,因此很多时候也取决于对业务的了解
- 双变量和多变量的异常值通常使用影响力指数或者距离来衡量。如马氏距离(Mahalanobis’ distance )和Cook’s D都是比较常用的异常值检测指数。
- 在SAS中,我们可以使用PROC Univariate, PROC SGPLOT来识别异常点及其影响。我们通常也会看看统计测量值,如TUDENT, COOKD, RSTUDENT等。
如何去掉异常值?
处理异常值的方法与处理缺失值的方法很类似,如删除、转换、合并,把他们作为一个单独的组,插补值以及其他一些可用的统计方法。现在,我们讨论一下处理异常值的一般方法:
删除异常值: 如果异常值是由于数据输入错误,数据处理错误导致的,或者异常值的数量非常少,我们可以删除含有异常值的样本。
转换和装箱值: 转换变量的值也可以消除异常值。一个值的自然对数可以减少极端值引起的变化。装箱也是一种变量转换。把异常值装箱后,决策树算法就可以很好的处理了。我们也用给不同的值分配不同权重的方法处理异常值。
插补法: 如同插补缺失值,我们也可以插补异常值。我们可以用均值,中位数,众数插补替换异常值。但要注意,在做插补之前,我们应该先分析一下异常值是自然异常还是人为异常。如果是人为的,我们才可以应用插补法。如同缺失值的处理,我们也可以构造一个模型来预测值异常值,然后用预测值替换异常值。
分别对待: 如果异常值很多,我们应该在统计模型中单独对它们进行处理。方法是把异常值和非异常值作为两组不同的群体,并分别为这两个群体建立模型,然后将两个模型的输出结合作为最终的输出。
到目前为止,我们已经学习了数据探索、缺失值处理以及异常值检测和处理。这3个步骤可以提高原始数据的可用性和准确性。让我们现在进入数据探索的最后阶段——特征工程。
4. 特征工程的艺术
什么是特征工程?
特征工程是从现有的数据中提取更多信息的科学(或者说是艺术)。在这个阶段,你没添加任何新的数据,但却让你已有的数据变得更有用。
假如,你在做一个根据日期预测购物中心人流量的项目。如果你直接使用日期,你可能无法从数据中提取有意义结论。这是因为人流量很少受日期的影响,而更多是受这是一周中星期几的影响。这个星期几的信息就隐含在你的数据中。你需要把它找出来,才能创建出更好的模型。
从数据中提取出有用信息的过程就是所谓的特征工程。
特征工程如何做?
一旦完成了数据探索中的前5个步骤——变量识别,单变量分析,双变量分析,缺失值处理和异常值处理, 你就可以开始特征工程了。特征工程本身可以分为2个步骤:
- 变量转换
- 变量/特征创建
这两种技术在数据挖掘中具有重要的作用,对模型预测能力有着显著的影响。下面我们了解一下每一步的细节。
什么是变量转换?
在数据建模中,转换是指用一个函数替换一个变量。例如,把一个变量x用它的平方根、立方根或者是对数替换。换言之,变量转换就是改变一个变量的分布或它与其他变量的关系的过程。
我们什么时候应该做变量转换?
在以下的情况下,变量转换很有必要:
当我们要改变一个变量的单位或者标准化一个变量的值以更好地理解这个变量时。如果数据的单位不同,这个转换是必须的。这种转换不会改变变量的分布。
当我们可以将复杂的非线性关系转化为线性关系时。变量之间的关系是线性的关系比非线性或曲线的关系更容易理解。转换可以帮我们将一个非线性关系转化为线性关系。散点图可以用来寻找两个连续变量之间的关系。这些转换也可以提高预测准确度。在这种情况下,对数变换是一种常用的变换技术。
- 对称分布比倾斜分布要好,因为它更容易解释和产生推论。有些建模技术要求变量服从正态分布。所以,当我们有一个倾斜的分布时,我们可以使用转换以减少倾斜。对于右偏态分布,我们可以取平方根、立方根或对数;对于左偏态分布,我们取平方、立方或指数。
- 有时为了方便实现,我们也需要做变量转换。举个例子,在我做的一个关于员工绩效的项目中,我发现年龄与员工的绩效有着直接的关系,比如年龄越大,绩效越好。从实现的角度,直接基于真实年龄来划分,后面的建模会很难。然而,将销售代理按年龄分三个组,小于30岁,30-45岁,大于45岁,然后对每组分别制定不同的策略,会是一个比较明智的做法。这种分类方法称为变量装箱(将变量变为分类变量)。
变量转换的常用方法有哪些?
变量转换的方法很多。上面的讨论中我们已经提到了一些,其中包括平方根、立方根、对数、装箱(分类)等许多方法。下面让我们详细地看一下这些转换方法的优点和缺点。
对数: 对数是一种常用的变换方法,它可以用来改变变量的分布形状。一般用于减少变量的右偏态分布。但是,它不适用于零或负数。
平方/立方根: 一个变量的平方和立方根也可以达到改变一个变量分布的效果。但没有对数变换那么明显。立方根的优势是可以应用于负数和零。平方根可以应用于正数和零。
装箱(分类): 它用来对变量分类。它可应用于原始值,百分比或频率。具体如何分类要基于对业务的理解。例如,我们可以把收入水平分为三类,即:高,中,低。我们还可以根据多个变量的值进行协变量装箱。
什么是变量/特征创建?它有什么好处?
特征/变量创建是指根据已有变量生成一个新的特征/变量。比如说,我们数据集中有个变量date(DD/MM/YY),我们可以由它生成一些可能与目标变量更相关的新变量,如日,月,年,周,星期几。这中手法可以把变量中的隐藏关系突出显示出来:
创造新特征的方法有很多。让我们来看一些常用的方法:
创建派生变量: 是指从现有的变量(使用函数转换或其他一些方法)创建新的变量。比如在Kaggle上的“Titanic”这个比赛,它的数据集中年龄变量有缺失值。在预测缺失值时,我们可以使用的名字中的称呼(主人、先生、小姐、太太)作为一个新的变量。那么,我们如何决定创建哪一个变量呢?坦白地说,这取决于分析师对业务的理解、他的好奇心以及他对这个问题的一系列假设。上面讲的变量转换的方法,如对数、装箱(分类)等方法也可以用来创建新的变量。
创建虚拟变量: 虚拟变量是把分类变量转换为数值变量最常用的方法。虚拟变量也称为指标变量。虚拟变量使得分类变量可以用于统计模型中。虚拟变量可以取值0和1。比如我们有个"gender"的分类变量。我们可以为它创建两个虚拟变量,即“var_male”(其中1表示是男性,0表示不是男性)和“var_female”(其中1表示女性,0表示不是女性)。同样,我们也可以给有多种分类的分类变量创建N个或N-1个虚拟变量。
要想了解更多,可以看看这个文章:5 Simple manipulations to extract maximum information out of your data
尾注
正如一开始所提到的,在数据探索方面的质量和努力将决定一个模型好坏。
数据探索和准备指南到此已经结束了。在这个完全指南中,我们详细地讨论了数据探索的七个步骤。本文的目的是为数据科学中这个非常重要的过程,提供一个深入和详细的指导。