Advertisement

数据挖掘之聚类分析

阅读量:

聚类分析是在没有给定划分类别的情况下,根据数据相似度进行样本分组的一种方法。

与分类模型需要使用有类标记样本构成的训练数据不同,聚类模型可以建立在无类标记的数据上,是一种非监督的学习 算法。

聚类的输入是一组未被标记的样本,聚类根据数据自身的距离或相似度将它们划分为若干组,划分的原则是组内距离最小化,而组间距离最大化。

聚类分析之前将数值大都为0的变量和相关性较高的变量删除掉。然后通过主成分分析变换得到没有相关性的主成分值。

常用聚类分析算法

算法名称 算法描述
K-Means K-均值聚类也叫快速聚类法,在最小化误差函数的基础上将数据划分为预定的类数K。 该算法原理简单并便于处理大量数据。
K-中心点 K-均值算法对异常值是敏感性的,而K-中心点算法不采用簇中对象的平均值作为簇中心,而选用簇中离平均值最近的对象作为簇中心
系统聚类 系统聚类也叫多层次聚类,分类的单位由高到低呈树形结构,且所处的位置越低,其过包含的对象就越少,但这些对象间的共同特征越多。 该聚类方法只适合在小数据量时使用,数据量大时速度回非常慢。

聚类分析结果评价

1、purity评价法

计算正确聚类数占总数的比例。

2、RI评价法
RI = frac{R+W}{R+M+D+W}

R为被聚在一类的两个对象被正确分类了;W指不应该被聚在一类的两个对象被正确分开了;M指不应该被聚在一类的对象被错误地放在了一类;D指不应该分开的对象被错误地分开了。

3、F值评价法

基于RI评价法衍生出的一个方法,

其中,p = \frac{R}{R+M},r = frac{R}{R+D}

实际上,RI方法是把准确率p和召回率r看得同等重要。我们可能需要某一特性多一些,这时候就适合用F值方法。


本文以K-Means算法举例:

根据以下数据将客户分类成不同客户群,并评价这些客户的价值。

R语言实现:

1、建立聚类模型

复制代码
 km = kmeans(data,centers = 3) #k-means聚类分析,分为三类

    
  
    
 print(km)
    
    
    
    

输出结果如下:

可以看到样本已经被分为三类,每一类的数目分别为367,346,227。

2、将样本根据聚类分析的结果,分为3组:

复制代码
  aaa = data.frame(data,km$cluster)

    
  
    
 data1 = data[which(aaa$km.cluster == 1),]
    
 data2 = data[which(aaa$km.cluster == 2),]
    
 data3 = data[which(aaa$km.cluster == 3),] #将样本分组
    
    
    
    

3、作图

复制代码
 par(mfrow = c(3,3))

    
  
    
 plot(density(data1[,2]),col = "red",main="R")
    
 plot(density(data1[,3]),col = "red",main="F")
    
 plot(density(data1[,4]),col = "red",main="M")
    
  
    
 plot(density(data2[,2]),col = "red",main="R")
    
 plot(density(data2[,3]),col = "red",main="F")
    
 plot(density(data2[,4]),col = "red",main="M")
    
  
    
 plot(density(data3[,2]),col = "red",main="R")
    
 plot(density(data3[,3]),col = "red",main="F")
    
 plot(density(data3[,4]),col = "red",main="M")
    
    
    
    

图形如下:

分析图形可知:

分群1特点:R分布在0-20天,F分布在1-10次,M分布在200-600元,属于较低价值的客户群体;
分群2特点:R分布在10-30天,F分布在1-20次,M分布在900-1500元,属于中等水平的客户群体;
分群3特点:R分布在0-20天,F分布在1-15次,M分布在1600-2000元,属于高价值的客户群体。

Python实现:

复制代码
 import pandas as pd

    
  
    
 k = 3 #聚类的类别
    
 iteration = 500 #最大循环次数
    
 data = pd.read_excel("consumption_data.xls",index_col="Id")
    
 data_zs = (data-data.mean())/data.std() #数据标准化
    
  
    
 from sklearn.cluster import KMeans
    
 model = KMeans(n_clusters=k,n_jobs=4,max_iter=iteration) #并发数设为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("1.xls")
    
    
    
    

输出结果如下:

绘制不同客户分群的概率密度函数图,通过这些图可以直观地比较不同客户群的价值。

复制代码
 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 plt
    
  
    
 pic_output = 'pd_' #概率密度图文件名前缀
    
 for i in range(k):
    
   density_plot(data[r[u'聚类类别']==i]).savefig(u'%s%s.png' %(pic_output, i))
    
    
    
    

输出结果如下:

聚类结果可视化。TSNE工具提供了一种有效的数据降维方式,可以在2维或3维的空间中展示聚类结果。

复制代码
 from sklearn.manifold import TSNE

    
  
    
 tsne = TSNE()
    
 tsne.fit_transform(data_zs) #进行数据降维
    
 tsne = pd.DataFrame(tsne.embedding_,index=data_zs.index) #转换数据格式
    
  
    
 import matplotlib.pyplot as plt
    
 plt.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)

还没有任何评论哟~