열렬히.뛰기

군집분석 : 코드

수학 & 통계 > 다변량분석 > 다변량분석 : 코드 > 군집분석 : 코드

계보적 군집분석

hierarchical clustering

r
# 계보적 군집분석 ----
d1.dist = dist(scale(d1[, -1]))
d1.hi = hclust(d1.dist)
## 시각화
plot(d1.hi, labels = d1$country)
rect.hclust(d1.hi, k=5, border='red')

여기서 조금 더 나아가 보면…

r
# 클러스터링된 데이터를 포함한 새로운 데이터 프레임
d2 = data.frame(country = d1$country, d1[,-1], cluster = cutree(d1.hi, k=5))
d2
table(d2$cluster)

# d3 = 각 클러스터별로 변수들의 평균값을 계산한 요약 통계치를 포함
d3 = aggregate(. ~ cluster, d2[,-1], mean)
d3

이것저것 시각화하기.

r
# 평균을 군집별로 묶고 시각화
colcol = c('white', 'yellow', 'green', 'cyan', 'black', 'grey')
kkk = 5
vv = names(d3)[-1]
tmp = barplot(as.numeric((as.matrix(d3[,-1]))), col=colcol[1:kkk])
text(matrix(tmp, kkk)[1, ], rep(-2, length(vv)), vv, xpd=T, cex=.5)
text(tmp, rep(-4, length(tmp)), rep(c(' ', 2:kkk), length(vv)), xpd=T, cex=.5)

k-means 클러스터링

r
set.seed(4)
library(cluster)
d1.k = kmeans(scale(d1[,-1]), centers=5)
d4 = data.frame(d1, cluster = d1.k$cluster)
d4

시각화도 할 수 있음

r
par(mfcol = c(1,2))
clusplot(scale(d1[,-1]), d1.k$cluster)
tmp = princomp(scale(d1[, -1]))
plot(tmp$scores[, 1], tmp$scores[, 2], type='n')
text(tmp$scores[, 1], tmp$scores[, 2], d1.k$cluster)

PAM 클러스터링

r
par(mfcol=c(1,2))
d1.p = pam(scale(d1[,-1]), 5)
plot(d1.p)

군집 갯수 선정하기

r
## factoextra로 시각화
library(factoextra)
fviz_nbclust(scale(d1[,-1]), kmeans)
fviz_nbclust(scale(d1[,-1]), pam)

## nbclust로 시각화
install.packages('NbClust')
library(NbClust)
NbClust(scale(d1[,-1]), method = 'kmeans')
tmp = NbClust(scale(d1[,-1]), method = 'kmeans', index = 'ccc')
plot(names(tmp$All.index), tmp$All.index, type='b')

모형 기반 클러스터링

가우시안 혼합 모형 기반으로 클러스터링을 시행

r
library(mclust)
result = Mclust(scale(d1[, -1]))
summary(result)
plot(result) # 종료하려면 0, 아니면 1