파이썬

NetworkX 패키지를 활용한 네트워크 시각화

내일의승기 2022. 10. 23. 22:25

 

데이터 분석을 하는 사람이라면, 기술 통계, 막대, 꺾은 선 그래프 등, 여러 시각화 자료를 준비해야 할 때가 많다.

하지만 우리가 흔히 접하는 산점도, 꺾은 선 그래프, 막대 그래프, 박스플롯, 히스토그램 등은 정형 데이터에 대한 시각화 결과물이다.

비정형 데이터 또한 시각화를 통해 나타낼 수 있다.

GIS 정보를 담은 지도가 그 예가 될 수 있을 것이며, 워드 클라우드 또한 그 예일 것이다.

이 비정형 데이터에 대한 파이썬 시각화 패키지로써, 오늘 내가 이야기하고자 하는 것은

NetworkX이다.

 

NetworkX, 줄여서 nx는 네트워크 분석 시각화를 위해 사용되는 패키지이다.

네트워크 분석이란? 구글에 의하면

네트워크 분석은 개인과 집단들 간의 관계를 노드(Node)와 링크(Link)로써 모형화하여, 그것의 구조나, 확산 및 진화과정을 계량적으로 분석하는 방법이다. 

라고 한다.

 

회사 업무 간에, 이러한 네트워크 관계를 가진 데이터를 시각화해야 할 일이 있었다.

그런데 제대로 쓸 줄 몰라 구글링을 하며 시간을 매우 많이 허비했던 탓에,

블로그에 기록으로 남겨 이후 만에 하나 필요한 시기가 온다면 다시 찾아 보고자 한다.

 

어차피 코드 사용법이야 구글 검색하면 나오니,

그저 내가 nx 모듈을 사용하며 배운 점 등에 대해

단순히 요약하여 적어보고자 한다.

 

NetworX 사용 간 배운 것.

1. 노드 간의 관계를 통해 나타내야 한다.

처음 nx를 사용하며, '가'와 '나'의 연결과, '하'와 '나'의 연결을 표현하고자 했다.

'가'와 연결된 '나'와, '하'와 연결된 '나'는 문자만 같을 뿐 서로 다른 개체이다.

이에 nx.add_edge('가', '나'), nx.add_edge('하','나') 하는 식으로 사용했다.

하지만 문제가 발생했다. '가'에 붙은 '나'와 '하'에 붙은 '나'를 같은 '나'로 인식해버린 것이다.

 

한참을 고민하며 방법을 궁리하던 중, 해답을 stackoverflow에서 찾았다. 노드를 string, 즉 이름이 아닌 int 형식의 index로 지정하는 것이었다. 최초에 노드에는 index를 지정하고, 나중에 시각화하여 나타낼 때에 index에 따라 string으로 된 이름을 매핑하여 라벨링하였다.

 

2. 노드의 이름을 맵핑할 때에는 딕셔너리 자료형을 사용한다.

다만 string 형식으로 라벨을 맵핑하는 것은 그냥 할 수 있는 것이 아니다.

{0: '가', 1: '나', 2: '다', 3: '하'}와 같은 딕셔너리 형식을 통해 맵핑해야 한다.

이렇게 지정한 딕셔너리 형식은 draw_networkx_nodes의 하이퍼 파라미터 labels를 지정함으로써 맵핑되었다.

 

3. DFS, BFS를 공부하면 도움이 된다.

결국 최초에 그래프의 관계를 구현하기 위해선, 노드의 깊이에 따라, 혹은 노드의 넓이에 따라 그 인덱스를 지정해줘야 한다.

당장 깊이우선탐색, 넓이우선탐색을 할 필요는 없지만, 최소한 노드를 생성함에 있어 DFS, BFS 알고리즘 문제 풀이에 사용되는 그래프 생성 정도는 익숙하게 할 줄 안다면, networkx를 통한 그래프 생성 또한 수월해질 것이다.

 

4. 직접 패키지 설치 경로를 뜯어보고 코드 수정하기

계속 한글이 깨져나오자, 가상환경 내 matplotlib의 경로를 찾아보고 뜯어보고 한글 폰트를 추가하였다.

그럼에도 한글이 깨져나왔다. 원인은 물론 matplotlib도 있었지만, networkx 자체의 문제도 있었다.

이에 networkx의 패키지 설치 경로로 찾아 들어가 ~~.py 파일을 직접 뜯어보고 패키지 기본 폰트를 수정하였다.

그 이후에야 비로소 한글 폰트 깨짐 현상을 수정할 수 있었다.

 

다만 허무한 것은, 알고보니 굳이 그렇게 직접 코드를 수정하지 않고서도 단순 하이퍼파라미터의 지정 만으로도

폰트 깨짐 문제를 해결할 수 있었다는 것이었다.

 

구현 이후 얻은 insight.

1. JSON 형식의 중요성

JSON 형식은 비정형 데이터를 저장하는 데에 매우 효과적인 방식이다.

하지만 그것에만 의의가 있는 것이 아니다.

키-밸류 관계에 따른 데이터 형식을 지원한다는 특성 상, 알고리즘 구현에 있어 그 사용 빈도가 매우 많다.

nx 그래프 구현 간 사용된 매핑 기법에서도 그것이 드러났다.

실제로 현업에서 개발을 하고 구현을 하다보면, 특히 데이터를 많이 다루는 내 업무 특성 상

결과물을 JSON(Dictionary) 형식으로 나타내야 할 경우가 매우 많았다.

중요하지 않은 자료구조는 없지만, 특히 JSON 형식의 중요성에 대해 다시 한 번 느낄 수 있었다.

 

2. 알고리즘 공부의 중요성

내가 이전에 BFS, DFS 학습을 통한 그래프 구현을 해본 적이 없었더라면, 이번 nx 그래프 구현도 매우 어려워졌을 것이다.

그간 알고리즘, 그리고 자료구조 학습에 매우 소홀했는데, 이 기회에 다시 돌아볼 수 있는 계기가 되었다.