본 강좌에서는 Weka 프로그램을 사용하여 군집분석을 수행하는 방법을 설명하고자 합니다.

Weka 프로그램을 처음 사용하는 경우 군집을 수행하는 절차 그리고 결과를 해석하기가 좀 어렵게 느껴집니다.
분류의 경우는 Tree 형태로 결과가 나오서 모델을 해석하기가 쉬운데 군집은 수행한 결과가 뭘 의미하는지 좀 해석하기가 좀 애매합니다.

간단한 예제를 가지고 Weka를 사용하여 군집분석을 수행하고 해석하는 방법을 설명하고자 합니다.
분석 데이터가 복잡하면 군집 분석도 괜히 어렵게 느껴질 수 있으므로 아주 이해하기 쉬운 간단한 데이터를 만들어 보았습니다.

분석을 위해 만들어 본 데이터를 아래에 설명합니다. 

데이터는 10명의 학생들의 수학, 물리, 영어, 중국어의 4과목의 성적으로 구성된 데이터입니다.
처음 3명의 학생은 [수학,물리] 를 잘하는 학생들이고, 다음 3명은 [영어,중국어]를 잘하는 학생들입니다. 다음 2명은 4과목이 모두 우수한 학생들이고, 마지막 2명은 모든 과목을 다 못하는 학생들입니다.

즉, 4개의 군집으로 구성한 간단한 데이터입니다. (정리하면, 군집1: 계산능력우수군집, 군집2: 외국어능력우수군집, 군집3: 전과목우수군집, 군집4: 공부와담쌓은군집)




위 그림은 데이터를 쉽게 이해하기 위하여 엑셀에서 보기 위하여 만든 CSV 형식의 파일입니다.
웨카 프로그램을 사용하여 분석하려면 아래의 그림에 표시된 Arff 형식의 파일을 사용해야 합니다.
두 가지 형식 모두 만들어서 아래에 첨부하였으니 실습해보려면 다운로드 하세요. 

 CSV 형식으로 된 데이터 파일  
 ARFF 형식으로 된 데이터 파일 (Weka 실행 용)  



웨카 프로그램을 시작합니다. 아래 그림의 왼쪽 편의 작은 윈도우가 표시됩니다.
4개의 버튼 중 [Explorer] 를 클릭합니다.

오른쪽과 같이 프로그램 화면이 표시되면, [Process] 탭에서 [Open File...] 을 클릭합니다.
분석에 사용할 데이터를 선택합니다.




위에서 첨부한 파일 [student_score.arff] 을 선택합니다.
그러면 아래와 같이 데이터의 간단한 정보를 표시합니다.




이제 군집 분석을 수행하기 위해 [Cluster] 탭으로 이동합니다.
여러가지 군집 알고리즘들이 있는데 기본적으로 EM 알고리즘이 설정되어 있습니다. 파라미터는 -I 100 -N -1 -S 100 -M 1.0E-6 으로 설정되어있습니다.



이미 기본적으로 EM 알고리즘이 선택되어 있는데 다른 알고리즘을 선택할 수도 있고, 옵션을 변경할 수도 있습니다.

[Choose] 버튼을 클릭하면 알고리즘을 선택할 수 있도록 표시됩니다.
[EM] 이라는 텍스트를 클릭한 후, 화면의 빈공간을 클릭합니다.
그러면 옵션을 변경할 수 있는 창이 표시됩니다.

여러가지 알고리즘들 중에서 가장 많이 사용되고 성능도 좋은 EM 알고리즘을 선택하겠습니다.
KMean 알고리즘의 경우 데이터의 분포에 민감하여 Outlier 에 적응력이 약합니다.
보통 EM 알고리즘은 확률에 기반하여 군집을 수행하기 때문에 KMeans보다 좋은 결과를 나타냅니다.



아래의 옵션 변경 창에서 군집의 수를 4로 변경합니다.
기본적으로 -1 이 설정되어 있습니다. (-N -1 이 그것을 의미합니다. 군집의 개수가 -1개 라는 것이 아니라 자동으로 찾겠다는 것임) 자동으로 지정된 군집의 개수는 일반적으로 적합하지 않은 경우가 많습니다. 따라서 분석하는 사람이 데이터를 잘 이해하고 적절히 지정해 주는 것이 좋습니다.

우리가 사용하는 데이터는 간단한 데이터이므로 군집의 개수가 4 가 적당하다는 것을 쉽게 알 수 있었습니다. 사실 쉽게 알 수 있도록 데이터를 만든것이지요.



데이터를 <수학논리력우수>, <인문계열능력우수>, <모든과목우수>, <모든과목저조>의 4개의 군집으로 가정하고 데이터를 생성하였으므로 군집수를 4로 입력한 것입니다.

아래와 같이 -N 4 로 옵션이 변경된 것을 확인할 수 있습니다.
Cluster Mode 를 [Use training set] 을 선택합니다. 입력 데이터로 모델을 만들고, 원 데이터를 그대로 테스트하는데 사용하겠다는 의미입니다. (훈련 데이터와 실험 데이터를 분리하려면 그 아래 옵션들을 사용해야겠습니다.)

하단의 [Start] 버튼을 누르면 분석이 수행되고 오른쪽 창에 분석 결과가 표시될 것입니다. 



결과를 해석해봅시다.
오른쪽 창의 맨 하단을 보면, 군집이 4개 생성되었다는 것을 볼 수 있습니다. 번호가 1번부터가 아니라 0번부터 붙혀졌습니다. 그래서 군집0, 군집1, 군집2, 군집3 의 이름이 부여됩니다. 우선은 각 군집에 포함된 레코드의 개수를 파악할 수 있습니다. 군집0 에는 3명의 학생이 소속되었습니다. (전체 10명이니 당연히 30% 라고 비율이 표시됩니다.) 이런식으로 군집2 에는 2명이 소속되었네요.

그런데 포함된 개수나 비율보다 더 중요한 것은 각 군집의 특성이 무엇이냐는 것입니다.
오른쪽에 스크롤을 올려서 결과 텍스트의 상단부분을 살펴보겠습니다.



텍스트 분석 결과를 위에서 부터 살펴보겠습니다.

먼저, 맨 위는 [Run information] 으로 알고리즘으 수행한 옵션 설정내용이 정리되어 있고 데이터에 대한 간단한 정보 (변수의 수, 레코드의 수) 가 표시되어 있습니다.

중요한 것은 Number of Cluster : 4 라고 된 부분의 뒤에서 부터입니다.

Cluster 0 부분은 <첫번째 클러스터(군집)> 군집0 에 대한 정리입니다.
probability : 0.3 은 전체 중 30% 즉, 3개의 데이터가 포함되어 있다는 의미입니다.
그 아래에 바로 변수들에 대한 정보(평균, 편차)가 표시되어 있습니다.
수학은 평균 38, 편차 8.4, 과학은 평균 45, 편차 4.0, 영어는 평균 95, 편차 4.0, 중국어는 평균 95, 편차 4.0 입니다. 즉, 군집0 은 [수학,과학]은 못하고 [영어,중국어] 성적이 우수한 그룹(군집)임을 이해할 수 있습니다. (편차 값이 작을 수록 군집의 밀집도가 좋다는 것을 의미합니다.)



같은 방식으로 모든 군집의 특성을 정리해보면 아래와 같습니다.

 군집이름  특성   포함된 학생수 (레코드 수)  
 군집0 (Cluster 0)  영어,중국어 성적 우수한 그룹  3명
 군집1 (Cluster 1)  전과목 성적이 우수한 그룹  2명
 군집2 (Cluster 2)  수학,과학 성적이 우수한 그룹  3명
 군집3 (Cluster 3)  공부와는 담 쌓은 그룹  2명

이렇게 해서 4개의 군집이 어떠한 특성으로 구분되었는가를 파악할 수 있습니다.
간단하게 텍스트로 되어있어 별 거 아닌 것 같지만 이 부분이 군집의 가장 중요한 내용이라고 생각됩니다.

그런데 이렇게 마무리하기에는 뭔가 좀 허전한 감이 있습니다.
우리가 원하는 것은 중요한 결과는 각 레코드가 어떤 군집에 소속되는 가에 대한 정보입니다.

아래와 같이 왼쪽 로그가 표시되는 창에서
작업 시간과 EM 이라고 표시된 부분 [19:52:58 EM] 의 형식으로 표시된 부분에서 마우스 오른족 버튼을 클릭합니다. 팝업 메뉴에서 [Visualize cluster assignments] 를 클릭합니다.  



그러면 아래와 그림과 같이 창이 표시됩니다.

중앙의 검정 부분(XY챠트)에 보면 10개의 레코드 (10명의 학생) 을 표시하는 별표 (*) 표시가 되어 있습니다.
현재 X축은 군집의 번호에 따른 구분이고 Y축은 수학 점수를 표시한 것입니다.

각 별표 (*) 는 군집에 따라 서로 다른 색상으로 표시되어 있음으로 어떤 레코드들이 서로 같은 군집에 포함되었는가를 확인할 수 있습니다. 이해하기 쉽도록 아래 그림에서는 같은 군집들을 노랑색 동그라미로 표시하였습니다.



이제 최종적으로 각 학생 (레코드) 들이 소속된 군집을 텍스트로 추출해보겠습니다.
위의 그림의 창에서 [Save] 버튼을 클릭한 후 결과 파일(arff형식)을 이름을 지정하여 저장합니다.
student_score_clustering.arff 라는 이름으로 저장한 후 그 파일을 텍스트 에디터 등으로 열어보면 아래와 같이 표시됩니다. (메모장으로는 줄 바꿈이 안되어 잘 표시가 안되니 Edit plus 또는 Utra-edit 등의 편집기를 사용하세요.)

자세히 살펴보면 원래의 레코드에 두 개의 필드가 새롭게 추가된 것을 볼 수 있습니다.
맨 앞에는 레코드별로 번호에 해당하는 변수가 추가되었고,
맨 끝에는 각 레코드가 소속된 군집을 표시하는 범주형 형태의 변수가 추가되었습니다.

아래의 데이터 부분을 보면 (@data 아래 부분)
각 레코드별로 소속된 군집번호가 부여된 것을 볼 수 있습니다.



위 결과 파일을 아래에 첨부했습니다.


결과를 보면 우리가 처음 의도했던 대로 4개의 군집으로 잘 구분되고 각 레코드들이 군집된 것을 확인할 수 있었습니다.

이것으로 Weka에서 군집 분석을 수행하는 방법을 설명하였습니다.
혹시 부족한 내용이 이나 더 궁금한 내용이 있다면 댓글에 달아주세요^^.

수고하셨습니다~.



by 에이아이 2009. 12. 12. 21:21