网站数据分析(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.数据清洗的概念常见问题及实践方法数据已成为企业和组织决策的重要依据,然而,原始数据往往存在各种质量问题,如缺失值、错误值、重复数据等,这些问题严重影响了数据分析的准确性和可靠性。数据清洗作为数据预处理的关键环节,能够有效地解决这些问题,为后续的数据分析和挖掘打下坚实的基础。 今天,让我们一起了解数据清洗的概念、常见问题及实践方法。 https://blog.csdn.net/weixin_44958787/article/details/141850204
2.pythonpython葡萄酒国家分布情况数据分析pyecharts可视化二、设计思路 好的,结合上述代码,我们可以从数据读取、数据清洗和数据处理三个方面详细讲解代码的设计思路和实现过程。 1. 数据读取 数据读取是数据分析的第一步,代码中通过两种方式读取 CSV 文件的数据:使用csv模块和pandas库。 使用csv模块读取数据 import csvfilename = 'winemag-data.csv'with open(filename, https://developer.aliyun.com/article/1581254
3.实施数据分析项目有哪些流程?从数据准备到解决方案全面解析!在数据清洗层,我们对原始数据进行初步处理,移除异常值(例如,观看时长超过24小时或地理位置数据异常的记录)。这一步骤对于确保后续分析的准确性至关重要。 数据汇总层 数据汇总层根据分析需求,将用户行为按照特定主题进行聚合,形成轻量级的聚合指标表。例如,在直播应用项目中,我们可以将用户的登录、订阅、观看、弹幕和送https://www.fanruan.com/bw/bd-sjfxxmss
4.基于Python技术的电商个性化推荐系统的灵感来源python商品推荐数据清洗 数据可视化及分析 结论与建议 分析思路 其实就今天的数据来讲,我们主要做的是探索性分析;首先梳理已有的字段,有标题(提取出品类)、价格、销量、店铺名、发货地。下面来做一下详细的维度拆分以及可视化图形选择: 品类: 品类销量的 TOP 10 有哪些?(表格或者横向条形图) https://blog.51cto.com/u_14152/11729805
5.小浣熊家族:自媒体新手的快速成长指南AI程序员海军分析思路 数据收集 收集各大自媒体平台的用户数据、内容数据、活动数据等 数据来源包括平台后台统计、第三方数据分析工具、问卷调查等 数据清洗 对收集到的数据进行清洗,去除重复和无效数据 确保数据的准确性和一致性 数据分析 使用数据分析工具(如 Python、R、Excel 等)进行数据处理和分析 https://xie.infoq.cn/article/66e2c96a2abe28aa81fd4c129
6.帆软FineBI数据编辑,帮你省下80%浪费在数据处理的时间!②历史步骤可见,让分析思路可回溯,处理过程变透明 用Excel做分析存在一个明显的弊端就是操作步骤不可见,不知道中间做了哪些步骤,如果想查看计算逻辑,只有两个方法:要么CTRL+Z回退,要么点进函数一个一个查看。 FineBI的数据编辑,可以针对历史操作步骤进行追溯、灵活调整历史操作步骤,解决历史操作不可见的问题。对于个人https://www.360doc.cn/mip/1132147943.html
7.Prompt用得好,增长工作下班早1.数据清洗 你是一位资深数据分析师,具备深厚的数据分析技能与行业经验。你擅长应用各种数据分析工具和技术,对数据进行挖掘、整合、分析,现在我有一份销售数据,是jason格式的,帮我把数据处理一下,直接输出表格。 2.找数据分析思路 你是一位XX行业的市场营销分析专家,请根据这份数据集合,给出4个不同方向的分析主题https://www.niaogebiji.com/article-645093-1.html
8.www.ptzfcg.gov.cn/upload/document/20180724/0279275ee54644f69.2投标人应在投标截止时间前按照福建省政府采购网上公开信息系统设定的操作流程将电子投标文件上传至福建省政府采购网上公开信息系统,同时将投标人的CA证书连同密封的纸质投标文件送达招标文件第一章第10条载明的地点,否则投标将被拒绝。 10、开标时间及地点:详见招标公告或更正公告(若有),若不一致,以更正公告(若有)http://www.ptzfcg.gov.cn/upload/document/20180724/0279275ee54644f6adb79e806e1b3734.html
9.图像数据清洗方法.pptx数智创新 变革未来图像数据清洗方法 图像数据清洗简介 数据清洗必要性 常见图像数据问题 数据清洗基本流程 图像预处理技术 图像噪声处理方法 图像标注修正技术 总结与展望Contents Page目录页 图像数据清洗简介图像数据清洗方法 图像数据清洗简介图像数据清洗简介1.图像数据清洗的定义和重要性:图像数据清洗是指通过一系列技术https://max.book118.com/html/2023/1110/7116145134006004.shtm
10.请问机场出租车相关的数据在哪找得到?因此,针对异常数据的清洗是在数据的正式处理分析之前必须做的重要步骤。缺少这一步骤,在后续的处理中很可能产生错误的分析结果。在出租车GPS数据中也不可避免地存在一定的数据异常。这里我们以数据中存在的异常载客状态为例,介绍数据异常的情况以及数据清洗的思路。https://www.yoojia.com/ask/17-11950137789821619087.html