网站数据分析(6)——缺失值异常值和重复值的处理在数据清洗过程中,主要处理的是缺失值异常值和重复值。所谓清洗,是对数

数据缺失分为两种:一是行记录的缺失,这种情况又称数据记录丢失;二是数据列值的缺失,即由于各种原因导致的数据记录中某些列的值空缺,不同的数据存储和环境中对于缺失值的表示结果也不同,例如,数据库中是Null,Python返回对象是None,Pandas或Numpy中是NaN。

丢失的数据记录通常无法找回,这里重点讨论数据列类型缺失值的处理,通常有四种思路:

这种方法简单明了,直接删除带有缺失值的行记录(整行删除)或者列字段(整列删除),减少缺失数据记录对总体数据的影响。但丢弃意味着会消减数据特征,以下任意一种场景都不宜采用该方法:

相对丢弃而言,补全是更加常用的缺失值处理方式,通过一定的方法将缺失的数据补上,从而形成完整的数据记录对于后续的数据处理、分析和建模至关重要。常用的补全方法包括:

某些情况下,我们可能无法得知缺失值的分布规律,并且无法对于缺失值采用上述任何一种方法做处理;或者我们认为数据缺失也是一种规律,不应该轻易对缺失值随意处理,那么还有一种缺失值处理思路——真值转换。

该思路的根本观点是,我们承认缺失值的存在,并且把数据缺失也作为数据分布规律的一部分,这将变量的实际值和缺失值都作为输入维度参与后续数据处理和模型计算。但是变量的实际值可以作为变量值参与模型计算,而缺失值通常无法参与运算,因此需要对缺失值进行真值转换。

以用户性别字段为例,很多数据库集都无法对会员的性别进行补足,但又舍不得将其丢弃,那么我们将选择将其中的值,包括男、女、未知从一个变量的多个值分布状态转换为多个变量的真值分布状态。

在数据预处理阶段,对于具有缺失值的数据记录不做任何处理,也是一种思路。这种思路主要看后期的数据分析和建模应用,很多模型对于缺失值有容忍度或灵活的处理方法,因此在预处理阶段可以不做处理。常见的能够自动处理缺失值的模型包括:KNN、决策树和随机森林、神经网络和朴素贝叶斯、DBSCAN(基于密度的带有噪声的空间聚类)等。这些模型对于缺失值的处理思路是:

异常数据是数据分布的常态,处于特定分布区域或范围之外的数据通常会被定义为异常或“噪音”。产生数据“噪音”的原因很多,例如业务运营操作、数据采集问题、数据同步问题等。对异常数据进行处理前,需要先辨别出到底哪些是真正的数据异常。从数据异常的状态看分为两种:

大多数数据挖掘或数据工作中,异常值都会在数据的预处理过程中被认为是噪音而剔除,以避免其对总体数据评估和分析挖掘的影响。但在以下几种情况下,无须对异常值做抛弃处理。

该场景是由业务部门的特定动作导致的数据分布异常,如果抛弃异常值将导致无法正确反馈业务结果。

例如:公司的A商品正常情况下日销量为1000台左右。由于昨日举行优惠促销活动导致总销量达到10000台,由于后端库存备货不足导致今日销量又下降到100台。在这种情况下,10000台和100台都正确反映了业务运营的结果,而非数据异常。

异常检测模型是针对整体样本中的异常数据进行分析和挖掘以便找到其中的异常个案和规律,这种数据应用围绕异常值展开,因此异常值不能做抛弃处理。

异常检测模型常用于客户异常识别、信用卡欺诈、贷款审批识别、药物变异识别、恶劣气象预测、网络入侵检测、流量作弊检测等。在这种情况下,异常数据本身是目标数据,如果被处理掉将损失关键信息。

如果数据算法和模型对异常值不敏感,那么即使不处理异常值也不会对模型本身造成负面影响。例如在决策树中,异常值本身就可以作为一种分裂节点。

除了抛弃和保留,还有一种思路可对异常值进行处理,例如使用其他统计量、预测量进行替换,但不推荐使用这种方法,原因是这会将其中的关键分布特征消除,从而改变原始数据集的分布规律。

数据集中的重复值包括以下两种情况:

去重是重复值处理的主要方法,主要目的是保留能显示特征的唯一数据记录。但当遇到以下几种情况时,请慎重(不建议)执行数据去重。

以变化维度表为例。例如在商品类别的维度表中,每个商品对应了同1个类别的值应该是唯一的,例如苹果iPhone7属于个人电子消费品,这样才能将所有所有商品分配到唯一类别属性值中。但当所有商品类别的值重构或升级时(大多数情况下随着公司的发展都会这么做),原有的商品可能被分配了类别中的不同值。

在开展分类数据建模工作时,样本不均衡是影响分类模型效果的关键因素之一,解决分类方法的一种方法是对少数样本类别做简单过采样,通过随机过采样采取简单复制样本的策略来增加少数类样本。经过这种处理方式后,也会在数据记录中产生相同记录的多条数据。此时,我们不能对其中重复值执行去重操作。

对于缺失值的处理,主要配合使用sklearn.preprocessing中的Imputer类、Pandas和Numpy。其中由于Pandas对于数据探索、分析和探查的支持较为良好,因此围绕Pandas的缺失值处理较为常用。

importpandasaspd#导入pandas库importnumpyasnp#导入numpy库fromsklearn.preprocessingimportImputer#导入sklearn.preprocessing中的Imputer库4.2生成缺失数据通过Pandas生成一个6行4列,列名分别为'col1'、'col2'、'col3'、'col4'的数据框。同时,数据框中增加两个缺失值数据。除了示例中直接通过pd.DataFrame来创建数据框外,还可以使用数据框对象的df.from_records、df.from_dict、df.from_items来从元组记录、字典和键值对对象创建数据框,或使用pandas.read_csv、pandas.read_table、pandas.read_clipboard等方法读取文件或剪贴板创建数据框。

#生成缺失数据df=pd.DataFrame(np.random.randn(6,4),columns=['col1','col2','col3','col4'])#生成一份数据df.iloc[1:2,1]=np.nan#增加缺失值df.iloc[4,3]=np.nan#增加缺失值print(df)结果

col1col2col3col401.411367-0.3679032.610054-0.59482910.723414NaN-0.664368-0.7401172-0.367365-0.173968-0.7322790.10299831.8111640.6538500.6056111.79355240.0940320.6432470.259631NaN50.918172-0.146227-1.0872380.3769284.3找出缺失数据通过df.null()方法找到所有数据框中的缺失值(默认缺失值是NaN格式),然后使用any()或all()方法来查找含有至少1个或全部缺失值的列,其中any()方法用来返回指定轴中的任何元素为True,而all()方法用来返回指定轴的所有元素都为True。

#查看哪些值缺失nan_all=df.isnull()#获得所有数据框中的N值print(nan_all)#打印输出结果

col1col2col3col40FalseFalseFalseFalse1FalseTrueFalseFalse2FalseFalseFalseFalse3FalseFalseFalseFalse4FalseFalseFalseTrue5FalseFalseFalseFalse(2)列出至少有一个元素含有缺失值的列#查看哪些列缺失nan_col1=df.isnull().any()#获得含有NA的列print(nan_col1)#打印输出结果

col1Falsecol2Truecol3Falsecol4Truedtype:bool(3)列出全部元素含有缺失值的列#查看哪些列缺失nan_col2=df.isnull().all()#获得全部为NA的列print(nan_col2)#打印输出结果

col1Falsecol2Falsecol3Falsecol4Falsedtype:bool4.4丢弃缺失值通过Pandas默认的dropna()方法丢弃缺失值,返回无缺失值的数据记录。该代码段执行后返回如下结果(第2行、第5行数据记录被删除):

#丢弃缺失值df2=df.dropna()#直接丢弃含有NA的行记录print(df2)#打印输出结果

col1col2col3col401.411367-0.3679032.610054-0.5948292-0.367365-0.173968-0.7322790.10299831.8111640.6538500.6056111.79355250.918172-0.146227-1.0872380.3769284.5缺失值替换为均值通过Sklearn的数据预处理方法对缺失值进行处理。首先通过Imputer方法创建一个预处理对象,其中strategy为默认缺失值的字符串,默认为NaN;

示例中选择缺失值替换方法是均值(默认),还可以选择使用中位数和众数进行替换,即strategy值设置为median或most_frequent;后面的参数axis用来设置输入的轴,默认值为0,即使用列做计算逻辑。然后使用预处理对象的fit_transform方法对df(数据框对象)进行处理,该方法是将fit和transform组合起来使用。

#使用sklearn将缺失值替换为特定值nan_model=Imputer(missing_values='NaN',strategy='mean',axis=0)#建立替换规则:将值为NaN的缺失值以均值做替换nan_result=nan_model.fit_transform(df)#应用模型规则print(nan_result)#打印输出结果

[[1.41136738-0.367903282.61005414-0.59482946][0.723413640.12179985-0.66436841-0.7401174][-0.36736481-0.17396797-0.732278930.10299754][1.811163790.653850470.605610661.79355171][0.09403240.643247120.259631050.18770606][0.91817218-0.14622709-1.087238330.37692791]]代码中的第2行第2列和第5行第4列分别被各自列的均值替换。为了验证我们手动计算各自列的均值,通过使用df['col2'].mean()和df['col4'].mean()分别获得这两列的均值,即-0.4494679289032068和-0.16611331259664791,跟Sklearn返回的结果一致。

使用Pandas做缺失值处理。Pandas对缺失值的处理方法是df.fillna(),该方法中最主要的两个参数是value和method。前者通过固定(或手动指定)的值替换缺失值,后者使用Pandas提供的默认方法替换缺失值,以下是method支持的方法:

#使用pandas将缺失值替换为特定值nan_result_pd1=df.fillna(method='backfill')#用后面的值替换缺失值#打印输出print(nan_result_pd1)#打印输出结果

col1col2col3col401.411367-0.3679032.610054-0.59482910.723414-0.173968-0.664368-0.7401172-0.367365-0.173968-0.7322790.10299831.8111640.6538500.6056111.79355240.0940320.6432470.2596310.37692850.918172-0.146227-1.0872380.376928(2)用后面的值替代缺失值,限制每列只能替代一个缺失值#使用pandas将缺失值替换为特定值nan_result_pd2=df.fillna(method='bfill',limit=1)#用后面的值替代缺失值,限制每列只能替代一个缺失值#打印输出print(nan_result_pd2)#打印输出结果

col1col2col3col401.411367-0.3679032.610054-0.59482910.723414-0.173968-0.664368-0.7401172-0.367365-0.173968-0.7322790.10299831.8111640.6538500.6056111.79355240.0940320.6432470.2596310.37692850.918172-0.146227-1.0872380.376928(3)用前面的值替换缺失值#使用pandas将缺失值替换为特定值nan_result_pd3=df.fillna(method='pad')#用前面的值替换缺失值#打印输出print(nan_result_pd3)#打印输出结果

col1col2col3col401.411367-0.3679032.610054-0.59482910.723414-0.367903-0.664368-0.7401172-0.367365-0.173968-0.7322790.10299831.8111640.6538500.6056111.79355240.0940320.6432470.2596311.79355250.918172-0.146227-1.0872380.376928(4)用0替换缺失值#使用pandas将缺失值替换为特定值nan_result_pd4=df.fillna(0)#用0替换缺失值#打印输出print(nan_result_pd4)#打印输出结果

col1col2col3col401.411367-0.3679032.610054-0.59482910.7234140.000000-0.664368-0.7401172-0.367365-0.173968-0.7322790.10299831.8111640.6538500.6056111.79355240.0940320.6432470.2596310.00000050.918172-0.146227-1.0872380.376928(5)用不同值替换不同列的缺失值#使用pandas将缺失值替换为特定值nan_result_pd5=df.fillna({'col2':1.1,'col4':1.2})#用不同值替换不同列的缺失值#打印输出print(nan_result_pd5)#打印输出结果

col1col2col3col401.411367-0.3679032.610054-0.59482910.7234141.100000-0.664368-0.7401172-0.367365-0.173968-0.7322790.10299831.8111640.6538500.6056111.79355240.0940320.6432470.2596311.20000050.918172-0.146227-1.0872380.376928(6)用平均数代替,选择各自列的均值替换缺失值#使用pandas将缺失值替换为特定值nan_result_pd6=df.fillna(df.mean()['col2':'col4'])#用平均数代替,选择各自列的均值替换缺失值#打印输出print(nan_result_pd6)#打印输出结果

col1col2col3col401.411367-0.3679032.610054-0.59482910.7234140.121800-0.664368-0.7401172-0.367365-0.173968-0.7322790.10299831.8111640.6538500.6056111.79355240.0940320.6432470.2596310.18770650.918172-0.146227-1.0872380.376928五、Python异常值处理有关异常值的确定有很多规则和方法,这里使用Z标准化得到的阈值作为判断标准:当标准化后的得分超过阈值则为异常。完整代码如下:

importpandasaspd#导入pandas库5.2生成异常数据直接通过DataFrame创建一个7行2列的数据框

#生成异常数据df=pd.DataFrame({'col1':[1,120,3,5,2,12,13],'col2':[12,17,31,53,22,32,43]})print(df)#打印输出结果

col1col2011211201723313553422251232613435.3异常值判断过程本过程中,先通过df.copy()复制一个原始数据框的副本用来存储Z-Score标准化后的得分,再通过df.columns获得原始数据框的列名,接着通过循环来判断每一列中的异常值。在判断逻辑中,对每一列的数据使用自定义的方法做Z-Score值标准化得分计算,然后跟阈值2.2做比较,如果大于阈值则为异常。

至于为什么阈值是2.2?有关数据标准化的话题后面再讨论。

#通过Z-Score方法判断异常值df_zscore=df.copy()#复制一个用来存储Z-score得分的数据框cols=df.columns#获得数据框的列名forcolincols:#循环读取每列df_col=df[col]#得到每列的值z_score=(df_col-df_col.mean())/df_col.std()#计算每列的Z-score得分df_zscore[col]=z_score.abs()>2.2#判断Z-score得分是否大于2.2,如果是则是True,否则为Falseprint(df_zscore)#打印输出结果

col1col20FalseFalse1TrueFalse2FalseFalse3FalseFalse4FalseFalse5FalseFalse6FalseFalse5.4删除异常值#删除异常值所在的行df_drop_outlier=df[df_zscore['col1']==False]print(df_drop_outlier)结果

col1col201122331355342225123261343上述过程中,主要需要考虑的关键点是:如何判断异常值。对于有固定业务规则的可直接套用业务规则,而对于没有固定业务规则的,可以采用常见的数学模型进行判断,即基于概率分布的模型(例如正态分布的标准差范围)、基于聚类的方法(例如KMeans)、基于密度的方法(例如LOF)、基于分类的方法(例如KNN)、基于统计的方法(例如分位数法)等,此时异常值的定义带有较强的主观判断色彩,具体需要根据实际情况选择。

importpandasaspd#导入pandas库6.2生成重复数据该数据是一个4行2列数据框

#生成重复数据data1=['a',3]data2=['b',2]data3=['a',3]data4=['c',2]df=pd.DataFrame([data1,data2,data3,data4],columns=['col1','col2'])print(df)结果

col1col20a31b22a33c26.3判断数据记录是否为重复值判断数据记录是否为重复值,返回每条数据记录是否重复的结果,取值为True或False。判断方法为df.duplicated(),该方法中两个主要的参数是subset和keep:

#判断重复数据isDuplicated=df.duplicated()#判断重复数据记录print(isDuplicated)#打印输出结果

0False1False2True3Falsedtype:bool6.4删除重复值操作的核心方法是df.drop_duplicates(),该方法的作用是基于指定的规则判断为重复值之后,删除重复值,其参数跟df.duplicated()完全相同。在该部分方法示例中,依次使用默认规则(全部列相同的数据记录)、col1列相同、col2列相同以及指定col1和col2完全相同四种规则进行去重。

#删除重复值new_df1=df.drop_duplicates()#删除数据记录中所有列值相同的记录print(new_df1)#打印输出结果

col1col20a31b23c2(2)删除数据记录中col1值相同的记录#删除重复值new_df2=df.drop_duplicates(['col1'])#删除数据记录中col1值相同的记录print(new_df2)#打印输出结果

col1col20a31b23c2(3)删除数据记录中col2值相同的记录#删除重复值new_df3=df.drop_duplicates(['col2'])#删除数据记录中col2值相同的记录print(new_df3)#打印输出结果

col1col20a31b2(4)删除数据记录中指定列(col1/col2)值相同的记录#删除重复值new_df4=df.drop_duplicates(['col1','col2'])#删除数据记录中指定列(col1/col2)值相同的记录print(new_df4)#打印输出

THE END
1.深度学习数据清洗的目的mob649e81673fa5的技术博客深度学习数据清洗的目的,#深度学习数据清洗的目的与实现深度学习的成功依赖于高质量的数据。在深度学习之前,数据清洗是一个至关重要的步骤。本文将详细介绍数据清洗的目的,流程及实现步骤,帮助初学者更好地理解这一过程。##数据清洗目的数据清洗的主要目的是去除噪声和https://blog.51cto.com/u_16175512/12697067
2.数据清洗的重要性与技巧:提升大数据分析的准确性和效率数据清洗在大数据分析中扮演着至关重要的角色,它直接关系到分析的准确性和效率。以下将详细探讨数据清洗的重要性以及相关的技巧。 一、数据清洗的重要性 提高数据质量:数据清洗能够去除或修正数据集中的错误、重复、不完整或不一致的数据,从而提高数据质量。脏数据(包含错误、重复、不完整的数据)可能导致误导性的结论,https://blog.csdn.net/Shaidou_Data/article/details/144110971
3.数据清洗的目的何在,你是如何理解数据清洗这一概念的?阅读下面文段,完成4~6题。 众人都轰动了,拥着往棋场走去。到了街上,百十人走成一片。行人见了,纷纷问怎么回事,可是知青打架?待明白了,就都跟着走。走过半条街,竟有上千人跟着跑来跑去。商店里的店员和顾客也都站出来张望。长途车路过这里开不过,乘客们纷纷探出头来,只见一街人头攒动,尘土飞起https://www.shuashuati.com/ti/9f5cb84ad5f2480193e676b8fdcc32f7.html
4.一文了解数据治理全知识体系!怎么引导客户呢?这里要引入一个众所周知的概念:二八原则。实际上,二八原则在数据治理中同样适用:80%的数据业务,其实是靠20%的数据在支撑;同样的,80%的数据质量问题,其实是由那20%的系统和人产生的。在数据治理的过程中,如果能找出这20%的数据,和这20%的系统和人,毫无疑问,将会起到事半功倍的效果。 https://www.clii.com.cn/lhrh/hyxx/202204/t20220427_3953726.html
5.机器学习中的数据清洗与特征处理综述机器学习中的数据清洗与特征处理综述 收藏 机器学习中的数据清洗与特征处理综述 背景 随着美团交易规模的逐步增大,积累下来的业务数据和交易数据越来越多,这些数据是美团做为一个团购平台最宝贵的财富。通过对这些数据的分析和挖掘,不仅能给美团业务发展方向提供决策支持,也为业务的迭代指明了方向。目前在美团的团购系统http://api.cda.cn/view/8897.html
6.如何在数据分析中进行数据清洗?数据清洗的作用主要有:野值判断和缺失值处理 一、野值判别。所谓野值,就是在一组数据中的“异常”数据,这些数据明显的与其他数据存在区别,野值包括以下这几个类型:在数据采集的过程中,完整性是基本的要求,也是相对来说比较好判别的数据。2、数据不准确 二、野值判断https://aiqicha.baidu.com/qifuknowledge/detail?id=17001272656
7.新澳门一码中精准一码免费中特,多元回归分析18.74.80小成绿毛虫在日用玻璃制品制造发布了:新澳门一码中精准一码免费中特,多元回归分析_18.74.80小成, 新澳门一码中精准一码免费中特,多元回归分析_18.74.80小成 在当今的数据驱动时代,如何利用数据来优化决策变得尤为重要。澳门新模式的精准数据分析,尤其是“一码中”系https://cdyabz.com/post/15064.html
8.研究生学术训练营之信息素养系列回顾(20182018年-2020年,图书馆依托“双一流”校研究生院的“学术训练营”项目,开启了研究生学术训练营之信息素养系列讲座及工作坊,主要对象为本校在读研究生、青年学者,结合本校学科特色,以高端学术讲座、工作坊和数据竞赛等形式,培养研究人员信息意识,提高收集、分析、处理、应用信息的能力,内容涉及数据检索、数据挖掘、数字https://wmcj.shisu.edu.cn/1a/15/c990a137749/page.htm
9.77778888王中王最新精准,你的成功之路,qs,V数据,如同现代社会的血脉,流淌在商业决策的每一个角落,而精准数据更是企业竞争中不可或缺的“王中王”,我们将一同探索“77778888王中王”这一神秘代码背后的故事,以及它是如何在复杂多变的数据海洋中,为追求成功的你铺设一条清晰路径的。 一、数据的王国:寻找“77778888王中王” https://wap.sdxmky.cn/kexue/5277.html