본문 바로가기

데이터 다루기/Base of R

[R] Hierarchical clustering, K-means clustering

728x90
반응형

저희가 사용할 데이터는 german credit 데이터로, 7가지 변수를 사용하도록 하겠습니다.

#데이터 불러오기
german<-read.csv("German_credit.csv")

# age credit_amount duration_in_month installment_rate num_of_existing_credits num_of_people_liable present_residence
german_1 <- german[, c(3,6,9,12,14,17,19)]

7가지 변수를 그대로, clustering 하는 것이 아니라, 지난 포스팅에서 배운 Factor analysis를 사용해, 3개의 factor로 데이터를 요약한 후, 진행해보도록 하겠습니다.

 

# FA
fa_g <- factanal(german_1, factors=3, rotation="varimax", scores = "regression") # varimax is the default

# Clustering
german_2 <- fa_g$scores

d <- dist(german_2, method="euclidean")
# distance matrix
# method="euclidean", "maximum", "manhattan", "canberra", "binary", "minkowski"

각 변수마다 distance를 정의해야 하는데, 가장 기본적인 것이 유클리디안 거리입니다.

이외에도 맨하탄, 캔버라, 민코우스키 등 다양한 거리가 있습니다.

C1 <- hclust(d, method="ward.D2")
# method="ward.D2", "single", "complete", "average","centroid"

plot(C1) # display dendogram

계층적 클러스터링에는 여러가지 방법이 있는데, 저희는 ward 계층적 클러스터링을 선택하였습니다.

1000개의 관측치가, 계층적으로 구성됩니다.

C1_groups <- cutree(C1, k=5) # cut tree into 3 clusters
rect.hclust(C1, k=5, border="red")

5개의 그룹으로 나누었습니다.

german_3 <- cbind(german_2, C1_groups) #cluster와 원데이터 통합

#군집별 평균 구하기
german_3<-as.data.frame(german_3) #german_3가 행렬형태라 list의 조합인 데이터프레임으로 바꿔줘야함.
install.packages('dplyr')
library(dplyr)
german_3[,4]<-as.data.frame(german_3[,4])
german_3%>%group_by(C1_groups)%>%summarise(mean_Factor1=mean(Factor1),mean_Factor2=mean(Factor2),mean_Factor3=mean(Factor3)) #각 군집별 평균

# A tibble: 5 x 4
  C1_groups mean_Factor1 mean_Factor2 mean_Factor3
      <dbl>        <dbl>        <dbl>        <dbl>
1         1       -0.372       -0.127       0.930 
2         2        1.39        -0.832      -0.273 
3         3       -0.421       -1.03       -0.385 
4         4       -0.436        0.891      -0.223 
5         5        1.69         0.902       0.0180

또한 각 군집별로 평균을 구할 수 있습니다.

pairs(german_3, main="German Clustering", pch=22, bg=c("red", "yellow", "blue")[unclass(german_3$C1_groups)])

#K-means 방법- PC를 구해서, randomly select centroids, 하나씩 추가
install.packages('cluster')
library(cluster)

german_3 = german_3[,-4]
C2 <- kmeans(german_3, 5)
C2$cluster
clusplot(german_3, C2$cluster, color=TRUE, lines=0)

kmeans 함수를 통해, 5개의 클러스터를 만들었습니다.

clusplot 함수는 각 클러스터들의 PCA를 통해 만든 2개의 PC로 그려줍니다.

반응형