Hieararchical Clustering Analysis
2021. 6. 28. 14:25ㆍR 공부/비지도학습
Hieararchical Clustering Analysis을 한국어로 하면 계층적 군집 분석이라고 할수있다.
계층적 군집 분석은 : 가장 가까운 데이터 끼리 순차적(계층적)으로 묶어 나가는 군집화 기법이다.
A랑 가장 가까운 데이터는 D이다. 그럼 A와 D를 묶는다.
그럼 AD와 다른것과의 거리는 어떻게 구하는가?
AD와 C의 거리가 가깝기 때문에 ADC로 묶어주고 ADBC로 바꿔준다.
그럼 군집 개수는 어떻게 설정할것인가?
수평으로 잘라준뒤 나눠진 군집 개수로 정한다.
실습을 해보자
오늘 사용할 데이터는 USArrests 라는 데이터이다. R에 기본적으로 내장되있는 데이터이므로 그냥 사용하면 된다.
df <- USArrests
head(df)
Murder Assault UrbanPop Rape
Alabama 13.2 236 58 21.2
Alaska 10.0 263 48 44.5
Arizona 8.1 294 80 31.0
Arkansas 8.8 190 50 19.5
California 9.0 276 91 40.6
Colorado 7.9 204 78 38.7
colSums(is.na(df)) #결측치검사
Murder Assault UrbanPop Rape
0 0 0 0
summary(df) #변수별 기술통계 및 분포 확인
Murder Assault UrbanPop Rape
Min. : 0.800 Min. : 45.0 Min. :32.00 Min. : 7.30
1st Qu.: 4.075 1st Qu.:109.0 1st Qu.:54.50 1st Qu.:15.07
Median : 7.250 Median :159.0 Median :66.00 Median :20.10
Mean : 7.788 Mean :170.8 Mean :65.54 Mean :21.23
3rd Qu.:11.250 3rd Qu.:249.0 3rd Qu.:77.75 3rd Qu.:26.18
Max. :17.400 Max. :337.0 Max. :91.00 Max. :46.00
Median과 Mean의 차이가 많이 나면 극단치가 많은 것이다.
boxplot(df)
여기서 보면 Assault는 최대값과 최소값이 차이가 너무 많이난다. 그러므로 4개의 변수를 표준화 시켜준다.
library(dplyr)
df <- scale(df) %>% as.data.frame() #표준화 함수 = scale() scale함수로 표준화하고 데이터프레임으로 만들어준다
boxplot(df)
Rape변수를 보면 위에 outlier가 있다.
Rape 변수의 outlier을 제거 해준다.
library(tibble)
df.rm.outlier <- df %>%
rownames_to_column('rname') %>% #rname에 행의 이름을 넣어줌
arrange(desc('Rape')) %>% #Rape변수 내림차순으로 만들고
slice(-1:-2) %>% #첫번째 행 두번째 행을 없애줌
column_to_rownames('rname')
boxplot(df.rm.outlier)
그리고 분석을 시작해보자
df.dist <- dist(df.rm.outlier,method = "euclidean") #유사도 행렬 생성(유클리드 거리)
#군집 구성 방식
df.hclust.sing <- hclust(df.dist,method = "single")
df.hclust.cplt <- hclust(df.dist,method = "complete")
df.hclust.avg <- hclust(df.dist,method = "average")
df.hclust.cent <- hclust(df.dist,method = "centroid")
df.hclust.ward <- hclust(df.dist,method = "ward.D2")
#dendrogram 생성 & 군집 시각화
plot(df.hclust.sing, cex = 0.6, hang = -1) #dendrogram 만듬 cex= 글자의 크기, hang =줄기가 바닥에서 부터 나올수있게 해줌
rect.hclust(df.hclust.sing,k=4,border = 2:5) #군집간의 경계를 만들기위함,k = 군집개수, border 색깔은 2번부터 5번까지 넣어줘라
plot(df.hclust.cplt, cex = 0.6, hang = -1) #complete method
rect.hclust(df.hclust.cplt,k=4,border = 2:5)
plot(df.hclust.avg, cex = 0.6, hang = -1) #average method
rect.hclust(df.hclust.avg,k=4,border = 2:5)
plot(df.hclust.cent, cex = 0.6, hang = -1) #centroid method
rect.hclust(df.hclust.cent,k=4,border = 2:5)
plot(df.hclust.ward, cex = 0.6, hang = -1) #ward method
rect.hclust(df.hclust.ward,k=4,border = 2:5)
method 별로 다 군집화가 다르게 이루어진다.
정답은없지만 여러점을 고려하는 average 나 ward를 많이쓰는 편이다.
df.clusters <- cutree(df.hclust.ward,k=4) #군집번호를 뽑기위해선 cutree사용
table(df.clusters)
1 2 3 4
7 19 10 12
df.rm.outlier$cluster <- df.clusters #cluster변수 만들고 df.clusters를 거기다가 넣음
head(df.rm.outlier)
Murder Assault UrbanPop Rape cluster
Alabama 1.24256408 0.7828393 -0.5209066 -0.003416473 1
Arkansas 0.23234938 0.2308680 -1.0735927 -0.184916602 2
California 0.27826823 1.2628144 1.7589234 2.067820292 3
Colorado 0.02571456 0.3988593 0.8608085 1.864967207 3
Connecticut -1.03041900 -0.7290821 0.7917228 -1.081740768 2
Delaware -0.43347395 0.8068381 0.4462940 -0.579946294 2
2차원 시각화
library(factoextra)
fviz_cluster(list(data=df.rm.outlier[,1:ncol(df.rm.outlier)-1], cluster = df.clusters)) #2차원 시각화해줌, ncol(df.rm.outlier)-1은 cluster 변수 빼주기 위함!
군집별 평균치 확인 및 시각화
library(reshape2)
temp <- df.rm.outlier %>% melt(id = 'cluster') #melt는 cluster를 기준으로 데이터를 정렬,펼쳐졌다.
head(temp)
df.means <- dcast(temp, cluster~variable , mean)
df.means
barplot(t(df.means[,-1]),beside = TRUE,col = 1:4,names.arg = c(1:4))# cluster 변수 뺴주고 , beside 는 막대기를 옆으로 눕혀준다.
legend("topright",colnames(df.rm.outlier[1:4]),fill = 1:4,cex = 0.5)
'R 공부 > 비지도학습' 카테고리의 다른 글
k-Means Analysis (0) | 2021.06.27 |
---|---|
PCA(주성분 분석) (0) | 2021.06.26 |