[실습] 결속집단 :: Python 네트워크 분석 - mindscale
Skip to content

[실습] 결속집단

import networkx as nx

레미제라블 등장인물 그래프를 만든다. 에지는 두 인물이 같은 장면에 등장했음을 나타낸다.

G = nx.les_miserables_graph()

클릭을 찾는다. 클릭이란 모두가 서로 에지로 연결된 노드들을 말한다.

cliques = list(nx.find_cliques(G))

클릭을 크기의 역순으로 정렬한다.

sorted_cliques = sorted(cliques, key=lambda x: len(x), reverse=True)

가장 큰 크기의 클릭을 찾는다.

largest_clique = sorted_cliques[0]
largest_clique
['Combeferre',
 'Gavroche',
 'Bahorel',
 'Courfeyrac',
 'Enjolras',
 'Bossuet',
 'Joly',
 'Feuilly',
 'Prouvaire',
 'Grantaire']

소설 속에서 "아베쎄의 벗들"이라는 단체의 구성원들로 이뤄진 클릭이다.

이 클릭에 속하는 노드와 그 이웃 노드를 시각화해보자. 우선 이웃 노드를 포함하는 집합을 만든다.

lcn = set()
for node in largest_clique:
    lcn.add(node)
    lcn |= set(G.neighbors(node))

집합을 리스트로 변환한다.

lcn = list(lcn)

클릭에 속하는 노드는 빨간색, 그 이웃 노드는 회색으로 시각화한다.

subgraph = G.subgraph(lcn)
pos = nx.spring_layout(subgraph)
nx.draw(subgraph, pos, node_color='white', edge_color='#CCC')

clique_labels = {n: n for n in largest_clique}
nx.draw_networkx_labels(subgraph, pos, labels=clique_labels, font_color='red')

neighbor_labels = {n: n for n in lcn if n not in largest_clique}
result = nx.draw_networkx_labels(subgraph, pos, labels=neighbor_labels, font_color='grey')