[ R ] R과 python을 활용한 데이터 분석 시각화 #4
[ 군집분석 / 시각화 ]
아래의 조건을 고려하여 군집분석을 실행하시오.
(1) 데이터: ggplot2 패키지 내 diamonds 데이터
(2) philentropy::distance() 함수 내 다양한 거리 계산 방법 중 Euclidian거리를 제외한 3개를 이용하여 거리 계산 및 사용된 거리에 대한 설명
(3) 탐색적 목적의 계층적 군집분석 실행
(4) 군집수 결정 및 결정 사유 설명
(5) k-means clustering 실행
(6) 시각화
(7) 거리 계산 방법에 따른 결과 차이 비교
- 맨해튼 거리, 민코프스키 거리, 코사인 거리를 선택하여 거리 계산을 진행
- 민코프스키 거리의 p 값이 1 이면 맨해튼 거리와 동일하고, p 값이 2 면 유클리드 거리와 동일하기 때문에 p 값을 3 으로 지정하여 계산을 진행.
- 각 거리에 대한 덴드로그램 자료와 엘보우 방법을 통해 얻은 자료가 3 정도로 나누었을 때 적절하다고 판단하여 군집의 수를 3 가지로 정해 k-means clustering 을 실행
- caratprice 의 상관관계가 가장 크고, 나머지는 유의미한 상관관계를 갖지 않았기 때문에 두 변수만을 가지고 시각화
rm(list=ls()) # clear all
#1 데이터: ggplot2 패키지 내 diamonds 데이터
library(ggplot2) library(cluster) data("diamonds") str(diamonds) data <- as.data.frame(diamonds) data <- data[-c(2:4,8:10)] head(data) |
carat depth table price 1 0.23 61.5 55 326 2 0.21 59.8 61 326 3 0.23 56.9 65 327 4 0.29 62.4 58 334 5 0.31 63.3 58 335 6 0.24 62.8 57 336 |
#2 philentropy::distance() 함수 내 다양한 거리 계산 방법 중 Euclidian거리를 제외한 3개를 이용하여 거리 계산 및 사용된 거리에 대한 설명
library(philentropy) |
#2-1) 맨하튼 거리
philentropy::distance(data[1:5,],method="manhattan") |
- 맨하튼 거리는 두 지점의 차이에 절대값을 씌운다.
- 단위 사각형이 있는 도시의 한 지점에서 다른 지점으로 이동하는 거리와 같다.
- 이름순 5개
#2-2) 민코프스키
philentropy::distance(data[1:5,],method="minkowski",p=3) |
- 민코프스키 거리는 m차원 공간에서의 거리이다.
- m=1일 때 맨하탄 거리와 같고, m=2일 때 유클리드 거리와 같다.
- m은 반드시 1보다 커야한다.
- 이름순 5개
#2-3) 코사인 거리
1-philentropy::distance(data[1:5,],method="cosine") library(proxy) dist(data[1:5,],method="cosine") |
- 코사인 거리는 두 벡터 내적을 각 벡터의 크기로 나눈 값을 1에서 뺀 것이다.
- 두 벡터의 사이각이 0에 가까울수록 두 벡터의 거리가 가깝다고 판단할 수 있다.
- 이름순 5개
#3 탐색적 목적의 계층적 군집분석 실행
sam <- sample(1:nrow(diamonds), 1000) test <- data[sam,] |
- 1000개 샘플링
#3-1) 맨하튼 거리계산 & 군집분석 & 시각화
dist1 <- philentropy::distance(test,method="manhattan") # 거리 계산 hc1 <- hclust(daisy(dist1,metric="gower")) # 군집 분석 plot(hc1,hang=-1) # 시각화 |
#3-2) 민코프스키 거리계산 & 군집분석 & 시각화
dist2 <- philentropy::distance(test,method="minkowski",p=3) # 거리 계산 hc2 <- hclust(daisy(dist2,metric="gower")) # 군집 분석 plot(hc2,hang=-1) # 시각화 |
#3-3) 코사인 거리계산 & 군집분석 & 시각화
dist3 <- 1-philentropy::distance(test,method="cosine") # 거리 계산 hc3 <- hclust(daisy(dist3,metric="gower")) # 군집 분석 plot(hc3,hang=-1) # 시각화 |
#4 군집수 결정 및 결정 사유 설명
tot <- c() for(i in 1:10){ set.seed(1004) kcluster <- kmeans(test,centers=i,iter.max=1000) tot[i] <- kcluster$tot.withinss } plot(c(1:10),tot,type="b", main="Optimal number of clusters", Xlab="Number of clusters", ylab="Total within-cluster sum of squares") |
- Elbow Method
- 각 거리를 시각화하여 얻은 덴드로그램과 엘보우 방법을 통해 얻은 그래프를 확인한 결과 3개의 군집으로 나누는 것이 적절하다고 보았다.
#5 k-means clustering 실행
kresult <- kmeans(test,3) kresult str(kresult) |
#6 시각화
#6-1) 상관관계 확인
cor(test) |
# carat depth table price # carat 1.00000000 0.01499319 0.1941535 0.92443889 # depth 0.01499319 1.00000000 -0.2866365 -0.01023173 # table 0.19415349 -0.28663650 1.0000000 0.14373156 # price 0.92443889 -0.01023173 0.1437316 1.00000000 |
- carat-price의 상관관계만 크다. 나머지는 10~20%
#6-2) [carat - price] k-means그래프 시각화
plot(test,col=kresult$cluster) |
#6-3) [carat - price] 그래프
plot(test[c("carat","price")],col=kresult$cluster) points(kresult$centers[,c("carat", "price")],col=c(2,3,1),pch=8,cex=2) |
#7 거리 계산 방법에 따른 결과 차이 비교
#7-1) 맨하튼
plot(hc1,hang=-1) rect.hclust(hc1,k=3,border=c(2:4)) |
#7-2) 민코프스키
plot(hc2,hang=-1) rect.hclust(hc2,k=3,border=c(2:4)) |
#7-3) 코사인
plot(hc3,hang=-1) rect.hclust(hc3,k=3,border=c(2:4)) |
[ 결론 ]
맨하튼과 민코프스키는 거의 동일한 그래프를 그려냈고, 코사인은 height과 나머지와 조금 다르다는 것을 확인할 수 있다. 여기서 height는 군집 간 거리를 뜻하는데, 거리 계산 방식에서 각도를 사용하는 계산이다보니 다른 두 개의 일반적인 연산 결과와 height의 차이가 존재한다고 볼 수 있다. 그 지점 외에 군집된 모양이 거의 유사한 것으로 보아 거리 계산이 달라져도 군집 결과는 항상 비슷하게 나타난다고 할 수 있다.