와인 구매 데이터를 R로 분석하여 Gephi로 군집화, 시각화 하기

#와인 구매 데이터를 R로 분석하여 Gephi로 군집화, 시각화 하기

안녕하세요. 외대 철학과 스터디 그룹, LOPES의 배서연 입니다. 저희는 겨울방학에 『DATA SMART』를 교재로 세미나를 했습니다. 생각보다 쉽지 않은 세미나였지만, 많은 것을 배울 수 있는 시간이었습니다. 이 책은 크게 두 부분으로 나눠져 있습니다. 1장부터 9장까지는 엑셀을 가지고 데이터를 분석하고 있으며, 나머지 10장에서는 앞에서 엑셀를 가지고 분석한 것을 다시 R로 구현하고 있습니다. 저희 팀은 이 책에 있는 분석들을 모두 R로 해보자는 목표를 갖고 있었습니다.

그러나 아쉽게도 이 책 10장에서는 2장과 5장에 나와있는 와인 구매자 목록을 이용한 군집화 중 K-평균(정확하게 말하자면, 구형 k-평균(spherical K-means)을 이용한 군집화를 R로 구현하는 방법은 소개했지만, 5장 말미에 나오는 모듈성 극대화(maximize graph modularity)를 통한 군집화를 R로 구현하는 방법은 소개하지 않고 있습니다. 그래서 이 글에서는 모듈성 극대화를 통한 와인 구매자 군집화를 R과 Gephi를 가지고 하는 방법을 소개합니다.

사실 『DATA SMART』 2장에서는 엑셀을 이용한 방법을 소개하고 있지만, 절대 참조를 고려하면서 수식을 짜고 구매자 수만큼 가로로 드래그를 해야 하는 등 약간의 번거로운 작업이 필요하기 때문에 R를 이용하고 최종적으로 이 작업 결과는 가지고 Gephi를 이용하는 편이 더 간편합니다. 참고로 아래 R코드는 처리 방법을 그대로 옮긴 것입니다. 자료 확인하는 경우에는 그 결과가 길어서 일부러 삭제했습니다.

준비작업

예제 파일이 없으신 분은 Wiley: Data Smart: Using Data Science to Transform Information into Insight – John W. Foreman에서 chapter2를 다운받고, WineKMC 파일 안의 Matrix시트를 R에서 지정한 디렉토리 폴더에 csv형식으로 내보내 사용하거나 혹은 chapter10안의 WineKMC파일을 사용하셔도 됩니다.

R로 작업하기 ( 코사인 유사도 구하기, Cut-off 시키기)

코사인 유사도 구하기

나와 비슷한 친구들을 ‘가깝다’고 표현하듯이, 수 많은 데이터의 정보를 유사한 것끼리 군집화 시키기 위해서는 그들 간의 가까운 ‘거리’를 구해야 합니다. 여기서 거리는 코사인 유사도를 사용하기 때문에 데이터를 행렬로 정제하는 것이 필요합니다.

코사인 유사도란 유클리드, 맨하튼 거리법과 같이 대표적인 거리 측정 방법입니다. 이를 통해 각 구매자간의 유사함의 정도를 거리의 개념으로 변환시킬 수 있습니다. 코사인 유사도를 통한 두 구매자간의 거리의 공식은 다음과 같습니다.

cos (45°) =(1 matched purchase)/(√1purchase√2purchase)
= (공통으로 구매한 개수)/(√첫번째 사람의 구매 개수 √두번째 사 람의 구매 개수)

코사인 유사도 값은 0과 1사이의 값을 가집니다. 거리가 가까울수록 1에 도달합니다. 그래서 자기와 자기 자신과의 거리는 모두 1이 나타나게 됩니다. 구해진 코사인 유사도 행렬의 대각선 값을 보면 모두 1인 것을 확인하실 수 있습니다. 하지만 여기서는 자신과의 거리는 무의미 하기 때문에 대각선의 1을 모두 0으로 바꿔줍니다. 아래 cos.sim 함수는 다음 링크를 참고했습니다.
clustering – Is there an R function that will compute the cosine dissimilarity matrix? – Cross Validated

그다지 중요하지 않은 관계는 지우고 강한 관계 들만 남기기 (Cut-off)
데이터가 커질수록 데이터들간의 관계는 복잡해지기 때문에 무의미한 관계들은 정리하는 것이 데이터를 이해하는데 도움이 됩니다. 앞에서 계산한 코사인 유사도는 에지 가중치가 0에서 1 사이의 값을 갖는 유사도 행렬(Affinity matrix)이기 때문에 특정 강도의 에지 이하를 모두 버리는 방법을 사용합니다. 여기서는 상위 20%만을 남길 Cut-off값을 구하고 그 값 이상은 1, 이하는 0인 행렬을 만들어줍니다. 이제 R로 직접 실행해봅시다.

Gephi를 이용해 군집화 시키기

군집화는 크게 두 가지 방법을 이용할 수 있습니다. 일단 인위적으로 군집화할 개수를 정하는 ‘분리형 군집화’ 방법이 있습니다. 예컨대, R의 clusters() 함수에서 군집을 5개로 옵션으로 정해주는 것이 이 군집화 방법을 사용한 것이라고 보면 됩니다.

다른 하나는 바로 ‘결합 형 군집화(aggolomerative)’입니다. ‘결합형 군집화’는 원래 객체가 속해진 그룹에서 시작해 가장 가까운 그룹을 서로 합쳐 나가는 일을 반복하여 modularity의 변화를 계산한 뒤 최적의 군집화를 찾는 방법입니다. 제가 사용하는 ‘Gephi’라는 프로그램은 바로 이 군집화 방법을 사용하고 있습니다.

참고로 Gephi가 받아들이는 실행 형식은 csv에서 쉼표(,)보다는 세미콜론(;)을 이용하기 때문에 텍스트 에디터를 사용하여 쉼표를 모두 세미콜론으로 바꿔주는 과정을 거쳐야합니다. 저는 Atom이라는 에디터를 사용했습니다.

Atom으로 형식 바꿔주기

Atom 에서 Atom을 다운 받을 수 있습니다. 저장했던 winedataneighborhood.csv파일을 Atom으로 열어줍니다. 위 Find 탭에서 Replace in Buffer를 눌러 이름에 붙어있는 쌍따옴표(“)를 없애고 쉼표(,)를 세미콜론(;)으로 모두 바꿔줍니다.

Gephi로 군집화한 것을 시각화하기

Gephi – The Open Graph Viz Platform에서 Gephi를 다운 받을 수 있습니다. Atom으로 바꿔준 winedataneighborhood.csv파일을 Gephi로 열어줍니다.이 파일은 방향성이 없기 때문에 undirected로 graph type을 설정합니다. Node 와 Edge 가 각각 100, 858임을 알 수 있습니다.

일단 오른쪽 창의 Statistics창에서 Modularity를 눌러줍니다.이미 우리가 가중치(Weight)를 인접도 행렬에서 1인 값으로 바꾸어 주었기 때문에 체크되어 있는 use weight를 해제하고 눌러줍니다.Number of Communities: 6에서 군집이 6개로 나누어짐을 알 수 있습니다.

왼쪽 appearance창에서 nodes – attribute를 눌러 modularity별로 색깔을 입혀줍니다. Lay out창을 통해 보기 좋은 형식을 선택해줍니다.밑에 검은 색 T버튼을 누르면 노드의 각 이름을 확인하실 수 있습니다.같은 색상 끼리 묶어져 있는 군집들이 보이시나요?
읽어주셔서 감사합니다 ^^

Gephi로 군집화한 것을 시각화하기

Leave a Reply