Doctor Pepper

네트워크의 기본 정의 (2) 본문

Network 심화/네트워크 분석

네트워크의 기본 정의 (2)

Doctor Pepper 2024. 11. 25. 23:09
728x90

 

 

 

1. 방향성 네트워크

 방향성 네트워크에서 링크는 각 링크의 방향을 나타내는 화살표로 표시된다. 무방향 네트워크에서는 두 노드 사이의 링크가 양방향으로 연결되지만, 방향성 네트워크에서는 한 방향으로만 연결될 수 있다. 즉, 링크가 있다고 해서 반대 방향에도 링크가 존재한다는 것은 아니다.

들어오는 링크 수 (In-degree) 특정 노드로 들어오는 링크의 수임
예를 들어, 노드 i에 들어오는 링크 수는 k^in_i로 표현됨
나가는 링크 수 (Out-degree) 특정 노드에서 나가는 링크의 수임
예를 들어, 노드 i에서 나가는 링크 수는 k^out_i로 표현됨

 

- NetworkX에서 방향성 네트워크 함수

  • in_degree(): 주어진 노드의 들어오는 연결선 수
  • out_degree(): 주어진 노드의 나가는 연결선 수
  • degree(): 주어진 노드의 전체 연결선 수 (들어오는 링크와 나가는 링크의 합)
D.in_degree(4)    # 노드 4에 들어오는 링크 수
D.out_degree(4)  # 노드 4에서 나가는 링크 수
D.degree(4)         # 노드 4의 전체 연결선 수

 

2. 가중치 네트워크

 가중치 네트워크는 링크에 가중치가 할당된 네트워크로, 링크의 크기나 강도를 나타낼 수 있다. 그래픽 표현에서 가중치는 각 링크의 두께로 표시되며, 가중치가 0인 링크는 사실상 존재하지 않는 링크와 같다.

 

 가중치 네트워크는 방향성이 있을 수도 있고 없을 수도 있다. 방향이 없는 가중치 네트워크의 경우, 연결선 수는 가중치를 무시하고 셀 수 있지만, 가중치를 고려하면 더 중요한 정보를 얻을 수 있다. 예를 들어, 연결강도(Strength)는 연결선의 가중치 합으로 정의된다.

  • 가중치 연결강도(Weighted degree): 연결선의 가중치 합으로 정의되며, 방향성 네트워크에서 들어오는 연결강도(in-strength)와 나가는 연결강도(out-strength)가 각각 정의될 수 있다.
  • 연결강도
    • 무방향 네트워크 : w_ij는 노드 i와 j 사이의 가중치다. 노드 i와 j 사이에 링크가 없으면 0으로 가정한다.
    • 방향성 가중치 네트워크 : w_ij는 노드 i에서 j로의 방향성 링크의 가중치이다.

 

- NetworkX에서 가중치 속성 부여

 

  • add_edge(): 링크에 가중치 추가
  • add_weighted_edges_from(): 여러 개의 가중치 링크를 한 번에 추가
  • edges(data='weight'): 링크의 가중치 데이터를 가져옴
  • degree(weight='weight'): 가중치를 고려한 연결강도 반환

 

W = nx.Graph()

# 가중치가 있는 링크 추가
W = nx.Graph()
W.add_edge(1, 2, weight=6)
W.add_weighted_edges_from([(2, 3, 3), (2, 4, 5)])

# 가중치가 3보다 큰 링크 출력
for (i, j, w) in W.edges(data='weight'):
     if w > 3:
          print(f'({i}, {j}, {w})')

# 노드 2의 가중치 연결강도 출력
W.degree(2, weight='weight')

 

이렇게 가중치와 방향성을 활용하여 네트워크를 분석하면, 각 링크의 중요도나 강도에 따른 더 세밀한 분석이 가능하다.

 

3. 다중 계층 네트워크와 시간적으로 변하는 네트워크

- 다중 계층 네트워크 (Multilayer Network)

 다중 계층 네트워크는 여러 층으로 구성된 네트워크를 나타낸다. 예를 들어, 항공 운송 네트워크에서는 각 항공사별로 독립적인 네트워크를 구성할 수 있습니다. 각 항공사는 자사 항공편을 운영하며, 이 네트워크는 항공사의 특성을 반영한다. 지연 예측이나 승객의 재예약 상황을 분석할 때, 항공사별 네트워크를 별도로 다루는 것이 유리하다. 다중 계층 네트워크는 각 항공사의 네트워크를 개별 계층으로 구성하고, 각 계층 간 연결을 통해 상호작용을 나타낸다.

 멀티플렉스 네트워크(Multiplex Network)는 동일한 노드 집합에 대해 여러 계층을 적용한 네트워크이다. 예를 들어, 소셜 네트워크에서 한 계층은 친구 관계, 다른 계층은 가족 관계를 나타낸다. 각 계층은 동일한 노드를 공유하지만, 다른 종류의 관계를 나타내는 방식이다.

 

- 시간적으로 변하는 네트워크 (Temporal Network)

시간적으로 변하는 네트워크는 멀티플렉스 네트워크의 특별한 형태로, 링크가 시간에 따라 다르게 발생하는 네트워크이다. 즉, 동적 네트워크로, 노드 간의 상호작용이 시간에 따라 변한다. 예를 들어, 트위터의 사용자 활동 네트워크는 시간에 따라 포스트, 리트윗, 멘션이 발생하는 방식으로 변한다. 이러한 변화는 타임스탬프를 통해 추적할 수 있다. 이와 같은 시간적으로 변하는 네트워크는 여러 시간 구간으로 나누어 스냅샷(snapshot)을 만들 수 있다.

 

- 계층 간 링크와 커플링

다중 계층 네트워크에서 계층 내 링크(intralyer link)는 동일한 계층 내에서 노드들을 연결하며, 계층 간 링크(interlayer link)는 서로 다른 계층의 노드를 연결한다. 멀티플렉스 네트워크에서는 계층 간 링크가 각 계층의 노드를 서로 연결하는 커플링(coupling)으로 나타낸다. 이는 각 계층에서 동일한 노드의 복사본을 연결하는 구조이다.

 

- 네트워크 통합과 그 문제점

 멀티플렉스 네트워크를 통합할 때, 각 계층의 노드들이 연결된 링크가 하나의 가중치 네트워크로 변환될 수 있다. 예를 들어, 리트윗 횟수에 따라 링크에 가중치를 부여할 수 있다. 그러나 이 통합 과정에서 다중 계층 시스템이 제공하는 중요한 정보가 손실될 수 있다. 예를 들어, 항공 운송 네트워크를 통합하면 승객의 환승 상황이나 특정 항공사의 네트워크 문제를 분석하는 데 한계가 있을 수 있다.

 

- 네트워크의 네트워크 (Network of Networks)

 각 계층은 고유한 노드와 링크 집합을 가지고 있기 때문에 다중 계층 네트워크는 네트워크의 네트워크(network of networks)로 나타낼 수 있다. 예를 들어, 전력망과 인터넷은 서로 다른 두 네트워크가 결합된 형태이다. 전력망은 전력 전송을 최적화하고, 인터넷은 라우터와 전력 공급에 의존한다. 이처럼 두 네트워크는 서로 영향을 미칠 수 있으며, 한 네트워크의 장애가 다른 네트워크에도 영향을 미칠 수 있다. 이런 네트워크의 결합은 예상치 못한 취약점을 초래할 수 있으며, 연쇄적인 장애(cascading failure) 같은 대규모 장애를 일으킬 수 있다.

 

4. 네트워크 표현법

 네트워크를 컴퓨터 파일이나 메모리에 저장하고 처리하려면, 노드와 링크를 형식적으로 표현할 방법이 필요하다. 여러 가지 네트워크 표현법이 있으며, 그 중 대표적인 방법은 인접 행렬(Adjacency Matrix), 인접 리스트(Adjacency List), 에지 리스트(Edge List)이다.

 

- 인접 행렬 (Adjacency Matrix)

인접 행렬은 네트워크를 N × N 크기의 행렬로 표현하는 방법이다. 각 행과 열의 인덱스는 네트워크의 노드를 나타내며, 행렬 요소 a_ij는 노드 i와 j 사이의 링크 존재 여부를 나타낸다.

[그림1-3 인접행렬]

 

  • 무방향 네트워크에서는 인접 행렬이 대칭 행렬입니다. 즉, a_ij = a_ji이므로, 행렬의 절반은 불필요한 정보를 포함하고 있습니다.
  • 방향성 네트워크에서는 인접 행렬이 대칭이 아니며, 링크의 방향을 고려하여 행렬이 다르게 구성됩니다.
  • 가중치 네트워크에서는 각 요소가 링크의 가중치를 나타내며, 링크가 존재하지 않으면 값이 0입니다.

 

무방향 네트워크 인접 행렬이 대칭 행렬입니다. 즉, a_ij = a_ji이므로, 행렬의 절반은 불필요한 정보를 포함하고 있음
방향성 네트워크 인접 행렬이 대칭이 아니며, 링크의 방향을 고려하여 행렬이 다르게 구성됨
가중치 네트워크 각 요소가 링크의 가중치를 나타내며, 링크가 존재하지 않으면 값이 0임

 

- NetworkX에서 인접 행렬 출력 및 링크 속성 설정

  • 인접 행렬 가져오기
import networkx as nx
print(nx.adjacency_matrix(G))
  • 링크 속성 설정
G.edge[3][4]     # 링크 속성 가져오기
G.edge[3][4]['color'] = 'blue'     # 링크 속성 설정하기

 

- 인접 리스트 (Adjacency List)

 인접 리스트는 각 노드의 이웃을 목록 형태로 저장하는 방법이다. 링크가 존재하는 노드들만 저장하므로, 성긴 네트워크에 매우 효율적입니다. 인접 행렬의 대안으로, 공간을 절약하면서 링크를 효과적으로 표현할 수 있다.

 

- NetworkX에서 인접 리스트 설정

for n, neighbors in G.adjacency():
     for number, link_attributes in neighbors.items():
           print('(%d, %d)' % (n, number))

 

이 방법은 특히 네트워크의 링크가 드물게 존재할 때 유리하다.

 

- 에지 리스트 (Edge List)

 에지 리스트는 네트워크의 각 링크를 연결된 노드 쌍으로 나열하는 방법이다. 어떤 쌍으로도 표현되지 않는 싱글톤(singleton)은 별도로 나열할 수 있다.

 

- NetworkX에서 에지 지 리스트 표현

nx.write_edgelist(G, "file.edges")       # 에지 리스트 저장
G2 = nx.read_edgelist("file.edges")   # 에지 리스트 읽기

 

가중치가 있는 네트워크는 write_weighted_edgelist() read_weighted_edgelist()를 사용하여 읽고 쓸 수 있다.

nx.write_weighted_edgelist(W, "wf.edges")      # 가중치가 있는 에지 리스트 저장
with open("wf.edges") as f:
     for line in f:
          print(line)       # 에지 리스트 출력
W2 = nx.read_weighted_edgelist("wf.edges")   # 가중치가 있는 에지 리스트 읽기

 

5. 네트워크 시각화

 네트워크를 시각화하려면 노드를 평면에 어떻게 배치할지 결정하는 네트워크 레이아웃 알고리즘이 필요하다. 다양한 종류의 네트워크에 적합한 여러 레이아웃 알고리즘이 있으며, 각각의 네트워크 특성에 맞는 방법을 선택해야 한다.

 

- 네트워크 레이아웃 알고리즘

지리적 레이아웃
(Geographic Layout)
예를 들어 항공 운송 네트워크와 같이 실제 지리적 위치가 중요한 네트워크에 적합함.
노드를 실제 위치에 맞게 배치하여 네트워크를 시각화함
동심원 레이아웃 상대적으로 작은 네트워크에서 유용하며, 계층적 구조를 나타내기 위한 방법임.
중심 노드에서 점차적으로 원을 그리며 레벨별로 노드를 배치할 수 있음
포스 디렉티드 레이아웃
(Force-directed layout)
가장 널리 사용되는 네트워크 레이아웃 알고리즘으로, 노드를 자연스럽게 배치하여 네트워크의 구조적 특성을 시각화함.

 

- 포스 디렉티드 레이아웃 알고리즘

 포스 디렉티드 레이아웃 알고리즘의 주요 목표는 연결된 노드를 서로 가까운 위치에 배치하고, 링크의 길이를 고르게 유지하며, 교차하는 링크의 수를 최소화하는 것이다. 이 알고리즘은 물리적 시스템을 모델링하여 작동한다. 예를 들어, 두 노드를 전하를 가진 입자처럼 보고, 두 노드는 서로 밀어내는 힘을 발생시키며, 연결된 노드 사이에는 스프링을 두어 서로 끌어당기는 힘을 만든다. 이를 통해 네트워크의 에너지가 최소화되는 방향으로 노드들이 이동한다.

  • 연결된 노드는 서로 밀착되고, 연결되지 않은 노드는 멀어진다.
  • 이 레이아웃은 시각적으로 미학적으로 만족스러울 뿐만 아니라, 네트워크 내의 커뮤니티 구조를 자연스럽게 드러낼 수 있다. 예를 들어, 사회적 네트워크에서 비슷한 성향을 가진 사용자들이 물리적으로 가까운 위치에 배치되어 커뮤니티를 시각적으로 확인할 수 있다.

- NetworkX에서 네트워크 시각화

 NetworkX에서는 기본적인 네트워크 레이아웃 알고리즘을 이용해 네트워크를 그릴 수 있는 기능을 제공한다. 가장 기본적인 방법은 nx.draw() 함수이다. 이 함수는 Matplotlib과 같은 시각화 라이브러리와 함께 사용된다.

import networkx as nx
import matplotlib.pyplot as plt

# 네트워크 생성
G = nx.erdos_renyi_graph(30, 0.2)

# 네트워크 시각화
nx.draw(G) plt.show()

 

 이 방법은 100개 이하의 노드를 가진 작은 네트워크에서 동작한다. 그러나 대규모 네트워크에서는 시각화가 복잡해지고, 성능 이슈가 발생할 수 있다. 이 경우 Gephi와 같은 외부 도구나, ForceAtlas2와 같은 고급 레이아웃 알고리즘을 사용하여 시각화를 처리할 수 있다.

728x90