R에서 Gephi 없이 igraph을 이용하여 군집화 하기

안녕하세요. 외대 철학과 스터디그룹 LOPES의 추선식입니다. 이번에는 오직 R만을 이용하여 와인데이터를 분석하고 군집화 해보겠습니다. 앞서 같은 스터디 그룹인 배서연 학우가 쓴 “와인 구매 데이터를 R로 분석하여 Gephi로 군집화, 시각화 하기“에서 Gephi를 이용해서 군집화 했었습니다. 그렇지만 저는 이 글에서 Gephi 없이 R을 이용해서 와인데이터를 군집화하고 그 결과를 서로 비교해보겠습니다.

준비 작업: 『DATA SMART』의 예제 와인데이터 이용하기

원본 와인데이터는 아래 링크로 가서 chapter2를 클릭하여 자료를 다운받으시고, WineKMC 파일 안의 Matrix시트를 R에서 지정한 디렉토리 폴더에 csv형식으로 내보내 사용하시거나 혹은 chapter10를 클릭하여 자료를 다운 받은 다음 그 안의 WineKMC.csv 파일을 사용하시면 됩니다.
Wiley: Data Smart: Using Data Science to Transform Information into Insight – John W. Foreman

R로 와인데이터 분석: (코사인 유사도 행렬 구하기 및 Cut-off 하기)

와인데이터의 군집화를 위해 먼저 해야 할 작업은 코사인 유사도 행렬을 만드는 것입니다. 코사인유사도는 각 구매자 간 구매데이터의 유사성에 비중을 둔 거리 계산법으로 이 예제에서는 와인 데이터의 구매 유사성을 토대로 구매자들 간의 거리를 측정할 수 있습니다. 코사인 유사도는 0과 1 사이의 값을 가지는데 코사인 유사도로 나타난 구매자들 간의 거리는 구매 데이터의 유사성 정도에 따라서 유사성이 강하면 그값이 1에 가까우며 유사성이 약할수록 0에 가까워지게 됩니다. 즉 이것으로 구매 데이터를 사람과 사람 간의 관계로 바꾸어 이후 군집화의 초석을 쌓는 것입니다.

다음 작업으로는 컷오프를 하는 것입니다. 이것을 하는 이유로는 와인 구매 데이터의 유사성을 통해 고객들 간의 모든 관계를 파악할 수 있지만, 그 관계가 너무 많아 데이터가 복잡하기 때문입니다. 따라서 중요하지 않은 관계는 지우고 강한 관계가 있는 데이터만 남기는 과정이 바로 컷오프입니다. 여기서 중요한 관계만 남기는 방법으로는 앞선 글애서와 똑같이 유사성이 강한 상위 20%만 남기는 것 입니다.

군집화하기: Igraph 패키지를 이용해서 군집화하기

군집화를 위해서는 Igraph 패키지가 필요합니다. 이 패키지가 기존의 Gephi의 기능인 네트워크 그래프를 다루는 일을 수행하기 때문입니다. Igraph 패키지는 컷오프 한 와인데이터 구매자들 간의 관계를 보고 군집화해주는 역할을 합니다. 이것을 이용해 R로 시각화를 해볼 순 있지만, 아직 모듈성 최적화가 되지 않은 상태이기에 군집 간 구분이 힘들기에 모듈성 최적화의 과정을 필요로 합니다.

따라서 Igraph로 군집화 된 것의 모듈성 최적화를 위해walktrap.community 나 multilevel.community 함수를 사용해야 합니다. 각 함수를 사용해서 군집의 최적화 즉 모듈성을 최적화하게 되면 모듈성은 walktrap.community 방식이 더 극대화되지만 두 방식의 모듈성 값 차이는 미세합니다. 두 가지 방식에 대한 더 자세한 설명을 알고 싶다면 이 두 기능이 내포된 Igraph 패키지와 각 함수에 대하여 Inside-r 링크에서 직접 찾아보실 수 있습니다.

R 코드 내용: 다음은 전체과정에 대한 R 코드입니다.

R 코드 설명

먼저 코사인 유사도를 구하는 데 필요한 패키지인 lsa를 다운 받습니다. 그 후 군집화에 사용할 패키지인 Igraph패키지를 다운 받습니다. 이제 와인 데이터를 읽어오고 코사인 유사도 그래프를 만들기 위한 작업(행,렬 변환 과 NA값 변환)을 합니다. 기본 작업이 완료되면 cosine 함수를 이용하여 코사인 유사도를 만들고 for 구문으로 대각선의 값을 0으로 바꿔 줍니다. 코사인 유사도 그래프가 완성되었으면 그것에 대한 컷오프 과정을 진행합니다. 컷오프 과정은 앞서 배서연 학우가 올린 글에서 설명되었기에 넘어가겠습니다.

이제 Igraph 패키지를 사용하게 되는데 가장 처음 할 일은 인접성 행렬 그래프를 만드는 것입니다. 인접성 행렬 그래프는 네트워크 데이터를 나타내는 그래프 중 하나로서 인접성 행렬을 통해 네트워크 데이터가 드러내는 관계를 보여주는 그래프입니다. 간단히 말해서 네트워크 데이터를 노드와 에지로 표현한 그래프라 할 수 있습니다.

코드에서 graph.adjacency 함수가 인접 행렬 그래프를 만들어 줍니다. graph.adjacency 함수는 방향성과 가중치에 따라서 인접 행렬을 다양하게 해석할 수 있기에 여기서는 가중치는 주지 않고 무방향성(undirected)을 설정해 줍니다.
다음으로 Igraph의 walktrap.community 함수를 사용합니다. 이 함수는 무작위 걸음(random walk)을 통해 그 걸음 길이가 짧을수록 같은 군집으로 묶는 역할을 합니다. 따라서 각 사람 간의 군집이 형성되는데 이것을 membership 함수를 통해 확인할 수 있습니다. 이어서 이 군집화 결과를 as.integer 함수를 통해 정수형 벡터로 바꾸어 줍니다.
남은 과정은 이제 기존의 정보들을 덧붙이는 과정입니다. 이것은 기존 와인에 대한 정보를 붙이고 하나의 데이터 벡터로 바꾸는 과정입니다. 이 과정을 진행하고 나면 최종 결과인 각 군집별 구매한 와인의 특성을 파악할 수 있습니다.

결과 비교해보기: Gephi 와 두 가지 방식(walktrap,multilevel)의 함수 결과 비교

비교하는 것에 앞서 결과를 추측해보자면 같은 군집화 알고리즘을 사용한다면 군집화의 결과가 같을 것이고 그렇지 않으면 차이가 있을 것이라 생각되어집니다.

군집화의 결과를 R로 비교해 보기 위해서는 19번째 코드까지 진행하고 그 이후 20번째 코드부터 다르게 진행합니다. 우선 walktrap.community 함수부터 사용해서 사람과 할당 군집목록을 만듭니다. 다음의 코드를 이용합니다.

winedata.wtc <- walktrap.community(winedata.graph)
membership(winedata.wtc)
walktrap.membership <- print(membership(winedata.wtc))
walktrap.community <- data.frame(walktrap.membership)

위 코드로 walktrap 함수의 구매자 별 군집 목록을 만듭니다. 같은 방식으로 multilevel.community 함수를 적용해 구매자 별 군집 목록을 완성합니다. 다음으로는 맨 위 링크에서 Gephi 로 작업한 파일을 Gephi 내부에서 csv 파일 형식으로 내보냅니다. Gephi에서 파일을 내보내는 방법은 gephi의 Data laboratory 섹션에서 Export table을 클릭하여 내보낼 수 있습니다. csv 형식으로 내보낸 파일을 R에서 읽어옵니다. R에서 csv 파일을 읽는 방법은 read.csv 함수를 사용하면 됩니다. 다음과 같이 gephi <- read.csv("CommunitiesGephi.csv") 사용합니다. R에서 불러온 다음엔 Gephi의 군집데이터를 이름을 토대로 다시 정렬해줍니다. 다음의 코드로 정렬할 수 있습니다.

library(plyr)
arrange(gephi,label)
gephi.community <- arrange(gephi,label)

이제 3개 방식의 군집 목록을 R에서 한 번에 비교해보도록 하겠습니다. 3개 방식을 한 번에 보는 방법은 cbind()함수를 사용하여 하나의 목록으로 합칠 수 있습니다.

walktrap.class <- walktrap.community$walktrap.membership
comparison.class <- cbind(gephi.community,walktrap.class)
multilevel.class <- multilevel.community$multilevel.membership
comparison.class <- cbind(comparison.class,multilevel.class)

위의 코드를 통해 하나의 목록으로 만들었다면 arrange() 함수를 통해서 방식별 정렬을 하여 비교할 수 있습니다. 예를 들면 arrange(comparison.class,modularity_class) 와 같이 Gephi의 군집을 기준으로 다른 방식과 비교한 것을 볼 수 있습니다.

3가지 방식의 군집화를 비교해본 결과 처음에는 모듈성이 거의 유사하기에 Gephi와 Igraph의 방식들의 군집화 결과가 서로 같을 것으로 생각했지만, 정렬을 통해 비교해본 결과 분명히 다르게 군집화가 이루어졌음을 확인할 수 있었습니다. 같은 자료, 같은 모듈성이지만 군집화 방식 도구에 따라 군집의 결과가 다르게 나누어진다는 사실에 놀랐습니다. 읽어주셔서 감사합니다

Leave a Reply