阅读提示
本文将提到Python数据分析与挖掘中的数据探索与数据特征分析
一、数据探索
根据观测、调查收集到初步的样本数据集后,接下来要考虑的问题是:样本数据集的数量和质量是否满足模型构建的要求?是否出现从未设想过的数据状态?其中有没有什么明显的规律和趋势?各因素之间有什么样的关联性?
通过检验数据集的数据质量、绘制图表、计算某些特征量等手段,对样本数据集的结构和规律进行分析的过程就是数据探索。数据探索有助于选择合适的数据预处理和建模方法,甚至可以完成一些通常由数据挖掘解决的问题。
后续将从数据质量分析和数据特征分析两个角度对数据进行探索。
1、数据质量的分析
数据质量分析是数据挖掘中数据准备过程的重要一环,是数据预处理的前提,也是数据挖掘分析结论有效性和准确性的基础,没有可信的数据,数据挖掘构建的模型将是空中楼阁。
数据质量分析的主要任务是检查原始数据中是否存在脏数据,脏数据一般是指不符合要求,以及不能直接进行相应分析的数据。在常见的数据挖掘工作中,脏数据包括如下内容:
- 缺失值
- 异常值
- 不一致的值
- 重复数据以及含有特殊符号(如 #、¥、*)的 数据
在后面我将主要对数据中的缺失值、异常值和一致性进行分析。
产生缺失值的原因:
a.有的信息暂时无法获取,或者获取信息的代价太大
b.有些信息是被遗漏的。可能是因为输入时认为不重要、忘记填写或对数据理解错误等一些人为因素而遗漏,也可能是由于数据采集设备的故障、存储介质的故障、传输媒体的故障等非人为原因而丢失。
c.属性值不存在。在某些情况下,缺失值并不意味着数据有错误。对一些对象来说某些属性值是不存在的,如一个未婚者的配偶姓名、一个儿童的固定收入等。
缺失值的影响:
a.数据挖掘建模将丢失大量的有用信息。
b.数据挖掘模型所表现出的不确定性更加显著,模型中蕴涵的规律更难把握。
c.包含空值的数据会使建模过程陷入混乱,导致不可靠的输出。
2、异常值的分析
异常值是指样本中的个别值,其数值明显偏离其余的观测值。异常值也称为离群点,异常值的分析也称为离群点分析。
a.简单统计量分析:
可以先对变量做一个描述性统计,进而查看哪些数据是不合理的。最常用的统计量是最大值和最小值,用来判断这个变量的取值是否超出了合理的范围。如客户年龄的最大值为199岁,则该变量的取值存在异常。
b.3σ原则:
如果数据服从正态分布,在3σ原则下,异常值被定义为一组测定值中与平均值的偏差超过3倍标准差的值。在正态分布的假设下,距离平均值3σ之外的值出现的概率为P( |x-μ| >3σ)≤0.003,属于极个别的小概率事件。如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述。
c.箱型图分析
箱型图依据实际数据绘制,没有对数据作任何限制性要求(如服从某种特定的分布形式),它只是真实直观地表现数据分布i的本来面貌;另一方面,箱型图判断异常值的标准以四分位数和四分位距为础,四分位数具有一定的鲁棒性:多达25%的数据可以变得任意远而不会很大地扰动四分位数,所以异常值不能对这个标准施加影响。由此可见,箱型图识别异常值的结果比较客观,在识别异常值方面有一定的优越性。
实例:
数据来源:C:\Users\lenovo\Desktop\Python数据分析与挖掘\chapter3\demo\data
如需数据集请私聊我
时间 | 2015/2/13 | 2015/2/14 |
---|---|---|
销量额(元) | 3036.8 |
分析餐饮系统日销量额数据可以发现,其中有部分数据是缺失的,但是如果数据记录和属性较多,使用人工分辨的方法就不切合实际,所以这里需要编写程序来检测出含有缺失值的记录和属性以及缺失率个数和缺失率等。
在Python的Pandas库中,只需要读入数据,然后使用describe()函数就可以查看数的基本情况。
餐饮销售额数据异常监测:
为了更直观的检测缺失值,使用箱线图方法。
#-*- coding: utf-8 -*-
import pandas as pd
catering_sale = '../data/catering_sale.xls' #餐饮数据
data = pd.read_excel(catering_sale, index_col = u'日期') #读取数据,指定“日期”列为索引列
import matplotlib.pyplot as plt #导入图像库
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.figure() #建立图像
p = data.boxplot(return_type='dict') #画箱线图,直接使用DataFrame的方法
x = p['fliers'][0].get_xdata() # 'flies'即为异常值的标签
y = p['fliers'][0].get_ydata()
y.sort() #从小到大排序,该方法直接改变原对象
print("异常值的个数是:%d个"%len