본문 바로가기
R

26. 정형 데이터마이닝 - 군집분석(Clustering)

by #Glacier 2018. 11. 21.
반응형

안녕하세요. 이번 시간에는 군집분석 (Clustering) 에 대해서 알아보도록 하겠습니다.


군집분석은 분류예측과 같이 타겟 값은 없는 데이터에서,

데이터 특성에 따라 집단을 분리하는 방식으로 거리를 측정하여 집단의 이질성과 동질성을 평가하여 그룹화한다.

이질성으로 거리를 산출하고, 동질성으로 묶음으로서 집단을 구분하고, 

집단을 구분하는데 사용된 변수들의 집단 간 차이를 통해 profiling 하여 데이터에 대한 구조적인 특성을 파악한다. 

이런 방식을 데이터에 대해 이해하지 못하는 상태에서 시도를 하면 전체적인 데이터가 어떻게 구성되어 있는지 쉽게 파악할 수 있다.


1.정의


# 관찰 대상에 대해 수집된 정보를 이용해 유사한 특성을 가진 그룹으로 나누어 집단의 특성을 도출하는 기법


2. 분석 목적


-각 집단의 프로파일링, 집단 간 차이분석, 특이집단 포착(Fraud), 군집의 결과를 분류분석의 입력 변수로 투입.


3. 활용 분야


- 유통사의 경우 수많은 점포를 군집으로 나누어 군집별 전략 수립 활용

- 고객세분화 (시장세분화-마케팅전략)


4. 관측 대상 간 거리 정의

# 정말 수식 쓰는 데에는 네이버 수식은 정말로 불편하군요 ㅠㅠ.. 한글이 훨씬 낫네요..




# 이렇게 다양한 거리를 측정하는 방식이 있습니다. 거리를 측정하는 방식에 따라 결과가 달라질 수도 있겠죠.

  하지만 책에서는 관측 대상 간의 근본적인 상대적 거리는 별 차이가 없기 때문에 거리측정 방식 자체에 

  지나치게 비중을 둘 필요는 없다고 제시하고 있네요~


5. R을 이용한 거리 계산


x1<-c(1, 2)

x2<-c(1, 3)

x3<-c(3, 6)

x4<-c(4, 7)

x5<-c(1, 5)

x<-t(data.frame(x1, x2, x3, x4, x5))



# 유클리딘

euc_dist<-dist(x, method="euclidean")
euc_dist
         x1       x2       x3       x4
x2 1.000000                           
x3 4.472136 3.605551                  
x4 5.830952 5.000000 1.414214         
x5 3.000000 2.000000 2.236068 3.605551


# 체비셰프

(che_dist<-dist(x, method="maximum")) # chebyshew


   x1 x2 x3 x4
x2  1         
x3  4  3      
x4  5  4  1   
x5  3  2  2  3


# 맨하탄

(man_dist<-dist(x, method="manhattan"))


   x1 x2 x3 x4
x2  1         
x3  6  5      
x4  8  7  2   
x5  3  2  3  5


# 캔버라

(can_dist<-dist(x, method="canberra"))


          x1        x2        x3        x4
x2 0.2000000                              
x3 1.0000000 0.8333333                    
x4 1.1555556 1.0000000 0.2197802          
x5 0.4285714 0.2500000 0.5909091 0.7666667


# 민코우스키

(min_dist<-dist(x, method="minkowski"))


x2 1.000000                           
x3 4.472136 3.605551                  
x4 5.830952 5.000000 1.414214         
x5 3.000000 2.000000 2.236068 3.605551


# 이렇게 다양한 방식으로 관측 대상 간 거리를 측정해볼 수 있었습니다. 다음은, 계층적 군집분석으로 군집 간 거리를 측정합니다.


6. 계층적 군집분석(hierarchical clustering)


(1) 군집화 순서에 따른 분류

 - 병합 방법 : 가까운 관측치끼리 묶어 가는 방법, 주로 쓰임

 - 분할 방법 : 먼 관측치를 나누어 가는 방법


(2) dendrogram : 군집결과를 나무구조로 나타내 군집 간의 구조관계를 알 수 있도록 한 그래프


(3) 군집 간 거리 측정 방법에 따른 분류

 1) 최단연결법(single linkage method) : 두 집단 간 관측치들의 거리의 최솟값을 군집 간의 거리로 정의

 2) 최장연결법(complete linkage method) : 두 집단 간 관측치들의 거리의 최댓값을 군집 간의 거리로 정의

 3) 평균연결법(average linkage method) : 두 집단 간 관측치들의 거리의 평균을 군집 간의 거리로 정의

 4) 중앙값연결법(median linkage method) : 두 집단 관측치들의 중앙값의 거리를 군집 간의 거리로 정의

 5) 중심 연결법(centroid linkage method)
 6) 와드 연결법(ward's linkage method)


7. R을 통한 계층적 군집화

# 여기서 hclust함수는 계층적 군집화를 사용할 때 쓰는 함수입니다.

# 유클리딘 거리를 제곱한 데이터를 가지고 , 최단연결법을 한 결과.


sin_den <- hclust (euc_dist^2, method ="single")

plot(sin_den, main="Cluster Dendrogram - single")




# 유클리딘 거리를 제곱한 데이터를 가지고 , 최장연결법을 한 결과.

com_den <- hclust (euc_dist^2, method ="complete")
plot(com_den, main="Cluster Dendrogram - complete")




# 유클리딘 거리를 제곱한 데이터를 가지고 , 평균연결법을 한 결과.

avg_den <- hclust (euc_dist^2, method= "average")

plot(avg_den, main="Cluster Dendrogram - average")




# 유클리딘 거리를 제곱한 데이터를 가지고 , 중앙값연결법을 한 결과.

med_den <- hclust(euc_dist^2, method="median")

plot(med_den, main = "Cluster Dendrogram - median")



# 유클리딘 거리를 제곱한 데이터를 가지고 , 중심연결법을 한 결과.

cen_den <- hclust(euc_dist^2, method="centroid")
plot(cen_den, main="Cluster Dendrogram - centroid")




# 유클리딘 거리를 제곱한 데이터를 가지고 , 와드연결법을 한 결과.

# 본래는 method="ward"로 책에는 나와있는데, ward라는 이름이 ward.D로 rename되었다고 뜨는군요~


war_den <- hclust(euc_dist^2, method="ward.D")
plot(war_den, main="Cluster Dendrogram - ward.D")



# 이렇게 계층적 군집방법을 한 번씩 해보았는데요~

# 이번에는 비계층적 군집방법(non-hierarchical clustering)을 알아보겠습니다.


8. 비계층적 군집화(non-hierarchical clustering)


(1) 비계층적 군집방법은 정해진 개수로 군집을 나누는데, 정해진 기준에 따라 더 이상 개선이 되지 않을 때 까지 군집화를 진행합니다.

    군집화 과정에서 관측치가 하나의 그룹에서 다른 그룹으로 이동되기도 한다. 대표적인 예로서 k-means 군집화가 있다.


(2) k-means 군집화 algorithm 설명

   n개의 관측치에 대해 k개의 군집으로 나눈 경우,

  1) 임의로 k의 중심을 정해 각 관측치를 가장 가까운 중심에 묶어 첫 번째 군집을 만듦

  2) 각 군집에 대해 군집 내 관측치의 거리를 계산하여 새로운 중심점을 구함

  3) 새로 정한 중심점에 대해 각 관측치를 가까운 중심점으로 다시 묶어 군집을 재정의

  4) 재정의된 군집이 이전 군집과 일치할 때까지 2)와 3)을 반복.


(3) 비계층적 군집방법의 종류

  1) k-meansclustering (Centroid-based clustering)

  2) Expectation-Maximization (EM) clustering (Distribution-based clustering)

  3) Density-based clustering

  4) Fuzzy clustering : numeric variable만 가능, NA가 허용, 관측치 개수/2개 까지 군집화 가능.


9. R을 이용한 비계층적 군집화


 (1) k-means

# HDclassif는 wine데이터 사용을 위함

install.packages("HDclassif")

library(HDclassif)

data(wine)


#kmeans()함수를 사용하고, data는 wine을 사용한다. 다만 첫 번째 column 'class'는 clustering에서 제외. 군집의 개수는 3으로 시도.


(k_wine<-kmeans(wine[,-c(1)],3))


K-means clustering with 3 clusters of sizes 47, 62, 69

Cluster means:
        V1       V2       V3       V4        V5       V6       V7        V8
1 13.80447 1.883404 2.426170 17.02340 105.51064 2.867234 3.014255 0.2853191
2 12.92984 2.504032 2.408065 19.89032 103.59677 2.111129 1.584032 0.3883871
3 12.51667 2.494203 2.288551 20.82319  92.34783 2.070725 1.758406 0.3901449
        V9      V10       V11      V12       V13
1 1.910426 5.702553 1.0782979 3.114043 1195.1489
2 1.503387 5.650323 0.8839677 2.365484  728.3387
3 1.451884 4.086957 0.9411594 2.490725  458.2319

Clustering vector:
  [1] 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 2 2 1 1 2 1 1 1 1 1 1 2 2
 [38] 1 1 2 2 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 3 2 3 3 2 3 3 2 2 2 3 3 1
 [75] 2 3 3 3 2 3 3 2 2 3 3 3 3 3 2 2 3 3 3 3 3 2 2 3 2 3 2 3 3 3 2 3 3 3 3 2 3
[112] 3 2 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 2 3 3 2 2 2 2 3 3 3 2 2 3 3 2 2 3 2
[149] 2 3 3 3 3 2 2 2 3 2 2 2 3 2 3 2 2 3 2 2 2 2 3 3 2 2 2 2 2 3

Within cluster sum of squares by cluster:
[1] 1360950.5  566572.5  443166.7
 (between_SS / total_SS =  86.5 %)

Available components:

[1] "cluster"      "centers"      "totss"        "withinss"     "tot.withinss"
[6] "betweenss"    "size"         "iter"         "ifault"      


# 위처럼 하면 결과까지 동시에 출력되지만 양이 많은 경우 일부가 생략된다. 따라서 되도록 결과를 k_wine에 저장하고, 필요한 것을 골라서 출력하는 것이 좋다.

# K-means clustering with 3 clusters of sizes 47, 62, 69 이렇게 3가지로 몇 개가 할당되었는지 알 수 있습니다.

# 다만 한 곳으로 너무 치우치거나 너무 작은 개수가 할당된 경우는 극단값이 하나의 집단으로 분류되었거나 잘못 처리된 경우일 수 있으니 유의해야 합니다


Cluster means:
         V1         V2         V3         V4          V5         V6         V7          V8
1 13.80447 1.883404 2.426170 17.02340 105.51064 2.867234 3.014255 0.2853191
2 12.92984 2.504032 2.408065 19.89032 103.59677 2.111129 1.584032 0.3883871
3 12.51667 2.494203 2.288551 20.82319  92.34783 2.070725 1.758406 0.3901449
        V9        V10         V11        V12         V13
1 1.910426 5.702553 1.0782979 3.114043 1195.1489
2 1.503387 5.650323 0.8839677 2.365484  728.3387
3 1.451884 4.086957 0.9411594 2.490725  458.2319


# 각 클러스터 별로 투입된 변수들의 평균값이 어떻게 차이가 나는지 보여주는 내용으로 다른 클러스터에 비해 값이 차이가 큰 변수를 기준으로 해당 클러스터의

# 특성을 판단합니다. 예를 들어 1 번째 클러스터는 V1이 크고, V2가 작다고 프로파일링이 되며 V3은 집단 간에 차이가 거의 없으므로 설명하는데 사용하지 않는다.

# 그리고 상대적으로 값이 크게 차이가 나는 변수 중심으로 설명하면 된다.


table(k_wine$cluster, wine$class)
   
     1  2  3
  1 46  1  0
  2 13 20 29
  3  0 50 19


#위의 내용은 클러스터링 내용과 타겟값을 비교해서 클러스터링이 얼마나 내재되어 있는 특성을 잘 구분해주었는지를 보여주는 내용으로서 일반적으로 클러스터링을

# 할 때 사용하는 내용은 아니며 이해를 돕기 위해 표시된 내용이다.


#도출된 cluster에 대해, 변수 중 V1과 V13만을 이용하여 시각화 *표는 각 군집의 center이다.


# wine data의 V1, V13 열만을 고르고, 색깔은 kmeans를 통한 군집별로 색깔을 입히며 , 별표는 center를 나타냅니다.


plot(wine[, c("V1", "V13")] , col=k_wine$cluster)

points(k_wine$centers[, c("V1","V13")], col=1:3 , pch=8, cex=2)



# 이렇게 wine 내의 V1, V13의 데이터를 가지고  군집별로 나누어서 plot을 찍어보면 이렇게 나타납니다.

# 이번에는 scale함수를 사용해서, 변수 간의 척도를 표준화시키고 군집화해보겠습니다.


wine_s<-scale(wine[, -c(1)])

(k_wine_s<-kmeans(wine_s, 3))


K-means clustering with 3 clusters of sizes 65, 51, 62

Cluster means:
          V1         V2         V3         V4          V5          V6
1 -0.9234669 -0.3929331 -0.4931257  0.1701220 -0.49032869 -0.07576891
2  0.1644436  0.8690954  0.1863726  0.5228924 -0.07526047 -0.97657548
3  0.8328826 -0.3029551  0.3636801 -0.6084749  0.57596208  0.88274724
           V7          V8          V9        V10        V11        V12
1  0.02075402 -0.03343924  0.05810161 -0.8993770  0.4605046  0.2700025
2 -1.21182921  0.72402116 -0.77751312  0.9388902 -1.1615122 -1.2887761
3  0.97506900 -0.56050853  0.57865427  0.1705823  0.4726504  0.7770551
         V13
1 -0.7517257
2 -0.4059428
3  1.1220202


plot(wine_s[,c("V1","V13")], col=k_wine_s$cluster)

points(k_wine_s$centers[, c("V1", "V13")], col=1:3, pch=8, cex=2)



# 이렇게 결과가 나왔는데 위에 scaling하지 않은 것이 더 보기는 좋죠? 하지만 스케일링을 하는 것이 좋습니다.

(2) pam


- robust한 k-means, missing data 허용, profiling시 중앙값을 이용하기 때문에 실제 observation으로 표현해주는 장점이 있으나 

  대용량 데이터에 대해서는 처리시간이 급상승하는 단점이 있다.


install.packages("cluster")
library(cluster)


#scale 전 clustering


(pam_wine <- pam(wine[, -c(1)], 3))


Medoids:
      ID    V1   V2   V3   V4 V5   V6   V7   V8   V9  V10  V11  V12  V13
[1,]  51 13.05 1.73 2.04 12.4 92 2.72 3.27 0.17 2.91 7.20 1.12 2.91 1150
[2,] 136 12.60 2.46 2.20 18.5 94 1.62 0.66 0.63 0.94 7.10 0.73 1.58  695
[3,]  73 13.49 1.66 2.24 24.0 87 1.88 1.84 0.27 1.03 3.74 0.98 2.78  472
Clustering vector:
  [1] 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 1 1 2 2 1 1 2 1 1 1 1 1 1 2 2
 [38] 1 1 2 2 1 1 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 3 2 3 3 2 3 3 2 2 2 3 3 1
 [75] 2 3 3 3 2 3 3 2 2 3 3 3 3 3 2 2 3 3 3 3 3 1 2 3 2 3 2 3 3 3 2 3 3 3 3 2 3
[112] 3 2 3 3 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 2 3 3 2 2 2 2 3 3 2 2 2 3 3 2 2 3 2
[149] 2 3 3 3 3 2 2 2 3 2 2 2 3 2 3 2 2 3 2 2 2 2 3 3 2 2 2 2 2 3
Objective function:
   build     swap 
92.11316 91.99938

Available components:
 [1] "medoids"    "id.med"     "clustering" "objective"  "isolation" 
 [6] "clusinfo"   "silinfo"    "diss"       "call"       "data"    


table(pam_wine$cluster, wine$class)


     1  2  3
  1 46  2  0
  2 13 19 30
  3  0 50 18


plot(wine[, c("V1", "V13")], col=pam_wine$cluster)

point(pam_wine$medoids[, c("V1", "V13")], col=1:3, pch=8, cex=2)



# scale 후 clustering

# data를 보시면 scaling 한 데이터입니다(wine_s) 위에서 K-means할 때 했던 데이터입니다. 착오없으시길!!


pam_wine_s<-pam(wine_s, 3)

table(pam_wine_s$cluster, wine$class)


   1  2  3
  1 59 15  0
  2  0 55  0
  3  0  1 48


plot(wine_s[, c("V1", "V13")], col=pam_wine_s$cluster)

points(pam_wine_s$medoids[, c("V1", "V13")], col=1:3, pch=8, cex=2)


 


# 요렇게 k-means와 pam 두 방식을 해봤습니다. 시각화 결과 조금 씩은 다르긴 하죠~


  (3) Density-based Clustering


​-density-based clustering은 observation끼리 뭉쳐 있는 것을 하나의 cluster로 정의한다. 아래와 같이 옵션으로 eps와 MinPts를 지정하는데, 특정 지점으로부터 반경이 eps내에 MinPts 수만큼의 observation이 있다면 이들은 모두 하나의 cluster에 속하게 된다. 따라서 한 cluster에 속하는 집단이 원을 이룬다거나, 직사각형을 이루는 등의 특정 모형을 가지지 않고, 다양한 모양을 할 수 있는 특징이 있다.


install.packages("fpc")

library(fpc)


#아래에선 dbscan으로, eps=2.6 MinPts=10으로 지정해주고, scaling도 하라는 명령어입니다.

#eps는 거리라고 생각하시면 됩니다~~


(den_wine_s <- dbscan(wine_s, eps=2.6, MinPts=10, scale=TRUE))


dbscan Pts=178 MinPts=10 eps=2.6
           0   1  2
border 26  31 23
seed    0  74 24
total   26 105 47


table(den_wine_s$cluster, wine$class)


     1  2  3
  0  1 23  2
  1 58 46  1
  2  0  2 45



(den_wine_s1 <- dbscan(wine_s, eps=2.5, MinPts=8, scale=TRUE))


dbscan Pts=178 MinPts=8 eps=2.5
        0   1  2
border 28  28 20
seed    0  76 26
total  28 104 46


table(den_wine_s1$cluster, wine$class)


     1  2  3
  0  2 24  2
  1 57 46  1
  2  0  1 45


str(den_wine_s1)


List of 4
 $ cluster: num [1:178] 1 1 1 1 1 1 1 1 1 1 ...
 $ eps    : num 2.5
 $ MinPts : num 8
 $ isseed : logi [1:178] TRUE FALSE FALSE FALSE FALSE TRUE ...
 - attr(*, "class")= chr "dbscan"


plot(den_wine_s, wine_s[, c("V1", "V13")])



# 이런식으로 뜨는군요. 색깔이 조금 보기 안좋네요;; 시각화를 잘못한 예로 보면 될...듯...(ㅠㅠ)


  (4) Fuzzy Clustering

​fuzzy clustering은 특정 cluster에 속할 확률을 계산한다. k-means가 명확하게 cluster를 나누는 반면 fuzzy cluster는 각 cluster에 속할 확률이 계산됨.

그리고 하나의 observation이 각 cluster에 속할 확률을 합하면 1이 된다. numeric variable만 가능, NA 허용, observation 수/2개 까지 cluster 생성 가능


set.seed(2014)
f1 <- cbind(rnorm(10, -5, 0.5), rnorm(10, -5, 0.5))

f2<- cbind(rnorm(10, 5, 0.5), rnorm(10, 5, 0.5))

f3<-  cbind(rnorm(5, 0.5*1.67, 0.5), rnorm(5, 0.5*1.67, 0.5))

f<- rbind(f1, f2, f3)


(fuz_f_2 <- fanny(f, 2))


Fuzzy Clustering object of class 'fanny' :                      
m.ship.expon.        2
objective     22.17072
tolerance        1e-15
iterations          14
converged            1
maxit              500
n                   25
Membership coefficients (in %, rounded):
      [,1] [,2]
 [1,]   98    2
 [2,]   96    4
 [3,]   96    4
 [4,]   97    3
 [5,]   98    2
 [6,]   98    2
 [7,]   96    4
 [8,]   98    2
 [9,]   98    2
[10,]   98    2
[11,]    5   95
[12,]    3   97
[13,]    3   97
[14,]    5   95
[15,]    4   96
[16,]   10   90
[17,]    3   97
[18,]    5   95
[19,]    6   94
[20,]    3   97
[21,]   40   60
[22,]   32   68
[23,]   35   65
[24,]   43   57
[25,]   48   52
Fuzzyness coefficients:
dunn_coeff normalized 
 0.8489205  0.6978409 
Closest hard clustering:
 [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

Available components:
 [1] "membership"  "coeff"       "memb.exp"    "clustering"  "k.crisp"    
 [6] "objective"   "convergence" "diss"        "call"        "silinfo"    
[11] "data"       


#

(fuz_f_3 <- fanny(f, 3))


Fuzzy Clustering object of class 'fanny' :                      
m.ship.expon.        2
objective     9.470866
tolerance        1e-15
iterations          10
converged            1
maxit              500
n                   25
Membership coefficients (in %, rounded):
      [,1] [,2] [,3]
 [1,]   95    2    3
 [2,]   91    3    6
 [3,]   93    3    5
 [4,]   94    2    4
 [5,]   96    1    2
 [6,]   95    2    4
 [7,]   90    3    6
 [8,]   97    1    2
 [9,]   97    1    2
[10,]   97    1    2
[11,]    4   86   10
[12,]    1   95    3
[13,]    2   93    5
[14,]    4   84   11
[15,]    2   93    5
[16,]    7   78   15
[17,]    1   95    3
[18,]    3   89    8
[19,]    4   87    9
[20,]    2   94    5
[21,]    5    6   89
[22,]    7   12   81
[23,]    4    5   91
[24,]    5    5   90
[25,]   13   13   74
Fuzzyness coefficients:
dunn_coeff normalized 
 0.8304814  0.7457221 
Closest hard clustering:
 [1] 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3

Available components:
 [1] "membership"  "coeff"       "memb.exp"    "clustering"  "k.crisp"    
 [6] "objective"   "convergence" "diss"        "call"        "silinfo"    
[11] "data"  


plot(fuz_f_2)



# 이렇게 x개를 k개의 군집으로 나눈 결과를 보여줍니다.


​10. R의 k-meas clustering에서 적정한 cluster 수 찾기.


​cluster 개수별로 k-means clustering을 한 결과 도출된 tot.withinss는 그룹 내 거리의 분산을 합한 것으로 얼마나 동질적인지 보여준다.

따라서 동질적인 cluster를 더 나눈다고 tot.withinss는 크게 낮아지지 않는다. 이를 이용해 tot.withinss가 급격히 낮아지는 한계를 적절한 cluster개수로

판단하는 것이 적합하다.


wss<-0

for (i in 1:15) wss[i] <- kmeans(wine_s, centers=i)$tot.withinss

plot(1:15, wss, type ="b", xlab="Number of Cluster", ylab="Within group sum of squares")


#위의 함수를 설명하면, 반복문입니다. i는 1부터 15까지의 숫자를 가지고 있으며, wine_s데이터의 centers가 1부터 15일 때의 kmeans의 분산합을 wss에 

 다 저장하게 됩니다. 그럼 1~15까지의 분산합이 다 쏙쏙 들어와있겠죠. 그럼 그것을 보기쉽게 plot으로 시각화합니다.

 x축명은 군집개수, y축명은 분산합이고, x축은 1~15까지, 세로축은 wss입니다.




# 짜잔. 이렇게 나왔네요. SPSS에서는 버튼 한두개만 누르면 되는걸 가지고 R은 참 어렵죠잉..ㅎㅎ

# 이렇게 보아하니 분산합이 크게 차이가 안나는 시점에서 고려하여보면, 군집 개수는 3개 정도가 적당할 것 같습니다.

  위의 fuzzy_f_3 데이터를 보아도 알 수 있듯이 3가지로 나누었을 때 확률이 다 높은 것을 알 수 있죠.



#와.. 이렇게 오늘 군집분석 포스팅을 마쳤습니다. 3시간걸렸네요..;; 오늘 R코드는 꽤나 길기 때문에

 오늘 R코드들은 Rdata파일로 올려놓겠습니다.

Clustering+R+Code.R



다음시간에는 연관성분석(Association Analysis)을 알아보도록 할게요.



반응형