728x90

군집분석(k-means) in R

 

k-means 는 비지도 학습에 포함되는 군집분석중 하나입니다.

여러 특성들을 거리로 비교해서 비슷한 특성을 가진 값들끼리 묶어주는 방법입니다.

하지만 몇개의 군집으로 나눠줄지는 사용자가 정해주어야 합니다.

 

r에서 기본으로 제공하는 iris데이터로 군집분석을 해보겠습니다.

 

#k-means 군집분석 (data=iris)

library(caret)
data <- iris
set.seed(123)

 

#표준화
scaled.data <- scale(data[,-5])
summary(training.data)
head(scaled.data,5)

 

#k-means의 사전 군집수를 3개로 지해서 시행
set.seed(0723)#난수설
result <- kmeans(scaled.data,3)

 

#k-means clustering 결과 확인
result$centers #각 군집의중시점 확인

#교차표로 확인
table(data$Species, result$cluster, dnn=c("class","clustering"))

 

#k - means clustering 시각화
plot(scaled.data[,1:2], col=result$cluster)
points(result$centers[,1:2],pch=8,co=1:3, cex=2)

 

#silhouette : k-means cluster이 잘되었는지 판단, 1에 가까울수록 잘된
library(cluster)
plot(silhouette(result$cluster, dist = dist(data[,-5])), col = 1:3)

 

#사전 군집수 3개가 정당한지 알기위해 2~6개까지 조정하면서 k-means clustering을 시행하고
#군집수에 따른 SSE를 시각화

#여러번 k-means 해서 확인
visual <- NULL
for (i in 2:6){
  set.seed(0723)
  eval(parse(text=paste("result",i,"<-kmeans(scaled.data,",i,");",sep="")))
  eval(parse(text=paste("visual[",i,"] <- result",i,"$tot.withinss",sep="")))
}
plot(visual[-1], type="l"  ,ylab = "", xlab = "",
     main = "cluster의 개수에 따른 클러스터 내부분산", )
abline(v=3,col="red") #군집수가 3에서 SSE감소폭이 줄어들고잇음


 

 

+ Recent posts