Python数据分析与挖掘实战总结(二)

简介: Python数据分析与挖掘实战总结

七、数据预处理


数据清洗

包括:删除原始数据中的无关数据、重复数据,平滑噪声数据,处理缺失值。

拉格朗日插值法:

image.png

当插值节点增减时,插值多项式就会发生变化,在实际计算中不方便。

牛顿插值法:P(x)是牛顿插值逼近函数,R(x)是误差函数

image.png

Python的Scipy库中只提供了拉格朗日插值法的函数(实现上比较容易)


#-*- coding: utf-8 -*-
  # 插值时存在问题,不同的位置选取的数据点不一样,并且保证最后的数据是正确的
  # 目前没有考虑连续脏数据的情况
  #拉格朗日插值代码
  import pandas as pd #导入数据分析库Pandas
  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为取前后的数据个数,默认为5,插值不要超过20
  def ployinterp_column(s, n, k=5):
    y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))] #取数,y是长度为10的列表
    y = y[y.notnull()] #剔除空值
    return lagrange(y.index, list(y))(n) #插值并返回插值多项式,代入n得到插值结果
  #逐个元素判断是否需要插值
  k = 2
  for i in data.columns:
    for j in range(len(data)):
      if (data[i].isnull())[j]: #如果为空即插值。
          if (j >= k) and (j < len(data) - k):
              y = data[i][list(range(j-k, j)) + list(range(j+1, j+1+k))] #取数,y是长度为10的列表
          elif j < k :
              y = data[i][list(range(0, j)) + list(range(j+1, 2 * k + 1))]
          elif j >= len(data) - k:
              y = data[i][list(range(len(data) - 1 - 2 * k, j)) + list(range(j+1, len(data)))]
          y = y[y.notnull()] #剔除空值
          data[i][j] = lagrange(y.index, list(y))(j) #插值并返回插值多项式,代入j得到插值结果
  data.to_excel(outputfile) #


数据集成

包括实体识别,冗余属性识别


数据变化

简单函数变换

规范化

image.png

离差标准化(最小最大规范化)


标准差标准化

image.png


小数定标规范化:属性值映射在[-1, 1]之间

image.png


#-*- coding: utf-8 -*-
#数据规范化
import pandas as pd
import numpy as np
datafile = '../data/normalization_data.xls' #参数初始化
data = pd.read_excel(datafile, header = None) #读取数据,矩阵
print (data - data.min())/(data.max() - data.min()) #最小-最大规范化,按列出路
print (data - data.mean())/data.std() #零-均值规范化
print data/10**np.ceil(np.log10(data.abs().max())) #小数定标规范化
连续属性离散化
等宽法(至于相同宽度)、等频法(将相同数量的记录放进每个区间)、基于聚类分析的方法(K-means)
  import pandas as pd
  from sklearn.cluster import KMeans #引入KMeans
  import matplotlib.pyplot as plt
  plt.rcParams['font.sans-serif'] = ['SimHei']     #用来正常显示中文标签
  plt.rcParams['axes.unicode_minus'] = False      #用来正常显示负号
  datafile = '../data/discretization_data.xls'    #参数初始化
  data = pd.read_excel(datafile) #读取数据
  data = data[u'肝气郁结证型系数'].copy()
  k = 4       #分为4类
  d1 = pd.cut(data, k, labels = range(k))     #等宽离散化,各个类比依次命名为0,1,2,3
  #等频率离散化
  w = [1.0*i/k for i in range(k+1)]           #为describe确定分位数0%,25%,50%,75%,100%           
  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))
  kmodel = KMeans(n_clusters = k, n_jobs = 1) #建立模型,n_jobs是并行数,一般等于CPU数较好
  kmodel.fit(data.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):                     #自定义作图函数来显示聚类结果   
    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 plt
  cluster_plot(d1, k).show()
  cluster_plot(d2, k).show()
  cluster_plot(d3, k).show()
属性构造:比如利用供入电量和供出电量计算线损率。
#-*- coding: utf-8 -*-
#线损率属性构造
import pandas as pd
#参数初始化
inputfile= '../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) #保存结果

小波变换


用于非平稳信号的时频分析。基于小波变换的主要方法有:多尺度空间能量分布特征提取、多尺度空间的模极大值特征提取、小波包变换的特征提取、适应性小波神经网络的特征提取。

小波基函数:Harry小波基,db系列小波基,均值为0。积分为0.

小波变换:a是伸缩因子,b是平移因子,对小波基函数进行伸缩和平移变换

image.png

任意函数f(t)的连续小波变换(CWT)为:

image.png

在约束条件下有逆变换:

image.png

python中scipy本身提供了信号处理函数,更好的信号处理库是PyWavelets(pywt)。


#小波特征变换提取代码
import pywt #导入PyWavelets
from scipy.io import loadmat #mat是MATLAB专用格式,需要用loadmat读取它
#参数初始化
inputfile= '../data/leleccum.mat' 
#提取自Matlab的信号文件
mat = loadmat(inputfile)
signal = mat['leleccum'][0]
coeffs = pywt.wavedec(signal, 'bior3.7', level = 5)
#返回结果为level+1个数字,第一个数组为逼近系数数组,后面的依次是细节系数数组
数据规约

属性规约:合并属性,逐步向前选择,逐步向后删除,决策树归纳,主成分分析。

主成分分析步骤:


设原始变量X_1,X_2,..., X_p的n次观测数据矩阵为:

image.png


将数据矩阵按列进行中心标准化

求相关系数矩阵R,

R=(rij)p×p

R=(rij)p×p

image.png


其中,

image.png

求R的特征方程

image.png

确定主成分个数m:alpha根据实际问题确定,一般取0.8

image.png

计算m个相应的单位特征向量:

image.png

计算主成分:

image.png

 

import pandas as pd
  from sklearn.decomposition import PCA
  #参数初始化
  inputfile = '../data/principal_component.xls'
  outputfile = '../tmp/dimention_reducted.xls' #降维后的数据
  data = pd.read_excel(inputfile, header = None) #读入数据
  pca = PCA()
  pca.fit(data)
  print pca.components_ #返回模型的各个特征向量
  print pca.explained_variance_ratio_ #返回各个成分各自的方差百分比
  #由上面可以看出前4个已经占了97%
  pca = PCA(3)
  pca.fit(data)
  low_d = pca.transform(data)                 #降低唯独
  pd.DataFrame(low_d).toexcel(outputfile)     #保存结果
  pca.inverse_transform(low_d)        # 
数值规约:通过选择替代的、较小的数据来减少数据量。
Python主要数据预处理函数
函数名 函数功能
interpolate 一维、高维数据插值
unique  去除数据终端额重复数据
isnull  判断是否空值
notnull 判断是否非空值
PCA 主成分分析
random  生成随机矩阵
f = scipy.interpolate.lagrange(x,y) #一维数据的拉格朗日插值
f(2)            #计算插值结果
###################################################################
D = pd.Series([1,2,1,3,5])      
D.unique()
np.uinque(D)        #这时候D可以是list,array,Series
###################################################################
D.isnull()      #D是series对象,返回布尔Series,D[D.isnull()]找到空值
###################################################################
np.random.randn(k,m,n)  #标准正态分布


八、挖掘建模


分类与预测

常用算法:回归分析、决策树、人工神经网络、贝叶斯网络、支持向量机。

Logistic回归

Logistic函数:

image.png

回归模型:

image.png

#-*- coding: utf-8 -*-
  #逻辑回归 自动建模
  import pandas as pd
  from sklearn.linear_model import LogisticRegression as LR
  from sklearn.linear_model import RandomizedLogisticRegression as RLR 
  #参数初始化
  filename = '../data/bankloan.xls'
  data = pd.read_excel(filename)
  x = data.iloc[:,:8].as_matrix()##变成矩阵
  y = data.iloc[:,8].as_matrix()
  rlr = RLR() #建立随机逻辑回归模型,筛选变量
  rlr.fit(x, y) #训练模型
  rlr.get_support() #获取特征筛选结果,也可以通过.scores_方法获取各个特征的分数
  print(u'通过随机逻辑回归模型筛选特征结束')
  #join() 表示连接,使用逗号,括号内必须是一个对象。如果有多个就编程元组,或是列表。
  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提供了REF包可以用于特征消除。还提供了REFCV,可以通过交叉验证来对特征进行排序。

决策树

ID3、C4.5、CART算法

ID3:在决策树的各级节点上都用信息增益作为判断标准进行属性的选择,使得在每个节点上都能获得最大的类别分类增益,使分类后的额数据集的熵最小,这样使得树的平均深度最小,从而有效地提高了分类效率。

步骤:


对当前样本集合,计算所有属性的信息增益

选择信息增益最大的属性作为测试属性,把测试属性取值相同的样本划为同一个子样本集

若子样本集的类别只有单个,则分支为叶节点;否则对子样本集循环调用本算法

#-*- coding: utf-8 -*-
  #使用ID3决策树算法预测销量高低
  import pandas as pd
  from sklearn.tree import export_graphviz
  from sklearn.externals.six import StringIO
  from sklearn.tree import DecisionTreeClassifier as DTC
  #参数初始化
  inputfile = '../data/sales_data.xls'
  data = pd.read_excel(inputfile, index_col = u'序号') #导入数据
  #数据是类别标签,要将它转换为数据
  #用1来表示“好”、“是”、“高”这三个属性,用-1来表示“坏”、“否”、“低”
  data[data == u'好'] = 1
  data[data == u'是'] = 1
  data[data == u'高'] = 1
  data[data != 1] = -1
  x = data.iloc[:,:3].as_matrix().astype(int)
  y = data.iloc[:,3].as_matrix().astype(int)
  dtc = DTC(criterion='entropy') #建立决策树模型,基于信息熵
  dtc.fit(x, y) #训练模型
  #导入相关函数,可视化决策树。
  #导出的结果是一个dot文件,需要安装Graphviz才能将它转换为pdf或png等格式。
  with open("tree.dot", 'w') as f:
    f = export_graphviz(dtc, feature_names = ['tianqi', 'zhoumo', 'cuxiao'], out_file = f)
    #f = export_graphviz(dtc, feature_names = [u'天气', u'周末', u'促销'], out_file = f)  
  #文本打开指定中文字体
  #edge [fontname = "SimHei"];/*添加,指定中文为黑体*/
  #node [fontname = "SimHei"];/*添加,指定中文为黑体*/
  #安装Graphviz
  #在命令行中编译
人工神经网络
  #-*- coding: utf-8 -*-
  #使用神经网络算法预测销量高低
  import pandas as pd
  #参数初始化
  inputfile = '../data/sales_data.xls'
  data = pd.read_excel(inputfile, index_col = u'序号') #导入数据
  #数据是类别标签,要将它转换为数据
  #用1来表示“好”、“是”、“高”这三个属性,用0来表示“坏”、“否”、“低”
  data[data == u'好'] = 1
  data[data == u'是'] = 1
  data[data == u'高'] = 1
  data[data != 1] = 0
  x = data.iloc[:,:3].as_matrix().astype(int)
  y = data.iloc[:,3].as_matrix().astype(int)
  from keras.models import Sequential
  from keras.layers.core import Dense, Activation
  model = Sequential() #建立模型
  model.add(Dense(3, 10))
  model.add(Activation('relu')) #用relu函数作为激活函数,能够大幅提供准确度
  model.add(Dense(10, 1))
  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, nb_epoch = 1000, batch_size = 10) #训练模型,学习一千次
  yp = model.predict_classes(x).reshape(len(y)) #分类预测
  from cm_plot import * #导入自行编写的混淆矩阵可视化函数
  cm_plot(y,yp).show() #


算法评价:相对误差、均方误差、识别准确度、识别精确率、ROC曲线


聚类分析

K-Means算法


 

#-*- coding: utf-8 -*-
  #使用K-Means算法聚类消费行为特征数据
  import pandas as pd
  from sklearn.cluster import KMeans
  import matplotlib.pyplot as plt
  plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
  plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
  #参数初始化
  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() #数据标准化
  model = KMeans(n_clusters = k, n_jobs = 1, max_iter = iteration) #分为k类,并发数4
  model.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): #自定义作图函数  
    p = data.plot(kind='kde', linewidth = 2, subplots = True, sharex = False)
    [p[i].set_ylabel(u'密度') for i in range(k)]
    plt.legend()
    return plt
  pic_output = '../tmp/pd_' #概率密度图文件名前缀
  for i in range(k):
    density_plot(data[r[u'聚类类别']==i]).savefig(u'%s%s.png' %(pic_output, i))

聚类算法评价:purity评价法、RI评价法、F值评价法

image.png


#-*- coding: utf-8 -*-
  #接k_means.py
  from sklearn.manifold import TSNE
  import matplotlib.pyplot as plt
  plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
  plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
  tsne = TSNE()
  tsne.fit_transform(data_zs) #进行数据降维
  tsne = pd.DataFrame(tsne.embedding_, index = data_zs.index) #转换数据格式
  #不同类别用不同颜色和样式绘图
  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()


关联分析

常用算法:Apriori、FP-Tree、Eclt算法、灰色关联法

Ariori算法

支持度:

image.png

,A、B同时发生的概率


置信度:

image.png

A发生B发生的概率

同时满足最小支持度和最小置信度称满足强规则

算法步骤:

扫描事物集,得到没个候选项的支持度

比较候选支持度与最小支持度,得到1项频繁集L_1

由L_1产生候选项集C_2,并计算支持度

比较候选支持度和最小支持度,得到2项频繁集L_2

类推,直至不能产生新的候选项集

#-*- coding: utf-8 -*-
  from __future__ import print_function
  import 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(['confidence','support'], ascending = False) #结果整理,输出
    print(u'\n结果为:')
    print(result)
    return result
  #######################################################33
  #-*- coding: utf-8 -*-
  #使用Apriori算法挖掘菜品订单关联规则
  from __future__ import print_function
  import pandas as pd
  from apriori import * #导入自行编写的apriori函数
  inputfile = '../data/menu_orders.xls'
  outputfile = '../tmp/apriori_rules.xls' #结果文件
  data = pd.read_excel(inputfile, header = None)
  print(u'\n转换原始数据至0-1矩阵...')
  ct = lambda x : pd.Series(1, index = x[pd.notnull(x)]) #1表示逐行转换。转换0-1矩阵的过渡函数
  b = map(ct, data.as_matrix()) #用map方式执行,b是list
  data = pd.DataFrame(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) #保存结果

时序模式

非平稳时间序列分析:许多非平稳序列差分后会显示出平稳序列的性质,这时称之为差分平稳序列,可以先做差分然后用ARMA模型进行拟合。这种方法称之为ARIMA模型。


#-*- coding: utf-8 -*-
  #arima时序模型
  import pandas as pd
  import matplotlib.pyplot as plt
  from statsmodels.graphics.tsaplots import plot_acf
  from statsmodels.tsa.stattools import adfuller as ADF
  from statsmodels.graphics.tsaplots import plot_pacf
  from statsmodels.stats.diagnostic import acorr_ljungbox
  from statsmodels.tsa.arima_model import ARIMA
  plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
  plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
  #参数初始化
  discfile = '../data/arima_data.xls'
  forecastnum = 5
  #读取数据,指定日期列为指标,Pandas自动将“日期”列识别为Datetime格式
  data = pd.read_excel(discfile, index_col = u'日期')
  #时序图
  data.plot()
  plt.show()
  plt.title('Time Series')
  #自相关图
  plot_acf(data).show()
  #平稳性检测
  print(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() #自相关图
  plot_pacf(D_data).show() #偏自相关图
  print(u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分'])) #平稳性检测
  #白噪声检验
  print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1)) #返回统计量和p值
  data[u'销量'] = data[u'销量'].astype(float)
  #定阶
  pmax = int(len(D_data)/10) #一般阶数不超过length/10
  qmax = int(len(D_data)/10) #一般阶数不超过length/10
  bic_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天的预测,返回预测结果、标准误差、置信区间。
函数名 函数功能
acf 计算自相关系数
plot_acf  画自相关系数图
pacf  计算偏相关系数
plot_pacf 画图
adfuller  单位根检验
diff  差分运算
ARIMA 创建模型
summary 给出ARIMA模型的报告
aic/bic/hqic  计算ARIMA模型的指标
forecast  预测
acorr_ljungbox  Ljung-Box检验,是否白噪声
  autocorr = acf(data, unbiased = False, nlags = 40, qstat = False, fft = False, alpha = False)
  # data 为观测值序列(时间序列),可以是DataFrame或者Series
  h = adfuller(Series, maxlag = None, Regression = 'c', autolog = 'AIC', store = False, regresults =False)
  D.diff()        #D为Pandas的DataFrame或Series
  arima = ARIMA(data, (p, 1, q)).fit()        #data为输入的时间序列,p,q为对应的阶
  amima.summary()         #返回一份格式化的模型报告
  arima.bic
  a,b,c = arima.forecast(num)     #num为要预测的天数,a为返回的预测值,b为预测误差,c为置信区间


离群点检测

方法:基于统计、基于邻近度、基于密度、基于聚类。

基于统计:一元正态分布若数据点在3倍标准差之外。

混合模型的离群点检测:数据的统计分布未知或者没有训练数据可用,很难建立模型。

基于原型的聚类:聚类所有的对象,然后评估对象属于簇的程度。如果删除一个对象导师制该目标显著改进,则可将该对象视为离群点。离群点可能形成小簇从而逃避检测。


#-*- coding: utf-8 -*-
  #使用K-Means算法聚类消费行为特征数据
  import numpy as np
  import pandas as pd
  from sklearn.cluster import KMeans
  import matplotlib.pyplot as plt
  plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文标签
  plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
  #参数初始化
  inputfile = '../data/consumption_data.xls' #ID 和三个属性
  k = 3 #聚类的类别
  threshold = 2 #离散点阈值
  iteration = 500 #聚类最大循环次数
  data = pd.read_excel(inputfile, index_col = 'Id') #读取数据
  data_zs = 1.0*(data - data.mean())/data.std() #数据标准化
  model = KMeans(n_clusters = k, n_jobs = 1, max_iter = iteration) #分为k类,并发数4
  model.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) #合并
  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()

电力窃漏电用户自动识别

数据分析:

分布分析:用户类别窃漏电情况分布发现,非居民类不存在漏电情况。故可清理

周期性分析:找到一个正常的用户和漏电用户,分别观察规律。发现正常用户有明显的周期性。


数据预处理

数据清洗:过滤掉非居民类的数据和节假日数据。

缺失值处理:拉格朗日插补法进行插补

数据变换:用电趋势指标、5天平均线损率、告警指标计数


模型构建

用LM神经网络和CART决策树模型建模

ROC曲线比较性能

航空公司客户价值分析

数据分析:缺失值分析和异常值分析,异常值看最大和最小值


数据预处理:

数据清洗,丢弃缺失值、票价为0折扣率不为0的数据

属性规约,删除不相关或者弱相关属性

数据变换:计算指标,并对数据进行标准化处理


模型构建

K-Means算法对客户数据进行分群,分为5类。

结合图表对结果进行分析

中医证型关联规则挖掘


数据预处理

数据清洗:删除整理无效问卷

属性规约:将冗余属性和无关属性删除

数据变换:构造属性,并将属性离散化


模型构建

采用Apriori关联规则算法对模型的样本数据进行分析,以模型参数设置的最小支持度和最小置信度作为条件,输出关联规则结果。

基于水色图像的水质评价


数据预处理

图像切割:提取水样图像中间部分具有代表意义的图像

特征提取:颜色的一阶、二阶、三阶矩


模型构建

为提高区分度,将所有特征乘以常数k。然后建立支持向量机模型。


水质评价

对新增的水质图像作评价。

家用电器用户行为分析与事件识别


数据预处理

数据规约:去除无用的属性和状态

数据变换:确定用水事件的阈值

数据清洗

模型构建:训练神经网络


模型检验:使用测试数据

应用系统负载分析与磁盘容量预测

数据分析:通过时序图观察数据的平稳性和周期性


数据预处理

数据清洗:删除重复值

属性构造:合并属性

模型构建


检验平稳性,单位根检验

白噪声检验

模型识别:采用极大似然比方法进行模型的参数估计,采用BIC信息准则对模型进行定阶。ARIMA(0,1,1)

模型检验:检验模型残差序列是否为白噪声如果不是,说明还有未提取的有用信息,需要修改模型。

模型评价:计算平均绝对误差,均方根误差


电子商务网站用户行为分析及服务推荐

数据抽取:建立数据库--导入数据--搭建Python数据库操作环境


数据分析

网页类型分析

点击次数分析

网页排名

数据预处理


数据清洗:删除数据(中间页面网址、发布成功网址、登录助手页面)

数据变化:识别翻页网址并去重,错误分类网址手动分类,并进一步分类

属性规约:只选择用户和用户选择的网页数据

模型构建


基于物品的协同滤波算法:计算物品之间的相似度,建立相似度矩阵;根据物品的相似度和用户的历史行为给用户生成推荐列表。


相似度计算方法:夹角余弦、Jaccard系数、相关系数


财政收入影响因素分析及预测模型


数据分析

描述性统计分析

相关分析

模型构建


对于财政收入、增值税、营业税、企业所得税、政府性基金、个人所得税


Adaptive-Lasso变量选择模型:去除无关变量

分别建立灰色预测模型与神经网络模型

基于基站定位数据的商圈分析


数据预处理

属性规约:删除冗余属性,合并时间属性

数据变换:计算工作日人均停留时间、凌晨、周末、日均等指标,并标准化。


模型构建

构建商圈聚类模型:采用层次聚类算法

模型分析:对聚类结果进行特征观察

电商产品评论数据情感分析

文本采集:八爪鱼采集器(爬虫工具)


文本预处理:

文本去重:自动评价、完全重复评价、复制的评论

机械压缩去词:

删除短句

文本评论分词:采用Python中文分词包“Jieba”分词,精度达97%以上。


模型构建

情感倾向性模型:生成词向量;评论集子集的人工标注与映射;训练栈式自编码网络

基于语义网络的评论分析

目录
相关文章
|
20天前
|
机器学习/深度学习 数据可视化 数据挖掘
使用Python进行数据分析和可视化
【10月更文挑战第42天】本文将介绍如何使用Python进行数据分析和可视化。我们将从数据导入、清洗、探索性分析、建模预测,以及结果的可视化展示等方面展开讲解。通过这篇文章,你将了解到Python在数据处理和分析中的强大功能,以及如何利用这些工具来提升你的工作效率。
|
26天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第36天】本文将带你走进Python的世界,从基础语法出发,逐步深入到实际项目应用。我们将一起探索Python的简洁与强大,通过实例学习如何运用Python解决问题。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供有价值的指导和灵感。让我们一起开启Python编程之旅,用代码书写想法,创造可能。
|
27天前
|
机器学习/深度学习 数据可视化 数据处理
Python数据科学:从基础到实战
Python数据科学:从基础到实战
28 1
|
19天前
|
数据采集 数据可视化 数据挖掘
掌握Python数据分析,解锁数据驱动的决策能力
掌握Python数据分析,解锁数据驱动的决策能力
|
23天前
|
数据采集 存储 数据处理
探索Python中的异步编程:从基础到实战
【10月更文挑战第39天】在编程世界中,时间就是效率的代名词。Python的异步编程特性,如同给程序穿上了一双翅膀,让它们在执行任务时飞得更高、更快。本文将带你领略Python异步编程的魅力,从理解其背后的原理到掌握实际应用的技巧,我们不仅会讨论理论基础,还会通过实际代码示例,展示如何利用这些知识来提升你的程序性能。准备好让你的Python代码“起飞”了吗?让我们开始这场异步编程的旅程!
35 0
|
27天前
|
并行计算 数据挖掘 大数据
Python数据分析实战:利用Pandas处理大数据集
Python数据分析实战:利用Pandas处理大数据集
|
27天前
|
数据采集 数据可视化 数据挖掘
利用Python进行数据分析:Pandas库实战指南
利用Python进行数据分析:Pandas库实战指南
|
1月前
|
数据采集 存储 数据挖掘
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第27天】在数据分析领域,Python的Pandas库因其强大的数据处理能力而备受青睐。本文介绍了Pandas在数据导入、清洗、转换、聚合、时间序列分析和数据合并等方面的高效技巧,帮助数据分析师快速处理复杂数据集,提高工作效率。
67 0
|
29天前
|
机器学习/深度学习 数据采集 数据挖掘
解锁 Python 数据分析新境界:Pandas 与 NumPy 高级技巧深度剖析
Pandas 和 NumPy 是 Python 中不可或缺的数据处理和分析工具。本文通过实际案例深入剖析了 Pandas 的数据清洗、NumPy 的数组运算、结合两者进行数据分析和特征工程,以及 Pandas 的时间序列处理功能。这些高级技巧能够帮助我们更高效、准确地处理和分析数据,为决策提供支持。
40 2
|
1月前
|
存储 数据挖掘 数据处理
Python数据分析:Pandas库的高效数据处理技巧
【10月更文挑战第26天】Python 是数据分析领域的热门语言,Pandas 库以其高效的数据处理功能成为数据科学家的利器。本文介绍 Pandas 在数据读取、筛选、分组、转换和合并等方面的高效技巧,并通过示例代码展示其实际应用。
40 2