1 minute read

NetworkX로 데이터 시각화 하기


앞서 포스팅한 “NetworkX 배우기(with python)”에서 networkx()의 기능들에 대해 알아봤다.

이번에는 이를 활용해 샘플 데이터를 다뤄보자!!

사용할 샘플 데이터는 미국 대학교 풋볼 팀의 대전 빈도에 대한 데이터 세트이다.

이곳에서 자료를 다운받을 수 있다.

👉 https://public.websites.umich.edu/~mejn/netdata/

자료를 이용해 그래프로 작성해보자.

import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

with open('football.txt', 'r') as file:
    txt = file.read()
with open('football.gml', 'r') as file:
    gml = file.read().split('\n')[1:]

# GML 파싱하여 그래프 생성
G = nx.parse_gml(gml)

# 그래프 그리기
nx.draw(G, with_labels=True, node_color="lightblue", edge_color="grey")

# PDF로 저장
plt.savefig('football.pdf')

이렇게 복잡한 그래프가 출력된다.


이 데이터로의 모든 노드에 대한 degree를 알고싶다!

노드와 degree에 대한 정보를 튜플 형태의 리스트로 출력해보자.

degree()를 이용하면 간단하게 출력할 수 있다.

그런데 수많은 리스트가 쭉 나열되니 가독성이 떨어진다.

조금 더 보기 좋게 출력해보자.

# 각 노드의 차수 계산
node_degrees = [(node, G.degree(node)) for node in G.nodes()]

# 결과 출력
print("Node Degrees:")
for node, degree in node_degrees:
    print(f"Node: {node}, Degree: {degree}")

위 코드의 마지막 줄에 사용된 f, 즉 f-string은 문자열 안에서 변수의 값을 직접 사용할 수 있게 해주는 기능이다.

{} 중괄호 안에 변수를 넣으면 해당 변수의 값이 문자열에 삽입된다.

출력 결과를 보면 훨씬 보기 좋게 정리된 것을 볼 수 있다!


이제 노드와 엣지의 개수를 알아보고 평균 degree도 구해보자.

각각의 값들이 계산되어 출력됐다!


다시 전체 데이터 세트 그래프를 살펴보자 …

노드의 라벨을 읽기도 어려울만큼 복잡하다.

부분그래프(sub geaph)를 따로 분리해 살펴보면 어떨까?

한 개의 데이터 세트에서 다수 개의 그래프를 분리하려면 connected_components()메소드를 활용한다.

이는 그래프의 제너레이터 형식을 반환하며 입력된 그래프 내에서 연결된 부분그래프들의 리스트이다.

부분그래프 개수를 알기 위해서는 반환된 제너레이터 형식을 이렇게 리스트 형태로 변환해 len()함수를 사용해야 한다.

이 그래프는 모든 노드가 연결되어있으므로 부분 그래프의 수로 1이 출력된다.

Categories:

Updated: