[실습] 결속집단
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')