3章数据探索(重要)

数据质量分析

是数据预处理的前提,是数据挖掘分析结论有效性和准确性的基础,其主要任务是检查原始数据中是否存在脏数据,脏数据包括:

缺失值

异常值

不一致的值

重复数据及含有特殊符号(如#、¥、*)的数据

本小节将主要对数据中的缺失值、异常值和一致性进行分析。

缺失值统计分析

统计缺失值的变量个数

统计每个变量的未缺失数

统计变量的缺失数及缺失率

异常值统计分析-箱型图代码

异常值分析是检验数据是否有录入错误以及含有不合常理的数据

异常值是指样本中的个别值,其数值明显偏离其余的观测值。异常值也称为离群点,异常值的分析也称为离群点的分析。

异常值分析方法主要有:简单统计量分析、3    原则、箱型图分析。

import pandas as pddata = pd.read_excel('../data/catering_sale.xls', 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')#p['fliers'][0].get不会报错#p = data.boxplot() #画箱线图,直接使用pd的DataFrame的方法x = p['fliers'][0].get_xdata() # 'flies'即为异常值的标签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 -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() #展示箱线图

一致性分析

数据不一致性是指数据的矛盾性、不相容性。直接对不一致的数据进行挖掘,可能会产生与实际相违背的挖掘结果。

在数据挖掘过程中,不一致数据的产生主要发生在数据集成的过程中,可能是由于被挖掘数据是来自于从不同的数据源、重复存放的数据未能进行一致性地更新造成的,比如两张表中都存储了用户的地址,在用户的地址发生改变时,如果只更新了一张表中的数据,那么这两张表中就有了不一致的数据。

数据特征分析

一般可通过绘制图表、计算某些特征量等手段进行数据的特征分析。

这里主要介绍的特征方法有:

分布分析-统计函数describe

分布分析能揭示数据的分布特征和分布类型,便于发现某些特大或特小的可疑值。

对于定性分类数据,可用饼图和条形图直观地显示分布情况。

对于定量变量而言,欲了解其分布形式,是对称的、还是非对称的,可做出频率分布表、绘制频率分布直方图、绘制茎叶图进行直观地分析;

定量变量做频率分布分析时选择“组数”和“组宽”是主要的问题,一般按照以下步骤:

求极差2决定组距与组数3决定分点4列出频率分布表5绘制频率分布直方图

1各组之间必须是相互排斥的

2各组必须将所有的数据包含在内

3各组的组宽最好相等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)

对比分析

对比分析是指把两个相互联系的指标数据进行比较,从数量上展示和说明研究对象规模的大小,水平的高低,速度的快慢,以及各种关系是否协调。特别适用于指标间的横纵向比较、时间序列的比较分析。在对比分析中,选择合适的对比标准是十分关键的步骤,选择得合适,才能做出客观的评价,选择不合适,评价可能得出错误的结论。

对比分析主要有以下两种形式:

第一种:绝对数比较

第二种:相对数比较

1)结构相对数4)强度相对数

2)比例相对数5)计划完成程度相对数

3)比较相对数6)动态相对数

统计量分析

用统计指标对定量数据进行统计描述,常从集中趋势和离中趋势两个方面进行分析。

平均水平的指标是对个体集中趋势的度量,使用最广泛的是均值和中位数;反映变异程度的指标则是对个体离开平均水平的度量,使用较广泛的是标准差(方差)、四分位间距。

集中趋势度量主要有:均值、中位数、众数

离中趋势度量主要有:极差、标准差、变异系数

周期性分析

周期性分析是探索某个变量是否随着时间变化而呈现出某种周期变化趋势。周期性趋势相对较长的有年度周期性趋势、季节性周期趋势,相对较短的一般有月度周期性趋势、周度周期性趋势,甚至更短的天、小时周期性趋势。

如在做某用电单位用电量趋势预测过程中,可以先分析该用电单位日用电量的时序图,来直观地估计其用电量变化趋势。

贡献度分析-帕累托分析

贡献度分析又称帕累托分析,帕累托法则又称20/80定律。同样的投入放在不同的地方会产生不同的效益。比如对一个公司来讲,80%的利润常常来自于20%最畅销的产品;而其他80%的产品只产生了20%的利润。贡献度分析要求我们抓住问题的重点,找到那最有效的20%的热销产品、渠道或者销售人员,在最有效的20%上投入更多资源,尽量减少浪费在80%低效的地方。

菜品盈利数据 帕累托图

#初始化参数dish_profit = '../data/catering_dish_profit.xls' #餐饮菜品盈利数据data = pd.read_excel(dish_profit, index_col = u'菜品名')data = data[u'盈利'].copy()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)#secondary_y数轴说明在右边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()#小知识cumsuma = np.array([[1,2,3], [4,5,6]])np.cumsum(a,axis=0)# sum over rows for each of the 3 columnsnp.cumsum(a,axis=1)# sum over rows for each of the 3 行

就餐饮企业来讲,可以重点改善盈利最高的80%的菜品,或者重点发展综合影响最高的80%的部门。这种结果可以通过帕累托分析直观的呈现出来,如下图:

相关性分析代码corr

分析连续变量之间线性的相关程度的强弱,并用适当的统计指标表示出来的过程称为相关分析。

相关性分析方法主要有:

直接绘制散点图2绘制散点图矩阵3计算相关系数(比较常用的如Pearson相关系数、Spearman秩相关系数和判定系数。)

catering_sale = '../data/catering_sale_all.xls' #餐饮数据,含有其他属性data= pd.read_excel(catering_sale, index_col = u'日期') #读取数据,指定“日期”列为索引列data.corr() #相关系数矩阵,即给出了任意两款菜式之间的相关系数data.corr()[u'百合酱蒸凤爪'] #只显示“百合酱蒸凤爪”与其他菜式的相关系数data[u'百合酱蒸凤爪'].corr(data[u'翡翠蒸香茜饺']) #计算“凤爪”与“翡翠蒸香茜饺”的相关系数

统计特征函数

Mean()Geomean()几何平均数,VarstdcorrcovMoment中心距

第4章-数据预处理

一、数据清洗

数据清洗主要是删除原始数据集中的无关数据、重复数据,平滑噪声数据,处理缺失值、异常值等。

1删除无关重复值
2平滑噪声
3异常值处理

(1)删除有异常值的记录 (2)视为缺失值 (3)平均值修正 (4)不处理
要分析异常值的原因,再决定取舍。

4缺失值处理

方法可分为三类:删除记录、数据插补和不处理。

常用的数据插补方法:均值/中位数/众数,固定值,最近邻插补,回归方法,插值

插值方法:有Hermite插值、分段插值、样条插值法,而最主要的有拉格朗日插值法和牛顿插值法。

拉格朗日插值法代码 ployinterp_column

拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。这样的多项式称为拉格朗日(插值)多项式from scipy.interpolate import lagrange #导入拉格朗日插值函数inputfile = '../data/catering_sale.xls' #销量数据路径outputfile = '../tmp/sales.xls' #输出数据路径data = pd.read_excel(inputfile) #读入数据data[u'销量'][(data[u'销量'] < 400) | (data[u'销量'] > 5000)] = None #过滤异常值,将其变为空值#自定义列向量插值函数#s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5def ployinterp_column(s, n, k=5):y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取数y = y[y.notnull()] #剔除空值return lagrange(y.index, list(y))(n) #插值并返回插值结果#逐个元素判断是否需要插值for i in data.columns:for j in range(len(data)):if (data[i].isnull())[j]: #如果为空即插值。data[i][j] = ployinterp_column(data[i], j)data.to_excel(outputfile) #输出结果,写入文件

二、数据集成实体识别,冗余属性识别

将多个数据源放在一个统一的数据仓库中。

要考虑实体识别问题和属性冗余问题,从而把源数据在最低层上加以转换、提炼和集成。


1.实体识别

实体识别的任务是检测和解决同名异义、异名同义、单位不统一的冲突。如:

同名异义:数据源A中的属性ID和数据源B中的属性ID分别描述的是菜品编号和订单编号,即描述的是不同的实体。

异名同义:数据源A中的sales_dt和数据源B中的sales_date都是是描述销售日期的,即A. sales_dt= B. sales_date

单位不统一:描述同一个实体分别用的是国际单位和中国传统的计量单位。


2.冗余属性识别

数据集成往往导致数据冗余,如:同一属性多次出现\同一属性命名不一致导致重复

不同源数据的仔细整合能减少甚至避免数据冗余与不一致,以提高数据挖掘的速度和质量。对于冗余属性要先分析检测到后再将其删除。

有些冗余属性可以用相关分析检测到。给定两个数值型的属性AB,根据其属性值,可以用相关系数度量一个属性在多大程度上蕴含另一个属性。

一、数据变换:简单函数变换 规范化,离散化

主要是对数据进行规范化的操作,将数据转换成“适当的”格式,以适用于挖掘任务及算法的需要。

1.简单函数变换

简单函数变换就是对原始数据进行某些数学函数变换,常用的函数变换包括平方、开方、对数、差分运算等

用来将不具有正太分布的数据变换成具有正太性的数据。
时间序列分析中,对数变换或者差分运算可以将非平稳序列转换为平稳序列


2.规范化 

数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,数值间的差别可能很大
消除指标间量纲影响

最小-最大规范化:也称为离差标准化是对原始数据的线性变换,使结果值映射到[0,1]之间

-均值规范化:也叫标准差标准化,经过处理的数据的平均数为0标准差为1

小数定标规范化:通过移动属性值的小数位数,将属性值映射到[-11]之间,移动的小数位数取决于属性值绝对值的最大值。

datafile= '../data/normalization_data.xls' #参数初始化data = pd.read_excel(datafile, header = None) #读取数据(data - data.min())/(data.max() - data.min()) #最小-最大规范化(data - data.mean())/data.std() #零-均值规范化data.mean(axis = 0)按照列

data/10**np.ceil(np.log10(data.abs().max())) #小数定标规范化

1. 连续属性离散化 

一些数据挖掘算法,特别是某些分类算法,要求数据是分类属性形式,如ID3算法、Apriori算法等。这样,常常需要将连续属性变换成分类属性,即连续属性离散化。

离散化性涉及两个子任务1需要多少个分类变量2确定如何将连续属性值映射到这些分类值。

常用的离散化方法 
(1)等宽法
(2)等频法
(3)基于聚类分析的方法

#数据规范化:离散化cut,KMeansdatafile = '../data/discretization_data.xls' #参数初始化data = pd.read_excel(datafile) #读取数据data = data[u'肝气郁结证型系数'].copy()k = 4# 等宽离散化,各个类比依次命名为0,1,2,3d1 = pd.cut(data, k, labels = range(k))#等频率离散化w = [1.0*i/k for i in range(k+1)]w = data.describe(percentiles = w)[4:4+k+1] #使用describe函数自动计算分位数w[0] = w[0]*(1-1e-10)d2 = pd.cut(data, w, labels = range(k))#聚类分类from sklearn.cluster import KMeans #引入KMeanskmodel = KMeans(n_clusters = k, n_jobs = 4) #建立模型,n_jobs是并行数,一般等于CPU数较好kmodel.fit(data.reshape((len(data), 1))) #训练模型c = pd.DataFrame(kmodel.cluster_centers_).sort_values(by=[0]) #.sort()#输出聚类中心,并且排序(默认是随机序的)w = pd.rolling_mean(c, 2).iloc[1:] #相邻两项求中点,作为边界点w = [0] + list(w[0]) + [data.max()] #把首末边界点加上d3 = pd.cut(data, w, labels = range(k))def cluster_plot(d, k): #自定义作图函数来显示聚类结果import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号plt.figure(figsize = (8, 3))for j in range(0, k):plt.plot(data[d==j], [j for i in d[d==j]], 'o')plt.ylim(-0.5, k-0.5)return pltcluster_plot(d1, k).show()cluster_plot(d2, k).show()cluster_plot(d3, k).show()

4. 属性构造 -构造新的属性

#新属性构造-输出到excelinputfile= '../data/electricity_data.xls' #供入供出电量数据outputfile = '../tmp/electricity_data.xls' #属性构造后数据文件data = pd.read_excel(inputfile) #读入数据data[u'线损率'] = (data[u'供入电量'] - data[u'供出电量'])/data[u'供入电量']data.to_excel(outputfile, index = False) #保存结果

5. 小波变换代码

非平稳序列的分析手段。
基于小波变换的特征提取方法:
(1)基于小波变换的多尺度空间能量分布特征提取法
(2)基于小波变换的多尺度空间的模极大特征值提取法
(3)基于小波变换的特征提取方法
(4)基于适应性小波神经网络的特征提取方法

inputfile= '../data/leleccum.mat' #提取自Matlab的信号文件from scipy.io import loadmat #mat是MATLAB专用格式,需要用loadmat读取它mat = loadmat(inputfile)signal = mat['leleccum'][0]import pywt #导入PyWaveletscoeffs = pywt.wavedec(signal, 'bior3.7', level = 5)#返回结果为level+1个数字,第一个数组为逼近系数数组,后面的依次是细节系数数组

二、数据规约

数据规约是将海量数据进行规约,规约之后的数据仍接近于保持原数据的完整性,但数据量小得多。

通过数据规约,可以达到:

降低无效、错误数据对建模的影响,提高建模的准确性

少量且具代表性的数据将大幅缩减数据挖掘所需的时间

降低储存数据的成本


1.属性规约常用方法
1.合并属性2逐步向前选择3逐步向后删除4决策树规约
5主成分分析降维代码

1数据矩阵2将数据矩阵中心标准化3求相关系数矩阵4R的特征方程5确定主成分个数

6计算m个相应的单位特征向量7计算主成分

inputfile = '../data/principal_component.xls'outputfile = '../tmp/dimention_reducted.xls' #降维后的数据data = pd.read_excel(inputfile, header = None) #读入数据from sklearn.decomposition import PCApca = PCA()pca.fit(data)pca.components_ #返回模型的各个特征向量pca.explained_variance_ratio_ #返回各个成分各自的方差百分比

三维

pca=PCA(3)

pca.fit(data)

low_d=pca.transform(data)#降维

pd.DataFrame(low_d).to_excel(outputfile)

pca.inverse_transform(low_d)

2数值规约 分箱,回归,聚类,卡方检验,决策树

通过选择替代的、较小的数据来减少数据量,包含有参数方法和无参数方法两类;有参数方法使用模型评估数据,不需要存放真实数据,只需要存放参数,例如回归、对数线性模型。

无参数需要数据,例如直方图、聚类、抽样。

五、常用数据预处理函数

1.interpolate:一维,高维数据插值
f.scipy.interpolate.lagrange(x,y)
2.unique:去除重复元素
np.unique(D)
D.unique( )

import pandas as pdimport numpy as npD=pd.Series([1,1,2,3,5])d1=D.unique()d2=np.unique(D)print "d1 is:\n",d1print "d2 is:\n",d2

3.isnull/notnull:判断空值/非空值
4.random:生成随机矩阵
k x m x n维0-1之间;
np.random.rand(k,m,n…)
k x m x n维,正态分布;
np.random.randn(k,m,n)
5.PCA:主成分分析

5章:挖掘建模

cmplot混淆矩阵,看spe

# -*- coding: utf-8 -*-def cm_plot(y, yp):from sklearn.metrics import confusion_matrix# 导入混淆矩阵函数cm = confusion_matrix(y, yp)# 混淆矩阵

import matplotlib.pyplot as plt# 导入作图库plt.matshow(cm, cmap=plt.cm.Greens)# 画混淆矩阵图,配色风格使用cm.Greens,更多风格请参考官网。plt.colorbar()# 颜色标签for x in range(len(cm)):# 数据标签for y in range(len(cm)):plt.annotate(cm[x, y], xy=(x, y), horizontalalignment='center', verticalalignment='center')plt.ylabel('True label')# 坐标轴标签plt.xlabel('Predicted label')# 坐标轴标签return plt

1分类与预测

算法与模型

算法:回归分析(logisticsLDA),决策树,神经网络,贝叶斯,svm,随机森林

常用回归模型:逻辑回归,(非)线性回归,岭回归,主成分回归, logistics回归

1、逻辑回归

#-*- coding: utf-8 -*-#逻辑回归 自动建模import pandas as pd#参数初始化filename = '../data/bankloan.xls'data = pd.read_excel(filename)x = data.iloc[:,:8].as_matrix()y = data.iloc[:,8].as_matrix()from sklearn.linear_model import LogisticRegression as LRfrom sklearn.linear_model import RandomizedLogisticRegression as RLR rlr = RLR() #建立随机逻辑回归模型,筛选变量rlr.fit(x, y) #训练模型rlr.get_support() #获取特征筛选结果,也可以通过.scores_方法获取各个特征的分数print(u'通过随机逻辑回归模型筛选特征结束。')print(u'有效特征为:%s' % ','.join(data.columns[rlr.get_support()]))x = data[data.columns[rlr.get_support()]].as_matrix() #筛选好特征lr = LR() #建立逻辑货柜模型lr.fit(x, y) #用筛选后的特征数据来训练模型print(u'逻辑回归模型训练结束。')print(u'模型的平均正确率为:%s' % lr.score(x, y)) #给出模型的平均正确率,本例为81.4%

Scikit-learn提供了RFE包,用于特征消除,还提供了RFECV通过交叉验证进行特征排序

2、决策树ID3,C4.5CART

ID3决策树

ID3算法是一种基于信息熵的决策树分类算法,它选择当前样本集中具有最大信息增益值的属性作为测试属性选择增益最大

#-*- coding: utf-8 -*-#使用ID3决策树算法预测销量高低import pandas as pd#参数初始化inputfile = '../data/sales_data.xls'data = pd.read_excel(inputfile, index_col = u'序号') #导入数据#数据是类别标签,要将它转换为数据#用1来表示“好”、“是”、“高”这三个属性,用-1来表示“坏”、“否”、“低”data[data == u'好'] = 1data[data == u'是'] = 1data[data == u'高'] = 1data[data != 1] = -1x = data.iloc[:,:3].as_matrix().astype(int)y = data.iloc[:,3].as_matrix().astype(int)from sklearn.tree import DecisionTreeClassifier as DTCdtc = DTC(criterion='entropy') #建立决策树模型,基于信息熵dtc.fit(x, y) #训练模型#导入相关函数,可视化决策树。#导出的结果是一个dot文件,需要安装Graphviz才能将它转换为pdf或png等格式。from sklearn.tree import export_graphvizfrom sklearn.externals.six import StringIOwith open("tree.dot", 'w') as f:f = export_graphviz(dtc, feature_names = x.columns, out_file = f)

2

CART决策树模型

#-*- coding: utf-8 -*-#构建并测试CART决策树模型import pandas as pd #导入数据分析库from random import shuffle #导入随机函数shuffle,用来打算数据datafile = '../data/model.xls' #数据名data = pd.read_excel(datafile) #读取数据,数据的前三列是特征,第四列是标签data = data.as_matrix() #将表格转换为矩阵shuffle(data) #随机打乱数据p = 0.8 #设置训练数据比例train = data[:int(len(data)*p),:] #前80%为训练集test = data[int(len(data)*p):,:] #后20%为测试集#构建CART决策树模型from sklearn.tree import DecisionTreeClassifier #导入决策树模型treefile = '../tmp/tree.pkl' #模型输出名字tree = DecisionTreeClassifier() #建立决策树模型tree.fit(train[:,:3], train[:,3]) #训练#保存模型from sklearn.externals import joblibjoblib.dump(tree, treefile)from cm_plot import * #导入自行编写的混淆矩阵可视化函数cm_plot(train[:,3], tree.predict(train[:,:3])).show() #显示混淆矩阵可视化结果#注意到Scikit-Learn使用predict方法直接给出预测结果。from sklearn.metrics import roc_curve #导入ROC曲线函数fpr, tpr, thresholds = roc_curve(test[:,3], tree.predict_proba(test[:,:3])[:,1], pos_label=1)plt.plot(fpr, tpr, linewidth=2, label = 'ROC of CART', color = 'green') #作出ROC曲线plt.xlabel('False Positive Rate') #坐标轴标签plt.ylabel('True Positive Rate') #坐标轴标签plt.ylim(0,1.05) #边界范围plt.xlim(0,1.05) #边界范围plt.legend(loc=4) #图例plt.show() #显示作图结果

3、人工神经网络BP\LM\RBF\FNN\GMDH\ANFIS

#-*- coding: utf-8 -*-#使用神经网络算法预测销量高低,用sales_data.xlsfrom keras.models import Sequentialfrom keras.layers.core import Dense, Activationmodel = Sequential() #建立模型model.add(Dense(10,input_dim=3))#三个输入,10个隐藏,1一个输出model.add(Activation('relu')) #用relu函数作为激活函数,能够大幅提供准确度model.add(Dense(1,input_dim=10))model.add(Activation('sigmoid')) #由于是0-1输出,用sigmoid函数作为激活函数model.compile(loss = 'binary_crossentropy', optimizer = 'adam')#class_mode = 'binary'#编译模型。由于我们做的是二元分类,所以我们指定损失函数为binary_crossentropy,以及模式为binary#另外常见的损失函数还有mean_squared_error、categorical_crossentropy等,请阅读帮助文件。#求解方法我们指定用adam,还有sgd、rmsprop等可选model.fit(x, y, epochs = 1000, batch_size = 10) #训练模型,学习一千次,x训练失败?yp = model.predict_classes(x).reshape(len(y)) #分类预测from cm_plot import * #导入自行编写的混淆矩阵可视化函数cm_plot(y,yp).show() #显示混淆矩阵可视化结果

2聚类分析:

划分方法(常用:kmean算法 ,k中心点),系统聚类,层次聚类,谱聚类,基于密度/网格/模型的聚类,均值漂移聚类:用scikit-learnspicy.cluster也有很多

kmeans聚类算法过程:

1)从N个样本数据中随机选取K个对象作为初始的聚类中心;

2)分别计算每个样本到各个聚类中心的距离,将对象分配到距离最近的聚类中;

3)所有对象分配完成后,重新计算K个聚类的中心;

4)与前一次计算得到的K个聚类中心比较,如果聚类中心发生变化,转2),否则转5)

5)当质心不发生变化时停止并输出聚类结果。

连续属性:度量样本之间的相似性最常用的是欧几里得距离、曼哈顿距离和闵可夫斯基距离, 文档数据:使用余弦相似性度量,先将文档数据整理成文档—词矩阵格式)

误差平方和SSE

import pandas as pd#参数初始化inputfile = '../data/consumption_data.xls' #销量及其他属性数据outputfile = '../tmp/data_type.xls' #保存结果的文件名k = 3 #聚类的类别iteration = 500 #聚类最大循环次数data = pd.read_excel(inputfile, index_col = 'Id') #读取数据data_zs = 1.0*(data - data.mean())/data.std() #数据标准化from sklearn.cluster import KMeansif __name__=='__main__':#加入此行代码即可model = KMeans(n_clusters = k, n_jobs = 4, max_iter = iteration) #分为k类,并发数4model.fit(data_zs) #开始聚类, you must protect your main loop using "if __name__ == '__main__'".#简单打印结果r1 = pd.Series(model.labels_).value_counts() #统计各个类别的数目r2 = pd.DataFrame(model.cluster_centers_) #找出聚类中心r = pd.concat([r2, r1], axis = 1) #横向连接(0是纵向),得到聚类中心对应的类别下的数目r.columns = list(data.columns) + [u'类别数目'] #重命名表头print(r)#详细输出原始数据及其类别r = pd.concat([data, pd.Series(model.labels_, index = data.index)], axis = 1)#详细输出每个样本对应的类别r.columns = list(data.columns) + [u'聚类类别'] #重命名表头r.to_excel(outputfile) #保存结果

绘制聚类后的概率密度图

def density_plot(data): #自定义作图函数p = data.plot(kind='kde', linewidth = 2, subplots = True, sharex = False)[p[i].set_ylabel(u'密度') for i in range(k)]plt.legend()return pltpic_output = '../tmp/pd_' #概率密度图文件名前缀for i in range(k):density_plot(data[r[u'聚类类别']==i]).savefig(u'%s%s.png' %(pic_output, i))

for i in range(len(data.iloc[0])):#逐列作图(data.iloc[:,i]).plot(kind='kde', linewidth=2, label=data.columns[i])

聚类后算法评价

Purity评价法:正确聚类占总数比例

RI评价

F值评价

聚类可视化TSNE

#kmeans.py

from sklearn.manifold import TSNEimport matplotlib.pyplot as plttsne = TSNE()tsne.fit_transform(data_zs) #进行数据降维tsne = pd.DataFrame(tsne.embedding_, index = data_zs.index) #转换数据格式#不同类别用不同颜色和样式绘图d = tsne[r[u'聚类类别'] == 0]#a=r[u'聚类类别'] == 0,dtype('bool'),r:oject,r.columns:Index([u'R', u'F', u'M', u'聚类类别'], dtype='object')plt.plot(d[0], d[1], 'r.')d = tsne[r[u'聚类类别'] == 1]plt.plot(d[0], d[1], 'go')d = tsne[r[u'聚类类别'] == 2]plt.plot(d[0], d[1], 'b*')plt.show()

3关联规则aprior,FP-TREE

1)关联规则的一般形式

支持度:项集AB同时发生的概率

置信度:项集A发生,则项集B也同时发生的概率

2)最小支持度和最小置信度

最小支持度:一个阈值,表示项目集在统计意义上的最低重要性;

最小置信度:一个阈值表示关联规则的最低可靠性。

同时满足最小支持度阈值和最小置信度阈值的规则称作强规则。

函数文件apirior.py

过程一:找出所有的频繁项集。

过程二:由频繁项集产生强关联规则def connect_string(x, ms):x = list(map(lambda i: sorted(i.split(ms)), x))l = len(x[0])r = []for i in range(len(x)):for j in range(i, len(x)):if x[i][:l - 1] == x[j][:l - 1] and x[i][l - 1] != x[j][l - 1]:r.append(x[i][:l - 1] + sorted([x[j][l - 1], x[i][l - 1]]))return r# 寻找关联规则的函数def find_rule(d, support, confidence, ms=u'--'):result= pd.DataFrame(index=['support', 'confidence'])# 定义输出结果support_series = 1.0 * d.sum() / len(d)# 支持度序列column = list(support_series[support_series > support].index)# 初步根据支持度筛选k = 0while len(column) > 1:k = k + 1print(u'\n正在进行第%s次搜索...' % k)column = connect_string(column, ms)print(u'数目:%s...' % len(column))sf = lambda i: d[i].prod(axis=1, numeric_only=True)# 新一批支持度的计算函数# 创建连接数据,这一步耗时、耗内存最严重。当数据集较大时,可以考虑并行运算优化。d_2 = pd.DataFrame(list(map(sf, column)), index=[ms.join(i) for i in column]).Tsupport_series_2 = 1.0 * d_2[[ms.join(i) for i in column]].sum() / len(d)# 计算连接后的支持度column = list(support_series_2[support_series_2 > support].index)# 新一轮支持度筛选support_series = support_series.append(support_series_2)column2 = []for i in column:# 遍历可能的推理,如{A,B,C}究竟是A+B-->C还是B+C-->A还是C+A-->B?i = i.split(ms)for j in range(len(i)):column2.append(i[:j] + i[j + 1:] + i[j:j + 1])cofidence_series = pd.Series(index=[ms.join(i) for i in column2])# 定义置信度序列for i in column2:# 计算置信度序列cofidence_series[ms.join(i)] = support_series[ms.join(sorted(i))] / support_series[ms.join(i[:len(i) - 1])]for i in cofidence_series[cofidence_series > confidence].index:# 置信度筛选result[i] = 0.0result[i]['confidence'] = cofidence_series[i]result[i]['support'] = support_series[ms.join(sorted(i.split(ms)))]result= result.T.sort(['confidence', 'support'], ascending=False)# 结果整理,输出print(u'\n结果为:')print(result)return result

使用Apriori算法挖掘菜品订单关联规则

#-*- coding: utf-8 -*-#使用Apriori算法挖掘菜品订单关联规则from __future__ import print_functionimport pandas as pdfrom apriori import * #导入自行编写的apriori函数inputfile = '../data/menu_orders.xls'outputfile = '../tmp/apriori_rules.xls' #结果文件data = pd.read_excel(inputfile, header = None)

代码好-转换原始数据至0-1矩阵...')有问题

ct = lambda x : pd.Series(1, index = x[pd.notnull(x)]) #转换0-1矩阵的过渡函数b = map(ct, data.as_matrix()) #用map方式执行data = pd.DataFrame(list(b)).fillna(0) #实现矩阵转换,空值用0填充print(u'\n转换完毕。')del b #删除中间变量b,节省内存support = 0.2 #最小支持度confidence = 0.5 #最小置信度ms = '---' #连接符,默认'--',用来区分不同元素,如A--B。需要保证原始表格中不含有该字符find_rule(data, support, confidence, ms).to_excel(outputfile) #保存结果

4时序模式:

常见的时间序列模型 平滑,趋势拟合法,组合(加法,乘法)、ARMA,ARMA,ARIMA,ARCH,GARCH,将重点介绍AR模型、MA模型、ARMA模型和ARIMA模型。

时间序列的预处理(随机+平稳)

拿到一个观察值序列后,首先要对它的纯随机性和平稳性进行检验,这两个重要的检验称为序列的预处理。根据检验结果可以将序列分为不同的类型,对不同类型的序列会采取不同的分析方法。

对于纯随机序列,又叫白噪声序列,就意味着序列的各项之间没有任何相关关系,序列在进行完全无序的随机波动,可以终止对该序列的分析。

对于平稳非白噪声序列,它的均值和方差是常数,现已有一套非常成熟的平稳序列的建模方法。通常是建立一个线性模型来拟合该序列的发展,借此提取该序列的有用信息。ARMA模型是最常用的平稳序列拟合模型;

对于非平稳序列,由于它的均值和方差不稳定,处理方法一般是将其转变为平稳序列,这样就可以应用有关平稳时间序列的分析方法,如建立ARMA模型来进行相应得研究。如果一个时间序列经差分运算后具有平稳性,成该序列为差分平稳序列,可以使用ARIMA模型进行分析。

1平稳性检验

对序列的平稳性的检验有两种检验方法,一种是根据时序图和自相关图的特征做出判断的图检验,该方法操作简单、应用广泛,缺点是带有主观性;另一种是构造检验统计量进行的方法,目前最常用的方法是单位根检验

1)时序图检验:如果有明显的趋势性或者周期性那它通常不是平稳序列。

2)自相关图检验(常用)

平稳序列具有短期相关性,随着延迟期数的增加,平稳序列的自相关系数 会比较快的衰减趋向于零,并在零附近随机波动,而非平稳序列的自相关系数衰减的速度比较慢

3)单位根检验是指检验序列中是否存在单位根,因为存在单位根就是非平稳时间序列了。p 值显著大于0.05===非平稳(不是白噪声)

2纯随机性检验

纯随机性检验也称白噪声检验一般是构造检验统计量来检验序列的纯随机性,常用的检验统计量有 Q 统计量、LB 统计量,计算出对应的p 值,如果p值显著大于显著性水平,则表示该序列不能拒绝纯随机的原假设,可以停止对该序列的分析。

平稳时间序列分析ARMA

ARMA模型的全称是自回归移动平均模型,它是目前最常用的拟合平稳序列的模型。

ARMA模型又可以细分为AR模型、MA模型和ARMA模型三大类。都可以看作是多元线性回归模型。

下面将分别介绍AR模型、MA模型和ARMA模型三大模型。

平稳时间序列的ARMA模型建模步骤。

某个时间序列经过预处理,被判定为平稳非白噪声序列,就可以利用ARMA模型进行建模。

AR模型、MA模型和ARMA模型的自相关系数和偏自相关系数的性质,选择出合适的模型。

ARMAARMA模型自相关系数和偏自相关系数的性质如下:

AR模型:自相关系数拖尾,偏自相关系数截尾;

MA模型:自相关系数截尾,偏自相关函数拖尾;

ARMA模型:自相关函数和偏自相关函数均拖尾。

非平稳时间序列分析ARIMA

对非平稳时间序列的分析方法可以分为确定性因素分解的时序分析和随机时序分析两大类

确定性因素分解的方法把所有序列的变化都归结为四个因素(长期趋势、季节变动、循环变动和随机波动)的综合影响。可以建立加法模型和乘法模型等。

根据时间序列的不同特点,随机时序分析可以建立的模型有ARIMA模型、残差自回归模型、季节模型、异方差模型等。

1、p阶差分相距一期的两个序 列值之间的减法运算称为 1 阶差分运算;

2、k步差分相距k期的两个序列值之间的减法运算称为k步差分运算。

3、差分运算具有强大的确定性信息提取能力,许多非平稳序列差分后会显示出平稳序列的性质,这时称这个非平稳序列为差分平稳序列。

4、对差分平稳序列可以使用ARMA模型进行拟合。

5、ARIMA模型的实质就是差分运算与ARMA模型的组合,掌握了ARMA模型的建模方法和步骤以后,对序列建立ARIMA模型是比较简单的。

建模步骤:(代码问题)

建模步骤

计算ACFPACF(自相关图平稳性检验+白噪声

先计算非平稳白噪声序列的自相关系数(ACF)和偏自相关系数(PACF

不平稳差分后再用ARIMA模型

import pandas as pd#读取数据,指定日期列为指标,Pandas自动将“日期”列识别为Datetime格式discfile = '../data/arima_data.xls'forecastnum = 5data = pd.read_excel(discfile, index_col = u'日期')import matplotlib.pyplot as pltdata.plot()plt.show()

#自相关图和偏自相关图选择模型

from scipy import statsimport matplotlibt.pyplot as pltimport statsmodels.api as smfrom statsmodels.graphics.api import qqplot

fig=sm.graphic.tsa.plot_acf(dta,lags=40,ax=ax1)fig = sm.graphics.tsa.plot_pacf(dta, lags=40, ax=ax2)# 一阶差分后的自相关图与偏自相关图dta = dta.diff(1).dropna()# 注意一定要将查分后的空值去掉再取自相关系数fig = sm.graphics.tsa.plot_acf(dta, lags=40, ax=ax3)fig = sm.graphics.tsa.plot_pacf(dta, lags=40, ax=ax4)

#平稳性检测#白噪声检验

from statsmodels.tsa.stattools import adfuller as ADFprint(u'原始序列的ADF检验结果为:', ADF(data[u'销量']))#返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstoreD_data=data.diff().dropna()D_data.columns=[u'销量差分']from statsmodels.stats.diagnostic import acorr_ljungboxprint(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) #返回统计量和p值from statsmodels.tsa.arima_model import ARIMA#定阶pmax = int(len(D_data)/10) #一般阶数不超过length/10qmax = int(len(D_data)/10) #一般阶数不超过length/10bic_matrix = [] #bic矩阵for p in range(pmax+1):tmp = []for q in range(qmax+1):try: #存在部分报错,所以用try来跳过报错。tmp.append(ARIMA(data, (p,1,q)).fit().bic)except:tmp.append(None)bic_matrix.append(tmp)bic_matrix = pd.DataFrame(bic_matrix) #从中可以找出最小值p,q = bic_matrix.stack().idxmin() #先用stack展平,然后用idxmin找出最小值位置。print(u'BIC最小的p值和q值为:%s、%s' %(p,q))

ARMA模型识别

AR模型、MA模型和ARMA模型的自相关系数和偏自相关系数的性质,选择出合适的模型。

模型定阶AIC:确定pq

(1)人为识别的方法:用相关图像根据ARMA模型识别原则进行模型定阶

(2)第二种方法:相对最优模型识别。

计算ARMA(p,q)当 p 和 q 均小于等于 5 的所有组合的 BIC 信息量,取其中 BIC 信息量达到最小的模型阶数。ARIMA(P1,Q

模型检验

确定模型后,需要检验其残差序列是否是白噪声,若不是,说明,残差中还存在有用的信息,需要修改模型或者进一步提取。若其残差不是白噪声,重新更换p,q的值,重新确定

p值为:0.627016 ,大于0.05残差为白噪声序列,模型通过检验。

模型预测

只能进行短期预测

model= ARIMA(data, (p,1,q)).fit() #建立ARIMA(0, 1, 1)模型model.summary2() #给出一份模型报告model.forecast(5)

模型优化与应用

5离群点检测

threshold=2norm = []for i in range(k): #逐一处理norm_tmp = r[['R', 'F', 'M']][r[u'聚类类别'] == i]-model.cluster_centers_[i]norm_tmp = norm_tmp.apply(np.linalg.norm, axis = 1) #求出绝对距离norm.append(norm_tmp/norm_tmp.median()) #求相对距离并添加#norm = pd.concat(norm) #合并norm[norm <= threshold].plot(style = 'go') #正常点discrete_points = norm[norm > threshold] #离群点discrete_points.plot(style = 'ro')for i in range(len(discrete_points)): #离群点做标记id = discrete_points.index[i]n = discrete_points.iloc[i]plt.annotate('(%s, %0.2f)'%(id, n), xy = (id, n), xytext = (id, n))plt.xlabel(u'编号')plt.ylabel(u'相对距离')plt.show()

《python数据分析与挖掘》-步骤相关推荐

  1. 《Python数据分析与挖掘》实战项目 - Python程序设计(期末大作业、课程设计、毕业设计)2012-2021近十年考研英语一真题词汇词频统计与可视化(附代码)

    <Python数据分析与挖掘> - 2012-2021近十年考研英语一真题词汇词频统计与可视化 声明 本文仅在CSDN发布,其他均为盗版.请支持正版! 正版链接: https://blog ...

  2. Python数据分析与挖掘实战期末考复习(抱佛脚啦)

    期末三天赛高考我真的会谢,三天学完数据挖掘--真的很极限了的. 课本是那本绿色的Python数据分析与挖掘实战(第2版),作者张良均- 图片来自老师给的ppt,以下内容是我自己总结的,自己复习用,覆盖 ...

  3. 《Python数据分析与挖掘实战》第10章(下)——DNN2 筛选得“候选洗浴事件”3 构建模型

    本文是基于<Python数据分析与挖掘实战>的实战部分的第10章的数据--<家用电器用户行为分析与事件识别> 做的分析. 接着前一篇文章的内容,本篇博文重点是处理用水事件中的属 ...

  4. python数据分析与挖掘实战 之笔记2

    <python数据分析与挖掘实战>学习笔记2 经过前面章节的分析,即对数据进行探索和预处理,得到了处理后的数据.根据所得到的数据建立分类与预测.聚类分析.关联规则.时序模式.和偏差检测等模 ...

  5. 《Python数据分析与挖掘实战》第11章——应用系统负载分析与磁盘容量预测(时间序列)

    文章目录 1.背景与目标分析 2.2 数据探索 2.1 查看数据信息 2.2 数据平稳性分析 3 数据预处理 3.1 数据清洗 3.2 数据变换--属性构造 4 模型构建 4.1 确定模型-- ARM ...

  6. Python数据分析与挖掘——回归模型的诊断

    当回归模型构建好之后,并不意味着建模过程的结束,还需要进一步对模型进行诊断,目的就是使诊断后的模型更加健壮.统计学家在发明线性回归模型的时候就提出了一些假设前提,只有在满足这些假设前提的情况下,所得的 ...

  7. Python数据分析与挖掘——线性回归预测模型

    线性回归模型属于经典的统计学模型,该模型的应用场景是根据已 知的变量(自变量)来预测某个连续的数值变量(因变量).例如,餐 厅根据每天的营业数据(包括菜谱价格.就餐人数.预定人数.特价菜 折扣等)预测 ...

  8. (七)Python数据分析与挖掘实战(实战篇)——航空公司客户价值分析

    这个专栏用来记录我在学习和实践<Python数据分析与挖掘实战>一书时的一些知识点总结和代码实现. 文章目录 背景和目标 数据 客户基本信息 乘机信息 积分信息 脚本 data_explo ...

  9. 《Python数据分析与挖掘实战》第12章(下)——协同推荐

    本文是基于<Python数据分析与挖掘实战>的实战部分的第12章的数据--<电子商务网站用户行为分析及服务推荐>做的分析. 由于此章内容很多,因此,分为三个部分进行分享--数据 ...

  10. 《Python数据分析与挖掘实战》一3.1 数据质量分析

    本节书摘来自华章出版社<Python数据分析与挖掘实战>一书中的第3章,第3.1节,作者 张良均 王路 谭立云 苏剑林,更多章节内容可以访问云栖社区"华章计算机"公众号 ...

最新文章

  1. VMware前路难测,多个厂家群雄逐鹿
  2. Python使用matplotlib可视化相关性分析热力图图heatmap、使用seaborn中的heatmap函数可视化相关性热力图(Correllogram)
  3. 关于nginx反向代理产生大量连接问题解决。
  4. 北京44岁程序员失业,感叹:编程估计没戏了,想去卖煎饼果子
  5. STM32外设之GPIO的推挽输出和开漏输出模式详解
  6. CV之LabelImg:图片标注工具之LabelImg(图像标注工具)的简介、安装、使用方法详细攻略
  7. 通过kubeless命令行部署Kyma Lambda Function
  8. Manacher 例题讲解
  9. 鲲鹏云实验-.NET Core 3.0-开始使用
  10. 爱立顺m33+android+4.4.2,更美丽更流畅 爱立顺M33升级Android 4.4.2
  11. int类型究竟占几个字节
  12. 黑马程序员java学生管理系统
  13. php随机生成6个数字,php随机产生六位数密码的实例代码
  14. 菜鸟历程1腾讯云服务器 10元学生套餐购买
  15. sql server2000安装quot;挂起quot;的解决方法
  16. broker可以禁用吗 time_【pximouse可以禁用吗】pximouse是什么程序_pximouse是什么
  17. Unity实现可调子屏幕(类小地图)效果
  18. [青少年CTF]misc-Simpleness writeup by q1jun
  19. php语音直播怎么做,语音直播功能实现流程
  20. nacos registry, gateway register failed java.lang.IllegalArgumentException: no server available

热门文章

  1. 王兴的“下半场”与美团-大众点评的另一种可能
  2. 支持右翼教科书的日本企业与个人全部名单
  3. 【MySQL从入门到精通】【高级篇】(一)字符集的修改与底层原理
  4. Python骇客帝国弹幕1.0
  5. 路由器设置虚拟服务器王者荣耀,封杀王者荣耀 实际很简单_网络设备无线网络和技术-中关村在线...
  6. Springboot接收前端的Json但是为null
  7. 64位win7系统下安装USB下载器驱动FriendlyArm-usb-dnw-driver-的解决方案
  8. 常用二极管,三极管参数
  9. fixed trait
  10. docker 下载mysql 8.0_docker安装mysql8.0