《4-3-1数据清洗与预处理教学课件PPT.pptx》由会员分享,可在线阅读,更多相关《4-3-1数据清洗与预处理教学课件PPT.pptx(34页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、4-3-1数据清洗与预处理弘 德 明 志 博 学 笃 行第第4 4章章 数据处理和分析数据处理和分析-Pandas-Pandas第第0606讲讲 数据清洗与预处理数据清洗与预处理主讲人:马学强弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行数据预处理在现实世界中,由于数据采集、数据存储、数据操作等诸多方面的原因,可能使得数据缺少某些感兴趣的属性值,存在名称或代码的差异以及错误或异常的值等,即数据通常是不完整的、不一致的、有噪声的、低质量的。因此,通过数据预处理,将来源于多个异构数据源的原始数据转换为高质量的、可以理解的数据格式,以符合和满足问题的数据需求是必要的。为什么要进行数据预
2、处理?弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行数据预处理选取合适的数据子集,使数据的行、列标识意义明确,便于理解和使用;缺失数据的检测、滤除或填充,使得信息更加完整;重复数据处理,包括记录重复、特征重复两种类型,可消除其中的数据冗余,优化存储空间;异常值处理,更多地表现为离群值或不良数据,一般采用删除的方式处理,但在删除之前,必须弄清这些数据产生的原因,避免对数据分析结果的误判;数据转换主要指数据类型转换,数据映射、数据的离散化和哑变量处理,其主要目的是降低内存消耗;数据匹配是对信息主体拥有的数据项进行比对和差异分析,主要有模糊匹配、正则表达式匹配两种方式;数据规范化是为消
3、除作为评价指标的数据特征之间的量纲和取值范围(数量级)差异的影响,以保证结果的可靠性。数据清洗的主要表现:弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行数据预处理数据预处理主要表现为数据清洗,是占据数据科学工作者大约80%精力的一项繁琐工作;数据清洗的脚本代码可使用函数方式编写,不仅结构简单清晰,而且可以大大减少重复性工作,节省数据清洗的成本。数据清洗的实践,情况复杂,涵盖各行各业的场景。需要具备严谨的态度和所研究领域全面、系统的知识,需要在数据科学探索的道路上不断积累成功和失败的经验,才能最终成为一名合格的数据清洗专家。弘 德 明 志 博 学 笃 行Contents目录01检测
4、和处理缺失值检测和处理缺失值检测和处理重复值检测和处理重复值02检测和处理异常值检测和处理异常值03弘 德 明 志 博 学 笃 行01检测和处理缺失值缺失值是指数据中不完整的某个或某些特征值。造成数据缺失的原因很多:疏忽或遗漏; 有意保留; 特征不存在数据缺失在很多数据应用场景中都会碰到,甚至是不可避免的。缺失值一般用NA(Not Available)表示,Pandas中的浮点值NaN(Not a Number)、Numpy中的nan、Python内置的None值都可以被视为NA。弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行检测缺失值Pandas使用isnull()、notnu
5、ll()分别用于识别缺失值和非缺失值,两种方法均返回布尔值True和False。结合sum()等统计函数,可以检测缺失值的分布、缺失值的数量。以某电商公司简单的交易数据(customer.xlsx)为例,说明缺失值的检测。 data=pd.read_excel(customer.xlsx) #读取Excel文件的数据,返回DataFrame对象 data.shape #DataFrame对象的行列数为(3000, 6) data.isnull() #检测数据集中的缺失值 data.isnull().sum(axis=0) #按列统计各特征的缺失值数量 data.isnull().sum(axi
6、s=0)/data.shape0 #按列统计缺失值占比率通过对数据中缺失值的检测和统计,可以得出一些基本的结论。但在进行数据清洗时,最好直接对缺失数据进行分析,以判断数据缺失是不是由于数据采集的问题,缺失数据会不会导致数据分析的偏差。弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行滤除缺失值缺失值的滤除,可以使用Pandas提供的dropna()方法,其语法如下:dropna(axis=0, how=any, thresh=None, subset=None, inplace=False)该方法在Pandas的Series和DataFrame对象上都可以使用,但功能会有较大差别。对
7、缺失值的处理,最简单直接的方式就是滤除缺失值,这种方法在样本数据量非常大且缺失值较少的情况下是非常有效的。缺失值的滤除,也会带来如下问题: 通过减少历史数据以换取完整的信息,可能会牺牲大量数据或丢失很多隐藏的重要信息; 在缺失数据量比较大的情况下,直接删除可能会导致数据的分布规律发生偏离,如原始数据符合正态分布,滤除缺失值后变为非正态分布。弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行滤除缺失值示例from numpy import nan as NAdata=pd.Series(2,NA,3.5,None,7.6) #定义系列对象data.dropna() #滤除缺失值,等价于
8、datadata.notnull()df=pd.DataFrame(name: Alfred, Batman, Catwoman, #创建对象 toy: NA, Batmobile, Bullwhip, born: pd.NaT, pd.Timestamp(1940-04-25),None) df.dropna() #滤除含有缺失值的所有行 df.dropna(axis=1) #按列滤除缺失值,默认axis=0(按行) df.dropna(how=all) #行中所有值均为缺失值,则滤除 df.dropna(thresh=2) #行中缺失值有2个及以上,则滤除 df.dropna(subset
9、=name,born) #对指定的列进行滤除 df.dropna(inplace=True) #真正滤除对象内部的缺失值弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行填充缺失值-替换法要填充缺失值,按照要填充缺失值,按照数据类型的不同数据类型的不同,可以采取以下两种替换方法:,可以采取以下两种替换方法: 数值型:通常用特征的均值(mean)、中位数(median)和众数(mode)等描述其集中趋势的统计量来填充缺失值。如一个班级的同学,其缺失的身高值可以用全班同学身高的平均值或中位数来填充。 类别型:通常用众数填充。如一个学校的同学,男生、女生的人数分别为500人、50人,则特征
10、的缺失值可以用人数较多的男生来填充。这种方法虽然简单,但是准确性不高,可能会引入噪声,或者可能会改变特征原有的分布规律。对缺失值的填充,可采用替换或插值的方法等。其中,替换是使用数据中非缺失数据的相似性进行填充,插值则是对数据中的特征进行建模以决定填充的缺失值。弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行填充缺失值-替换法 热卡法(hot deck imputation):对于一个包含缺失值的变量,在数据集中找到一个与它最相似的对象,然后用这个对象的值进行填充。这种方法常用相关系数矩阵来确定变量之间的相似性,然后用最相似变量的值来替换缺失值。这种方法概念简单,利用数据间的关系来
11、进行缺失值估计,但难以定义相似标准,主观因素较多。 K-均值聚类法(k-means clusting):将所有样本进行k-近邻聚类划分,然后再通过划分的种类的均值对各类的缺失值进行填充。这是一种无监督机器学习的聚类方法。使用这种方法对缺失值进行填充,其准确性取决于聚类结果的好坏,而聚类结果受初始选择点的影响变化大,适用于短时间内变化不大的变量。缺失值的填充,也可采用近似值替换缺失值的方法,主要有热卡法或k-近邻聚类法两种。注意:近似值的判定,针对不同的问题会选用不同的标准。弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行填充缺失值-替换法示例 from numpy import n
12、an as NA #将numpy.nan定义为缺失值标记NA df = pd.DataFrame(NA, 2, NA, 0,3, 4, NA, 1,NA, NA, NA, 5,NA, 3, NA, 4, columns=list(ABCD) #创建DataFrame对象 df.fillna(df.mean() #用均值填充缺失值 df.fillna(method=ffill) #按列从第1个非NaN值开始向前填充 values = A: 0, B: 1, C: 2, D: 3 #定义字典 df.fillna(value=values) #按字典键值对关系分别填充各列 df.fillna(val
13、ue=values,limit=1) #按字典键值对,填充各列中第1个NaN在大多数情况下,缺失值的替换可以使用DataFrame.fillna()方法,其语法如下:fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, *kwarg)弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行填充缺失值-插值法比较常用的插值法有线性插值、多项式插值和样条插值等,如下:线性插值:是一种较为简单的插值方法,它针对已知的值求出线性方程,通过求解线性方程得到缺失值。多项式插值:是利用已知
14、的值拟合一个多项式,使得现有的数据满足这个多项式,再利用这个多项式求解缺失值,常见的多项式插值法有拉格朗日插值和牛顿插值等。样条插值:是以可变样条来作出一条经过一系列点的光滑曲线的插值方法,插值样条由一些多项式组成,每一个多项式都是由相邻两个数据点决定,这样可以保证两个相邻多项式及其导数在连接处连续。从拟合结果来看,多项式插值和样条插值在大多数情况下拟合都非常出色,线性插值法只在自变量和因变量为线性关系的情况下拟合才较为出色。在实际的数据处理和分析中,满足线性关系的情况比较少,因此多项式插值和样条插值是较为合适的选择。在缺失值的处理上,直接滤除缺失值简单易行,但是会引起数据结构的变动和样本数量
15、的减少;缺失值的替换方法理解相对容易,使用难度较低,但是会影响数据的标准差,导致信息量变动。因此,在数据缺失值的处理上,可以使用另一种常用的方法,即插值法。弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行填充缺失值-插值法示例 s = pd.Series(0, 1, np.nan, 3) #创建Series对象 s.interpolate() #线性插值 s = pd.Series(None, single_one, None, fill_two_more, None, None, None, 4.71, np.nan) #创建Series对象 s.interpolate(meth
16、od=pad, limit=2) #用已经存在的值填充邻近的NaN s = pd.Series(0, 2, np.nan, 8) #创建Series对象 s.interpolate(method=polynomial, order=2) #多项式插值,次数为2 df = pd.DataFrame(0.0, None, -1.0, 1.0), (None, 2.0, None, None),(2.0, 3.0, None, 9.0), (None, 4.0, -4.0, 16.0), columns=list(ABCD) #创建DataFrame对象 df.interpolate(method=
17、linear, limit_direction=forward, axis=0) #使用线性插值法,按列向前填充缺失值 dfD.interpolate(method=polynomial, order=2) #使用多项式插值,次数为2Pandas库提供了interpolate()方法进行缺失值的插值填充,适用于Series和DataFrame对象,其语法如下:interpolate(method=linear,axis=0,limit=None,inplace=False,limit_direction=forward, limit_area=None, downcast=None, *kwa
18、rgs)注:在使用多项式插值或样条插值方法时,必须指定多项式或样条的次数,且只能适用于索引(index)为数值型(numeric)或日期时间型(datetime)的数据。弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行填充缺失值-小结 Python的外部扩展库SciPy,其中的interpolate模块提供了更为丰富的插值方法,除常规的一维、二维插值方法外,还提供了如在图形学领域具有重要作用的重心坐标插值(BarycentricInterpolator)等。在实际应用中,需要根据不同的场景,选择合适的插值方法。 对缺失数据的填充处理,除替换和插值这两种方法外,针对具有随机特性的数据
19、集,按照数据缺失的机制、模式及变量的类型,还可以使用最大似然估计(maximum likelihood estimation)、蒙特卡洛(Monte Carlo)方法、随机森林等方法,拟合预测数据的缺失值。可在将来的数据挖掘(Data Mining)中进一步学习。对缺失值的填充,做如下总结:弘 德 明 志 博 学 笃 行02检测和处理重复值弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行检测和处理重复值检测和处理重复值的意义由于数据分布、数据共享等原因,在数据的采集和处理过程中,会产生大量的重复数据,大大增加存储成本。对重复数据的有效检查和删除,在不损坏数据保真度或完整性的前提下,
20、可降低冗余数据对存储成本的影响,以优化和节省更多存储空间。重复值表现为记录重复、特征重复两种类型。弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行记录重复记录重复值的检测和滤除如果对数据集按行检测,存在多行,其一个或多个特征的值完全相同,则称为记录重复。Pandas提供了DataFrame、Series对象的duplicated()和drop_duplicates()方法,分别用于重复值的检测和删除,其基本语法如下:duplicated(self, subset=None, keep=first)drop_duplicates(self, subset=None, keep=fir
21、st, inplace=False)说明如下: 默认情况下,两条记录的所有特征都相同时,则视为重复。也可以使用subset参数指定某个或某些特征是否重复; 支持从前向后(keep=first)或从后向前(keep=last)两种方式进行重复值检测,默认为first; 参数inplace表示是否在原数据集上操作,默认为False; 方法不会改变数据集的原始排列,且具有代码简洁和运行稳定的特点。弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行记录重复-示例以全球最大的P2P(Peer to Peer)线上金融平台Lending Club 样例数据为例,使用duplicated()和dr
22、op_duplicates()方法进行记录重复值的检测和删除。member_id loan_amnt gradeemp_lengthannual_incissue_dloan_statusopen_acctotal_pymnttotal_rec_int012965995000B-B210+ years24000.002016/1/15Fully Paid35863.155187863.1611311748NaNB-B51 yearNaN2016/6/16Current153581.1200001042.85213135242400C-C510+ years12252.002016/6/14Fu
23、lly Paid23005.666844605.6731277178100000C-C110+ years49200.002016/1/15Fully Paid1012231.8900002214.9241311748NaNB-B51 yearNaN2016/6/16Current153581.1200001042.85513114415000A-A43 yearsNaN2016/1/15Fully Paid95632.210000632.2161304742NaNC-C58 years47004.002016/5/16Fully Paid710137.8400103137.847128868
24、63000E-E19 years48000.002016/1/15Fully Paid43939.135294939.1481306957NaNF-F24 yearsNaN2016/4/12Charged Off11646.020000294.94913067215375B-B51 year15000.002016/11/12Charged Off21476.190000533.4210 13052016500C-C35 years72000.002016/6/13Fully Paid147678.0176731178.0211 130500812000B-B510+ years75000.0
25、02015/9/13Fully Paid1213947.9891601947.9912 1306957NaNF-F24 yearsNaN2016/4/12Charged Off11646.020000294.9413 13049563000B-B13 years15000.002016/1/15Fully Paid113480.269999480.2714 130350310000B-B23 years100000.002016/10/13Charged Off147471.9900001393.4215 13048711000D-D11 year28000.002016/1/15Fully
26、Paid111270.716942270.7216 129969910000C-C44 yearsNaN2016/1/15Fully Paid1412527.1500002527.1517 130488436A-A110+ years110000.002016/5/13Fully Paid203785.271965185.2718 13048711000D-D1 data=pd.read_excel(“loandata.xlsx”) #打开Excel文件,返回DataFrame对象 data.duplicated() #检测完全相同的重复记录,有重复时对应索引号为True data.dupli
27、cated(subset=loan_amnt,grade,keep=last) #指定部分特征,按从后向前判断是否重复 data.drop_duplicates() #删除重复的记录注:删除记录并不会影响原文件loandata.xlsx中的数据。若要删除原文件loandata.xlsx中的数据,可以设置inplace=True。弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行特征重复如果数据集按列检测,存在一个或多个特征名称不同,但数据完全相同的情况,则称为特征重复。弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行特征重复-示例连续型重复特征的检测和去除,可以利用特征间
28、的相似度计算,将两个相似度为1的特征去除其中的一个。在Pandas中相似度的计算可使用DataFrame对象的corr()函数,其语法如下:corr(self, method=pearson, min_periods=1)使用该函数计算相似度时,默认的方法为“pearson” ,可以通过“method”参数设置为“spearman”法和“kendall”法。 df=pd.DataFrame(0.2,0.3),(0.0,0.6),(0.6,0.0),(0.2,0.1),columns=dogs,cats) #定义DataFrame对象 df.corr(method=pearson) #使用相关系
29、数计算相似度 def cosine_similarity(x,y): #定义余弦相似度函数 numerator=sum(a*b for a,b in zip(x,y) denominator=np.linalg.norm(x)*np.linalg.norm(y) return round(numerator/float(denominator),3) df.corr(method=cosine_similarity) #调用自定义函数计算相似度dogscatsdogs1.000000-0.851064cats-0.8510641.000000dogscatsdogs1.0000.178cats
30、0.1781.000弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行特征重复-示例通过相似度矩阵去除重复特征时,大多针对数值型重复特征去重,而类别型特征之间无法通过计算相似系数来衡量相似度,该方法的使用存在局限性。对某一数据子集而言,可以使用相似度矩阵进行特征去重。若要考虑在不同数据子集之间是否存在特征重复,可以通过DataFrame.equals()方法。只有当两个DataFrame对象中的数据完全相同时,equals()方法的返回值才为True。 df1 = pd.DataFrame(A:1,2,3, B:4,5,None, C:7,8,9) df2 = pd.DataFram
31、e(A:1,2,3, B:4,5,None, C:7,8,9) df1.equals(df2) #比较两个DataFrame对象是否相同在将来的机器学习中,我们可以探讨更多的特征选择方法,如过滤法(Filter)、封装式(Wrapper)、嵌入式(Embedded),以寻找到最优特征子集,剔除掉不相关或冗余的特征,提高模型精确度,并能够协助理解数据产生的过程。弘 德 明 志 博 学 笃 行03检测和处理异常值弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行异常值异常值产生的原因异常值是指数据中存在不合理的个别值,该值明显偏离其余值,有时也称为离群点。产生异常值的主要原因包括人为错误
32、和自然错误两大类,如数据录入错误属于人为错误,而数据采集过程中由于外部干扰产生的噪声数据则为自然错误。异常值的存在对数据分析十分危险,如果计算分析过程的数据有异常值,那么会对结果会产生不良影响,从而导致分析结果产生偏差乃至错误。异常值的存在,在某些场景下也会引起分析者的极大兴趣,具有积极的意义。如疾病预测中,相对于健康人的身体指标,若有人的身体指标出现异常,很可能会成为疾病预测的一个重要起始点。在信用欺诈、网络攻击等场景中,也会有类似的应用。弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行异常值的检测方法1. 1.简单统计简单统计简单统计可通过观察数据的统计性描述或散点图来发现异常
33、值。在Pandas中,可使用DataFrame对象的describe()方法和plot()方法来实现。一般异常值的检测方法有基于统计的方法、基于聚类的方法以及专门检测异常值的方法等,比较常用的异常值检测方法主要为简单统计、3原则和箱型图分析三种方法。弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行异常值的检测方法数值分布数值分布在数据中的占比在数据中的占比0.68270.95450.9973弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行异常值的检测方法3原则检测和去除异常值示例 data=pd.DataFrame(np.random.randn(1000,4) #生成
34、数据子集 data.describe() #数据集的简单统计,观察数据的基本统计特征 avg=data.mean() #获取到数据的平均值 std=data.std() #获取到数据的标准差#在布尔型DataFrame对象中使用any()方法,选出数据集中超出区间(-3,+3)的全部行。 data(abs(data-avg)(3*std).any(1)#将数据集中的值限制在区间(-3,+3)以内。 dataabs(data-avg)(3*std)=np.sign(data-avg)*(3*std)弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行异常值的检测方法3. 箱型图分析箱型图
35、提供了识别异常值的一个标准,即异常值通常被定义为小于QL-1.5IQR或大于QU+1.5IQR的值。QL称为下四分位数,表示全部观察值中有四分之一的数据取值比它小。QU称为上四分位数,表示全部观察值中有四分之一的数据取值比它大。IQR称为四分位数间距,是上四分位数QU与下四分位数QL之差,其间包含了全部观察值的一半。箱型图依据实际数据绘制,真实、直观地表现出了数据分布的本来面貌,且没有对数据做任何限制性要求,其判断异常值的标准以四分位数和四分位数间距为基础。四分位数给出了数据分布的中心、散布和形状的某种指示,具有一定的鲁棒性,即25%的数据可以变得任意远而不会很大地扰动四分位数,所以异常值通常
36、不能对这个标准施加影响。鉴于此,箱型图识别异常值的结果比较客观,因此在识别异常值方面具有一定的优越性。弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行异常值的检测方法箱型图分析示例 data=np.random.randn(1000,3) #产生1000*3个满足正态分布的随机数 df=pd.DataFrame(data=data,columns=C1,C2,C3)#按列分别计算占比0%、25%、50%、75%、100%各处的值,然后依据定义分别计算下界、四分位数间距、上界的值。 Percent=np.percentile(df,0,25,50,75,100,axis=0) IQR
37、=Percent3-Percent1 #四分位数间距 QU=Percent3+IQR*1.5 #上界 QL=Percent1-IQR*1.5 #下界#在计算相应的值后,可以利用DataFrame对象的boxplot()方法绘制箱型图,并标记箱型图中的上限、下限、上四分位数和下四分位数。 bp=df.boxplot(return_type=dict) #绘制箱型图,返回值类型为字典弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行异常值的检测方法箱型图分析示例(续)#循环标记每个箱型图的相应值 for i in range(len(df.columns):x=i+1.1 #调整横坐标x
38、的位置ytext=QLi,Percent1i,Percent3i,QUifor y in ytext: s=str(y) #调整y的位置,并缩短显示的数字长度 if y=Percent1i:plt.text(x,y-0.25,s:8) else:plt.text(x,y+0.1,s:8)plt.show()从图中容易看出异常值(图中空心圆圈)的分布情况,其中C1、C2、C3三组数大部分数据在上下四分位箱体内,数据相对集中,但都有异常值,C1的离散程度最大,且都以均值为中心。弘 德 明 志 博 学 笃 行弘 德 明 志 博 学 笃 行异常值的处理方法检测到异常值以后,我们需要对其进行一定的处理。常用的处理方法有: 删除:直接删除含有异常值的记录; 缺失值:将异常值视为缺失值,利用处理缺失值的方法进行处理; 平均值修正:可用前后两个观测值的平均值修正该异常值; 不处理:直接在具有异常值的数据集上进行数据挖掘。弘 德 明 志 博 学 笃 行谢谢大家 为什么要进行数据清洗?为什么要进行数据清洗? 缺失值、重复值、异常值的检测和缺失值、重复值、异常值的检测和处理是进行数据分析处理是进行数据分析的必要前提,常用的方法有哪些?的必要前提,常用的方法有哪些?