portfolio

[ R ] R과 python을 활용한 데이터 분석 시각화 #4

yul_S2 2022. 12. 31. 12:31
반응형

 [ 군집분석 / 시각화 ] 

 아래의 조건을 고려하여 군집분석을 실행하시오.
(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의 차이가 존재한다고 볼 수 있다. 그 지점 외에 군집된 모양이 거의 유사한 것으로 보아 거리 계산이 달라져도 군집 결과는 항상 비슷하게 나타난다고 할 수 있다.

반응형