精华内容
下载资源
问答
  • R语言聚类分析案例

    千次阅读 2020-09-26 10:58:42
    R语言聚类分析案例 在 mclust 包中包含一个 diabetes 数据集(加载 mclust 包后,可通过代码“head(diabetes)”查看数据的前 5 行,通过“?diabetes”查看每个变量的具体意义),该数据集包含 145 名糖尿病患者的三...

    R语言聚类分析案例

    在 mclust 包中包含一个 diabetes 数据集(加载 mclust 包后,可通过代码“head(diabetes)”查看数据的前 5 行,通过“?diabetes”查看每个变量的具体意义),该数据集包含 145 名糖尿病患者的三个指标的测量数据,针对该数据集,请进行如下分析:
    (1)只考虑 3 个指标数据,使用 k-means 聚类对数据进行聚类分析,找到合适的聚类数目,并对聚类效果进行评估;

    ######################第五题 聚类分析############################################
    library(mclust)
    library(MASS)
    data(diabetes)
    diabetes=diabetes#导入数据
    head(diabetes)#观察前五行
    ?diabetes
    

    结果如下:

    > head(diabetes)#观察前五行
       class glucose insulin sspg
    1 Normal      80     356  124
    2 Normal      97     289  117
    3 Normal     105     319  143
    4 Normal      90     356  199
    5 Normal      90     323  240
    6 Normal      86     381  157
    

    进行聚类:

    km<-kmeans(diabetes[,2:4], 3, nstart = 1) 
    km 
    diabetes$cluster<-km$cluster#赋值进去
    diabetes
    

    聚类结果如下:

    > km 
    K-means clustering with 3 clusters of sizes 33, 86, 26
    
    Cluster means:
        glucose   insulin      sspg
    1 107.42424  531.5455 323.66667
    2  91.39535  359.2791 166.72093
    3 241.65385 1152.8846  75.69231
    
    Clustering vector:
      1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30 
      2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2 
     31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60 
      2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2 
     61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90 
      2   2   2   2   2   2   2   2   1   2   1   2   2   2   2   1   2   2   2   2   2   1   2   2   1   1   1   1   1   1 
     91  92  93  94  95  96  97  98  99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 
      1   1   1   1   1   2   1   1   1   1   1   1   2   2   2   1   1   1   1   2   1   2   3   3   1   3   3   3   3   3 
    121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 
      3   3   3   1   3   3   3   3   3   3   1   3   3   1   1   1   1   3   3   3   3   3   3   3   3 
    
    Within cluster sum of squares by cluster:
    [1] 1058399.6  592025.2 1738796.1
     (between_SS / total_SS =  80.5 %)
    
    Available components:
    
    [1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss" "betweenss"    "size"        
    [8] "iter"         "ifault"      
    
    
    > diabetes
           class glucose insulin sspg cluster
    1     Normal      80     356  124       2
    2     Normal      97     289  117       2
    3     Normal     105     319  143       2
    4     Normal      90     356  199       2
    5     Normal      90     323  240       2
    

    由:Within cluster sum of squares by cluster:[1] 1058399.6 592025.2 1738796.1 (between_SS / total_SS = 80.5 %) 发现聚类效果良好,与原类别标签也较为一致。

    (2)在使用系统聚类时,使用不同的距离得到的聚类结果有何异同?

    基本思想: 是一类将数据所对应研究对象进行分类的统计方法。它是将个体 (样品)或者对象 (变量)按相似程度(距离远近)划分类别,使得同一类中的元素之间相似性比其他类的元素的相似性更强。目的在于使类间元素的同质性最大化和类与类间元素的异质性最大化。
    Q 型聚类分析是指对样本进行聚类,R 型聚类分析是指对变量进行聚类分析。
    基本方法:
    ①系统聚类法:最短距离法、最长距离法、中间距离法、类平均法和离差平方和法等
    聚集——开始时将 n 个样品各自作为一类,并规定样品之间的距离和类与类之间的距离,然后将距离最近的两类合并成一个新类,计算新类与其他类的距离;重复进行两个最近类的合并,每次减少一类,直至所有的样品合成一类。
    分割——由 n 个样品组成一类开始,按某种最优准则将它分割成两个尽可能远的子类,再
    用同样准则将每一子类进一步地分割成两类,从中选一个分割最优地子类,这样将类数由
    两类增加到三类。如此下去,直至所有 n 个样品各自为一类或采用某种停止规则。

    
    d <- dist(scale(diabetes[,2:4]))#建立距离矩阵
    
    #不同方法对比
    method=c("complete", "average", "centroid", "ward.D")
    alldata<-data.frame()
    hc<-hclust(d,"complete"); 
    class1<-cutree(hc, k=5) #分成3类 
    
    hc<-hclust(d,"average"); 
    class2<-cutree(hc, k=5) #分成3类 
    
    hc<-hclust(d,"centroid"); 
    class3<-cutree(hc, k=5) #分成3类 
    
    hc<-hclust(d,"ward.D"); 
    class4<-cutree(hc, k=5) #分成3类 
    
    alldata<-data.frame(diabetes,class1,class2,class3,class4)#合并为一个数据框
    alldata
    

    聚类结果:

    > alldata
           class glucose insulin sspg cluster class1 class2 class3 class4
    1     Normal      80     356  124       2      1      1      1      1
    2     Normal      97     289  117       2      1      1      1      1
    3     Normal     105     319  143       2      1      1      1      1
    4     Normal      90     356  199       2      1      1      1      2
    5     Normal      90     323  240       2      1      1      1      2
    6     Normal      86     381  157       2      1      1      1      1
    7     Normal     100     350  221       2      1      1      1      2
    

    可发现系统聚类法,使用不同的距离方法的时候,聚类结果有所差异,但差异不算特别大。对于两端值分类结果较为良好,但对于类别之间中间值分类较为差。

    (3)该数据集的分布情况适合使用密度聚类吗?如果使用密度聚类,聚类的效果是否会比上述的两种聚类方法效果更好?

    密度聚类也称为基于密度的聚类,基本出发点是假设聚类结果可以通过样本分布
    的稠密程度来确定,主要目标是寻找被低密度区域分离的高稠密区域。它有以下优点:
    ①相较于 K-means 聚类,DBSCAN 不需要预先声明聚类数量,即聚类数量会根据领域和 MinPts 参数动态确定,从而能更好体现数据的簇分布的原始特征点,但是根据不同参数会得到不同的聚类结果。
    ②DBSCAN 密度聚类可以找出任何形状的聚类,适用于数据分布形状不规则的数据集。

    library(fpc)
    model<-dbscan(diabetes[,2:4],eps=50,MinPts=5)
    diabetes$dbscan<-model$cluster
    
    ## 可视化在不同的eps情况下,聚类的情况
    eps <- c(40,50,60,70)
    name <- c("one","two","three","four")
    dbdata <- diabetes[,2:4]
    for (ii in 1:length(eps)) {
      modeli <- dbscan(diabetes[,2:4],eps=eps[ii],MinPts=5)
      dbdata[[name[ii]]] <- as.factor(modeli$cluster)
      
    }
    head(dbdata)
    

    聚类结果如下:

    > head(dbdata)
      glucose insulin sspg one two three four
    1      80     356  124   1   1     1    1
    2      97     289  117   1   1     1    1
    3     105     319  143   1   1     1    1
    4      90     356  199   1   1     1    1
    5      90     323  240   1   1     1    1
    6      86     381  157   1   1     1    1
    ........
    138     188     958  100   0   0     2    3
    139     339    1354   10   0   0     0    0
    140     265    1263   83   0   0     0    0
    141     353    1428   41   0   0     0    2
    142     180     923   77   0   0     2    3
    

    可发现,自动聚类成了3-4类,前三种都是划分为3类,故分为3类较为合理。

    展开全文
  • 聚类分析 杨威 yangweipyl@163.com 人以类聚,物以群分对事物进行分类,是人们认识事物 的出发点,也是人们认识世界的一种重要方法因此,分类学 已成为人们认识世界的一门基础学科 聚类分析又称群分析,它是研究(样品或...
  • 聚类分析案例

    千次阅读 2017-04-01 13:54:00
    利用数据挖掘进行数据分析常用的方法主要有分类、回归分析聚类、关联规则、特征、变化和偏差分析、Web页挖掘等,它们分别从不同的角度对数据进行挖掘。 分类。分类是找出数据库中一组数据对象的共同特点并按照...

    一、数据挖掘的常用方法

    利用数据挖掘进行数据分析常用的方法主要有分类、回归分析、聚类、关联规则、特征、变化和偏差分析、Web页挖掘等,它们分别从不同的角度对数据进行挖掘。

    分类。分类是找出数据库中一组数据对象的共同特点并按照分类模式将其划分为不同的类,其目的是通过分类模型,将数据库中的数据项映射到某个给定的类别。它可以应用到客户的分类、客户的属性和特征分析、客户满意度分析、客户的购买趋势预测等,如一个汽车零售商将客户按照对汽车的喜好划分成不同的类,这样营销人员就可以将新型汽车的广告手册直接邮寄到有这种喜好的客户手中,从而大大增加了商业机会。

    回归分析。回归分析方法反映的是事务数据库中属性值在时间上的特征,产生一个将数据项映射到一个实值预测变量的函数,发现变量或属性间的依赖关系,其主要研究问题包括数据序列的趋势特征、数据序列的预测以及数据间的相关关系等。它可以应用到市场营销的各个方面,如客户寻求、保持和预防客户流失活动、产品生命周期分析、销售趋势预测及有针对性的促销活动等。

    聚类。聚类分析是把一组数据按照相似性和差异性分为几个类别,其目的是使得属于同一类别的数据间的相似性尽可能大,不同类别中的数据间的相似性尽可能小。它可以应用到客户群体的分类、客户背景分析、客户购买趋势预测、市场的细分等。

    关联规则。关联规则是描述数据库中数据项之间所存在的关系的规则,即根据一个事务中某些项的出现可导出另一些项在同一事务中也出现,即隐藏在数据间的关联或相互关系。在客户关系管理中,通过对企业的客户数据库里的大量数据进行挖掘,可以从大量的记录中发现有趣的关联关系,找出影响市场营销效果的关键因素,为产品定位、定价与定制客户群,客户寻求、细分与保持,市场营销与推销,营销风险评估和诈骗预测等决策支持提供参考依据。

    特征。特征分析是从数据库中的一组数据中提取出关于这些数据的特征式,这些特征式表达了该数据集的总体特征。如营销人员通过对客户流失因素的特征提取,可以得到导致客户流失的一系列原因和主要特征,利用这些特征可以有效地预防客户的流失。

    变化和偏差分析。偏差包括很大一类潜在有趣的知识,如分类中的反常实例,模式的例外,观察结果对期望的偏差等,其目的是寻找观察结果与参照量之间有意义的差别。在企业危机管理及其预警中,管理者更感兴趣的是那些意外规则。意外规则的挖掘可以应用到各种异常信息的发现、分析、识别、评价和预警等方面。

    Web页挖掘。随着Internet的迅速发展及Web 的全球普及, 使得Web上的信息量无比丰富,通过对Web的挖掘,可以利用Web 的海量数据进行分析,收集政治、经济、政策、科技、金融、各种市场、竞争对手、供求信息、客户等有关的信息,集中精力分析和处理那些对企业有重大或潜在重大影响的外部环境信息和内部经营信息,并根据分析结果找出企业管理过程中出现的各种问题和可能引起危机的先兆,对这些信息进行分析和处理,以便识别、分析、评价和管理危机。

    二、数据挖掘的功能

    数据挖掘通过预测未来趋势及行为,做出前摄的、基于知识的决策。数据挖掘的目标是从数据库中发现隐含的、有意义的知识,主要有以下五类功能。

    自动预测趋势和行为:数据挖掘自动在大型数据库中寻找预测性信息,以往需要进行大量手工分析的问题如今可以迅速直接由数据本身得出结论。一个典型的例子是市场预测问题,数据挖掘使用过去有关促销的数据来寻找未来投资中回报最大的用户,其它可预测的问题包括预报破产以及认定对指定事件最可能做出反应的群体。

    关联分析:数据关联是数据库中存在的一类重要的可被发现的知识。若两个或多个变量的取值之间存在某种规律性,就称为关联。关联可分为简单关联、时序关联、因果关联。关联分析的目的是找出数据库中隐藏的关联网。有时并不知道数据库中数据的关联函数,即使知道也是不确定的,因此关联分析生成的规则带有可信度。

    聚类:数据库中的记录可被化分为一系列有意义的子集,即聚类。聚类增强了人们对客观现实的认识,是概念描述和偏差分析的先决条件。聚类技术主要包括传统的模式识别方法和数学分类学。80年代初,Michalski提出了概念聚类技术,其要点是,在划分对象时不仅考虑对象之间的距离,还要求划分出的类具有某种内涵描述,从而避免了传统技术的某些片面性。

    概念描述:概念描述就是对某类对象的内涵进行描述,并概括这类对象的有关特征。概念描述分为特征性描述和区别性描述,前者描述某类对象的共同特征,后者描述不同类对象之间的区别。生成一个类的特征性描述只涉及该类对象中所有对象的共性。生成区别性描述的方法很多,如决策树方法、遗传算法等。

    偏差检测:数据库中的数据常有一些异常记录,从数据库中检测这些偏差很有意义。偏差包括很多潜在的知识,如分类中的反常实例、不满足规则的特例、观测结果与模型预测值的偏差、量值随时间的变化等。偏差检测的基本方法是,寻找观测结果与参照值之间有意义的差别。

    三、数据挖掘实例 – 聚类分析应用之市场细分

    聚类是将数据分类到不同的类或者簇这样的一个过程,所以同一个簇中的对象有很大的相似性,而不同簇间的对象有很大的相异性。

    从统计学的观点看,聚类分析是通过数据建模简化数据的一种方法。传统的统计聚类分析方法包括系统聚类法、分解法、加入法、动态聚类法、有序样品聚类、有重叠聚类和模糊聚类等。

    从机器学习的角度讲,簇相当于隐藏模式。聚类是搜索簇的无监督学习过程。与分类不同,无监督学习不依赖预先定义的类或带类标记的训练实例,需要由聚类学习算法自动确定标记,而分类学习的实例或数据对象有类别标记。聚类是观察式学习,而不是示例式的学习。

    从实际应用的角度看,聚类分析是数据挖掘的主要任务之一。而且聚类能够作为一个独立的工具获得数据的分布状况,观察每一簇数据的特征,集中对特定的聚簇集合作进一步地分析。聚类分析还可以作为其他算法(如分类和定性归纳算法)的预处理步骤。

    聚类分析的核心思想就是物以类聚,人以群分。在市场细分领域,消费同一种类的商品或服务时,不同的客户有不同的消费特点,通过研究这些特点,企业可以制定出不同的营销组合,从而获取最大的消费者剩余,这就是客户细分的主要目的。在销售片区划分中,只有合理地将企业所拥有的子市场归成几个大的片区,才能有效地制定符合片区特点的市场营销战略和策略。金融领域,对基金或者股票进行分类,以选择分类投资风险。

    下面以一个汽车销售的案例来介绍聚类分析在市场细分中的应用。

     

    汽车销售聚类分析

     

    商业目标

    业务理解:数据名称《汽车销售.csv》。该案例所用的数据是一份关于汽车的数据,该数据文件包含销售值、订价以及各种品牌和型号的车辆的物理规格。订价和物理规格可以从 edmunds.com 和制造商处获得。定价为美国本土售价。如下:

     

    美国本土售价

     

    表1:数据视图

    业务目标:对市场进行准确定位,为汽车的设计和市场份额预测提供参考。

    数据挖掘目标:通过聚类的方式对现有的车型进行分类。

    数据准备

    通过数据探索对数据的质量和字段的分布进行了解,并排除有问题的行或者列优化数据质量。

     

    汽车销售销售数据

    第一步,我们使用统计节点审核数据的质量,从审核结果中我们发现存在缺失的数据,如下图所示:

     

     

    审核后的数据

    第二步,对缺失的数据进行处理,我们选择使用缺失填充节点删除这些记录。配置如下:

     

     

    删除记录配置

     

    建模

    我们选择层次聚类进行分析,尝试根据各种汽车的销售量、价格、引擎、马力、轴距、车宽、车长、制动、排量、油耗等指标对其分类。

    因为层次聚类不能自动确定分类数量,因此需要我们以自定义的方式规定最后聚类的类别数。层次聚类节点配置如下(默认配置):

     

    层次聚类节点配置

    可以使用交互表或者右击层次聚类节点查看聚类的结果,如下图所示:

     

     

    使用交互表或者右击层次聚类节点查看聚类的结果

    再使用饼图查看每个类的大小,结果如下:饼图结果

     

     

    从图中可见,分成的三个类样本数差异太大,cluster_0和cluster_1包含的样本数都只有1,这样的分类是没有意义的,因此需要重新分类。我们尝试在层次聚类节点的配置中指定新的聚类方法:完全。新的聚类样本数分布如下:新的聚类样本数分布

     

     

    cluster_0、 cluster_1、cluster_2的样本数分别为:50、9、93。条形图记数

     

     

    执行后输出树状/冰柱图,可以从上往下看,一开始是一大类,往下走就分成了两类,越往下分的类越多,最后细分到每一个记录是一类,如下所示:树状图

     

     

    我们可以再使用条形图查看每类的销售量、平均价格,如下图所示:条形图求和

     

     

    每类总销量分布图每类总销量分布图

     

     

    每类平均销量分布图每类平均销量分布图

     

     

    每类平均价格分布图

     

    我们再看一下每类的销售额分布情况。首先,我们需要使用Java代码段节点或者派生节点生成销售额字段,配置如下:每类平均价格分布图配置

     

    再使用饼图查看销售额分布情况,cluster_0、 cluster_1、cluster_2的市场份额分别为:32.39%、0.53%和67.08%,如下图所示:市场份额

     

     

     

    案例小结

    通过这个案例,大家可以发现聚类分析确实很简单。进行聚类计算后,主要通过图形化探索的方式评估聚类合理性,以及在确定聚类后,分析每类的特征。

    转载于:https://www.cnblogs.com/zourui4271/p/6655699.html

    展开全文
  • python 文本聚类分析案例说明摘要1、结巴分词2、去除停用词3、生成tfidf矩阵4、K-means聚类5、获取主题词 / 主题词团 说明 实验要求:对若干条文本进行聚类分析,最终得到几个主题词团。 实验思路:将数据进行预处理...
  • 聚类分析案例分析.docx
  • R语言混合型数据聚类分析案例

    千次阅读 2016-11-20 12:16:57
    利用聚类分析,我们可以很容易地看清数据集中样本的分布情况。以往介绍聚类分析的文章中通常只介绍如何处理连续型变量,这些文字并没有过多地介绍如何处理混合型数据(如同时包含连续型变量、名义型变量和顺序型变量...

    利用聚类分析,我们可以很容易地看清数据集中样本的分布情况。以往介绍聚类分析的文章中通常只介绍如何处理连续型变量,这些文字并没有过多地介绍如何处理混合型数据(如同时包含连续型变量、名义型变量和顺序型变量的数据)。本文将利用 Gower 距离、PAM(partitioning around medoids)算法和轮廓系数来介绍如何对混合型数据做聚类分析。

    R语言

    本文主要分为三个部分:

    • 距离计算
    • 聚类算法的选择
    • 聚类个数的选择

    为了介绍方便,本文直接使用 ISLR 包中的 College 数据集。该数据集包含了自 1995 年以来美国大学的 777 条数据,其中主要有以下几个变量:

    • 连续型变量
      • 录取率
      • 学费
      • 新生数量
    • 分类型变量
      • 公立或私立院校
      • 是否为高水平院校,即所有新生中毕业于排名前 10% 高中的新生数量占比是否大于 50%

    本文中涉及到的R包有:

    In [3]:

    set.seed(1680) # 设置随机种子,使得本文结果具有可重现性
    
    library(dplyr)
    library(ISLR)
    library(cluster)
    library(Rtsne)
    library(ggplot2)
    Attaching package: dplyr
    
    The following objects are masked from package:stats’:
    
        filter, lag
    
    The following objects are masked from package:base’:
    
        intersect, setdiff, setequal, union
    

    构建聚类模型之前,我们需要做一些数据清洗工作:

    • 录取率等于录取人数除以总申请人数
    • 判断某个学校是否为高水平院校,需要根据该学校的所有新生中毕业于排名前 10% 高中的新生数量占比是否大于 50% 来决定

    In [5]:

    college_clean <- College %>%
      mutate(name = row.names(.),
             accept_rate = Accept/Apps,
             isElite = cut(Top10perc,
                           breaks = c(0, 50, 100),
                           labels = c("Not Elite", "Elite"),
                           include.lowest = TRUE)) %>%
      mutate(isElite = factor(isElite)) %>%
      select(name, accept_rate, Outstate, Enroll,
             Grad.Rate, Private, isElite)
    
    glimpse(college_clean)
    Observations: 777
    Variables: 7
    $ name        (chr) "Abilene Christian University", "Adelphi University", "...
    $ accept_rate (dbl) 0.7421687, 0.8801464, 0.7682073, 0.8369305, 0.7564767, ...
    $ Outstate    (dbl) 7440, 12280, 11250, 12960, 7560, 13500, 13290, 13868, 1...
    $ Enroll      (dbl) 721, 512, 336, 137, 55, 158, 103, 489, 227, 172, 472, 4...
    $ Grad.Rate   (dbl) 60, 56, 54, 59, 15, 55, 63, 73, 80, 52, 73, 76, 74, 68,...
    $ Private     (fctr) Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes, Yes,...
    $ isElite     (fctr) Not Elite, Not Elite, Not Elite, Elite, Not Elite, Not...

    距离计算

    聚类分析的第一步是定义样本之间距离的度量方法,最常用的距离度量方法是欧式距离。然而欧氏距离只适用于连续型变量,所以本文将采用另外一种距离度量方法—— Gower 距离。

    Gower 距离

    Gower 距离的定义非常简单。首先每个类型的变量都有特殊的距离度量方法,而且该方法会将变量标准化到[0,1]之间。接下来,利用加权线性组合的方法来计算最终的距离矩阵。不同类型变量的计算方法如下所示:

    • 连续型变量:利用归一化的曼哈顿距离
    • 顺序型变量:首先将变量按顺序排列,然后利用经过特殊调整的曼哈顿距离
    • 名义型变量:首先将包含 k 个类别的变量转换成 k 个 0-1 变量,然后利用 Dice 系数做进一步的计算
      • 优点:通俗易懂且计算方便
      • 缺点:非常容易受无标准化的连续型变量异常值影响,所以数据转换过程必不可少;该方法需要耗费较大的内存

    利用 daisy 函数,我们只需要一行代码就可以计算出 Gower 距离。需要注意的是,由于新生入学人数是右偏变量,我们需要对其做对数转换。daisy 函数内置了对数转换的功能,你可以调用帮助文档来获取更多的参数说明。

    In [6]:

    # Remove college name before clustering
    
    gower_dist <- daisy(college_clean[, -1],
                        metric = "gower",
                        type = list(logratio = 3))
    
    # Check attributes to ensure the correct methods are being used
    # (I = interval, N = nominal)
    # Note that despite logratio being called, 
    # the type remains coded as "I"
    
    summary(gower_dist)

    Out[6]:

    301476 dissimilarities, summarized :
         Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
    0.0018601 0.1034400 0.2358700 0.2314500 0.3271400 0.7773500 
    Metric :  mixed ;  Types = I, I, I, I, N, N 
    Number of objects : 777

    此外,我们可以通过观察最相似和最不相似的样本来判断该度量方法的合理性。本案例中,圣托马斯大学和约翰卡罗尔大学最相似,而俄克拉荷马科技和艺术大学和哈佛大学差异最大。

    In [7]:

    gower_mat <- as.matrix(gower_dist)
    
    # Output most similar pair
    
    college_clean[
      which(gower_mat == min(gower_mat[gower_mat != min(gower_mat)]),
            arr.ind = TRUE)[1, ], ]

    Out[7]:

      name accept_rate Outstate Enroll Grad.Rate Private isElite
    682 University of St. Thomas MN 0.8784638 11712 828 89 Yes Not Elite
    284 John Carroll University 0.8711276 11700 820 89 Yes Not Elite

    In [8]:

    # Output most dissimilar pair
    
    college_clean[
      which(gower_mat == max(gower_mat[gower_mat != max(gower_mat)]),
            arr.ind = TRUE)[1, ], ]

    Out[8]:

      name accept_rate Outstate Enroll Grad.Rate Private isElite
    673 University of Sci. and Arts of Oklahoma 0.9824561 3687 208 43 No Not Elite
    251 Harvard University 0.1561486 18485 1606 100 Yes Elite

    聚类算法的选择

    现在我们已经计算好样本间的距离矩阵,接下来需要选择一个合适的聚类算法,本文采用 PAM(partioniong around medoids)算法来构建模型:

    PAM 算法的主要步骤:

    1. 随机选择 k 个数据点,并将其设为簇中心点
    2. 遍历所有样本点,并将样本点归入最近的簇中
    3. 对每个簇而言,找出与簇内其他点距离之和最小的点,并将其设为新的簇中心点
    4. 重复第2步,直到收敛

    该算法和 K-means 算法非常相似。事实上,除了中心点的计算方法不同外,其他步骤都完全一致 。

    • 优点:简单易懂且不易受异常值所影响
    • 缺点:算法时间复杂度为 O(n2)O(n2)

    聚类个数的选择

    我们将利用轮廓系数来确定最佳的聚类个数,轮廓系数是一个用于衡量聚类离散度的内部指标,该指标的取值范围是[-1,1],其数值越大越好。通过比较不同聚类个数下轮廓系数的大小,我们可以看出当聚类个数为 3 时,聚类效果最好。

    In [9]:

    # Calculate silhouette width for many k using PAM
    
    sil_width <- c(NA)
    
    for(i in 2:10){
      
      pam_fit <- pam(gower_dist,
                     diss = TRUE,
                     k = i)
      
      sil_width[i] <- pam_fit$silinfo$avg.width
      
    }
    
    # Plot sihouette width (higher is better)
    
    plot(1:10, sil_width,
         xlab = "Number of clusters",
         ylab = "Silhouette Width")
    lines(1:10, sil_width)

    聚类结果解释

    描述统计量

    聚类完毕后,我们可以调用 summary 函数来查看每个簇的汇总信息。从这些汇总信息中我们可以看出:簇1主要是中等学费且学生规模较小的私立非顶尖院校,簇2主要是高收费、低录取率且高毕业率的私立顶尖院校,而簇3则是低学费、低毕业率且学生规模较大的公立非顶尖院校。

    In [18]:

    pam_fit <- pam(gower_dist, diss = TRUE, k = 3)
    
    pam_results <- college_clean %>%
      dplyr::select(-name) %>%
      mutate(cluster = pam_fit$clustering) %>%
      group_by(cluster) %>%
      do(the_summary = summary(.))
    
    print(pam_results$the_summary)
    [[1]]
      accept_rate        Outstate         Enroll         Grad.Rate      Private  
     Min.   :0.3283   Min.   : 2340   Min.   :  35.0   Min.   : 15.00   No :  0  
     1st Qu.:0.7225   1st Qu.: 8842   1st Qu.: 194.8   1st Qu.: 56.00   Yes:500  
     Median :0.8004   Median :10905   Median : 308.0   Median : 67.50            
     Mean   :0.7820   Mean   :11200   Mean   : 418.6   Mean   : 66.97            
     3rd Qu.:0.8581   3rd Qu.:13240   3rd Qu.: 484.8   3rd Qu.: 78.25            
     Max.   :1.0000   Max.   :21700   Max.   :4615.0   Max.   :118.00            
          isElite       cluster 
     Not Elite:500   Min.   :1  
     Elite    :  0   1st Qu.:1  
                     Median :1  
                     Mean   :1  
                     3rd Qu.:1  
                     Max.   :1  
    
    [[2]]
      accept_rate        Outstate         Enroll         Grad.Rate      Private 
     Min.   :0.1545   Min.   : 5224   Min.   : 137.0   Min.   : 54.00   No : 4  
     1st Qu.:0.4135   1st Qu.:13850   1st Qu.: 391.0   1st Qu.: 77.00   Yes:65  
     Median :0.5329   Median :17238   Median : 601.0   Median : 89.00           
     Mean   :0.5392   Mean   :16225   Mean   : 882.5   Mean   : 84.78           
     3rd Qu.:0.6988   3rd Qu.:18590   3rd Qu.:1191.0   3rd Qu.: 94.00           
     Max.   :0.9605   Max.   :20100   Max.   :4893.0   Max.   :100.00           
          isElite      cluster 
     Not Elite: 0   Min.   :2  
     Elite    :69   1st Qu.:2  
                    Median :2  
                    Mean   :2  
                    3rd Qu.:2  
                    Max.   :2  
    
    [[3]]
      accept_rate        Outstate         Enroll       Grad.Rate      Private  
     Min.   :0.3746   Min.   : 2580   Min.   : 153   Min.   : 10.00   No :208  
     1st Qu.:0.6423   1st Qu.: 5295   1st Qu.: 694   1st Qu.: 46.00   Yes:  0  
     Median :0.7458   Median : 6598   Median :1302   Median : 54.50            
     Mean   :0.7315   Mean   : 6698   Mean   :1615   Mean   : 55.42            
     3rd Qu.:0.8368   3rd Qu.: 7748   3rd Qu.:2184   3rd Qu.: 65.00            
     Max.   :1.0000   Max.   :15516   Max.   :6392   Max.   :100.00            
          isElite       cluster 
     Not Elite:199   Min.   :3  
     Elite    :  9   1st Qu.:3  
                     Median :3  
                     Mean   :3  
                     3rd Qu.:3  
                     Max.   :3  
    

    PAM 算法的另一个优点是各个簇的中心点是实际的样本点。从聚类结果中我们可以看出,圣弗朗西斯大学是簇1 的中心点,巴朗德学院是簇2 的中心点,而密歇根州州立大学河谷大学是簇3 的中心点。

    In [19]:

    college_clean[pam_fit$medoids, ]

    Out[19]:

      name accept_rate Outstate Enroll Grad.Rate Private isElite
    492 Saint Francis College 0.7877629 10880 284 69 Yes Not Elite
    38 Barnard College 0.5616987 17926 531 91 Yes Elite
    234 Grand Valley State University 0.7525653 6108 1561 57 No Not Elite

    可视化方法

    t-SNE 是一种降维方法,它可以在保留聚类结构的前提下,将多维信息压缩到二维或三维空间中。借助t-SNE我们可以将 PAM 算法的聚类结果绘制出来,有趣的是私立顶尖院校和公立非顶尖院校这两个簇中间存在一个小聚类簇。

    In [22]:

    tsne_obj <- Rtsne(gower_dist, is_distance = TRUE)
    
    tsne_data <- tsne_obj$Y %>%
      data.frame() %>%
      setNames(c("X", "Y")) %>%
      mutate(cluster = factor(pam_fit$clustering),
             name = college_clean$name)
    
    ggplot(aes(x = X, y = Y), data = tsne_data) +
      geom_point(aes(color = cluster))

    进一步探究可以发现,这一小簇主要包含一些竞争力较强的公立院校,比如弗吉尼亚大学和加州大学伯克利分校。虽然无法通过轮廓系数指标来证明多分一类是合理的,但是这 13 所院校的确显著不同于其他三个簇的院校。

    In [25]:

    tsne_data %>%
      filter(X > 15 & X < 25,
             Y > -15 & Y < -10) %>%
      left_join(college_clean, by = "name") %>%
      collect %>%
      .[["name"]]

    Out[25]:

    1. ‘Kansas State University’
    2. ‘North Carolina State University at Raleigh’
    3. ‘Pennsylvania State Univ. Main Campus’
    4. ‘SUNY at Buffalo’
    5. ‘Texas A&M Univ. at College Station’
    6. ‘University of Georgia’
    7. ‘University of Kansas’
    8. ‘University of Maryland at College Park’
    9. ‘University of Minnesota Twin Cities’
    10. ‘University of Missouri at Columbia’
    11. ‘University of Tennessee at Knoxville’
    12. ‘University of Texas at Austin’

    原文链接:https://dpmartin42.github.io/blogposts/r/cluster-mixed-types

    原文作者:Daniel P.Martin

    译者:Fibears

    展开全文
  • 聚类分析案例:探究用户对物品类别的喜好细分降维 数据如下: order_products__prior.csv:订单与商品信息 字段:order_id,product_id, add_to_cart_order, reordered products.csv:商品信息 字段:...

    聚类分析案例:探究用户对物品类别的喜好细分降维

    数据如下:

    • order_products__prior.csv:订单与商品信息
      • 字段:order_idproduct_id, add_to_cart_order, reordered
    • products.csv:商品信息
      • 字段:product_id, product_name, aisle_id, department_id
    • orders.csv:用户的订单信息
      • 字段:order_id,user_id,eval_set,order_number,….
    • aisles.csv:商品所属具体物品类别
      • 字段: aisle_idaisle

    1 需求

    2 分析

    • 1.获取数据
    • 2.数据基本处理
      • 2.1 合并表格
      • 2.2 交叉表合并
      • 2.3 数据截取
    • 3.特征工程 — pca
    • 4.机器学习(k-means)
    • 5.模型评估
      • sklearn.metrics.silhouette_score(X, labels)
        • 计算所有样本的平均轮廓系数
        • X:特征值
        • labels:被聚类标记的目标值

    3 完整代码

    import pandas as pd
    from sklearn.decomposition import PCA
    from sklearn.cluster import KMeans
    from sklearn.metrics import silhouette_score
    
    #  1.获取数据
    order_product = pd.read_csv('./cluster/order_products__prior.csv')
    products = pd.read_csv('./cluster/products.csv')
    orders = pd.read_csv("./cluster/orders.csv")
    aisles = pd.read_csv("./cluster/aisles.csv")
    
    #  2.数据基本处理
    #  2.1合并表格
    table1 = pd.merge(order_product, products, on=["product_id", "product_id"])
    table2 = pd.merge(table1, orders, on=["order_id", "order_id"])
    table = pd.merge(table2, aisles, on=["aisle_id", "aisle_id"])
    
    #  2.2交叉表合并
    table = pd.crosstab(table["user_id"], table["aisle"])
    
    #  2.3数据截取
    table = table[:1000]
    
    #  3.特征工程--PCA
    transfer = PCA(n_components=0.9)
    data = transfer.fit_transform(table)
    
    #  4.机器学习(k-means)
    estimator = KMeans(n_clusters=8, random_state=22)
    y_predict = estimator.fit_predict(data)
    
    #  5.模型评估
    ret = silhouette_score(data, y_predict)
    print(ret)
    

    运行结果:

    【这个结果比较低】

    算法选择指导

    • 关于在计算的过程中,如何选择合适的算法进行计算,可以参考scikit learn官方给的指导意见:

    展开全文
  • 同你分享1个完整的聚类分析案例

    千次阅读 2020-02-08 13:30:00
    这篇文章从对聚类的感性认识到聚类算法的实现:k个初始中心点的选择,中心点的迭代,直到算法收敛得到聚类结果。但有几个问题需要回答:如何判断数据是否适合聚类?k类是如何确定的?遇到数据集小的...
  • SPSS聚类分析——一个案例演示聚类分析全过程

    万次阅读 多人点赞 2015-03-06 14:46:23
    SPSS聚类分析——一个案例演示聚类分析全过程 摘要: 案例数据源: 有20种12盎司啤酒成分和价格的数据,变量包括啤酒名称、热量、钠含量、酒精含量、价格。数据来自《SPSS for Windows 统计分析》 ...
  • 数据挖掘*实验报告 实验项目名称 对全国31个地区农村居民人均年食品消费量09年的聚类分析 信息技术学院 软件技术与数据库教研室 实验概述对全国不同地区农村居民每人年食品消费量的聚类分析 实验目的 运用数据挖掘...
  • 聚类分析在各行各业应用十分常见,而顾客细分是其最常见的分析需求,顾客细分总是和聚类分析挂在一起。 顾客细分,关键问题是找出顾客的特征,一般可从顾客自然特征和消费行为入手,在大型统计分析工具出现之前,...
  • 聚类分析的Matlab 程序—系统聚类(附有案例分析)

    万次阅读 多人点赞 2018-08-08 17:41:31
    聚类分析的Matlab 程序—系统聚类 (1)计算数据集每对元素之间的距离,对应函数为pdistw. 调用格式:Y=pdist(X),Y=pdist(X,’metric’), Y=pdist(X,’distfun’),Y=pdist(X,’minkowski’,p) 说明:X是m*n的矩阵,...
  • from sklearn.cluster import KMeans # 导入sklearn聚类模块 from sklearn.metrics import silhouette_score, calinski_harabaz_score # 效果评估模块 from sklearn.preprocessing import MinMaxScaler # 标准化库 #...
  • 4重心距离 5离差平方和距离 2谱系聚类与K均值聚类 谱系聚类法是目前应用较为广泛的一种聚类法. 谱系聚类是根据生物分类学的思想对研究对象进行 分类的方法. 在生物分类学中分类的单位是 门纲目科属种其中种是分类的...
  • 基于聚类分析案例库分层组织结构,张涛,刘厚泉,基于案例推理包括案例检索、案例重用、案例修正、案例存储四个基本步骤。案例检索是案例推理中最重要的一个步骤。为了提高案例
  • 数据挖掘案例分析(聚类分析).doc

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,986
精华内容 5,994
关键字:

关于聚类分析的案例