關(guān)于聚類分析的介紹,可參見本人之前的筆記:聚類分析
案例一:世界銀行樣本數(shù)據(jù)集
創(chuàng)建世界銀行的一個(gè)主要目標(biāo)是對(duì)抗和消除貧困。在這個(gè)不斷發(fā)展的世界中,世界銀行持續(xù)的發(fā)展并精細(xì)地調(diào)整它的政策,已經(jīng)幫助這個(gè)機(jī)構(gòu)逐漸實(shí)現(xiàn)了消除貧困的目標(biāo)。消除貧困的成果以下指標(biāo)的改進(jìn)衡量,這些指標(biāo)包括健康、教育、衛(wèi)生、基礎(chǔ)設(shè)施以及其他需要用于改進(jìn)窮人生活的服務(wù)。與此同時(shí),發(fā)展成果必須保證以一種環(huán)保的、全社會(huì)的、經(jīng)濟(jì)可持續(xù)的方式達(dá)成。
準(zhǔn)備工作
為了進(jìn)行層次聚類,我們需要使用從世界銀行收集的數(shù)據(jù)集。
第1步:收集和描述數(shù)據(jù)
該任務(wù)使用名為WBClust2013的數(shù)據(jù)集。該數(shù)據(jù)以標(biāo)準(zhǔn)格式存儲(chǔ)在名為WBClust2013.csv的CSV格式的文件中。其有80行數(shù)據(jù)和14個(gè)變量。點(diǎn)我獲取數(shù)據(jù)

第一列Country為非數(shù)值型變量,其他列均為數(shù)值型變量。
第2步:探索數(shù)據(jù)
讓我們探索數(shù)據(jù)并理解變量間的關(guān)系。我們通過導(dǎo)入名為WBClust2013.csv的CSV文件開始。存儲(chǔ)數(shù)據(jù)到wbclust數(shù)據(jù)框中:
wbclust = read.csv("ClusteringAnalysis/Practical-Machine-Learning-Cookbook/Chapter03/Data/WBClust2013.csv")
下一步輸出wbclust數(shù)據(jù)框,head()函數(shù)返回wbclust數(shù)據(jù)框。wbclust數(shù)據(jù)框作為一個(gè)輸入?yún)?shù)傳入:
head(wbclust)
結(jié)果如下:

第3步:轉(zhuǎn)換數(shù)據(jù)
中心化變量和創(chuàng)建z值是兩個(gè)常見的用于歸一化數(shù)據(jù)的數(shù)據(jù)分析手段。上面提到的數(shù)值型變量需要?jiǎng)?chuàng)建z值。scale()函數(shù)是一個(gè)通用的函數(shù),其默認(rèn)方法中心化并比例縮放一個(gè)數(shù)值化矩陣的列。數(shù)據(jù)框wbclust被傳給該比例函數(shù)。只有數(shù)據(jù)框中數(shù)值化的變量會(huì)被縮放。結(jié)果存儲(chǔ)在wbnorm數(shù)據(jù)框中。
wbnorm = scale(wbclust[,2:13])
head(wbnorm)
結(jié)果如下:

所有的數(shù)據(jù)框都有rownames屬性。rownames()函數(shù)用來獲取或設(shè)置矩陣類變量的行名或列名。數(shù)據(jù)框wbclust以及第一列被傳遞給rownames()函數(shù)。
rownames(wbnorm) = wbclust[,1]
rownames(wbnorm)
調(diào)用rownames(wbnorm)方法顯示第一列的數(shù)值。結(jié)果如下:

第4步:訓(xùn)練并評(píng)估模型效果
下一步是訓(xùn)練模型。首先使用dist()函數(shù)計(jì)算距離矩陣。使用特定的距離度量方法計(jì)算數(shù)據(jù)矩陣行間的距離。使用的距離度量可以是歐式距離、最大距離、曼哈頓距離、堪培拉距離、二進(jìn)制距離,或閔可夫斯基距離。這里的距離度量使用歐式距離。使用歐式距離計(jì)算兩個(gè)向量間的距離為sqrt(sum((x_i-y_i)^2))。結(jié)果被存儲(chǔ)在一個(gè)新的數(shù)據(jù)框dist1中。
dist1 <- dist(wbnorm,method="euclidean")
下一步是使用Ward方法進(jìn)行聚類。hclust()函數(shù)對(duì)一組不同的n個(gè)對(duì)象進(jìn)行聚類分析。第一階段,每個(gè)對(duì)象被指派給它自己的簇。之后每個(gè)階段,算法迭代聚合兩個(gè)最相似的簇。這個(gè)過程不斷持續(xù)直到只剩一個(gè)簇。hclust()函數(shù)要求我們以距離矩陣的形式提供數(shù)據(jù)。dist1數(shù)據(jù)框被作為輸入傳入。默認(rèn)使用全鏈接算法。此外還可以使用不同的聚集方法,包括ward.D、ward.D2、single、complete和average。
cluster1 <- hclust(dist1,method = "ward.D")
cluster1
輸入clust1命令可顯示所使用的聚集方法,計(jì)算距離的方法,以及數(shù)據(jù)對(duì)象的數(shù)量。結(jié)果如下:

第5步:繪制模型
plot()函數(shù)是一個(gè)通用的繪制R語言對(duì)象的函數(shù)。這里plot()函數(shù)用來繪制系統(tǒng)樹圖:
plot(cluster1, labels= wbclust$Country,cex=0.7,
xlab="",ylab="Distance", main="Clustering for 80 Most Populous Countries")
結(jié)果如下:

rect.hclust()函數(shù)強(qiáng)調(diào)不同的簇,并在系統(tǒng)樹圖的枝干處繪制長方形。系統(tǒng)樹圖首先在某個(gè)等級(jí)上被剪切,之后在選定的枝干上繪制長方形。
clust1對(duì)象以及需要形成的簇的數(shù)量作為輸入變量傳入函數(shù)。
rect.hclust(cluster1,k=5)
結(jié)果如下:

rect.hclust(cluster1,k=12)

cuts()函數(shù)基于期望的簇?cái)?shù)量或者切割高度將樹中的元素切割到不同的簇中。這里,clust1對(duì)象以及需要形成的簇的數(shù)量作為輸入變量傳入函數(shù)。
cuts = cutree(cluster1,k=5)
cuts
結(jié)果如下:

得到每個(gè)簇的國家列表:
for (i in 1:5){
print(paste("Countries in Cluster ",i))
print(wbclust$Country[cuts==i])
print(" ")
}
結(jié)果如下:
