网站数据分析(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.数据清洗的具体方法有哪些?数据清洗流程数据清洗的具体方法有哪些? 清洗数据是数据分析和机器学习项目中至关重要的一步,其目标在于识别并纠正数据集中的错误、遗漏或不一致,以提高数据质量和后续分析结果的准确性。以下是一个详细的数据清洗流程,通常包括以下几个步骤: 1.数据收集与理解 收集数据:从各种来源(如数据库、API、文件等)获取数据。https://blog.csdn.net/Shaidou_Data/article/details/143205411
2.通透!十大数据清洗方法!!51CTO博客文本数据清洗 数据类型转换 特征工程 咱们一起来探讨~ 1. 缺失值处理 原理 缺失值处理是指在数据集中存在空值或缺失数据的情况下,通过合适的策略填补或处理这些缺失值,以减少对后续分析和模型训练的影响。常见的缺失值处理方法包括删除缺失值、均值填补、中位数填补、众数填补和插值法。 https://blog.51cto.com/u_15671528/12187385
3.数据清洗的方法有哪些?一般来说,数据中是存在噪音的,那么噪音是怎么清洗的呢?我们就在这篇文章中给大家介绍一下数据清洗的方法。通常来说,清洗数据有三个方法,分别是分箱法、聚类法、回归法。这三种方法各有各的优势,能够对噪音全方位的清理。分箱法是一个经常使用到方法,所谓的分箱法,就是将需要处理的数据根据一定的规则放进http://baijiahao.baidu.com/s?id=1711739383699713605&wfr=spider&for=pc
4.数据清洗的方法包括什么常见问题数据清洗的方法包括什么 数据清洗的方法包括:1、分箱法,就是将需要处理的数据根据一定的规则放进箱子里,然后进行测试;2、回归法,就是利用函数的数据进行绘制图像,然后对图像进行光滑处理;3、聚类法,就是将抽象的对象进行集合分组,成为不同的集合,找到在集合意外的孤点。https://m.php.cn/faq/478619.html
5.值得收藏!数据清洗的十类常用方法数据清洗是数据治理过程中的一个重要环节,它指的是对原始数据进行筛选、修复、转换和处理,以确保数据的准确性、完整性和一致性。 在数据清洗过程中,不仅需要明确数据清洗的对象,还需要根据具体的情况选择合适的数据清理方法。以下是不同对象所对应不同的数据清洗方法。 https://www.fanruan.com/bw/doc/178453
6.数据分析中的数据预处理包括哪些步骤一、数据清洗 数据清洗是数据预处理的第一步,主要是为了处理原始数据中存在的错误、缺失、重复、异常等问题。具体步骤如下: 1.去重:检查数据集中是否存在重复的数据记录,如有重复,删除其中的一条或多条记录。 2.处理缺失值:数据集中可能存在某些数据缺失的情况,可以通过删除缺失值、替换缺失值或使用插值方法进行处https://www.linkflowtech.com/news/1073
7.数据处理方法有哪些?数据处理的三种方法各位老铁们好,相信很多人对数据处理方法有哪些都不是特别的了解,因此呢,今天就来为大家分享下关于数据处理方法有哪些以及数据处理的三种方法的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧! 一、数据处理的常用方法有 1、列表法:是将实验所获得的数据用表格的形式进行排列的数据处理方法。列表法的https://www.duote.com/tech/202401/534651.html
8.数据清洗的常见问题有哪些?数据清洗的常见问题有哪些? 收藏 数据清洗是数据处理流程中不可或缺的一步,其目的是对原始数据进行筛选、转换和修正,以确保数据质量符合使用要求。然而,在进行数据清洗时,常会遇到一些问题,下面将介绍一些常见的数据清洗问题及解决方法。 缺失数据 在实际数据处理过程中,经常会遇到部分数据缺失的情况,这可能是由于人为https://www.cda.cn/bigdata/202776.html
9.科学网—[转载]制造业生产过程中多源异构数据处理方法综述摘要:随着现代制造业向着自动化、信息化、智能化方向快速发展,生产过程中会产生大量的多源异构数据。对多源异构数据的有效处理和深度挖掘可为生产制造者提供更有效的生产调度、设备管理等策略,从而提高生产质量和效率。针对制造业生产过程中多源异构数据的处理方法与技术等进行系统性的综述,首先明确了制造业生产过程多源异构https://blog.sciencenet.cn/blog-3472670-1287069.html
10.数据清理技术的主要目的包括()数据处理的意义有数据处理是实现数据共享的关键步骤、是检验数据质量的关键环节() A. 是实现空间数据有序化的关键环节 B. 是合理安排工作的环节 C. 是实现数据一致化的准则 D. 是完成数据的步骤 查看完整题目与答案 电子商务中下列不属于数据清洗的是() A. 一致性检查 B. 无效值处理 C. 成对删https://www.shuashuati.com/ti/5c1a68404f6a4076adcda2411f7654b7.html
11.解密代码模型StarCoder&CodeLlamaStarcoder团队对不同类型的编程语言有个性化的处理逻辑,下文我们进一步分析了具体的处理方法。 人工检查 为了筛选出高质量的数据,StarCoder团队通过人工检查的方式进行数据处理。首先从 The Stack 数据集中为每种编程语言随机选择 30,000 个文件,按扩展名对它们进行分类,并为每个扩展名保留最多 1,000 个文件。Starhttps://hub.baai.ac.cn/view/34967