關于聚類分析的介紹挂绰,可參見本人之前的筆記:聚類分析
案例一:世界銀行樣本數(shù)據(jù)集
創(chuàng)建世界銀行的一個主要目標是對抗和消除貧困。在這個不斷發(fā)展的世界中焊切,世界銀行持續(xù)的發(fā)展并精細地調整它的政策扮授,已經(jīng)幫助這個機構逐漸實現(xiàn)了消除貧困的目標。消除貧困的成果以下指標的改進衡量专肪,這些指標包括健康、教育堪侯、衛(wèi)生嚎尤、基礎設施以及其他需要用于改進窮人生活的服務。與此同時伍宦,發(fā)展成果必須保證以一種環(huán)保的芽死、全社會的、經(jīng)濟可持續(xù)的方式達成次洼。
準備工作
為了進行層次聚類关贵,我們需要使用從世界銀行收集的數(shù)據(jù)集。
第1步:收集和描述數(shù)據(jù)
該任務使用名為WBClust2013的數(shù)據(jù)集卖毁。該數(shù)據(jù)以標準格式存儲在名為WBClust2013.csv的CSV格式的文件中揖曾。其有80行數(shù)據(jù)和14個變量。點我獲取數(shù)據(jù)
第一列Country為非數(shù)值型變量亥啦,其他列均為數(shù)值型變量炭剪。
第2步:探索數(shù)據(jù)
讓我們探索數(shù)據(jù)并理解變量間的關系。我們通過導入名為WBClust2013.csv的CSV文件開始翔脱。存儲數(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ù)框作為一個輸入?yún)?shù)傳入:
head(wbclust)
結果如下:
第3步:轉換數(shù)據(jù)
中心化變量和創(chuàng)建z值是兩個常見的用于歸一化數(shù)據(jù)的數(shù)據(jù)分析手段届吁。上面提到的數(shù)值型變量需要創(chuàng)建z值错妖。scale()函數(shù)是一個通用的函數(shù),其默認方法中心化并比例縮放一個數(shù)值化矩陣的列疚沐。數(shù)據(jù)框wbclust被傳給該比例函數(shù)暂氯。只有數(shù)據(jù)框中數(shù)值化的變量會被縮放。結果存儲在wbnorm數(shù)據(jù)框中濒旦。
wbnorm = scale(wbclust[,2:13])
head(wbnorm)
結果如下:
所有的數(shù)據(jù)框都有rownames屬性株旷。rownames()函數(shù)用來獲取或設置矩陣類變量的行名或列名。數(shù)據(jù)框wbclust以及第一列被傳遞給rownames()函數(shù)。
rownames(wbnorm) = wbclust[,1]
rownames(wbnorm)
調用rownames(wbnorm)方法顯示第一列的數(shù)值晾剖。結果如下:
第4步:訓練并評估模型效果
下一步是訓練模型锉矢。首先使用dist()函數(shù)計算距離矩陣。使用特定的距離度量方法計算數(shù)據(jù)矩陣行間的距離齿尽。使用的距離度量可以是歐式距離沽损、最大距離、曼哈頓距離循头、堪培拉距離绵估、二進制距離,或閔可夫斯基距離卡骂。這里的距離度量使用歐式距離国裳。使用歐式距離計算兩個向量間的距離為sqrt(sum((x_i-y_i)^2))。結果被存儲在一個新的數(shù)據(jù)框dist1中全跨。
dist1 <- dist(wbnorm,method="euclidean")
下一步是使用Ward方法進行聚類缝左。hclust()函數(shù)對一組不同的n個對象進行聚類分析。第一階段浓若,每個對象被指派給它自己的簇渺杉。之后每個階段,算法迭代聚合兩個最相似的簇挪钓。這個過程不斷持續(xù)直到只剩一個簇是越。hclust()函數(shù)要求我們以距離矩陣的形式提供數(shù)據(jù)。dist1數(shù)據(jù)框被作為輸入傳入碌上。默認使用全鏈接算法倚评。此外還可以使用不同的聚集方法,包括ward.D绍赛、ward.D2蔓纠、single、complete和average吗蚌。
cluster1 <- hclust(dist1,method = "ward.D")
cluster1
輸入clust1命令可顯示所使用的聚集方法腿倚,計算距離的方法,以及數(shù)據(jù)對象的數(shù)量蚯妇。結果如下:
第5步:繪制模型
plot()函數(shù)是一個通用的繪制R語言對象的函數(shù)敷燎。這里plot()函數(shù)用來繪制系統(tǒng)樹圖:
plot(cluster1, labels= wbclust$Country,cex=0.7,
xlab="",ylab="Distance", main="Clustering for 80 Most Populous Countries")
結果如下:
rect.hclust()函數(shù)強調不同的簇,并在系統(tǒng)樹圖的枝干處繪制長方形箩言。系統(tǒng)樹圖首先在某個等級上被剪切硬贯,之后在選定的枝干上繪制長方形。
clust1對象以及需要形成的簇的數(shù)量作為輸入變量傳入函數(shù)陨收。
rect.hclust(cluster1,k=5)
結果如下:
rect.hclust(cluster1,k=12)
cuts()函數(shù)基于期望的簇數(shù)量或者切割高度將樹中的元素切割到不同的簇中饭豹。這里鸵赖,clust1對象以及需要形成的簇的數(shù)量作為輸入變量傳入函數(shù)。
cuts = cutree(cluster1,k=5)
cuts
結果如下:
得到每個簇的國家列表:
for (i in 1:5){
print(paste("Countries in Cluster ",i))
print(wbclust$Country[cuts==i])
print(" ")
}
結果如下: