비계층적 군집분석
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 패키지 삭제됨. 다른 패키지 있나 찾아볼 것
계층적 군집 분석
계층적 군집분석 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"