数据分析学习总结笔记02:聚类分析及其R语言实现
1. 聚类分析概述
1.1 聚类分析简介
聚类分析(cluster analysis)是一组将研究对象分为相对同质的群组的统计分析技术。聚类分析也称群分析或点群分析,它是研究多要素事物分类问题的数量方法。在科学研究、社会调查或日常生活中,通过观察个体的特征,将群体中的个体归为不同的族群/簇(Cluster)1。
1.2 聚类分析原理
根据样本自身的属性,用数学方法按照某种相似性或差异性指标,定量地确定样本之间的亲疏关系,并按这种亲疏关系程度对样本进行聚类。
1.3 聚类&分类
- 分类分析中,个体的类别标签固有存在,只是对于新观测个体暂时未知,分类过程旨在根据其特征预测类别,后续可知是否预测准确。属于有监督学习(supervised learning)。例如,银行征信分类。
- 聚类分类中,类别的个数及个体标签本身并不存在,只是根据个体特征的相似性形成“合理”的聚集,并无“正确答案”参考。属于无监督学习(unsupervised learning),较为主观。例如,精准营销。
1.4 如何刻画相似度?
合理的聚类方式应当使得同一族群内的观测尽可能相似,但不同的族群之间有明显区分。
刻画相似度的方式——距离,距离越小越相似月可能聚为同一类。主要有以下几种常见的方式度量:
- 欧式距离(Euclidean distance):
- 马氏距离(Mahalanobis distance)
- Minkowski 测度
- Canberra 测度
2. 聚类分析的方法
传统的统计聚类分析方法包括系统聚类法、分解法、加入法、动态聚类法、有序样品聚类、有重叠聚类和模糊聚类等。采用K-均值、k-中心点等算法的聚类分析工具已被加入到许多常用的统计分析软件包中,如SPSS、SAS等。
2.1 层次聚类
2.1.1 层次聚类步骤
(1)建立n个初始族群,每个族群中只有一个个体;
(2)计算n个族群间的距离矩阵;
(3)合并距离最小的两个族群,计算新族群间的距离矩阵;
(4)如果组别数为1,转步骤(5),否则转步骤(3);
(5)绘制系统树图;
(6)选择族群个数。
2.1.2 简介
考虑所有的群组组合几乎无法实现,所以一种最常用的聚类方法为层次聚类/系统聚类(hierarchical cluster)。主要有两种方式:
- 凝聚法(Agglomerative clustering)由单个个体开始,逐步合并最“相似”的个体,直到所有个体都合并为一个族群。再进一步考虑该族群和其他族群的距离。
- 分离法(Divisive clustering)即为凝聚法的相反方向。
层次聚类过程的结果可以利用图表展示为系统树图(Dendrogram),用来展示层次聚类的每一个步骤及其结果,包括合并族群带来的距离的变化。
2.1.3 层次聚类的类型
本节主要介绍凝聚法。凝聚法每一步需要合并“距离最小的两个族群”,不同族群间距离的定义方法决定了不同的聚类结果。
(1)连接法
- 简单连接法/最近邻法:定义族群间的距离为两族群中相隔最近的两个个体间的距离。
- 完全连接法/最远邻法:定义族群间的距离为两组别中相隔最远个体之间的距离。
- 平均连接法:定义族群间的距离为nA个A集合点和nB个B集合点产生的所有nA nB个距离的平均值。
- 质心连接法:定义族群间的距离为两族群各自的质心,即样本均值向量,之间的欧式距离。每次合并都会重新计算新族群的质心,该方法可能存在倒置现象,即,如果两个族群合并之后,下一步合并时的距离反而减小,这种情况称为倒置,在系统树图中表现为交叉现象。由于在简单连接、完全连接和平均连接中距离的度量是单调的,倒置在这些层次聚类方法中不可能发生。倒置可以通过基于中点的质心法进行解决。
(2)Ward法
Ward法/方差平方和增量法,由合并前后的族群内方差平方和的差异定义距离:
I(AB) = SSE(AB) - ( SSE(A) + SSE(B) )
2.1.4 层次聚类族群个数的选择
可以通过树图的两个族群间的距离进行划分,选择较大距离的点进行划分。同时,需要结合对数据的经验和理解,看聚成多少类更加符合实际情况,或者更易于理解。总结为以下思路:
- 根据经验或业务理解预先设定;
- 数据驱动:从系统树图中于给定距离水平下“切分”树图得到对应族群。通常寻找合并组别时较大的距离变化的节点。
2.1.5 层次聚类R语言实践
简单连接聚类/完全连接聚类/平均连接聚类:
library(EXAMPLE)
measure
dm <- dist(measure[,c(“x”,“y”,“z”)])
round(dm,2)
layout(matrix(1:3,nr=1),height=c(2,1))
plot(cs<-hclust(dm,method=“single/complete/average”,main=“single”)
abline(h=3.8, col=“lightgrey”)
为了显示聚类效果,可以画出带族标签的主成分散点图。
plot(body_pc s c o r e s [ , 1 : 2 ] , t y p e = " n " , x l a