数据质量分析是数据挖掘中数据准备过程重要的一环,是数据预处理的前提。数据质量分析的主要任务是检查原始数据中是否存在脏数据,脏数据包括缺失值,异常值,不一致的值等等。
缺失值
缺失值就是由于人为或其他任何原因导致的数据缺失问题,缺失值的处理分为删除存在缺失值的属性、对可能的值进行插补、不处理三种情况。
异常值
异常值就是不合理的数据,常用的检测方法如下:
1) 简单的最大最小统计,比如用户最大年龄为 99,就可能是异常值
2) 3西格玛原则,如果数据服从正太分布,那么跟平均值相差 3 个西格玛(方差) 以外就概率为 0.3%,即可认为是异常值
3) 最常用的就是箱线图分析,也就是定义 QL 为1/4 分位数,QU 为3/4 分位数,IQR = QU-QL。则我们把小于 QL - 1.5IQR 的值,以及大于 QU + 1.5IQR 的值定义为异常值。它的优势是不依赖于数据分布,并且具有一定的鲁棒性:几乎一半的数据可以变得任意远而不影响结果。用餐饮销售额数据 catering_sale.xls 为例,检测其异常值代码如下:
#-*- coding:utf-8 -*-
import pandas as pd
# 餐饮数据
catering_sale = "wajue/catering_sale.xls"
# 读取数据,指定 "日期" 列为索引列
data = pd.read_excel(catering_sale,index_col = "日期")
# 数据描述 平均值,标准差,最小值 1/4 1/2 3/4 分位数 最大值
print data.describe()
# 导入图像处理
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure() # 建立图像
# 使用 dataframe 画箱线图
p = data.boxplot(return_type='dict')
# fliers 即为异常值的标签
x = p["fliers"][0].get_xdata()
y = p["fliers"][0].get_ydata()
y.sort()
# annotate 方法添加注释,也就是 在箱线图上标注异常值
# 第一个参数就是标注的内容,这里就是异常值的大小
# 后面两个参数是调整标注的位置设置的
for i in range(len(x)):
if i > 0 :
plt.annotate(y[i],xy = (x[i],y[i]), xytext = (x[i]+0.05 - 1.0/(y[i]-y[i-1]),y[i]))
else:
plt.annotate(y[i],xy = (x[i],y[i]), xytext = (x[i]+0.08,y[i]))
plt.show()
plt.show()
如图中注释出来的值就是箱线图中检测出来的异常值。
一致性分析
数据不一致性是指数据的矛盾性,不相容性。可能是由于被挖掘数据来自不同的数据源。比如同一个用户的电话号码,那边是一个号码,另一个数据源又是另一个号码。