python小能手的文章

  • python数据分析(10)——挖掘建模(5)离群点检测

    1. 离群点的类型
    2. 检测方法
    3. 代码#-*- coding: utf-8 -*-#使用K-Means算法聚类消费行为特征数据import numpy as npimport pandas as pd#参数初始化inputfile = 'consumption_data.xls' #销量及其他属性数据k = 3 #聚类的类别threshold = 2 #离散点阈值iteration = 500 #聚类最大循环次数data = pd.read_excel(inputfile, index_col = 'Id') #读取数据data_zs = 1.0*(data - data.mean())/data.std() #数据标准化from sklearn.cluster import KMeansmodel = KMeans(n_clusters = k, n_jobs = 4, max_iter = iteration) #分为k类,并发数4model.fit(data_zs) #开始聚类#标准化数据及其类别r = pd.concat([data_zs, pd.Series(model.labels_, index = data.index)], axis = 1) #每个样本对应的类别r.columns = list(data.columns) + [u'聚类类别'] #重命名表头norm = []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) #合并import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号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()
    0  留言 2019-01-03 19:21:21
  • python数据分析(9)——挖掘建模(4)时序模式

    1. 时间序列算法
    2. 时间序列的预处理2.1平稳性检验2.1.1 时序图检验平稳的时序图序列值在一个常数附近随机波动,而且波动的范围有界。
    2.1.2 自相关图检验平稳序列具有短期相关性。
    2.1.3 单位根检验存在单位根是非平稳时间序列。
    2.2 纯随机性检验序列值之间没有任何关系(理想状态)。
    3. 平稳时间序列3.1 AR模型
    3.2 MA模型
    3.3 ARMA模型
    3.4建模步骤
    4. 非平稳时间序列分析4.1 ARIMA模型
    4.2 代码实现#-*- coding: utf-8 -*-#arima时序模型import pandas as pd#参数初始化discfile = 'arima_data.xls'forecastnum = 5#读取数据,指定日期列为指标,Pandas自动将“日期”列识别为Datetime格式data = pd.read_excel(discfile, index_col = u'日期')#时序图import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号data.plot()plt.show()#自相关图from statsmodels.graphics.tsaplots import plot_acfplot_acf(data).show()#平稳性检测from statsmodels.tsa.stattools import adfuller as ADFprint(u'原始序列的ADF检验结果为:', ADF(data[u'销量']))#返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore#差分后的结果D_data = data.diff().dropna()D_data.columns = [u'销量差分']D_data.plot() #时序图plt.show()plot_acf(D_data).show() #自相关图from statsmodels.graphics.tsaplots import plot_pacfplot_pacf(D_data).show() #偏自相关图print(u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分'])) #平稳性检测#白噪声检验from statsmodels.stats.diagnostic import acorr_ljungboxprint(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) #返回统计量和p值from statsmodels.tsa.arima_model import ARIMAdata[u'销量'] = data[u'销量'].astype(float)#定阶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)) model = ARIMA(data, (p,1,q)).fit() #建立ARIMA(0, 1, 1)模型model.summary2() #给出一份模型报告model.forecast(5) #作为期5天的预测,返回预测结果、标准误差、置信区间。
    原始序列图

    原始自相关图

    一阶差分后序列图

    一阶差分后自相关图

    一阶差分后偏自相关图

    结果

    原始序列的ADF检验结果为: (1.8137710150945274, 0.9983759421514264, 10, 26, {‘1%’: -3.7112123008648155, ‘5%’: -2.981246804733728, ‘10%’: -2.6300945562130176}, 299.46989866024177)
    差分序列的ADF检验结果为: (-3.1560562366723532, 0.02267343544004886, 0, 35, {‘1%’: -3.6327426647230316, ‘5%’: -2.9485102040816327, ‘10%’: -2.6130173469387756}, 287.5909090780334)差分序列的白噪声检验结果为: (array([11.30402222]), array([0.00077339]))
    BIC最小的p值和q值为:0、1
    2  留言 2019-01-03 15:40:45
  • python数据分析(8)——挖掘建模(3)关联规则

    1. 常用关联规则算法
    2. Apriori算法2.1 关联规则和频繁项集2.1.1 关联规则的一般形式
    2.1.2 最小支持度和最小置信度最小支持度是用户或专家定义的衡量支持度的一个阈值,表示项目集在统计意义上的最低重要性;最小置信度是用户或专家定义的衡量置信度的一个阈值,表示关联规则的可靠性。同时满足最小支持度阈值和最小置信度阈值的规则称作强规则。
    2.1.3 项集项集是项的集合。项集的出现频率是所有包含项集的事务计数,又称作绝对支持度或支持度计数。如果项集I的相对支持度满足预定义的最小支持度阈值,则I是频繁项集。
    2.1.4 支持度计数
    #-*- coding: utf-8 -*-from __future__ import print_functionimport pandas as pd#自定义连接函数,用于实现L_{k-1}到C_k的连接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 = 0 while len(column) > 1: k = k+1 print(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]).T support_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.0 result[i]['confidence'] = cofidence_series[i] result[i]['support'] = support_series[ms.join(sorted(i.split(ms)))] result = result.T.sort_values(['confidence','support'], ascending = False) #结果整理,输出 print(u'\n结果为:') print(result) return result
    2  留言 2019-01-02 15:36:40
  • python数据分析(7)——挖掘建模(2)聚类分析

    1. 常用聚类分析算法聚类分析建模原理

    常用聚类方法

    常用聚类分析算法

    2. K-Means聚类算法2.1 算法过程K-Means算法的计算步骤取得k个初始质心:

    从数据中随机抽取k个点作为初始聚类的中心,来代表各个类把每个点划分进相应的类;根据欧式距离最小原则,把每个点划分进距离最近的类中重新计算质心;根据均值等方法,重新计算每个类的质心迭代计算质心;重复第二步和第三步,迭代计算聚类完成;聚类中心不再发生移动
    2.2 代码#-*- coding: utf-8 -*-#使用K-Means算法聚类消费行为特征数据import pandas as pd#参数初始化inputfile = 'consumption_data.xls' #销量及其他属性数据outputfile = '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 KMeansmodel = KMeans(n_clusters = k, n_jobs = 4, max_iter = iteration) #分为k类,并发数4model.fit(data_zs) #开始聚类#简单打印结果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): #自定义作图函数 import matplotlib.pyplot as plt plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号 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 = 'pd_' #概率密度图文件名前缀for i in range(k): density_plot(data[r[u'聚类类别']==i]).savefig(u'%s%s.png' %(pic_output, i))
    分群1的概率密度函数图

    分群2的概率密度函数图

    分群3的概率密度函数图

    2.3 用TSNE进行数据降维并展示聚类结果#-*- coding: utf-8 -*-#接k_means.pyfrom sklearn.manifold import TSNEtsne = TSNE()tsne.fit_transform(data_zs) #进行数据降维tsne = pd.DataFrame(tsne.embedding_, index = data_zs.index) #转换数据格式import matplotlib.pyplot as pltplt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号#不同类别用不同颜色和样式绘图d = tsne[r[u'聚类类别'] == 0]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()
    0  留言 2019-01-01 22:31:44
  • python数据分析(6)——挖掘建模(1)分类与预测

    经过数据探索与数据预处理,得到了可以直接建模的数据.根据挖掘目标与数据形式可以建立分类与预测、聚类分析、关联规则、时序模式和偏差检测等模型。
    分类与预测问题是预测问题的两种主要的类型,分类主要是预测分类标号(基于离散属性的),而预测是建立连续值函数模型,预测给定自变量对应的因变量的值。
    一、实现过程1.1 分类分类属于有监督学习的范畴,大致上的意思就是我们可以将样本数据分成几个类别,将我们的数据与我们的类别相互对应。

    1.2 预测预测是指建立两种或者两种以上变量之间相互依赖的函数模型,然后进行预测或者控制。
    1.3 实现过程
    二、常用的预测和分类方法
    三、回归分析
    主要回归模型分类


    3.1 Logistic回归分析介绍3.1.1 Logistic函数

    3.1.2 Logistic回归模型
    3.1.3 Logistic回归模型解释
    3.2 Logistic回归建模步骤
    #-*- coding: utf-8 -*-#逻辑回归 自动建模import pandas as pd#参数初始化filename = '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(indices=True)]))x = data[data.columns[rlr.get_support(indices=True)]].as_matrix() #筛选好特征lr = LR() #建立逻辑货柜模型lr.fit(x, y) #用筛选后的特征数据来训练模型print(u'逻辑回归模型训练结束。')print(u'模型的平均正确率为:%s' % lr.score(x, y)) #给出模型的平均正确率,本例为81.4%
    四、 决策树决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。Entropy = 系统的凌乱程度,使用算法ID3, C4.5和C5.0生成树算法使用熵。这一度量是基于信息学理论中熵的概念。
    决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。

    4.1 ID3算法简介及基本原理
    显然E(A)越小,Gain(A)的值越大,说明选择测试属性A对于分类提供的信息越大,选择A之后对分类的不确定程度越小。
    4.2 ID3算法具体流程
    对当前样本集合,计算所有属性的信息增益选择信息增益最大的属性作为测试属性,把测试属性取值相同的样本划为同一个子样本集若子样本集的类别属性只含有单个属性,则分支为叶子节点,判断其属性值并标上相应的符号,然后返回调用处;否则对子样本递归调用本算法。
    #-*- coding: utf-8 -*-#使用ID3决策树算法预测销量高低import pandas as pd#参数初始化inputfile = '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_graphvizx = pd.DataFrame(x)from sklearn.externals.six import StringIOx = pd.DataFrame(x)with open("tree.dot", 'w') as f: f = export_graphviz(dtc, feature_names = x.columns, out_file = f)

    五、人工神经网络人工神经模型

    激活函数

    人工神经算法


    BP算法学习流程

    例子如下:(用神经网络算法预测销量高低)
    #-*- coding: utf-8 -*-#使用神经网络算法预测销量高低import pandas as pd#参数初始化inputfile = 'sales_data.xls'data = pd.read_excel(inputfile, index_col = u'序号') #导入数据#数据是类别标签,要将它转换为数据#用1来表示“好”、“是”、“高”这三个属性,用0来表示“坏”、“否”、“低”data[data == u'好'] = 1data[data == u'是'] = 1data[data == u'高'] = 1data[data != 1] = 0x = data.iloc[:,:3].as_matrix().astype(int)y = data.iloc[:,3].as_matrix().astype(int)from keras.models import Sequentialfrom keras.layers.core import Dense, Activationmodel = Sequential() #建立模型model.add(Dense(input_dim = 3, output_dim = 10))model.add(Activation('relu')) #用relu函数作为激活函数,能够大幅提供准确度model.add(Dense(input_dim = 10, output_dim = 1))model.add(Activation('sigmoid')) #由于是0-1输出,用sigmoid函数作为激活函数model.compile(loss = 'binary_crossentropy', optimizer = 'adam')#编译模型。由于我们做的是二元分类,所以我们指定损失函数为binary_crossentropy#另外常见的损失函数还有mean_squared_error、categorical_crossentropy等,请阅读帮助文件。#求解方法我们指定用adam,还有sgd、rmsprop等可选model.fit(x, y, nb_epoch = 1000, batch_size = 10) #训练模型,学习一千次yp = model.predict_classes(x).reshape(len(y)) #分类预测from cm_plot import * #导入自行编写的混淆矩阵可视化函数cm_plot(y,yp).show() #显示混淆矩阵可视化结果
    BP神经网络预测销售高低混淆矩阵图:
    1  留言 2018-12-28 19:11:58
  • python数据分析(5)——数据预处理(下)

    3. 数据变换3.1 简单函数变换常用的变换包括平方、开方、取对数、差分运算等

    3.2 规范化为了消除指标之间的量纲和取值范围差异的影响,需要进行标准化处理,将数据按照比例进行缩放,使之落入一个特定的区别。
    3.2.1 最小—最大规范化(离差标准化)将数值映射到[0,1]
    x’=(x-min)/(max-min)
    3.2.2 零—均值规范化
    3.2.3 小数定标规范化将数值映射到[-1,1]

    我们对同一个数据源使用三种规约化的方法进行对比。
    代码data_normalization 数据集normalization_data.xls
    #-*- coding: utf-8 -*-#数据规范化import pandas as pdimport numpy as npdatafile = 'normalization_data.xls' #参数初始化data = pd.read_excel(datafile, header = None) #读取数据#(data - data.min())/(data.max() - data.min()) #最小-最大规范化#(data - data.mean())/data.std() #零-均值规范化#data/10**np.ceil(np.log10(data.abs().max())) #小数定标规范化

    3.3 连续属性离散化3.3.1 离散化的过程确定分类数以及如何将连续属性值映射到这些分类值
    3.3.2 常用的离散化方法
    等宽法
    将属性的值域分成具有相同宽度的区间,区间的个数由数据本身的特点决定,或者由用户指定。

    等频法
    将相同数量的记录放进每个区间。

    基于聚类分析的方法
    首先将连续属性的值用聚类算法进行聚类,然后再将聚类得到的簇进行处理,合并到一个簇的连续属性值并做同一标记。聚类分析的离散化方法也需要用户指定簇的个数,从而决定产生的区间数。
    代码data_discretization 数据集discretization_data.xls
    #-*- coding: utf-8 -*-#数据规范化import pandas as pddatafile = 'discretization_data.xls' #参数初始化data = pd.read_excel(datafile) #读取数据data = data[u'肝气郁结证型系数'].copy()k = 4d1 = pd.cut(data, k, labels = range(k)) #等宽离散化,各个类比依次命名为0,1,2,3#等频率离散化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.values.reshape((len(data), 1))) #训练模型c = pd.DataFrame(kmodel.cluster_centers_).sort(0) #输出聚类中心,并且排序(默认是随机序的)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 plt plt.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()

    3.4 属性构造为更好的数据挖掘,需要利用已有的属性集构造出新的属性。比如:线损率 = [(供入电量 - 供出电量)/供入电量] * 100%线损率超过3%~15%,认为用户存在窃漏电行为。
    代码为line_rate_construct 数据集
    #-*- coding: utf-8 -*-#线损率属性构造import pandas as pd#参数初始化inputfile= 'electricity_data.xls' #供入供出电量数据outputfile = 'electricity_data1.xls' #属性构造后数据文件data = pd.read_excel(inputfile) #读入数据data[u'线损率'] = (data[u'供入电量'] - data[u'供出电量'])/data[u'供入电量']data.to_excel(outputfile, index = False) #保存结果
    3.5 小波变换小波变换具有多分辨率特点,在时域和频域都有表征信号局部特征的能力,通过伸缩和平移等运算对信号进行多尺度聚焦分析,提供了一种非平稳信号的时频分析手段,可以由粗到细观察信号。
    3.5.1 基于小波变换的特征提取方法

    3.5.2 小波基函数一种具有局部之集的函数,平均值为0,满足Ψ(0) = ∫Ψ(t)dt = 0. 常用的小波基有Haar小波基、db系列小波基。

    3.5.3 小波变换伸缩和平移变换:

    3.5.4 基于小波变换多尺度空间能量分布特征提取方法小波分析技术可以把信号在各频率波段中的特征提取出来,基于小波变化的多尺度空间能量分布特征提取方法是对信号进行频带分析,再分别以计算所得的各个频带的能量作为特征向量。
    信号f(t)的二进小波分解可表示为:

    f(t) = Aj + ΣDj

    其中A是近似信号,为低频部分;D是细节信号,为高频部分,此时信号的频带分布如图:

    信号的总能量为:

    E = EAj + ∑EDj

    选择第j层的近似信号和各层的细节信号的能量作为特征,构造特征向量:

    F = [EAj, ED1 , ED2 , …….EDj]

    利用小波变换提取出可以代表声波信号的向量数据,即完成从声波信号的特征向量数据的变换。本例利用小波函数对声波信号数据进行分解,得到5个层次的小波系数。
    利用这些小波系数求得各个能量值,这些能量值即可作为声波信号的特征数据。
    在python中,Scipy本身提供一些信号处理函数,但不够全面,更好的信号处理库是PyWaves(pywt)。
    #-*- coding: utf-8 -*-#利用小波分析进行特征分析#参数初始化inputfile= '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个数字,第一个数组为逼近系数数组,后面的依次是细节系数数组print(coeffs)
    4 数据规约数据规约产生更小但保持原数据完整性的新数据集。在规约后的数据集上进行分析和挖掘更有效。
    4.1 属性规约属性规约通过属性合并来创新属性维数,或删除不相关的属性(维)来减少数据维数,从而提高数据挖掘效率。
    属性规约的目标是寻找出最小的属性子集并确保新数据子集的概率分布。
    属性规约常用方法:

    逐步向前选择,逐步向后删除和决策树归纳属于直接删除不相关属性(维)方法。
    主成分分析是一种用于连续属性的数据降维方法,它构造了原始数据的一个正交变换,新空间的基底去除原始空间基底下数据的相关性,只需使用少数新变量就能解释原始数据大部分变异。

    在python中,主成分分析的函数位于Scikit-Learn下:

    sklearn.decomposition.PCA(n_components = None, copy = True, whiten = False)    # decomposition 分解;components 成分;whiten 漂白

    参数说明:

    n_components
    意义:PCA算法中所要保留的主成分个数n,也即保留下来的特征个数n。
    类型:int或者string,缺省时默认为None,所有成分被保留。赋值为int,比如n_components = 1,将把原始数据降到一个维度。赋值为string,比如n_components = ‘mle’,将自动选取特征个数n,使得满足所要求的方差百分比。

    copy
    类型:bool,True,False,缺省时默认为True。
    意义:表示是否在运行算法时,将原始训练数据复制一份。若为True,则运行PCA算法后,原始训练数据的值不会有任何改变,因为是在原始数据的副本上进行运算;若为False,则运行PCA算法后,原始训练数据的值会变,因为是在原始数据上进行降维运算。

    whiten
    类型:bool,缺省时默认为False。
    意义:白化,使得每个特征具有相同的方差。
    使用主成分分析降维的程序代码如下:
    import pandas as pd# 参数初始化inputfile = 'principal_component.xls'outputfile = 'dimention_reducted.xls' # 降维后的数据data = pd.read_excel(inputfile, header = None) # 读入数据from sklearn.decomposition import PCApca = PCA()pca.fit(data)print(pca.components_) # 返回模型的各个特征向量print(pca.explained_variance_ratio_) # 返回各个成分各自的方差百分比; variance(方差); ratio(比率)
    4.2 数值规约
    直方图聚类抽样参数回归# python数据分析(5)——数据预处理(下)
    1  留言 2018-12-26 15:35:36
  • python数据分析(4)——数据预处理(上)

    数据预处理的主要内容包括数据清洗、数据集成、数据变换和数据规约。

    1 数据清洗数据清洗主要是删除原始数据集中的无关数据、重复数据,平滑噪声数据,筛选掉与挖掘主题无关的数据,处理缺失值、异常值。
    1.1 缺失值处理方法主要分为删除记录、数据插补和不处理,其中常用的数据插补方法如下。

    这里主要介绍拉格朗日插值法和牛顿插值法。其他的插值方法还有Hermite插值、分段插值和样条插值。


    P(x)是牛顿插值逼近函数,R(x)是误差函数。
    3)将缺失的函数值对应的点x代入插值多项式得到缺失值的近似值f(x).
    牛顿插值法也是多项式插值,但采用了另一种构造插值多项式的方法,与拉格朗日插值相比,具有承袭型和易于变动节点的特点。从本质上来说,两者给出的结果是一样的(相同次数、相同系数的多项式),只不过表示的形式不同。因此,在Python的Scipy库中,只提供了拉格朗日插值法的函数(因为实现上比较容易),如果需要牛顿插值法,则需要自行编写函数。
    例子是catering_sale.xls
    #拉格朗日插值代码import pandas as pd #导入数据分析库Pandasfrom scipy.interpolate import lagrange #导入拉格朗日插值函数inputfile = 'catering_sale.xls' #销量数据路径outputfile = '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.2 异常值处理
    我们一般将异常值视为缺失值进行插补。
    python中判断每个元素是否空值/非空值

    D.isnull/notnull()

    2. 数据集成2.1 实体识别实体识别是指从不同数据源识别出现实世界的实体,它的任务是统一不同源数据的矛盾之处。
    2.1.1 同名异义数据源中同样是属性ID,不一定是同一实体。
    2.1.2 异名同义不同数据源中不同名字的数据项表示是同一实体。
    2.1.3 单位不统一描述同一个实体分别用的是国际单位和中国传统的计量单位。
    检测和解决这些冲突就是实体识别的任务。
    2.2 冗余属性识别
    同一属性多次出现同一属性命名不一致导致重复
    有些冗余属性可以用相关分析检测。
    python去除数据中的重复元素

    D.unique()
    np.unique(D)
    2  留言 2018-12-26 12:57:25
  • python数据分析(3)——数据特征分析(下)

    1. 周期性分析周期性分析是探索某个变量是否随这时间的变化而呈现出某种周期变化趋势。
    时间尺度较长的有年度性、季节性;较短的有月度、周度性;甚至更短的天、小时。
    2. 贡献度(帕累托)分析20/80定律,同样的投入放在不同的地方会产生不同的效益。
    例如对于一个公司,80%的利润常常来源于20%的产品,其余80%产品只产生了20%利润。
    帕累托图用双直角坐标系表示,左边纵坐标表示频数,右边纵坐标表示频率,折线表示累积频率,横坐标表示影响的各项因素,按影响程度的大小(即出现频数多少)从左到右排列,通过对帕累托图的观察分析,可以抓住影响的主要因素,从而优先解决主要问题。
    数据为catering_dish_profit.xls
    代码为
    #-*- coding: utf-8 -*-#菜品盈利数据 帕累托图from __future__ import print_functionimport pandas as pd#初始化参数dish_profit = 'catering_dish_profit.xls' #餐饮菜品盈利数据data = pd.read_excel(dish_profit, index_col = u'菜品名')data = data[u'盈利'].copy()data.sort_values(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()

    3. 相关性分析3.1 直接绘制散点图判断两个变量是否具有线性相关关系的最最直观的方法是直接绘制散点图。

    3.2 绘制散点图矩阵需要同时考察多个变量间的相关关系,使用散点图矩阵。
    代码是
    # Seaborn visualization libraryimport seaborn as sns# Create the default pairplotsns.pairplot(df)

    3.3 计算相关系数3.3.1 Pearson相关系数
    3.3.2 Spearman秩相关系数
    3.3.3 判定系数
    #-*- coding: utf-8 -*-#餐饮销量数据相关性分析from __future__ import print_functionimport pandas as pdcatering_sale = 'catering_sale_all.xls' #餐饮数据,含有其他属性data = pd.read_excel(catering_sale, index_col = u'日期') #读取数据,指定“日期”列为索引列

    data.corr() #相关系数矩阵,即给出了任意两款菜式之间的相关系数data.corr()[u’百合酱蒸凤爪’] #只显示“百合酱蒸凤爪”与其他菜式的相关系数data[u’百合酱蒸凤爪’].corr(data[u’翡翠蒸香茜饺’]) #计算“百合酱蒸凤爪”与“翡翠蒸香茜饺”的相关系数

    2  留言 2018-12-24 09:11:55
  • python数据分析(2)——数据特征分析(上)

    1 分布分析分布分析能揭示数据的分布特征和分布类型。对于定量数据,欲了解其分布形式是对称的还是非对称的,发现某些特大或特小的可疑值,可通过绘制频率分布表、绘制频率分布直方图、绘制茎叶图进行直观地分析;对于定性分类数据,可用饼图和条形图直观地显示分布情况。
    1.1 定量数据分布分析对于定量变量而言,选择“组数”和“组宽”是做频率分布分析时最需要考虑的问题。
    1.1.1 步骤
    求极差 max-min决定组距与组数 组数*组距=极差决定分点列出频率分布表绘制频率分布直方图
    1.1.2 原则
    各组之间必须互斥各组必须将所有数据包含在内各组的组宽最后相等
    一个数据不能同时属于两个组且分点也要包含在内,所以一般都是一致的半闭区间
    直方图绘制

    plt.hist(x,y) //x为待绘制直方图的一维数组,y为分成多少组
    //也可以是列表,手动指定分界点

    1.2 定性数据的分布分析对于定性变量,常常根据变量的分类类型来分组,可以采用饼图和条形图来描述定性变量的分布。
    饼状图绘制

    plt.pie(size)

    2 对比分析适用于指标间的横纵向比较、时间序列的比较分析(一般都是画折线图)。选择合适的对比标准十分重要。
    2.1 形式2.1.1 绝对数比较利用现有的数值直接比较,寻找差异。
    2.1.2 相对数比较由两个有联系的指标对比计算,用以反映客观现象之间数量联系程度的综合指标。其数值表现为相对数。由于研究目的和对比基础不同,相对数可以分为以下几种。

    结构相对数
    将同一总体内部分数值与全部数值对比求得比重,用以说明事物的性质、结构或质量。如居民视频支出额占消费支出总额比重、产品合格率。

    比例相对数
    将同一总体内不同部分的数值进行对比,表明总体内各部分的关系。如人口性别比例、投资与消费比例。

    比较相对数
    将同一时期两个性质相同的指标数值进行对比,说明同类现象在不同空间条件下的数量对比关系。如不同地区商品价格对比,不同行业、不同企业间某项指标对比等。

    强度相对数
    将两个性质不同但有一定联系的总量指标进行对比,用以说明现象的强度、密度和普遍程度。如人均国内生产总值用“元/人”表示,人口密度用“人/平方公里”表示,也有用百分数或千分数表示的,如人口出生率用%。表示。

    计划完成程度相对数
    是某一时期实际完成数与计划数的对比,用以说明计划完成程度。

    动态相对数
    将同一现象在不同时期的指标数值对比,用以说明发展方向和变化的速度,如发展速度,增长速度等。
    3 统计量分析用统计指标对定量数据进行统计描述,常从集中趋势和离中趋势两个方面进行分析。
    3.1 集中趋势度量3.1.1 均值
    有时为了去掉极端值的影响,会选择截断均值(去掉高低极端值的平均数)。
    3.1.2 中位数3.1.3 众数3.2 离中趋势度量3.2.1 极差num=max-min
    但是忽略了中间数据时的分布情况。
    3.2.2 标准差
    3.2.3 变异系数
    主要用来比较两个或多个具有不同单位或不同波动幅度的数据集的离中趋势。
    3.2.4 四分位数间距其值越大,说明数据变异程度越大。
    1  留言 2018-12-22 10:11:23
  • python数据分析(1)——数据质量分析

    1. 前言数据质量分析是数据挖掘中数据预处理的前提,主要任务是检查脏数据。
    脏数据包括:

    缺失值异常值不一致的值重复数据或者含有特殊符号(#、*、¥)的数据
    2. 缺失值缺失值的处理分为删除存在缺失值的记录、对可能值的插补和不处理。
    3. 异常值(离群点)3.1 简单统计量分析可以先对变量做一个描述性的统计,进而查看哪些数据是不合理的。最常用的统计量是最大值和最小值:eg:客户年龄一般在0-150岁
    3.2 正态分布分析如果数据服从正态分布,异常值被定义为一组测定值中与平均值的偏差超过3倍标准差的值。
    回忆一下初中的知识点,正态分布图,当时老师告诉我们,99.7%的数据都会落在平均值的偏差超过3倍标准差范围之间。

    其他的0.3%就作为异常值了。
    3.3 箱型图分析箱线图(Box-plot)又称盒须图、盒式图或箱形图,是一种用作显示一组数据分散情况资料的统计图,在数据分析中经常被使用到,可以被用于异常值的检测。

    3.3.1下四分位数Q1
    确定四分位数的位置。Qi所在位置=i(n+1)/4,其中i=1,2,3。n表示序列中包含的项数。根据位置,计算相应的四分位数。
    3.3.2 中位数(第二个四分位数)Q2中位数,即一组数由小到大排列处于中间位置的数。若序列数为偶数个,该组的中位数为中间两个数的平均数。
    3.3.3 上四分位数Q3计算方法同下四分位数。
    3.3.4 上限上限是非异常范围内的最大值。首先要知道什么是四分位距如何计算的?四分位距IQR=Q3-Q1,那么上限=Q3+1.5IQR
    3.3.5 下限下限是非异常范围内的最小值。下限=Q1-1.5IQR
    4. 一致性不一致数据主要发生在数据集成的过程中,可能是由于被挖掘数据是来自于从不同的数据源、对于重复存放的数据未能进行一致性更新造成的。例如两张存储用户电话的表只有一张更新。
    5. 实例数据
    餐饮日销额数据



    时间
    2015/2/10
    2015/2/11
    2015/2/12
    2015/2/13
    2015/2/14




    销售额(元)
    2742.8
    2014.3
    865
    3036.8



    首先,我们用describe来查看数据的基本情况
    import pandas as pddinnersale = 'dinnersale.xlsx'#数据文件地址data=pd.read_excel(dinnersale,index_col=u'时间')#读取数据,指定索引列describe=data.describe()#查看数据的基本情况print(describe)
    结果如下

    其中count是非空值数,通过len(data)可以知道数据记录为多少条,这样就得到了缺省值数。
    此外,提供的基本参数还有平均值(mean),标准差(std),最小值(min),1/4位数(25%),1/2位数(50%),3/4位数(75%)及最大值(max)。这样其实方便了大家使用箱型图排除异常值。
    import pandas as pdimport matplotlib.pyplot as pltdinnersale='dinnersale.xlsx'data=pd.read_excel(dinnersale,index_col=u'时间')plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签plt.rcParams['axes.unicode_minus']=False#用来正常显示负号plt.figure() #建立图像p=data.boxplot(return_type='dict') #画箱线图,直接使用DataFrame的方法#要指定返回类型否则下面下标获取不到#'fliers'即为异常值的标签x=p['fliers'][0].get_xdata()y=p['fliers'][0].get_ydata()y.sort()#从小到大排序,该方法直接改变原对象#annotate添加注释# 第一个参数是注释的内容# xy设置箭头尖的坐标# xytext设置注释内容显示的起始位置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()#展示箱线图
    图片如下,异常值就是上下限外的(还需要结合实际情况)

    Tips:

    安装matplotlib包

    python -m pip install -U matplotlib


    数据质量分析很重要,记得老师说过数据70%在于前期的处理
    1  留言 2018-12-20 12:40:45
eject