阅读提示
本文将提到Python数据分析与挖掘中的 数据探索与数据特征分析
目录
- 阅读提示
- 一、数据探索
- 1、数据质量的分析
- 2、异常值的分析
- 3、一致性分析
- 二、数据特征分析
- 1、分步分析
- 2、对比分析
- 3、统计量分析
- 4、周期性分析
- 5、贡献度分析
- 6、相关性分析
一、数据探索
根据观测、调查收集到初步的样本数据集后,接下来要考虑的问题是:样本数据集的数量和质量是否满足模型构建的要求?是否出现从未设想过的数据状态?其中有没有什么明显的规律和趋势?各因素之间有什么样的关联性?通过检验数据集的数据质量、绘制图表、计算某些特征量等手段,对样本数据集的结构和规律进行分析的过程就是数据探索。数据探索有助于选择合适的数据预处理和建模方法,甚至可以完成一些通常由数据挖掘解决的问题。 后续将从数据质量分析和数据特征分析两个角度对数据进行探索。
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(y))
#用annotate添加注释
#其中有些相近的点,注解会出现重叠,难以看清,需要一些技巧来控制。
#以下参数都是经过调试的,需要具体问题具体调试。
for i in range(len(x)):
if i>0:
plt.annotate(y[i], xy = (x[i],y[i]), xytext=(x[i]+0.05 -0.8/(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() #展示箱线图
我们可以轻松的根据输出语句:
print("异常值的个数是:%d个"%len(y))
得出结果:
异常值的个数是:8个
Process finished with exit code 0
从图中可以看出,箱型图中的超过上下界的8个销售额数据可能为异常值。结合实际的具体业务可以把865、4060.3、4065.2归为正常值,将22、51、60、6607.4.9106.44归为异常值。 最后确定过滤规则为:日销量在400以下5000以上则属于异常数据,编写过滤程序进行后续处理。
3、一致性分析
数据不一致性指的是数据的矛盾性、不相容性。直接对不一致的数据进行挖掘,可能会产生与实际想违背的挖掘结果。不一致的产生原因有很多,可能被挖掘的数据来自不同的数据源、对于重复存放的数据未能进行一致性更新等造成的。
二、数据特征分析
对数据进行质量分析过后,我们可以通过绘制表格、计算某些特殊值、特征量等手段对数据进行更进一步的特征分析。
1、分步分析
分布分析能揭示数据的分布特征和分布类型。对于定量数据,欲了解其分布形式是对称的还是非对称的,发现某些特大或特小的可疑值,可通过绘制频率分布表、绘制频率分布直方图、绘制茎叶图进行直观地分析;对于定性分类数据,可用饼图和条形直观地显示分布情况。
定量数据的分布分析:
对于定量变量而言,选择“组数”和“组宽”是做频率分布分析时最主要的问题,一般按照以下步骤进行。
- 求极差
- 决定组距与组数
- 决定分点
- 列出频率分布表
- 绘制频率分布直方图
遵循的主要原则:
- 各组之间必须是相互排斥的
- 各组必须将所有的数据包含在内
- 各组的组宽最好相等
“捞起生鱼片”的销售情况:
日期 | 销售额(元) | 日期 | 销售额(元) | 日期 | 销售额(元) |
2014/4/1 | 420 | 2014/5/1 | 1770 | 2014/6/1 | 3960 |
… | … | … | … | … | … |
| | 2014/5/31 | 1800 | | |
如需要数据请私聊我
对于上面我们已经拿到的数据集:
(1)求极差
极差 = 最大值 - 最小值 = 3960 - 40 = 3915
(2)分组
这里可以根据业务数据的含义对数据进行取组距,值为500。
组数 = 极差 / 组距 = 3915 / 500 = 7.83 => 可看做为8
(3)决定分点
分布区间如表所示:
[0,500) | [500,1000) | [1000,1500) | [1500,2000) |
[2000,2500) | [2500,3000) | [3000,3500) | [3500,4000) |
(4)绘制频率分布表
组段 | 组中值x | 频数 | 频率f | 累计频率 |
[500,1000) | 750 | 24 | 26.37% | 42.85% |
[1000,1500) | 1250 | 17 | 18.68% | 61.54% |
[1500,2000) | 1750 | 15 | 16.84% | 78.02% |
… | … | … | … | … |
[4000,4500) | 4250 | 1 | 1.10% | 100.00% |
(5)绘制频率分布直方图
以捞起生鱼片的销售额为横轴,各组段的频率密度(频率/组距)为纵轴,绘制频率分布直方图。
2、对比分析
对比分析是指把两个相互联系的指标进行比较,从数量上展示和说明研究对象规模的大小,水平的高低,速度的快慢,以及各种关系是否协调。特别适用于指标间的横纵向比较、时间序列的比较分析。在对比分析中,选择合适的对比标准是十分关键的步骤,只有选择合适,才能做出客观的评价,选择不合适,评价可能得出错误的结论。对比分析主要有以下两种形式。
(1 )绝对数比较绝对数比较是利用绝对数进行对比,从而寻找差异的一种方法。
(2)相对数比较相对数比较是由两个有联系的指标对比计算的,用以反映客观现象之间数量联系程度的综合指标,其数值表现为相对数。由于研究目的和对比基础不同,相对数可以分成以下几种。
- 结构相对数:将同一总体内的部分数值与全部数值对比求得比重,用以说明事物的性质、结构或质量。如居民食品支出额占消费支出总额比重、产品合格率等。
- 比例相对数:将同一总体内不同部分的数值进行对比,表明总体内各部分的比例关系。如人口性别比例、投资与消费比例等。
- 比较相对数:将同一时期两个性质相同的指标数值进行对比,说明同类现象在不同空间条件下的数量对比关系。如不同地区商品价格对比,不同行业、不同企业间某指标对比等。
- 强度相对数:将两个性质不同但有一定联系的总量指标进行对比,用以说明现象的强度、密度和普遍程度。如人均国内生产总值用“元/人”表示,人口密度用“人/平方公里”表示,也有用百分数或千分数表示的,如人口出生率用‰表示。
- 计划完成程度相对数:是某一时期实际完成数与计划数的对比,用以说明计划完成程度。
- 动态相对数:将同一现象在不同时期的指标数值进行对比,用以说明发展方向和变化的速度。如发展速度、增长速度等。
3、统计量分析
用统计指标对定量数据进行统计描述,常从集中趋势和离中趋势两个方面进行分析。
集中趋势度量:
- 均值
- 中位数
- 众数
离中趋势度量:
- 极差
- 标准差
- 变异系数
- 四分位数间距
若详细介绍篇幅将会过长,请大家自行查阅上述名词及实例
餐饮销量数据统计量分析:
#-*- coding: utf-8 -*-
#餐饮销量数据统计量分析
from __future__ import print_function
import pandas as pd
catering_sale = '../data/catering_sale.xls' #餐饮数据
data = pd.read_excel(catering_sale, index_col = u'日期') #读取数据,指定“日期”列为索引列
data = data[(data[u'销量'] > 400)&(data[u'销量'] < 5000)] #过滤异常数据
statistics = data.describe() #保存基本统计量
statistics.loc['range'] = statistics.loc['max']-statistics.loc['min'] #极差
statistics.loc['var'] = statistics.loc['std']/statistics.loc['mean'] #变异系数
statistics.loc['dis'] = statistics.loc['75%']-statistics.loc['25%'] #四分位数间距
print(statistics)
运行程序,我们可以得到如下结果:
销量
count 195.000000
mean 2744.595385
std 424.739407
min 865.000000
25% 2460.600000
50% 2655.900000
75% 3023.200000
max 4065.200000
range 3200.200000
var 0.154755
dis 562.600000
Process finished with exit code 0
4、周期性分析
周期性分析是探索某个变量是否随着时间变化而呈现出某种周期变化趋势。时间尺度相对较长的周期性趋势有年度周期性趋势、季节性周期趋势,相对较短的有月度周期性趋势、周度周期性趋势,甚至更短的天、小时周期性趋势。
5、贡献度分析
的利润常常来自于20%最畅销的产品,而其他80%的产品只产生了20%的利润。
菜品盈利帕累托图
#-*- coding: utf-8 -*-
#菜品盈利数据 帕累托图
from __future__ import print_function
import pandas as pd
#初始化参数
dish_profit = '../data/catering_dish_profit.xls' #餐饮菜品盈利数据
data = pd.read_excel(dish_profit, index_col = u'菜品名')
data = data[u'盈利'].copy()
# data.sort(ascending = False)
import matplotlib.pyplot as plt #导入图像库
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.figure()
data.plot(kind='bar')
plt.ylabel(u'盈利(元)')
p = 1.0*data.cumsum()/data.sum()
p.plot(color = 'r', secondary_y = True, style = '-o',linewidth = 2)
plt.annotate(format(p[6], '.4%'), xy = (6, p[6]), xytext=(6*0.9, p[6]*0.9), arrowprops=dict(arrowstyle="->", connectionstyle="arc3,rad=.2")) #添加注释,即85%处的标记。这里包括了指定箭头样式。
plt.ylabel(u'盈利(比例)')
plt.show()
6、相关性分析
分析连续变量之间线性相关程度的强弱,并用适当的统计指标表示出来的过程称为相关分析。
- 直接绘制散点图
判断两个变量是否具有线性相关关系最直观的方法就是绘制散点图
- 绘制散点图矩阵
需要同时考察多个变量间的相关关系时,一一绘制它们间的简单散点图是十分麻烦的。此时可利用散点图矩阵同时绘制各变量间的散点图,从而快速发现多个变量间主要相关性,这在进行多元线性回归时显得尤为重要。
- 计算相关系数
为了更加准确地描述变量之间的线性相关程度,可以通过计算相关系数来进行相关分析。在二元变量的相关分析过程中比较常用的有Pearson相关系数、Spearman秩关系数和判定系数。
餐饮销量数据相关性分析:
#-*- coding: utf-8 -*-
#餐饮销量数据相关性分析
from __future__ import print_function
import pandas as pd
catering_sale = '../data/catering_sale_all.xls' #餐饮数据,含有其他属性
data = pd.read_excel(catering_sale, index_col = u'日期') #读取数据,指定“日期”列为索引列
a = data.corr() #相关系数矩阵,即给出了任意两款菜式之间的相关系数
b = data.corr()[u'百合酱蒸凤爪'] #只显示“百合酱蒸凤爪”与其他菜式的相关系数
c = data[u'百合酱蒸凤爪'].corr(data[u'翡翠蒸香茜饺']) #计算“百合酱蒸凤爪”与“翡翠蒸香茜饺”的相关系数
print(b)
这里我们将
data.corr()[u'百合酱蒸凤爪']
命名为b,输出b我们可以得到“百合酱蒸凤爪”与其他菜式的相关系数
百合酱蒸凤爪 1.000000
翡翠蒸香茜饺 0.009206
金银蒜汁蒸排骨 0.016799
乐膳真味鸡 0.455638
蜜汁焗餐包 0.098085
生炒菜心 0.308496
铁板酸菜豆腐 0.204898
香煎韭菜饺 0.127448
香煎罗卜糕 -0.090276
原汁原味菜心 0.428316
Name: 百合酱蒸凤爪, dtype: float64
Process finished with exit code 0
从上面的结果可以看到,如果顾客点了“百合酱蒸凤爪”,则和点“翡翠蒸香茜饺”“金银蒜汁蒸排骨”“香煎萝卜糕”“铁板酸菜豆腐”“香煎韭菜饺”等主食类的相关性比较低,反而点“乐膳真味鸡”“生炒菜心”“原汁原味菜心”的相关性比较高。
★如有不足或错误还请指出,谢谢。