군집분석(Clustering)


비계층적 군집분석

K-평균 군집분석(K-means Clustering)
  • 비계층적 군집분석의 대표적인 방법으로는 K-평균 군집분석이 있음
  • 비계층적 군집분석은 자료에 있는 각 개체를 그룹화하여 K개의 군집으로 만드는 방법임
  • 초기 군집수에 따라 결과가 많아 달라짐. 따라서 다양한 K를 넣어보아서 가장 좋은 결과를 선택함. 군집수 K는 분석 전에 설정하거나 분석과정에서 결정됨
  • 연속형 변수일때 사용이 용이함
  • 계산량이 적어 대용량 데이터도 빠르게 처리 가능함
  • 장점 : 각 개체의 군집이 명시되기 때문에 실제 상황에서 적용하기 쉬움
  • 단점 :
    • K를 임의로 정해야 함
    • 값의 범위가 다양할 경우에는 적절하지 않다
    • 적은 수의 이상치가 영향을 미침
  • 수행과정 :
    • 군집수 K개를 결정한다. 가장 서로 멀리 떨어지 ㄴK개의 개체를 초기점으로 임의 선택함
    • 주변의 객체들이 가장 가까운 초기점으로 할당되어 군집이 형성됨
    • 각 군집 내에서 새로운 중심좌표(평균)을 구함
    • 좌표의 변동이 없을 때까지 반복함


K-평균 군집분석 Ex.1

head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa
iris2 <- iris[ ,3:4]
head(iris2)
##   Petal.Length Petal.Width
## 1          1.4         0.2
## 2          1.4         0.2
## 3          1.3         0.2
## 4          1.5         0.2
## 5          1.4         0.2
## 6          1.7         0.4
# 정규화
data.scaled <- scale(iris2)
head(data.scaled)
##      Petal.Length Petal.Width
## [1,]    -1.335752   -1.311052
## [2,]    -1.335752   -1.311052
## [3,]    -1.392399   -1.311052
## [4,]    -1.279104   -1.311052
## [5,]    -1.335752   -1.311052
## [6,]    -1.165809   -1.048667
# 군집분석
data.cluster <- kmeans(data.scaled, centers=3)
data.cluster
## K-means clustering with 3 clusters of sizes 48, 50, 52
## 
## Cluster means:
##   Petal.Length Petal.Width
## 1    1.0245672   1.1242119
## 2   -1.3006301  -1.2507035
## 3    0.3048515   0.1648655
## 
## Clustering vector:
##   [1] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
##  [36] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
##  [71] 1 3 3 3 3 3 3 1 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 1 1 1 1 1
## [106] 1 3 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 3 3 1 1 1 1 1
## [141] 1 1 1 1 1 1 1 1 1 1
## 
## Within cluster sum of squares by cluster:
## [1] 9.293174 1.410870 7.202739
##  (between_SS / total_SS =  94.0 %)
## 
## Available components:
## 
## [1] "cluster"      "centers"      "totss"        "withinss"    
## [5] "tot.withinss" "betweenss"    "size"         "iter"        
## [9] "ifault"
# 그래프
plot(data.scaled, col=data.cluster$cluster)
points(data.cluster$centers, col=4:6, pch=8, cex=2)

***

K-평균 군집분석 Ex.2

# 데이터 준비
autoparts <- read.csv("autoparts.csv", header = T)
autoparts3 <- autoparts[autoparts$prod_no=="45231-3B610", -c(1:7)]
autoparts3$flag <- 1
autoparts3$flag[autoparts3$c_thickness > 32] <- 2
autoparts3$flag[autoparts3$c_thickness < 20] <- 3
table(autoparts3$flag)
## 
##    1    2    3 
## 2298   38   42
head(autoparts3)
##       fix_time a_speed b_speed separation s_separation rate_terms  mpa
## 18780     82.0   0.736   1.776      180.7        719.1         92 74.7
## 18781     82.0   0.724   1.773      178.6        719.9         92 74.8
## 18782     82.0   0.732   1.752      178.9        719.7         92 74.7
## 18783     82.0   0.715   1.682      179.5        719.7         91 74.8
## 18784     81.6   0.728   1.690      180.7        719.4         93 74.8
## 18785     82.0   0.743   1.771      178.7        720.8         91 74.6
##       load_time highpressure_time c_thickness flag
## 18780      19.7                70        26.1    1
## 18781      19.7                72        27.4    1
## 18782      19.7                68        27.3    1
## 18783      19.7                63        26.7    1
## 18784      19.7                64        25.8    1
## 18785      19.7                67        26.4    1
# 정규화
data.scaled <- scale(autoparts3[ ,1:9])
head(data.scaled)
##         fix_time     a_speed  b_speed  separation s_separation rate_terms
## 18780 -0.1369565  0.27414980 2.861916  0.30986579   -0.6256391  0.4958978
## 18781 -0.1369565 -0.01704125 2.820923 -0.07819886   -0.4515622  0.4958978
## 18782 -0.1369565  0.17708612 2.533971 -0.02276105   -0.4950814  0.4958978
## 18783 -0.1369565 -0.23543453 1.577467  0.08811456   -0.4950814 -0.1585112
## 18784 -0.3121724  0.08002243 1.686782  0.30986579   -0.5603603  1.1503069
## 18785 -0.1369565  0.44401124 2.793594 -0.05971959   -0.2557257 -0.1585112
##             mpa   load_time highpressure_time
## 18780 0.2438613 -0.03480827       -0.40027978
## 18781 0.2554364 -0.03480827        0.05342152
## 18782 0.2438613 -0.03480827       -0.85398108
## 18783 0.2554364 -0.03480827       -1.98823432
## 18784 0.2554364 -0.03480827       -1.76138367
## 18785 0.2322862 -0.03480827       -1.08083173
# 군집 3개 설정
data.cluster<- kmeans(data.scaled, 3)  
# data.cluster 너무 많아 생략

# 그래프
# 두개의 그룹이 합쳐져서 제대로 군집분석이 되지 않음. 
# 이경우에는 변수의 수가 많은 것이 원인으로 의심. 따라서 이 경우에는 희소 K-평균 군집분석을 수행할 필요 있음
plot(data.scaled, col=data.cluster$cluster)
points(data.cluster$centers, col=4:6, pch=8, cex=2)

# 결과 수치
# 그룹 2는 전혀 예측 못함
table(real=autoparts3$flag, pred=data.cluster$cluster)
##     pred
## real    1    2    3
##    1   41 1979  278
##    2   30    8    0
##    3    1   41    0
## 희소 K-평균 군집분석(Sparse K-means Clustering)
# 희소 K-평균 군집분석은 변수마다 서로 다른 가중치를 주는 방법임
# 변수를 크게 해줄 때 변수의 거리를 크게 해주는데 기여하는 변수는 남기고 별로 기여하지 못하는 변수는 제외시키는 방법
# 변수의 종류가 많을 때 적용하면 성능 개선이 이루어질 때가 많음
# 2018.7.20 자로 sparcl 패키지 삭제됨. 다른 패키지 있나 찾아볼 것


계층적 군집 분석

  • 계층적 군집 분석은 군집분석 결과를 나무 구조 형식의 덴드로그램으로 표현
  • 장점 :
    • 전체 군집들 사이의 구조적 관계를 쉽게 살펴볼 수 있음
    • 군집의 수를 사전에 결정할 필요가 없음
  • 단점 :
    • 데이터 집합이 매우 클 경우, 계산 속도가 느림
    • 데이터를 재정렬하거나, 몇개의 관측치를 제외시킬 경우 전혀 다른 결과가 나타날 수 있음
    • 일단 개체가 특정 군집에 할당되면 다시는 다른 군집에 포함되지 못하는 성질을 가지고 있기 때문에 때때로 잘못된 군집결과를 초래할 수 있음
    • 초기에 이상치가 분류되면 전체 구조가 왜곡됨
  • 알고리즘 : 각 개체를 하나의 군집으로 하여 개체 n 개의 군집을 형성함
    • 각 군집 간의 거리를 계산하여 가장 가까운 두 개의 군집을 합침
    • 전 개체가 하나의 군집이 될 때까지 2번을 반복하여 군집을 계속 합침
    • - 거리 계산에는 dist() 함수가 자주 사용됨
    • - 가까운 두 개의 군집을 합치는 hclust() 함수는 계층적 군집분석을 할 때 자주 사용됨

계층적 군집분석 EX.1

# 데이터 준비
x1 <- c(8,12,15)
x2 <- c(10,13,18)
x <- data.frame(x1, x2)
x
##   x1 x2
## 1  8 10
## 2 12 13
## 3 15 18
# 거리는 유클리안으로 계산
# 예 (8,10) (12,13) 은 계산결과는 5임
d <- dist(x)
d
##           1         2
## 2  5.000000          
## 3 10.630146  5.830952
# 계층적 군집분석
hc <- hclust(d)

# 그래프
plot(hc)


계층적 군집분석 EX.2

# 변수가 단일 벡터인 경우, 그 값은 y축 값으로 가정함
x <- c(1,3,7,14,2,28,27,25,10,11)
d <- dist(x)
d
##     1  2  3  4  5  6  7  8  9
## 2   2                        
## 3   6  4                     
## 4  13 11  7                  
## 5   1  1  5 12               
## 6  27 25 21 14 26            
## 7  26 24 20 13 25  1         
## 8  24 22 18 11 23  3  2      
## 9   9  7  3  4  8 18 17 15   
## 10 10  8  4  3  9 17 16 14  1
hc <- hclust(d)
plot(hc)

계층적 군집분석 EX.3

# 데이터 준비
autoparts <- read.csv("autoparts.csv", header = T)
autoparts4 <- autoparts[autoparts$prod_no=="45231-P3B750", -c(1:7)]
autoparts4$flag <- 1
autoparts4$flag[autoparts4$c_thickness > 32] <- 2
autoparts4$flag[autoparts4$c_thickness < 20] <- 3
table(autoparts4$flag)
## 
##  1  2  3 
## 50 17  2
head(autoparts4)
##       fix_time a_speed b_speed separation s_separation rate_terms  mpa
## 28155     82.7   0.657   1.857      221.8        673.5         88 73.7
## 28156     82.7   0.659   1.840      223.9        672.7         88 73.8
## 28157     82.8   0.670   1.839      220.7        673.8         88 73.8
## 28158     82.8   0.653   1.824      221.2        674.4         87 73.7
## 28159     82.8   0.675   1.826      222.9        674.6         87 73.8
## 28160     82.6   0.653   1.846      222.7        674.5         87 73.8
##       load_time highpressure_time c_thickness flag
## 28155      19.6                70        28.5    1
## 28156      19.6                82        27.2    1
## 28157      19.7                73        29.3    1
## 28158      19.7                74        28.2    1
## 28159      19.7                81        26.3    1
## 28160      19.6                69        26.6    1
# 정규화
data.scaled <- scale(autoparts4[ ,1:9])
head(data.scaled)
##        fix_time   a_speed   b_speed separation s_separation rate_terms
## 28155 0.1777265 0.5722081 0.8228063  0.4349209   -0.5047412  1.7659691
## 28156 0.1777265 0.5971102 0.5965105  0.5665693   -0.5531290  1.7659691
## 28157 0.2110502 0.7340721 0.5831990  0.3659623   -0.4865958  1.7659691
## 28158 0.2110502 0.5224038 0.3835261  0.3973071   -0.4503049  0.9256114
## 28159 0.2110502 0.7963274 0.4101492  0.5038796   -0.4382079  0.9256114
## 28160 0.1444028 0.5224038 0.6763796  0.4913416   -0.4442564  0.9256114
##             mpa load_time highpressure_time
## 28155 0.6149726 0.1589139        -0.1422649
## 28156 0.6199176 0.1589139         2.0802881
## 28157 0.6199176 0.1889551         0.4133734
## 28158 0.6149726 0.1889551         0.5985861
## 28159 0.6199176 0.1889551         1.8950754
## 28160 0.6199176 0.1589139        -0.3274776
# 군집분석
d <- dist(data.scaled)
data.cluster <- hclust(d)

# 그래프
# 계층적 군집분석이 수행되기는 하였으나 결과가 너무 복잡항 이해하기 어려움
plot(data.cluster)

## 희소 계층적 군집분석
# 계층적 군집분석에서도 일부의 변수만을 이용하는 희소 계층적 군집분석을 수행할 수 있음
# 현대 해당패키지 삭제됨 "sparcl"