본 강좌에서는 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
  • 한진영 2009.12.13 16:13 ADDR EDIT/DEL REPLY

    상세한 설명 감사드립니다^^ 많은 도움이 되었습니다!

  • 준구 2010.03.28 20:18 ADDR EDIT/DEL REPLY

    안녕하세요 kmeans 알고리즘 검색하다가 우연히 들렸는데
    설명 감사합니다 ^^
    그런데 이해가 안되는게 있는데요
    위에 예제는 눈으로 봐도 구별할수있는데
    만약에 데이터 양이 많아지면
    처음에 k를 어떻게 정해주나요?

    제가 가지고있는데 데이터가 attribute가 10개이상
    row가 5천개 이상되거든요...

    답변해주시면 감사하겠습니다 ^^

    • 에이아이 2010.03.28 22:48 신고 EDIT/DEL

      몇 개의 군집이 가장 좋다라고 말할 수는 없고, 군집의 개수k를 2,3,4,... 으로 여러 번 실험을 해서 결과를 보고 최적의 k(군집개수)를 결정해야 합니다. 몇 개가 가장 좋다는 정답은 없고, 분석하는 사람이 이용하기에 가장 적합한 것을 찾으면 됩니다. 물론, 군집의 개수에 따른 적합도를 수치로 계산하는 방법들, 논문들이 있기도 합니다. 주로 레코드들이 군집내에 얼마나 밀집되어 있는가, 그리고 다른 군집과는 얼마나 떨어져있는가를 고려하는 방법을 사용합니다. 댓글로 하기에는 너무 길어졌네요^^. 아~ 그리고 SAS E-Miner에서는 자동으로 k를 2부터 증가시켜 가면서 군집분석하여 몇 개가 가장 적합한지 그래프로 그려주는 기능도 본 적도 있습니다. 너무 일반적인 얘기만 써놔서 별 도움을 못드리는 글 같아 죄송합니다.^^

  • 기초적인... 2010.04.20 13:25 ADDR EDIT/DEL REPLY

    문제를 모르겠습니다... arff 이 파일을 어떻게 생성하는거죠??

    • 에이아이 2010.04.20 16:38 신고 EDIT/DEL

      arff 형식으로 직접 만들어 주셔야 합니다. http://ai-times.tistory.com/175 글을 참고해보시겠어요.

  • ANN 2010.05.15 03:17 ADDR EDIT/DEL REPLY

    도움이 많이 되는 정보 감사합니다.
    Weka 로 artificial neural network 을 이용하려면 어떻게 해야 하나요?

  • 궁금 2010.10.05 17:56 ADDR EDIT/DEL REPLY

    cvs에서 arff형태로 변환을 하고 싶은데..

    1. 기본적으로 csv -> arff 변환 방법을 알고 싶습니다.
    그리고
    2. 자꾸 에러가 뜨네요 ... ㅠㅠ

  • 질문있습니다. 2011.08.26 11:25 ADDR EDIT/DEL REPLY

    안녕하세요.
    우선 정리해놓으신 유용한 정보 감사합니다. ^^
    혹시 EM 을 사용할때 데이터를 정규화해서 적용하는 경우와 그렇지 않은 경우의 차이점에 대해 설정해주실 수 있으신가요?
    적용하려는 데이터의 변수가 많고 값들이 0~10, 250~400 등 편차가 큰 경우입니다.

    감사합니다

  • 질문질문 2012.05.21 12:20 ADDR EDIT/DEL REPLY

    특정한 노드를 중복으로 포함하는 경우는 어떻게 해야 하나요? 예를 들어 4개의 그룹으로 군집할때 10개의 점에서 특정한 하나의 점을 4개 그룹 모두에 포함되게 하고 싶은데요.

  • 옵션창 문의 2012.06.07 16:20 ADDR EDIT/DEL REPLY

    군집갯수를 변경해주는 옵션창(weka.gui.genericObjectEditor라고 쓰인 창)은 어떻게 띄우나요?
    지금 wekca3.6.7인데 이버전에 뜨는거 맞은가요?

  • 적용 알고리즘 문의 2012.06.07 16:32 ADDR EDIT/DEL REPLY

    데이터는 정해져있는데, 어떤 알고리즘을 적용해면 좋을지 모르는경우,
    weka에서 모델별로 돌려보고 뭘보고 판단해야 해요?
    원하는 결과를 미리 갖고 있어야하는 건가요?

  • 수수료없음 2014.06.25 21:54 ADDR EDIT/DEL REPLY

    관리자의 승인을 기다리고 있는 댓글입니다