数据清洗方法(重复、缺失、异常)

数据清洗方法(重复、缺失、异常),第1张

数据清洗方法(重复、缺失、异常)

        数据处理过程中,一般都需要进行数据的清洗工作,如数据集是否重复、是否存在缺失、是否具有完整性和一致性、数据中是否存在异常值等。

目录

一、重复观测处理

二、缺失值处理

三、异常值处理


一、重复观测处理

        重复观测,顾名思义是指观测行存在重复的现象,重复观测的存在会影响数据分析和数据挖掘的准确性,所以在数据分析和建模之前需要进行观测的重复性检验,如果存在重复观测,还需要重复项的删除。

检测数据集的记录是否存在重复,可以使用duplicated方法进行验证,但是该方法返回每一行的检验结果,如果10行数据就会返回10个bool值。可以使用any值,只要有一个条件为True,那么any函数的结果就为True


#导入模块
import pandas as pd
import numpy as np
# 数据读入
df = pd.read_excel(r'''C:Usersyu'chuan'zhaoDesktoppythondatacourse第5章 Python数据处理工具--Pandasdata_test04.xlsx''')
#重复观测的检测
print('数据集中是否存在重复观测:n',any(df.duplicated()))

out:
数据集中是否存在重复观测:
 True

删除数据集中的重复观测:

#删除重复项
df.drop_duplicates(inplace=True)
df

 该方法中也有inplace参数,设置为True就表示直接在原始数据集上 *** 作。

二、缺失值处理

        缺失值是指数据集中的某些观测存在遗漏的指标值。一般而言当遇到缺失值时,可以用三种方法处置,分别是删除法、替换法和插补法。 

        删除法:当缺失的观测比例非常低时(5%以内)直接删除存在缺失的观测,或者当某些变量的缺失比例非常高时(如85%以上)直接删除这些缺失的变量

        替换法:用某种常数直接替换那些缺失值。对于连续变量,可以使用均值或中位数替换;对于离散变量,可以使用众数替换

        插补法:根据其他非缺失的变量或观测来预测缺失值,常见的插补法有回归插补法、K近邻插补法、拉格朗日插补法等。


        检测数据集是否存在缺失值使用的是isnull方法,该方法仍然是基于每一行的检测,所以仍然需要使用any函数,返回整个数据集中是否存在缺失的结果。从代码返回的结果看,该数据集存在缺失值。

  

#数据读入
df=pd.read_excel(r'''C:Usersyu'chuan'zhaoDesktoppythondatacourse第5章 Python数据处理工具--Pandasdata_test05.xlsx''')
#缺失观测的检测
print('数据集中是否存在缺失值:n',any(df.isnull()))

out:
数据集中是否存在缺失值:
 True

dropna方法可以将所有含缺失值的行记录全部删除(行)

drop方法可以将变量删除(列)

fillna方法可以缺失值的替换,前向替换指用缺失值的前一个值替换,后向替换同理。(常用时间序列型的数据集)

使用value参数,常数替换,统计值替换(需要采用字典的方式传递给参数),例子是性别众数,年龄均值,收入中位数。

# 删除法之记录删除
df.dropna()
# 删除法之变量删除
df.drop('age', axis = 1)
# 替换法之前向替换
df.fillna(method = 'ffill')
# 替换法之后向替换
df.fillna(method = 'bfill')
# 替换法之常数替换
df.fillna(value = 0)
# 替换法之统计值替换
df.fillna(value = {'gender':df.gender.mode()[0], 'age':df.age.mean(), 'income':df.income.median()})
三、异常值处理

        异常值是指那些远离正常值的观测,即“不合群”观测。

        对于异常值的检测,一般采用两种方法,一种是n个标准差法,n=2时,满足条件的就是异常值,n=3满足条件的就是极端异常值。

        另一种是箱线图判别法,Q1为下四分位数(25%),Q3为上四分位数(75%),IQR为四分位差(上四分位数与下四分位数的差),当n=1.5,满足条件的即为异常值,n=3时,满足条件的为极端异常值。

        

         如果数据近似服从正态分布,优先选择n标准差法,因为数据的分布相对比较对称;否则选择箱线图法,因为分位数并不会受到极端值的影响。

# 数据读入
sunspots = pd.read_table(r'''C:Usersyu'chuan'zhaoDesktoppythondatacourse第5章 Python数据处理工具--Pandassunspots.csv''', sep = ',')
# 异常值检测之标准差法
xbar = sunspots.counts.mean()
xstd = sunspots.counts.std()
print('标准差法异常值上限检测:n',any(sunspots.counts > xbar + 2 * xstd))
print('标准差法异常值下限检测:n',any(sunspots.counts < xbar - 2 * xstd))
# 异常值检测之箱线图法
Q1 = sunspots.counts.quantile(q = 0.25)
Q3 = sunspots.counts.quantile(q = 0.75)
IQR = Q3 - Q1
print('箱线图法异常值上限检测:n',any(sunspots.counts > Q3 + 1.5 * IQR))
print('箱线图法异常值下限检测:n',any(sunspots.counts < Q1 - 1.5 * IQR))

out:
标准差法异常值上限检测:
 True
标准差法异常值下限检测:
 False
箱线图法异常值上限检测:
 True
箱线图法异常值下限检测:
 False

检测结果说明存在异常值超过上限临界值的。

通过绘制数量的直方图和核密度曲线图,用来检测数据是否近似服从正态分布。

# 导入绘图模块
import matplotlib.pyplot as plt 
# 设置绘图风格
plt.style.use('ggplot')
# 绘制直方图
sunspots.counts.plot(kind = 'hist', bins = 30, density = True)
# 绘制核密度图
sunspots.counts.plot(kind = 'kde')
# 图形展现
plt.show()

 数据分布形状都是有偏的,不符合正态分布特点。

如何处理这些异常值?删除/替换

# 替换法处理异常值
print('异常值替换前的数据统计特征:n',sunspots.counts.describe())
# 箱线图中的异常值判别上限
UL = Q3 + 1.5 * IQR
print('判别异常值的上限临界值:n',UL)
# 从数据中找出低于判别上限的最大值
replace_value = sunspots.counts[sunspots.counts < UL].max()
print('用以替换异常值的数据:n',replace_value)
# 替换超过判别上限异常值
sunspots.counts[sunspots.counts > UL] = replace_value
print('异常值替换后的数据统计特征:n',sunspots.counts.describe())

out:
判别异常值的上限临界值:
 148.85000000000002
用以替换异常值的数据:
 141.7

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5717179.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存