精华内容
下载资源
问答
  • 什么是聚类分析聚类分析方法的类别

    万次阅读 多人点赞 2019-07-03 21:09:55
    聚类分析是指将数据对象的集合分组为由类似的对象组成的多个类的分析过程。 基本概念 聚类(Clustering)就是一种寻找数据之间内在结构的技术。聚类把全体数据实例组织成一些相似组,而这些相似组被称作簇。处于...

    聚类分析是指将数据对象的集合分组为由类似的对象组成的多个类的分析过程。

    基本概念

    聚类(Clustering)就是一种寻找数据之间内在结构的技术。聚类把全体数据实例组织成一些相似组,而这些相似组被称作簇。处于相同簇中的数据实例彼此相同,处于不同簇中的实例彼此不同。

    聚类技术通常又被称为无监督学习,与监督学习不同的是,在簇中那些表示数据类别的分类或者分组信息是没有的。

    数据之间的相似性是通过定义一个距离或者相似性系数来判别的。图 1 显示了一个按照数据对象之间的距离进行聚类的示例,距离相近的数据对象被划分为一个簇。

    聚类分析示意
    图 1  聚类分析示意

    聚类分析可以应用在数据预处理过程中,对于复杂结构的多维数据可以通过聚类分析的方法对数据进行聚集,使复杂结构数据标准化。

    聚类分析还可以用来发现数据项之间的依赖关系,从而去除或合并有密切依赖关系的数据项。聚类分析也可以为某些数据挖掘方法(如关联规则、粗糙集方法),提供预处理功能。

    在商业上,聚类分析是细分市场的有效工具,被用来发现不同的客户群,并且它通过对不同的客户群的特征的刻画,被用于研究消费者行为,寻找新的潜在市场。

    在生物上,聚类分析被用来对动植物和基因进行分类,以获取对种群固有结构的认识。

    在保险行业上,聚类分析可以通过平均消费来鉴定汽车保险单持有者的分组,同时可以根据住宅类型、价值、地理位置来鉴定城市的房产分组。

    在互联网应用上,聚类分析被用来在网上进行文档归类。

    在电子商务上,聚类分析通过分组聚类出具有相似浏览行为的客户,并分析客户的共同特征,从而帮助电子商务企业了解自己的客户,向客户提供更合适的服务。

    聚类分析方法的类别

    目前存在大量的聚类算法,算法的选择取决于数据的类型、聚类的目的和具体应用。聚类算法主要分为 5 大类:基于划分的聚类方法、基于层次的聚类方法、基于密度的聚类方法、基于网格的聚类方法和基于模型的聚类方法。

    1. 基于划分的聚类方法

    基于划分的聚类方法是一种自顶向下的方法,对于给定的 n 个数据对象的数据集 D,将数据对象组织成 k(k≤n) 个分区,其中,每个分区代表一个簇。图 2 就是基于划分的聚类方法的示意图。

    层次聚类算法示意
    图 2  层次聚类算法示意

    基于划分的聚类方法中,最经典的就是k-平均(k-means)算法和 k-中心(k-medoids)算法,很多算法都是由这两个算法改进而来的。

    基于划分的聚类方法的优点是,收敛速度快,缺点是,它要求类别数目 k 可以合理地估计,并且初始中心的选择和噪声会对聚类结果产生很大影响。

    2. 基于层次的聚类方法

    基于层次的聚类方法是指对给定的数据进行层次分解,直到满足某种条件为止。该算法根据层次分解的顺序分为自底向上法和自顶向下法,即凝聚式层次聚类算法和分裂式层次聚类算法。

    1)自底向上法。

    首先,每个数据对象都是一个簇,计算数据对象之间的距离,每次将距离最近的点合并到同一个簇。然后,计算簇与簇之间的距离,将距离最近的簇合并为一个大簇。不停地合并,直到合成了一个簇,或者达到某个终止条件为止。

    簇与簇的距离的计算方法有最短距离法、中间距离法、类平均法等,其中,最短距离法是将簇与簇的距离定义为簇与簇之间数据对象的最短距离。自底向上法的代表算法是AGNES(AGglomerativeNESing)算法。

    2)自顶向下法。

    该方法在一开始所有个体都属于一个簇,然后逐渐细分为更小的簇,直到最终每个数据对象都在不同的簇中,或者达到某个终止条件为止。自顶向下法的代表算法是 DIANA(DivisiveANAlysis)算法。

    基于层次的聚类算法的主要优点包括,距离和规则的相似度容易定义,限制少,不需要预先制定簇的个数,可以发现簇的层次关系。基于层次的聚类算法的主要缺点包括,计算复杂度太高,奇异值也能产生很大影响,算法很可能聚类成链状。

    3. 基于密度的聚类方法

    基于密度的聚类方法的主要目标是寻找被低密度区域分离的高密度区域。与基于距离的聚类算法不同的是,基于距离的聚类算法的聚类结果是球状的簇,而基于密度的聚类算法可以发现任意形状的簇。

    基于密度的聚类方法是从数据对象分布区域的密度着手的。如果给定类中的数据对象在给定的范围区域中,则数据对象的密度超过某一阈值就继续聚类。

    这种方法通过连接密度较大的区域,能够形成不同形状的簇,而且可以消除孤立点和噪声对聚类质量的影响,以及发现任意形状的簇,如图 3 所示。

    基于密度的聚类方法中最具代表性的是 DBSAN 算法、OPTICS 算法和 DENCLUE 算法。 图 2 是基于层次的聚类算法的示意图,上方是显示的是 AGNES 算法的步骤,下方是 DIANA 算法的步骤。这两种方法没有优劣之分,只是在实际应用的时候要根据数据特点及想要的簇的个数,来考虑是自底而上更快还是自顶而下更快。

    密度聚类算法示意
    图 3  密度聚类算法示意

    4. 基于网格的聚类方法

    基于网格的聚类方法将空间量化为有限数目的单元,可以形成一个网格结构,所有聚类都在网格上进行。基本思想就是将每个属性的可能值分割成许多相邻的区间,并创建网格单元的集合。每个对象落入一个网格单元,网格单元对应的属性空间包含该对象的值,如图 4 所示。

    基于网格的聚类算法示意
    图 4  基于网格的聚类算法示意

    基于网格的聚类方法的主要优点是处理速度快,其处理时间独立于数据对象数,而仅依赖于量化空间中的每一维的单元数。这类算法的缺点是只能发现边界是水平或垂直的簇,而不能检测到斜边界。另外,在处理高维数据时,网格单元的数目会随着属性维数的增长而成指数级增长。

    5. 基于模型的聚类方法

    基于模型的聚类方法是试图优化给定的数据和某些数学模型之间的适应性的。该方法给每一个簇假定了一个模型,然后寻找数据对给定模型的最佳拟合。假定的模型可能是代表数据对象在空间分布情况的密度函数或者其他函数。这种方法的基本原理就是假定目标数据集是由一系列潜在的概率分布所决定的。

    图 5 对基于划分的聚类方法和基于模型的聚类方法进行了对比。左侧给出的结果是基于距离的聚类方法,核心原则就是将距离近的点聚在一起。右侧给出的基于概率分布模型的聚类方法,这里采用的概率分布模型是有一定弧度的椭圆。

    图 5 中标出了两个实心的点,这两点的距离很近,在基于距离的聚类方法中,它们聚在一个簇中,但基于概率分布模型的聚类方法则将它们分在不同的簇中,这是为了满足特定的概率分布模型。

    聚类方法对比示意
    图 5  聚类方法对比示意

    在基于模型的聚类方法中,簇的数目是基于标准的统计数字自动决定的,噪声或孤立点也是通过统计数字来分析的。基于模型的聚类方法试图优化给定的数据和某些数据模型之间的适应性。

    推荐学习目录:54.聚类分析简介
    55.k-means聚类算法

    展开全文
  • from sklearn.cluster import KMeans # 导入sklearn聚类模块 from sklearn.metrics import silhouette_score, calinski_harabaz_score # 效果评估模块 from sklearn.preprocessing import MinMaxScaler # 标准化库 #...
  • 聚类分析案例

    千次阅读 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

    展开全文
  • 聚类分析

    2019-08-06 18:27:50
    聚类分析 餐饮企业经常会碰到这样的问题。 1)如何通过餐饮客户消费行为的测量,进一步评判餐饮客户的价值和餐饮客户进行细分,找到有价值的客户群和需关注的客户群? 2)如何合理菜品进行分析,以便区分哪些...
    聚类分析

    餐饮企业经常会碰到这样的问题。
    1)如何通过对餐饮客户消费行为的测量,进一步评判餐饮客户的价值和对餐饮客户进行细分,找到有价值的客户群和需关注的客户群?
    2)如何合理对菜品进行分析,以便区分哪些菜品畅销毛利又高,哪些菜品滞销毛利又低?
    这些餐饮问题,可以通过聚类分析解决。

    常用聚类分析算法

    与分类不同,聚类分析是在没有给定划分类别的情况下,根据数据相似度进行样本分组的一种方法。与分类模型需要使用有类标记样本构成的训练数据不同,聚类模型可以建立在无类标记的数据上,是一种非监督的学习算法。聚类的输入是一组违背标记的样本,聚类根据数据自身的距离或相似度将其划分为若干组,划分的原则是组内距离最小化而组间距离最大化。

    常用聚类方法
    类别包括的主要算法
    划分(分裂)方法K-Means算法(K-平均)、K-MEDOIDS算法(K-中心点)、CLARANS算法(基于选择的算法)
    层次分析方法BIRCH算法(平衡迭代规约和聚类)、CURE算法(代表点聚类)、CHAMELEON算法(动态模型)
    基于密度的方法DBSCAN算法(基于高密度连接区域)、DENCLUE算法(密度分布函数)、OPTICS算法(对象排序识别)
    基于网格的方法STING算法(统计信息网络)、CLIOUE算法(聚类高维空间)、WAVE-CLUSTER算法(小波变换)
    基于模型的方法统计学方法、神经网络方法
    常用聚类分析算法
    算法名称算法描述
    K-MeansK-均值聚类也称为快速聚类法,在最小化误差函数的基础上将数据划分为预定的类数 K 。该算法原理简单并便于处理大量数据
    K-中心点K-均值算法对孤立点的敏感性。K-中心点算法不采用簇中对象的平均值作为簇中心,而选用簇中离平均值最近的对象作为簇中心
    系统聚类系统聚类也称为多层次聚类,分类的单位由高到低呈树形结构,且所处的位置越低,其所包含的对象就越少,但这些对象间的共同特征越多。该聚类方法只适合在小数据量的时候使用,数据量大的时候速度会非常慢
    K-Means 聚类算法

    1.算法过程
    1)从 N N N 个样本数据中随机选取 K K K 个对象作为初始的聚类中心。
    2)分别计算每个样本到各个聚类中心的距离,将对象分配到距离最近的聚类中。
    3)所有对象分配完成后,重新计算 K K K 个聚类的中心。
    4)与前一次计算得到的 K K K 个聚类中心比较,如果聚类中心发生变化,转过程2),否则转过程5)。
    5)当质心不发生变化时停止并输出聚类结果。
    对于连续数据,聚类中心取该簇的均值,但是当样本的某些属性时分类变量时,均值可能无定义,可以使用 K − K- K 众数方法。
    2.数据类型与相似性的度量
    1)对于连续属性,要先对各属性进行 零-均值规范(零均值化后的数据均值为零),再进行距离的计算。在 K − M e a n s K-Means KMeans聚类算法中,一般需要度量样本之间的距离、样本与簇之间的距离以及簇与簇之间的距离。
    度量样本之间的相似性最常用的是欧几里得距离、曼哈顿距离和闵可夫斯基距离;样本与簇之间的距离可以用样本到簇中心的距离 d ( e i ) , x d(e_i),x d(ei),x;簇与簇之间的距离可以用簇中心的距离 d ( e i , e j ) d(e_i,e_j) d(ei,ej)
    p p p 个属性来表示 n n n 个样本的数据矩阵如下。

    [ x 11 ⋯ x 1 p ⋮ ⋱ ⋮ x n 1 ⋯ x n p ] \left[ \begin{matrix} x_{11} & & \cdots&& x_{1p}\\ \vdots && \ddots && \vdots \\ x_{n1} && \cdots && x_{np} \end{matrix} \right] x11xn1x1pxnp

    欧几里得距离:

    d ( i , j ) = ( x i 1 − x j 1 ) 2 + ( x i 2 − x j 2 ) 2 + ⋯ + ( x i p − x j p ) 2 d(i,j)=\sqrt{(x_{i1}-x_{j1})^2+(x_{i2}-x_{j2})^2+\cdots+(x_{ip}-x_{jp})^2} d(i,j)=(xi1xj1)2+(xi2xj2)2++(xipxjp)2

    曼哈顿距离:

    d ( i , j ) = ∣ x i 1 − x j 1 ∣ + ∣ x i 2 − x j 2 ∣ + ⋯ + ∣ x i p − x j p ∣ d(i,j)=|x_{i1}-x_{j1}|+|x_{i2}-x_{j2}|+\cdots+|x_{ip}-x_{jp}| d(i,j)=xi1xj1+xi2xj2++xipxjp

    闵可夫斯基距离:

    d ( i , j ) = ( ∣ x i 1 − x j 1 ∣ ) q + ( ∣ x i 2 − x j 2 ∣ ) q + ⋯ + ( ∣ x i p − x j p ∣ ) q q d(i,j)=\sqrt[q]{(|x_{i1}-x_{j1}|)^q+(|x_{i2}-x_{j2}|)^q+\cdots+(|x_{ip}-x_{jp}|)^q} d(i,j)=q(xi1xj1)q+(xi2xj2)q++(xipxjp)q

    q q q 为正整数, q = 1 q=1 q=1 时即为曼哈顿距离; q = 2 q=2 q=2 时即为欧几里得距离。

    2)文档数据
    对于文档数据使用余弦相似性度量,先将文档数据整理成文档-词矩阵格式,如下:


    在这里插入图片描述

    两个文档之间的相似度的计算公式为:

    d ( i , j ) = c o s ( i , j ) = i ⃗ ⋅ j ⃗ ∣ i ⃗ ∣ ∣ j ⃗ ∣ d(i,j)=cos(i,j)=\frac{\vec {i}\cdot\vec{j}}{|\vec{i}||\vec{j}|} d(i,j)=cos(i,j)=i j i j

    3.目标函数
    使用误差平方和 S S E SSE SSE 作为度量聚类质量的目标函数,对于两种不同的聚类结果,选择误差平方和较小的分类结果。
    连续属性的 S S E SSE SSE 计算公式为:


    S S E = ∑ i = 1 K ∑ x ∈ E i d i s t ( e i , x ) 2 SSE=\displaystyle\sum^K_{i=1}\displaystyle\sum_{x\in E_i}dist(e_i,x)^2 SSE=i=1KxEidist(ei,x)2

    文档数据的 S S E SSE SSE 计算公式为:


    S S E = ∑ i = 1 K ∑ x ∈ E i c o s ( e i , x ) 2 SSE=\displaystyle\sum^K_{i=1}\displaystyle\sum_{x\in E_i}cos(e_i,x)^2 SSE=i=1KxEicos(ei,x)2

    E i E_i Ei 的聚类中心 e i e_i ei 计算公式为:


    e i = 1 n i ∑ x ∈ E i x e_i=\frac{1}{n_i}\displaystyle\sum_{x\in{E_i}}x ei=ni1xEix

    上述公式符号说明:


    在这里插入图片描述

    下面结合具体案例来解答之前的两个问题:
    1)如何通过对餐饮客户消费行为的测量,进一步评判餐饮客户的价值和对餐饮客户进行细分,找到有价值的客户群和需关注的客户群?
    2)如何合理对菜品进行分析,以便区分哪些菜品畅销毛利又高,哪些菜品滞销毛利又低?


    消费行为特征数据
    在这里插入图片描述

    数据下载: consumption_data.xls

    采用 K − M e a n s K-Means KMeans 聚类算法,设定聚类个数 K K K 3 3 3,最大迭代次数为 500 500 500次,距离函数取欧式距离

    import pandas as pd
    
    
    # 参数初始化
    inputfile = '../Data/consumption_data.xls'
    outputfile = '../Res_data/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 KMeans
    model = KMeans(n_clusters=k, n_jobs=4, max_iter=iteration)  # 分为k类,并发数4
    model.fit(data_zs)  # 开始聚类
    
    
    # 详细输出原始数据及其类别
    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 plt
    
    
    pic_output = '../tmp/pd_'  # 概率密度图文件前缀
    for i in range(k):
        density_plot(data[r[u'聚类类别'] == i]).savefig(u'%s%s.png' % (pic_output, i))
    

    结果:


    在这里插入图片描述

    分群1特点: R R R 间隔分布在 0 − 30 0-30 030 天;消费次数集中在 2 − 12 2-12 212 次;消费金额在 100 − 2000 100-2000 1002000


    在这里插入图片描述

    分群2特点: R R R 间隔分布在 0 − 30 0-30 030 天;消费次数集中在 10 − 30 10-30 1030 次;消费金额在 100 − 2000 100-2000 1002000


    在这里插入图片描述

    分群3特点: R R R 间隔相对较大,间隔分布在 25 − 125 25-125 25125 天;消费次数集中在 0 − 25 0-25 025 次;消费金额在 0 − 2800 0-2800 02800

    对比分析: 分群2时间间隔较短,消费次数多,而且消费金额较大,是高消费、高价值人群。分群1时间间隔较短,但消费次数较少,消费金额属于中等,代表着一般客户。分群3时间价格最长,消费次数以及消费金额并不凸出,是价值比较低的客户群体。


    聚类分析算法评价

    聚类分析仅根据岩本数据本身将样本分组。其目标是实现组内的对象相互之间是相似的(相关的),而不同组中的对象是不同的(不相关的)。组内的相似性越大,组件差别越大,聚类效果就很好。

    1) p u r i t y purity purity 评价法
    purity 方法只需计算正确聚类数占总数的比例。


    p u r i t y ( X , Y ) = 1 n ∑ k m a x ∣ x k ∩ y i ∣ purity(X,Y)=\frac{1}{n}\displaystyle\sum_k max|x_k\cap y_i| purity(X,Y)=n1kmaxxkyi

    其中, x = ( x 1 , x 2 , ⋯   , x k ) x=(x_1,x_2,\cdots,x_k) x=(x1,x2,,xk) 是聚类集合。 x k x_k xk 表示第 k k k 个聚类的集合。 y = ( y 1 , y 2 , ⋯   , y k ) y=(y_1,y_2,\cdots,y_k) y=(y1,y2,,yk) 表示需要被聚类的集合, y i y_i yi 表示第 i i i 个聚类对象。 n n n 表示被聚类集合对象的总数。

    2) R I RI RI 评价法


    R I = R + W R + M + D + W RI=\frac{R+W}{R+M+D+W} RI=R+M+D+WR+W

    其中, R R R 是值被聚在一类的两个对象被正确分类了, W W W 是指不应该被聚在一类的两个对象被正确分开了, M M M 是指不应该放在一类的对象被错误的放在了一类, D D D 指不应该分开的对象被错误的分开了。

    3) F F F 值评价法


    F α = ( 1 + α 2 ) p r α 2 p + r F_\alpha = \frac{(1+\alpha^2)pr}{\alpha^2p+r} Fα=α2p+r(1+α2)pr

    其中, p = R R + M p=\frac{R}{R+M} p=R+MR r = R R + D r=\frac{R}{R+D} r=R+DR
    实际上 R I RI RI 方法就是把准确率 p p p 和召回率 r r r 看的同等重要,事实上,有时候我们可能需要某一特性更多一点,这时候就适合使用 F F F 值方法。

    Python 主要聚类分析算法

    在这里插入图片描述

    聚类结果可视化工具——TSNE

    通常来说输入的特征数是高维的(大于 3 3 3 维),一般难以直接以原特征对聚类结果进行展示。而 T S N E TSNE TSNE 提供了一种有效的数据降维方式,让我们可以在 2 2 2 维或者 3 3 3 维空间展示聚类结果。

    import pandas as pd
    
    
    # 参数初始化
    inputfile = '../Data/consumption_data.xls'
    outputfile = '../Res_data/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 KMeans
    model = KMeans(n_clusters=k, n_jobs=4, max_iter=iteration)  # 分为k类,并发数4
    model.fit(data_zs)  # 开始聚类
    
    
    # # 详细输出原始数据及其类别
    r = pd.concat([data, pd.Series(model.labels_, index=data.index)], axis=1)  # 详细输出每个样本对应的类别
    r.columns = list(data.columns) + [u'聚类类别']  # 重命名表头
    r.to_excel(outputfile)  # 保存结果
    
    
    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()
    

    效果:


    在这里插入图片描述

    展开全文
  • 聚类分析——客户分群分析

    千次阅读 2020-05-27 14:06:37
    聚类分析练习——客户分群

    聚类分析——客户分群分析

    一、聚类
    聚类分析主要是针对无监督问题,即没有标签值。回顾之前python分析淘宝用户行为(三),我们再运用RFM模型时,人为制作评分系统,并打上标签值,今天主要是直接将其当作无监督问题来处理
    简单来说,就是将相似的东西分到一组,比如说我们进行客户分群时,会根据其价值进行分群,从而制定精准策略。但聚类也存在一些问题,比如说如何评估,如何调参等等。
    二、K-Means算法
    理论解释并不是很难理解,我简单说一下自己的理解,现在有很多组数据,没有标签值,只能根据他们之间的相似度进行分组。
    **过程:**指定需要分多少种客户类型,即K值,然后选取质心(利用向量各维取平均值),选完后将周围的点计算欧几里得距离,最后根据距离进行相似分类。

    **优势:**简单,快速,适合常规数据集

    **劣势:**K值难确定;复杂度与样本呈线性关系;很难发现任意形状的簇
    三、DBSCAN算法
    1、基本概念

    **核心对象:**若某个点的密度达到算法设定的阈值则其为核心点(即r领域内的数量不小于minPts)

    **\epsilon-领域的距离阈值:**设定的半径r
    **直接密度可达:**若某点p在点q的领域内,且q是核心点则p-q直接密度可达

    **密度可达:**若有一个点的序列q0,q1…qk,对于任意其qi-qi-1是直接密度可达的,则称为从q0到qk密度可达,这实际上是直接密度可达的“传播”

    **过程:**数据集-指定半径(r)-密度阈值(Minpts)-进行聚类
    参数选择:

    **半径:**可以根据K距离来设定

    **K距离:**给定数据集P ={p(i);i=0,1,…n},计算点p(i)到集合D的子集S中所有点的距离,距离按照从小到大的顺序排序,d(K)就被称为k-距离

    **MinPts:**k-距离中k的值,一般取的小一些,多次尝试

    **优势:**不需要指定簇个数;可以发现任意形状的簇;擅长找到离群点(检测任务);两个参数就够了。
    **劣势:**高维数据有些困难(可以做降维);参数难以选择(参数对结果的影响非常大);sklearn中效率很慢(数据削减策略)。

    四、练习

    本次分析数据来源CDNow网站的用户在1997年1月1日至1998年6月30日期间内购买CD交易明细。数据集一共有用户ID,购买日期,订单数,订单金额四个字段。对其利用RFM模型进行聚类分析。

    第一步:获取数据,并进行简单的数据清洗

    import pandas as pd
    import numpy as np
    columns=['user_id','order_time','order_products','order_money']
    data=pd.read_table(r'C:\Users\Administrator\Desktop\python\project\聚类分析\RFM\CDNOW.txt',sep='\s+',names=columns)
    data.head()
    print(data.describe())
    print(data.info())
    # 查看异常值
    missing = data.isnull().sum()
    # 删除重复值
    data = data.drop_duplicates(keep ='first',inplace = False)
    # 检查异常值,并删掉(本数据中,订单金额为0,是异常数据)
    expect = data[data['order_money']==0] 
    data=data.drop(index=(data.loc[(data['order_money']==0)].index)) 
    # 数据类型转换,注意看到日期数据,基本都是下面操作
    data['order_time'] = pd.to_datetime(data['order_time'],format = '%Y%m%d')
    

    第二步,构造特征向量
    关于RFM模型进行客户分组时,需要R、F、M值,以下为构造过程:

    # R值是最近一次消费时间与截至时间的间隔(用day来衡量)
    data['order_interval']= pd.to_datetime('1998-06-30')-data['order_time']
    data['order_interval'] = data['order_interval'].apply(lambda x:x.days) #去掉日期间隔的days
    # F值是指消费的频率,M值表示消费的金额
    rfm = data.groupby(['user_id'],as_index = False).agg({'order_interval':'min','order_products':'count','order_money':'sum'})
    rfm.columns = ['user_id','r','f','m']  #重命名列:最近一次订单r,订单频率f和订单总金额m
    

    第三步,进行模型建立之前,需要对数据进行标准化处理

    from sklearn.preprocessing import StandardScaler
    data = StandardScaler().fit_transform(rfm.loc[:,['r','f','m']])
    第四步:建立模型
    from sklearn.cluster import KMeans
    kmodel = KMeans(n_clusters=3)
    kmodel.fit(data)
    
    # 查看聚类结果
    kmeans_cc = kmodel.cluster_centers_  # 聚类中心
    print('各类聚类中心为:\n',kmeans_cc)
    kmeans_labels = kmodel.labels_  # 样本的类别标签
    print('各样本的类别标签为:\n',kmeans_labels)
    r1 = pd.Series(kmodel.labels_).value_counts()  # 统计不同类别样本的数目
    print('最终每个类别的数目为:\n',r1)
    
    各类聚类中心为:
     [[ 0.62263953 -0.33099376 -0.26103463]
     [-1.37152564  0.60113127  0.42723658]
     [-1.77096075  7.04810188  7.79356919]]
    各样本的类别标签为:
     [0 0 1 ... 0 0 0]
    最终每个类别的数目为:
     0    16182
    1     7170
    2      150
    dtype: int64
    
    # 输出聚类分群的结果
    cluster_center = pd.DataFrame(kmodel.cluster_centers_,columns = ['ZR','ZF','ZM'])   # 将聚类中心放在数据框中
    cluster_center.index = pd.DataFrame(kmodel.labels_ ).drop_duplicates().iloc[:,0]  # 将样本类别作为数据框索引
    print(cluster_center)
    
         ZR        ZF        ZM
    0                              
    0  0.622640 -0.330994 -0.261035
    1 -1.371526  0.601131  0.427237
    2 -1.770961  7.048102  7.793569
    

    简单的聚类分析就是这样,根据结果,我们发现这些客户被分为了三种,其中第0组的占比非常大,应该是最近购买间隔占比较大,说明公司的可持续性高。第1组购买频率较高,说明客户粘性较大,最后一组的购买频率和购买金额都较高,可以进行VIP服务。
    将结果进行可视化分析,从而更清晰的进行结果分析。

    # 客户分群雷达图
    labels = ['ZR','ZF','ZM']
    legen = [' customers' + str(i + 1) for i in cluster_center.index]  # 客户群命名,作为雷达图的图例
    lstype = ['-',':','-.']
    kinds = list(cluster_center.iloc[:, 0])
    # 由于雷达图要保证数据闭合,因此再添加L列,并转换为 np.ndarray
    cluster_center = pd.concat([cluster_center, cluster_center[['ZR']]], axis=1)
    centers = np.array(cluster_center.iloc[:, 0:])
    
    # 分割圆周长,并让其闭合
    n = len(labels)
    angle = np.linspace(0, 2 * np.pi, n, endpoint=False)
    angle = np.concatenate((angle, [angle[0]]))
    
    import matplotlib.pyplot as plt
    # 绘图
    fig = plt.figure(figsize = (8,6))
    ax = fig.add_subplot(111, polar=True)  # 以极坐标的形式绘制图形
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    # 画线
    for i in range(len(kinds)):
        ax.plot(angle, centers[i], linestyle=lstype[i], linewidth=3, label=kinds[i])
    # 添加属性标签
    ax.set_thetagrids(angle * 180 / np.pi, labels)
    plt.title('Customer Profile Analysis')
    plt.legend(legen)
    

    在这里插入图片描述
    当然,看上面这个图,我们发现分类分得并不是很好,我们可以利用肘部法和轮廓系数来进行相应的评估和调参。

    from sklearn.metrics import silhouette_score,silhouette_samples
    for n_clusters in range(2,10):
        km = KMeans(n_clusters=n_clusters)
        preds = km.fit_predict(data)
        centers =km.cluster_centers_
        score = silhouette_score(data,preds)
        print('For n_clusters = {},silhouette_score is {}'.format(n_clusters,score))
    # 寻找轮廓系数接近1的,在这个情况下,还是k=3,轮廓系数最高
    

    综上所述,聚类分析用在无监督问题,具体问题还是要具体分析,这个案例只是练习,也可以将特征进行一系列处理,从而达到更好的效果。

    展开全文
  • 聚类分析在各行各业应用十分常见,而顾客细分是其最常见的分析需求,顾客细分总是和聚类分析挂在一起。 顾客细分,关键问题是找出顾客的特征,一般可从顾客自然特征和消费行为入手,在大型统计分析工具出现之前,...
  • (1)使用教材 §7 航空公司客户价值聚类分析配套示例数据和代码,掌握其特征构造操作过程 (2)考虑:使用其它模型参数, 聚类算法, 并观察结果;利用数据探索分析结果, 提取有用的变量/特征, 进行聚类分析, 观察...
  • Kmeans聚类实例④——电商用户质量聚类分析(RFM)

    万次阅读 多人点赞 2019-06-15 18:59:38
    聚类通常分为以下步骤: ...⑤ 聚类,如果是现成的模型,则直接聚类即可,如果是拟定的指标,则各指标进行相关性验证,剔除掉相关性较高的指标,再聚类 ⑥ 根据聚类结果,结合业务场景提供建议 本篇...
  • 聚类分析初识

    2017-08-01 12:49:09
    实例举两个实际列子: 1. 如何通过餐饮客户消费行为的测量,... 聚类分析定义聚类分析是在没有给定划分类别的情况下,根据相似度进行样本分组的一种方法。是一种非监督的学习算法,划分的原则是组内距离最小化而
  • 在此基础上, 提出了一种基于模糊聚类分析客户分类算法, 对客户进行分类管理, 并给出了一个计算实例, 取得了正确的计算结果。该计算实例表明, 这个算法可以用于关于客户关系管理的决策支持系统中。
  • 聚类分析

    2019-04-24 18:14:00
    聚类分析指将物理或抽象对象的集合分组为由类似的对象组成的多个类的分析过程。它是一种重要的人类行为。 聚类分析的目标就是在相似的基础上收集数据来分类。聚类源于很多领域,包括数学,计算机科学,统计学,生物...
  • 聚类分析(银行客户画像)

    千次阅读 热门讨论 2018-06-05 20:37:29
    # CDA 11 聚类分析客户画像) # 导入数据 customer<- read.csv("D:\\桃子的数据\\CDA\\11 聚类分析\\课件&代码-11.客户画像\\Data\\Age_Income3.csv",header=T,sep=',') names(customer)...
  • 聚类分析(超全超详细版)

    万次阅读 多人点赞 2020-04-20 20:50:31
    聚类分析是一种典型的无监督学习, 用于未知类别的样本进行划分,将它们按照一定的规则划分成若干个类族,把相似(距高相近)的样本聚在同一个类簇中, 把不相似的样本分为不同类簇,从而揭示样本之间内在的性质以及...
  • 1 聚类分析介绍 1.1 基本概念 聚类就是一种寻找数据之间一种内在结构的技术。聚类把全体数据实例组织成一些相似组,而这些相似组被称作聚类。处于相同聚类中的数据实例彼此相同,处于不同聚类中的实例彼此不同...
  • 1、聚类分析 是按照个体的特征将他们分类,让同一个类别内的个体之间具有较高的相似度,不同类别之间具有较大的差异性; 2、基本理论 Kmeans:K表示算法当中类的个数 Means 均值算法:K-means 使用均值算法把...
  • 在此基础上,提出了一种基于模糊聚类分析客户分类算法,对客户进行分类管理,并给出了一个计算实例,取得了正确的计算结果。该计算实例表明,这个算法可以用于关于客户关系管理的决策支持系统中。
  • KMeans算法( 聚类分析)

    万次阅读 热门讨论 2019-11-21 21:03:04
    1 聚类分析相关概念 1.1 聚类与分类 分类其实是从特定的数据中挖掘模式,作出判断的过程。比如Gmail邮箱里有垃圾邮件分类器,一开始的时候可能什么都不过滤,在日常使用过程中,我人工对于每一封邮件点选“垃圾...
  • 深入浅出聚类分析

    2020-11-10 08:20:00
    Kervin_Chan| 作者掘金|来源https://juejin.im/post/68449039688212316231如何选择聚类分析算法聚类算法有几十种之多,聚类算法的选...
  • 聚类分析深入浅出

    2020-11-07 20:37:00
    Kervin_Chan| 作者掘金|来源https://juejin.im/post/68449039688212316231如何选择聚类分析算法聚类算法有几十种之多,聚类算法的选...
  • 基于 K means 聚类的客户细分案例分析 摘要当今流行的客户...销售数据来进行分析选择 K-means 聚类分析方法结合企业 的实际情况划分出不同的客户群企业可以根据不同客户 群的需求和企业的贡献制定不同的宣传营销策
  • 在《多元统计分析——聚类分析——K-均值聚类(K-中值、K-众数)》当中,我们理解了K-均值聚类的原理,也简单的介绍了K-均值聚类的两个应用场景: ... 将个案数据做划分:出于客户细分目的的聚类分析
  • Python+pandas实现简单聚类分析

    万次阅读 2018-10-31 21:42:08
    应用百度百科对聚类分析的解释: 聚类分析指将物理或抽象对象的集合分组为由类似的对象组成的多个类的分析过程。它是一种重要的人类行为。 聚类分析的目标就是在相似的基础上收集数据来分类。聚类源于很多领域,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,997
精华内容 2,798
关键字:

对客户的聚类分析案例