层次聚类分析案例(一)
关于聚类分析的介绍,可参见本人之前的笔记:聚类分析
案例一:世界银行样本数据集
创建世界银行的一个主要目标是对抗和消除贫困。在这个不断发展的世界中,世界银行持续的发展并精细地调整它的政策,已经帮助这个机构逐渐实现了消除贫困的目标。消除贫困的成果以下指标的改进衡量,这些指标包括健康、教育、卫生、基础设施以及其他需要用于改进穷人生活的服务。与此同时,发展成果必须保证以一种环保的、全社会的、经济可持续的方式达成。
准备工作
为了进行层次聚类,我们需要使用从世界银行收集的数据集。
第1步:收集和描述数据
该任务使用名为WBClust2013的数据集。该数据以标准格式存储在名为WBClust2013.csv的CSV格式的文件中。其有80行数据和14个变量。点我获取数据
第一列Country为非数值型变量,其他列均为数值型变量。
第2步:探索数据
让我们探索数据并理解变量间的关系。我们通过导入名为WBClust2013.csv的CSV文件开始。存储数据到wbclust数据框中:
wbclust = read.csv("ClusteringAnalysis/Practical-Machine-Learning-Cookbook/Chapter03/Data/WBClust2013.csv")
下一步输出wbclust数据框,head()函数返回wbclust数据框。wbclust数据框作为一个输入参数传入:
head(wbclust)
结果如下:
head(wbclust)
第3步:转换数据
中心化变量和创建z值是两个常见的用于归一化数据的数据分析手段。上面提到的数值型变量需要创建z值。scale()函数是一个通用的函数,其默认方法中心化并比例缩放一个数值化矩阵的列。数据框wbclust被传给该比例函数。只有数据框中数值化的变量会被缩放。结果存储在wbnorm数据框中。
wbnorm = scale(wbclust[,2:13])
head(wbnorm)
结果如下:
所有的数据框都有rownames属性。rownames()函数用来获取或设置矩阵类变量的行名或列名。数据框wbclust以及第一列被传递给rownames()函数。
rownames(wbnorm) = wbclust[,1]
rownames(wbnorm)
调用rownames(wbnorm)方法显示第一列的数值。结果如下:
第4步:训练并评估模型效果
下一步是训练模型。首先使用dist()函数计算距离矩阵。使用特定的距离度量方法计算数据矩阵行间的距离。使用的距离度量可以是欧式距离、最大距离、曼哈顿距离、堪培拉距离、二进制距离,或闵可夫斯基距离。这里的距离度量使用欧式距离。使用欧式距离计算两个向量间的距离为sqrt(sum((x_i-y_i)^2))。结果被存储在一个新的数据框dist1中。
dist1 <- dist(wbnorm,method="euclidean")
下一步是使用Ward方法进行聚类。hclust()函数对一组不同的n个对象进行聚类分析。第一阶段,每个对象被指派给它自己的簇。之后每个阶段,算法迭代聚合两个最相似的簇。这个过程不断持续直到只剩一个簇。hclust()函数要求我们以距离矩阵的形式提供数据。dist1数据框被作为输入传入。默认使用全链接算法。此外还可以使用不同的聚集方法,包括ward.D、ward.D2、single、complete和average。
cluster1 <- hclust(dist1,method = "ward.D")
cluster1
输入clust1命令可显示所使用的聚集方法,计算距离的方法,以及数据对象的数量。结果如下:
第5步:绘制模型
plot()函数是一个通用的绘制R语言对象的函数。这里plot()函数用来绘制系统树图:
plot(cluster1, labels= wbclust$Country,cex=0.7,
xlab="",ylab="Distance", main="Clustering for 80 Most Populous Countries")
结果如下:
rect.hclust()函数强调不同的簇,并在系统树图的枝干处绘制长方形。系统树图首先在某个等级上被剪切,之后在选定的枝干上绘制长方形。
clust1对象以及需要形成的簇的数量作为输入变量传入函数。
rect.hclust(cluster1,k=5)
结果如下:
rect.hclust(cluster1,k=12)
cuts()函数基于期望的簇数量或者切割高度将树中的元素切割到不同的簇中。这里,clust1对象以及需要形成的簇的数量作为输入变量传入函数。
cuts = cutree(cluster1,k=5)
cuts
结果如下:
得到每个簇的国家列表:
for (i in 1:5){
print(paste("Countries in Cluster ",i))
print(wbclust$Country[cuts==i])
print(" ")
}
结果如下: