자료 4.1에는 미국에서 판매되고 있는 20개 맥주 브랜드를 대상으로 칼로리량, 염분량, 알코올농도, 가격 등을 측정한 자료가 주어져 있다. 군집분석에서는 변숫값들을 이용하여 각 관찰치 사이의 거리 또는 유사성을 측정하게 되는데 이 경우 각 변수의 관측단위가 다르기 때문에 발생되는 영향력을 없애기 위하여 4.2절에서 설명한 바와 같이 각 변수를 표준화하여 이용한다. 이 자료를 이용하여 R을 이용한 계층적 군집분석과 K-평균 군집분석을 실시하는 과정과 분석결과를 살펴보자.
summary(beer)
calories sodium alcohol cost
Min. : 68.0 Min. : 6.00 Min. :2.30 Min. :0.2800
1st Qu.:110.2 1st Qu.: 9.50 1st Qu.:4.20 1st Qu.:0.4300
Median :144.0 Median :15.00 Median :4.65 Median :0.4400
Mean :132.4 Mean :14.95 Mean :4.44 Mean :0.4965
3rd Qu.:150.2 3rd Qu.:19.00 3rd Qu.:4.90 3rd Qu.:0.4850
Max. :175.0 Max. :27.00 Max. :5.50 Max. :0.7900
“row.names = 1”은 행별 명칭은 첫 번째 열에 있는 값이라는 의미. 그 결과 각 행의 명칭은 맥주 이름으로 인식되었다.
4.2.2항에서 언급한 바와 같이 군집분석을 하기 전에 표준화를 수행한 후 군집분석을 수행하는 것이 더 바람직한 경우가 많다. 그 이유는 군집분석에서는 거리 혹은 유사도함수를 사용하는데 그러한 함수는 변수의 단위에 의해 영향을 받기 때문이다.
표준화를 수행하는 명령어는 <R 4.2>와 같다. 여기서 표준화를 위하여 “scale()” 명령어를 사용하였다. 표준화의 효과를 확인하기 위해 평균과 표준편차를 계산해 본 결과 평균은 0이고 표준편차는 1이 나오므로 표준화는 잘 진행되었다. 표준화된 데이터프레임은 ’zbeer’라는 이름으로 저장되었다.
round(apply(zbeer, 2, mean), 3)
calories sodium alcohol cost
0 0 0 0
round(apply(zbeer, 2, sd), 3)
calories sodium alcohol cost
1 1 1 1
계층적 군집분석을 수행하기 위해서는 관찰치 간 거리의 계산이 필수적이다. 만약 관찰치의 총 수가 N명이라면, 거리행렬은 N * N 크기가 될 것이다. 거리행렬을 계산하는 절차는 <R 4.3>과 같다. 여기서 거리행렬을 계산하는 명령어는 “dist()”이다. 이 명령어의 인수로 거리함수를 지정해 줄 수 있는데, “euclidean”은 디폴트 인수이고, 그 외에도 “manhattan”, “minkowski” 등이 있다.
zbeer_euc[1]
[1] 0.7015818
zbeer_man[1]
[1] 1.102367
4.2.2 항에서 맥주 데이터를 예시로 하여 유클리디안 거리와 맨해튼 거리를 계산하였는데 첫 번째 쌍인 ‘BUDWEISER’와 ’SCHLITZ’ 맥주 사이의 유클라디안 거리와 맨해튼 거리는 각각 0.7016과 1.1024로 4.2.2항의 결과와 일치한다.
먼저 최단연결법을 이용하여 계층적 군집분석을 수행해 보기로 한다. 거리행렬은 유클리디안 거리를 사용하였다. 결과는 <R 4.4>와 같다.
hc_s
Call:
hclust(d = zbeer_euc, method = "single")
Cluster method : single
Distance : euclidean
Number of objects: 20
“plot(hc_s, hang = -1)”에서 “hang = -1”이라는 명령을 사용하면 덴드로그램 내 관찰치의 이름이 정렬되어 보기에 좋다. 최단연결법에 의한 덴드로그램은 다음과 같다.
만약 최단연결법이 아닌 최장연결법을 사용하게 되면 다음과 같은 덴드로그램을 구할 수 있다. “method = ‘complete’”라는 옵션을 사용한다. 위의 최단연결법의 결과와 상당한 차이가 있음을 알 수 있다.
hc_c
Call:
hclust(d = zbeer_euc, method = "complete")
Cluster method : complete
Distance : euclidean
Number of objects: 20
<R 4.6>은 중심연결법을 사용한 계층적 군집분석의 R 코드와 결과이다. 그 아래 그림은 중심연결법에 의한 덴드로그램이다.
hc_cen
Call:
hclust(d = zbeer_euc, method = "centroid")
Cluster method : centroid
Distance : euclidean
Number of objects: 20
와드의 방법을 사용하여 계층적 군집분석을 수행하는 명령은 <R 4.7>과 같다.
hc_w
Call:
hclust(d = zbeer_euc, method = "ward.D")
Cluster method : ward.D
Distance : euclidean
Number of objects: 20
각 개체에 소속 군집 id를 할당하려면 “cutree()” 함수를 이용한다.
<R 4.8>은 중심연결법을 이용한 계층적 군집분석 결과에서 군집 수를 2~4개로 하였을 때의 소속 군집을 할당하는 내용이다. 예를 들어덴드로그램의 결과와 비교해 보자.
hc_cen24 <- cutree(hc_cen, 2:4)
hc_cen24
2 3 4
BUDWEISER 1 1 1
SCHLITZ 1 1 1
LOWENBRAU 1 1 1
KRONENBOURG 1 2 2
HEINEKEN 1 2 2
OLD MILWAUKEE 1 1 1
AUGSBERGER 1 1 1
STROHS BOHEMIAN STYLE 1 1 1
MILLER LITE 1 1 1
BUDWEISER LIGHT 1 1 1
COORS 1 1 1
COORS LIGHT 1 1 1
MICHELOB LIGHT 1 1 1
BECKS 1 2 2
KIRIN 1 2 2
PABST EXTRA LIGHT 2 3 3
HAMMS 1 1 1
HEILEMANS OLD STYLE 1 1 1
OLYMPIA GOLD LIGHT 2 3 4
SCHLITZ LIGHT 1 1 1
앞에서 읽어들인 zbeer 자료를 이용해 K-평균 군집분석을 수행해 보자. 표준화를 수행한 후 군집의 개수가 K=2인 K-평균 군집분석을 수행하는 절차는 <R 4.9>와 같다. K-평균 군집분석 결과에서는 각 변수별 최종 군집의 중심값 및 각 관찰치별 소속 군집분석의 결과를 보여준다.
kmc <- kmeans(zbeer, centers = 2)
kmc
K-means clustering with 2 clusters of sizes 14, 6
Cluster means:
calories sodium alcohol cost
1 0.5745921 0.3114899 0.4832236 0.1684391
2 -1.3407148 -0.7268097 -1.1275218 -0.3930246
Clustering vector:
BUDWEISER SCHLITZ LOWENBRAU KRONENBOURG HEINEKEN OLD MILWAUKEE AUGSBERGER
1 1 1 1 1 1 1
STROHS BOHEMIAN STYLE MILLER LITE BUDWEISER LIGHT COORS COORS LIGHT MICHELOB LIGHT BECKS
1 2 2 1 2 1 1
KIRIN PABST EXTRA LIGHT HAMMS HEILEMANS OLD STYLE OLYMPIA GOLD LIGHT SCHLITZ LIGHT
1 2 1 1 2 2
Within cluster sum of squares by cluster:
[1] 34.328491 9.515432
(between_SS / total_SS = 42.3 %)
Available components:
[1] "cluster" "centers" "totss" "withinss" "tot.withinss" "betweenss" "size" "iter" "ifault"
K-평균 군집분석에서 생성된 군집 데이터를 그림으로 나타내기 위한 절차는 <R 4.10>과 같다.
“pch = 16”은 산점도의 점을 생상으로 채우는 옵션
모든 산점도에서 군집 1과 군집 2의 구분이 명확함을 확인할 수 있다.
계층적 군집분석과 K-평균 군집분석을 실시한 결과 두 가지 분석결과가 매우 다름을 알 수 있다. 즉, K-평균 군집분석에서 K=2로 하였을 때의 군집분석 결과와 계층적 군집분석에서 군집의 개수를 2로 한 결과가 서로 다른 것을 알 수 있다. 구체적으로 계층적 군집분석 방법에서는 군집에 속한 관찰치 수가 18개와 2개로 나누어지는 데 비해 K-평균 군집분석방법에서는 14개와 6개로 나누어짐을 알 수 있다.
이와 같이 군집분석에서는 방법에 따라 다른 형태의 군집이 만들어진다. 또한 계층적 군집분석 내에서도 4.3.4항에서 본 바와 같이 연결방법에 따라 결과가 다르게 나온다. 따라서 군집분석을 실시하고자 하는 경우에는 주어진 자료에 가장 적합한 방법을 찾아서 분석을 실시하여야 하고 4.3.5항과 4.4.3항에 언급하였드스이 군집분석의 결과의 검증에 주의하여야 한다.