Exploratory Data Analysis: Descriptive Statistics, Visualization, and Preprocessing
探索性数据分析思想概述
数据分析是什么
数据分析 是一个统计学的新方向 缺少一个准确的定义
- 它不要求我们给方法的不确定度一个准确的度量,这在经典的统计学中的参数估计,假设检验中都是不可缺少的;
- 它重视方法的抗干扰性(稳健性) 和效率达到了同一个水准
现有的数理统计学 对度量不确定性非常的重视 但是他们为了这样精确的度量往往依赖于各种假设,随后导致数理统计学重理论而轻应用;
数据分析的出现,是对这个思想的一次改变,我们将事情的重心转移到了让数据说话之上,用一些不太正式的手法处理我们的数据,为后面的证实阶段提供基础,不再考虑为他们的不确定性的准确的度量
——陈希孺 探索性数据分析中文版序
探索性数据分析是什么
简单来说:探索性数据分析是连接经典的统计分析和流行的数据挖掘与机器学习(也是经典统计学中建模的那些内容)的一座桥梁
他的作用只有一个,就是让我们理解数据,从不同的角度了解数据
EDA(exploratory data analysis)属于统计学的一个新兴部分,与之相对的概念是 CDA 验证性数据分析
数据分析分为两个阶段,探索性的和验证性的,我们只有交替使用才能给出正确的分析结果
这种探索没有预设观点和假设,而是希望使用探索的结果来提出一些观点和假设用于后续的建模 也就是CDA,两者是不可分离的
非常明显的,EDA应该属于一种非参数的方法
EDA中都有什么内容
科学可视化是EDA中相当重要的一个部分 它隶属于统计图形的范畴 我们在 R 统计可视化 中进行单独的介绍
描述性统计作为统计学导论的内容 我们也进行单独的研究 描述性统计与可视化 我们原本可以把这些内容全部归类到EDA中
概率密度估计的主要部分都在描述性统计中进行了介绍。至于更深一步的验证工作,则属于非参数统计的范畴,可以结合描述性统计与可视化中的分布形状内容一起理解。
数据预处理也应该属于 EDA 的内容,它是后续数据分析的基础,本文后面会单独介绍。
除此以外,特征工程也是机器学习领域的重要预处理方法,它包括特征筛选、特征构造和降维等内容。
探索性数据分析的特性
根据 David 和 Tukey 出版的 Understanding Robust And Exploratory Data Analysis 对探索性数据分析做过介绍
Robust 在目前的工业界被翻译成鲁棒性 陈忠琏教授翻译为 耐抗性 有时我们也把它称为稳健性 在这里我们不纠结翻译的细节 其核心意义在于
稳健性要求数据分析方法对数据的局部不良的不敏感性 这种不良在局部,但是可能变化巨大
那么探索性数据分析和稳健性有什么联系? 稳健性和探索性数据分析是整体而非泾渭分明 稳健性是我们对探索性数据分析的要求 所有的探索性数据分析方法都应该尽量对异常不敏感
因此 分位数作为高稳健性数字特征的代表在EDA中的使用非常的广泛 ,包括五数概括 箱线图 分位差 等等手段 这些我们在描述性统计的EDA部分有过介绍 描述性统计与可视化中的 EDA 离散度量内容 描述性统计与可视化中的集中趋势度量内容
Know our Data
描述性统计
描述性统计分析是了解数据的最基本方式 它在经典统计学中就被我们研究过了 描述性统计与可视化
数据可视化
除此以外 数据可视化技术也是EDA的重要一部分 R 统计可视化
数据预处理
数据预处理的基本介绍与常见问题
数据预处理的基本介绍
在开篇之前 我们先来一张图体现数据挖掘(数据分析)全流程

预处理数据是数据挖掘工作中最基础的内容,但也恰好是数据挖掘中最耗费时间的一部分,是 Kaggle 等数据科学平台容易弱化的一部分,里面包含着大量工作。
数据和特征决定了机器学习的上限,而所选模型和算法只是去逼近这个上限 这就是特征工程和本文的数据预处理部分的作用
数据预处理的常见问题
这里我们回应为什么要做数据预处理 预处理针对哪些情况进行
对于数据对象,我们能得到未经处理的特征(属性),这时的特征可能有以下问题
- 不属于同一量纲:即特征的规格不一样,不能够放在一起比较(统一单位)
- 信息冗余:对于某些定量特征,其包含的有效信息为区间划分,例如学习成绩,假若只关心“及格”或 “不及格”,那么需要将定量的考分,转换成“1”和“0”表示及格和未及格(定量转定性)
- 定性特征不能直接使用:某些机器学习算法和模型只能接受定量特征的输入,那么需要将定性特征转换为定量特征(定性转定量)
- 存在缺失值:缺失值需要补充(补充缺失)
- 当数据维数过高时,还会存在所谓的“维数灾难(Curse of Dimensionality)”问题 (数据降维) 我们留在特征工程中再讨论特征工程中的数据降维内容
特征提取与类型转换
想要预处理数据,首先需要得到数据。实验或业务系统中拿到的大量数据,往往有很大一部分对研究问题没有直接作用,并且经常是非结构化的。此时就要进行数据挖掘工作的第一步:特征提取与类型转换。
创建一组可供分析师使用的特征数据,将特征数据转换为统一的表达形式
如何进行特征提取取决于我们要解决的问题,往往还依赖分析师的经验,至于类型转换 我们有一些经验可以遵循 这些内容仅供参考
| 源数据类型 | 目标数据类型 | 方法 |
|---|---|---|
| 数值型 | 类别型 | 离散化 |
| 类别型 | 数值型 | 二元化 |
| 文本 | 数值型 | 潜在语义分析(LSA) |
| 时序 | 离散序列 | 符号聚合近似(SAX) |
| 时序 | 多维数值型 | 离散小波变换(DWT);离散傅里叶变换(DFT) |
| 离散序列 | 多维数值型 | 离散小波变换(DWT);离散傅里叶变换(DFT) |
| 空间 | 多维数值型 | 二维 DWT |
| 图 | 多维数值型 | 多维标度(MDS);图谱转换 |
| 任何类型 | 图 | 相似图(可用性较有限) |
作为强经验依赖的内容 这里不展开介绍了 在不同的领域都有自己的方案 没有通用的方法
常见数据预处理方法
我们后面将介绍下面的数据预处理方法 这里一定不是完全的,因为很多方法都在其他课程内容中学习 这里加入链接即可
- 数据清洗:数据清洗处理数据的某些记录值缺失,平滑数据中的噪声、发现异常值,改正不一致等
- 数据融合:将不同来源的、异质的数据融合到一起。良好的数据融合可以减少数据中的冗余和不一致性,进而提升后续步骤的精度和速度
- 数据转换:通过平滑聚集,数据概化,规范化等方式将数据转换成适用于数据挖掘的形式
- 数据降维:将高维度数据化为低维度数据,仍保持原数据的大部分信息,使数据挖掘结果与降维前结果相同或几乎相同
相关的理论支撑
Codd 关系代数第三范式:整理数据是为了让数据的结构布局有含义,也就是说
- 每个特征都在一列中
- 每个实例都在一行中
- 每种特征都应该只存在一个表中
- 如果特征存在于多个表中,那么就有一列把它们连接起来 这就是我们为什么要整理数据
数据清洗(Data Cleaning)
我们直接介绍需要干的事情就好了
缺失值处理
缺失值在实际数据中是不可避免的问题,对于不同的数据场景应该采取不同的策略,首先应该判断缺失值的分布情况
- 如果缺失值极少且这个维度信息不重要,一般删除它们对于整体数据情况影响不大;
- 如果缺失值较多或这个维度的信息还很重要的时候,直接删除会对后面的算法跑的结果造成不好的影响,我们需要考虑插补数据了
缺失一般分为三类
- 完全随机缺失MCAR(和任何其他变量与自己无关的缺失)
- 随机缺失MAR (和其他观测变量相关的缺失)
- 非随机缺失MANR(和自己的取值相关的缺失)
其中 MAR最普遍 我们一般假设这种情况 只有这样基于建模插补才是可行的
均值或中位数填充
它不会减少样本信息,处理简单,但是当缺失数据不是随机数据时会产生偏差; 对于正常分布的数据可以使用均值代替,如果数据是倾斜的,使用中位数可能更好
插补技术思想
- 随机插补法——从总体中随机抽取某个样本代替缺失样本;
- 多重插补法——通过变量之间的关系对缺失数据进行预测,例如利用蒙特卡洛方法生成多个完整的数据集,最后对分析结果进行汇总处理,这是一种相对稳健的插补技术,非常的推荐
- 热平台插补——在非缺失数据集中找到一个与缺失值所在样本相似的样本(匹配样本)利用其中的观测值对缺失值进行插补 也就是 临近插补
建模插补技术
可以用回归等基于推理的工具归纳确定。
例如,利用数据集中其他数据的属性,可以构造一棵判定树(回归方程),来预测缺失值的值
一般是综合各种建模插补技术进行多重插补(Multiple Imputation,简称MI)
保留缺失技术
- 如果是分类问题,缺失可以作为一种类别被使用
- 如果模型愿意接受NA的存在,保留NA作为缺失嵌入给后面的模型
缺失有时候是一种信息
对于随机缺失,我们只能使用插补的手段来处理。但是对于很多涉及非纯数据挖掘的问题,缺失很多情况下存在规律性,比如某个业务部分的工作失误产生的缺失,收集数据的手段本身存在问题产生了缺失,如果可以发现缺失产生的原因的话,我们可以重新针对性的处理数据来填补缺失,甚至有时候缺失数据就可以通过其他已有的数据进行非常可信的推算。
还有的时候,缺失本身也是一种可以考虑的信息。将缺失本身作为一种信息纳入模型也是有价值的,某些数据的缺失暗含了用户本身的特征。
异常值处理
异常值我们通常也称为“离群点”(outlier),即在样本空间中,与其他样本点的一般行为或特征不一致的点。一般可能有如下产生原因:
- 计算的误差或者操作的错误所致(错误数据)
- 数据本身的可变性或弹性所致(真实的特殊数据)
离群点不一定是无用数据,它也许正是用户感兴趣的,比如在欺诈检测领域,那些与正常数据行为不一致的离群点,往往预示着欺诈行为,因此成为执法者所关注的。
对于离群值我们的处理方案也不唯一
- 删除离群是最常见的处理方法
- 如果确实想保留这个样本 我们一般采用视为缺失后的插补方法
- 如果算法对离群不敏感 不处理离群值也是可以的
基于统计分布的离群点检测
这类检测方法假设样本空间中所有数据符合某个分布或者数据模型,然 后根据模型采用不和谐校验( discordancy test )识别离群点
正态分布的 原则 使用箱线图进行离群点检测都属于这个范畴
基于距离的离群点检测
正如我们基于距离进行聚类分析一样,那些孤独的类可以被视为离群点。这里可以参考机器学习中关于距离计算与层次聚类的内容。 实际使用中,那些离其他点距离过远的点会被视为离群点。
基于密度的离群点检测
类似地,也可以从密度聚类的角度理解离群点。 实际使用中,那些密度过低的点会被视为离群点。这种方法可以同时检测出全局离群点和局部离群点。
数据去重
数据重复在实际生活中很常见,在一些数据挖掘模型中,这些冗余的数据加大了数据分析的难度和处理速度,因此需要对数据去重
常见的方法有
- 遍历数据搜索——复杂度高,仅适用于数据规模较小的情形
- 哈希表示——生成数据指纹,简单高效,适用于大规模数据,代表算法:
- Bitmap:位图法;
- SimHash:相似哈希;
- 布隆过滤器
很多模型并不需要数据去重工作
数据去噪
噪声,是被测量变量的随机误差或方差;大部分数据挖掘方法都将离群点视为噪声或异常而丢弃,但确实有专门研究噪声的数据挖掘方法
观测量(Measurement) = 真实数据(True Data) + 噪声 (Noise)
常见数据去噪方法有
- 分箱法:考察数据的“近邻”(即周围的值)来光滑有序数据值
- 回归法:用一个函数拟合数据来光滑数据,能够帮助消除噪声
大部分模型(尤其统计模型)并不需要数据去噪工作
数据融合(Data Integration)
我们还是介绍需要做一些什么
数据融合将不同来源的、异质的数据融合到一起。良好的数据融合可以减少数据中的冗余和不一致性
在实际的使用中 数据融合往往根据数据的情况来决定 比如:实体识别问题(Entity Identification Problem):尝试匹配不同的数据源中指向现实世界相同实体的纪录
更多的内容这里不再介绍了
数据转换(Data Transformation)
数据转换有着很庞大的内容 他们的目的都是将数据从一种表示形式变为另一种表现形式,满足数据挖掘的条件
这里我们介绍一些比较基本的数据转换方法 实际上在统计学中数据变换已经成为了一门学科 有着非常多的研究
常见的数据转换方法大致可分为如下几类:
- 离散化
- 二值化
- 归一化与标准化
- 特征编码
离散化
有些数据挖掘算法,特别是某些分类算法,要求数据是分类属性形式或者分类形式可以有效提升算法工作效率
这样,常常需要将连续属性变换成分类属性(离散化,discretization),并且连续和离散属性可能都需要变换成一个或多个二元属性
常见离散化方法有:
- 无监督:分箱法(等宽/等频)、直观划分,中位数分组 等
- 有监督:chimerge法 MDPL法,CAIM法等 监督离散化方法是对那些缺少直觉和领域知识的FE工作者的好方法
我们提示过离散化要谨慎R 统计可视化中关于谨慎处理数据的讨论,但此时我们必须离散化,保持警惕就好
分箱法的一种习惯规则如下
- 组数在5到20之间 数据越多分组数越多
- 组距尽可能相同(等频分组时除外)
- 组距尽可能选取奇数,当然根据情况选偶数也可以
- 最小组下限 最大组上限覆盖全部个体,但也要尽可能避免溢出过多
- 尽量避免使用只有上限或者只有下限的分组
二值化
特征二值化是把数值特征转化成布尔值的过程,其核心在于设定一个 阈值,大于阈值的赋值为 1(true),小于等于阈值的赋值为 0(false)
归一化与标准化
归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为 无量纲的表达式,成为标量
标准化旨在统一数据量纲 提升算法可解释性,于此同时,在那些需要梯度下降的算法中,统一量纲有助于加速梯度下降的收敛。
在传统机器学习与统计学中,归一化与标准化是必不可少的;在深度学习领域,我们还研发出了更多中归一化方法来帮助梯度下降的执行。
常见的方式有
- 基于极值归一化: 会导致异常值被挤压到小区间,所以应在处理完异常值之后进行
- 绝对值最大归一化:
- z-scores变换:
- 十倍缩放:
- Robust scaling :
- 范数归一化:
数据合并
离散化将原本连续的数据变为多个分类指标,降低了类别的颗粒度,于此同时降低了模型运算的开销。
数据合并是针对离散型数据的又一次离散化。有时候分类数据的类别过多,可能存在上百个类别,这样使用特征编码后会得到过多变量。
数据合并的目标是降低变量类别的数目。常见方法有:
- 根据我们对变量的理解,将某些类别手工的合并
- 对于那些占比低于百分之二十(习惯规则)的类别,将他们全部合并为一个OTHERS类别,这个类别也可以作为插补的手段,也就是稀疏类别合并
特征编码
特征编码是针对分类自变量产生的思想 我们在广义线性回归中关于分类自变量与虚拟变量的问题中进行讨论
数据变换
在非常多的情况下 我们需要对原始数据进行一定变换才能更好的体现数据特征;这往往是因为 原始数据具有
- 强非对称性
- 大量离群值
- 对简单模型的拟合呈现了大并且非偶然的残差
- 箱线图衍生的中位数与四分位差图体现了他们两者的相依关系 我们希望通过对原始数据进行一些形状上的调整 来让进一步的分析更加的合理 后面我们会介绍 什么时候需要变换 做什么样的变换等等 变换 是一个非常广义的概念 映射为常数 映射为次序量 都算是变换 但是我们在后面只研究一类特殊的变换 他要求
- 中位数次序保持不变
- 连续且光滑的函数
- 初等函数就可以构造形成 以有简单的计算形式 变换是有代价的,并不是所有时候变换都能带来好处
幂变换
定义 幂变换有下面的表达形式
里面的参数可以比较自由的选取 但是需要保证满足我们前面要求的变换的性质 幂变换有下面三种比较常用的形式
做变换的理由
数据的内在要求
比如我们有时候希望把摄氏度转化为华氏度,把人口的数量进行对数化(因为增长是指数的),这些变化基于数据本身的特征 往往依赖于我们对这一类数据研究的经验 进行他们可以有益于进一步的分析
为对称性变换
箱线图和偏度系数可以告诉我们数据是否存在系统性的偏斜,这往往是我们不希望的 所以要研究数据如何对称化
- 基本的 我们会尝试平方根变换 也就是
- 如果尽管如此还是不够对称 我们考虑对数变换 也就是
- 对数变换一般也可以用 代替
为了消除四分位差和中位数的依赖性
消除这种依赖性往往被认为更适合进行直观的探索性的分析
为了构造变量的近似线性关系
近似线性的模型更加容易的进行简单的拟合 进而分析残差
什么时候变换是值得的
我们并没有一个严格确定的标准 下面是一些参考的分析方式
- 最大数据值和最小数据值的比较大 一般认为是20以上
- 该领域有进行这样变换的习惯
- 残差较大并且呈现了某种规律
从习惯出发时变换最广泛的应用
Box-Cox变换
Box-Cox变换的意义是让前面的线性回归模型符合我们需要的所有假设 它包括Gauss-Markov假设 线性相依假设 正态误差假设 实际上这是对回归诊断出现问题后的一个修正方式 注意,Box-Cox 变换不是单一变换,而是一个变换族。 Box-Cox变换族的整体表示
明显的 选择怎么样的Box-Cox变换的核心是选择合适 事实上 我们并没有解析的方式来得到一个稳定的 在实际的操作中 我们会选择大量的 分别进行非常多的Box-Cox变换 根据各种信息量准则确定 我们此时的核心目标只有
- 方差齐
- 满足正态性假设
马氏距离变换:马氏距离是通过旋转坐标轴后的欧式距离实现的,可以消除自相关性
- Title: Exploratory Data Analysis: Descriptive Statistics, Visualization, and Preprocessing
- Author: Hyacehila
- Created at : 2024-02-29 13:41:47
- Link: https://hyacehila.github.io//blog/2024/02/29/exploratory-data-analysis-learning-notes/
- License: This work is licensed under CC BY-NC-SA 4.0.