PySpark - GraphX 활용한 그래프 분석과 네트워크 모델링
잡학다식의 지식공방

빅데이터 관련 자료/Machine Learning

PySpark - GraphX 활용한 그래프 분석과 네트워크 모델링

carpe08 2023. 11. 30. 18:07
320x100

그래프 분석은 네트워크 모델의 구조와 상호 관계를 분석하는 중요한 방법입니다. PySpark의 GraphX 및 GraphFrames 라이브러리를 활용하면 대규모 데이터셋에서도 효율적인 그래프 분석과 네트워크 모델링이 가능합니다. 이 글에서는 PySpark를 활용한 그래프 분석 방법과 대표적인 알고리즘 적용, 그리고 시각화 방법까지 단계별로 설명하겠습니다.


1. 그래프 구성과 탐색

PySpark에서는 GraphFrames 라이브러리를 사용하여 그래프를 생성할 수 있습니다. 그래프는 노드(정점)와 엣지(간선)로 구성되며, 각각 DataFrame 형태로 정의됩니다.

from pyspark.sql import SparkSession
from graphframes import GraphFrame

# Spark 세션 생성
spark = SparkSession.builder \
    .appName("Graph Analysis") \
    .getOrCreate()

# 노드와 엣지 데이터프레임 정의
vertices = spark.createDataFrame([
    (1, 'Alice'), (2, 'Bob'), (3, 'Charlie')
], ['id', 'name'])

edges = spark.createDataFrame([
    (1, 2, 'friends'), (2, 3, 'follows')
], ['src', 'dst', 'relationship'])

# 그래프 생성
graph = GraphFrame(vertices, edges)

# 그래프 탐색: 관계 쌍 찾기
result = graph.find("(a)-[e]->(b)")
result.show()

find() 메서드를 활용하면 특정 패턴을 만족하는 노드와 엣지를 탐색할 수 있습니다. 위 예제에서는 모든 관계 쌍을 추출합니다.


2. 그래프 알고리즘 적용

GraphFrames는 다양한 그래프 알고리즘을 내장하고 있어 복잡한 관계 분석을 간편하게 수행할 수 있습니다.

PageRank 알고리즘 예시

results = graph.pageRank(resetProbability=0.15, tol=0.01)
results.vertices.select("id", "pagerank").show()

PageRank는 웹 페이지나 소셜 네트워크에서 노드의 중요도를 측정할 때 유용합니다. 위 결과에서는 각 노드의 PageRank 점수를 확인할 수 있습니다.

연결된 컴포넌트 분석

components = graph.connectedComponents()
components.select("id", "component").show()

서로 연결된 노드 집합을 파악하여 네트워크 내에서 군집 구조를 분석할 수 있습니다.


3. 네트워크 시각화

그래프 분석 결과를 시각화하면 관계 구조를 더 직관적으로 이해할 수 있습니다. PySpark 자체로는 시각화 기능이 제한되므로, NetworkX와 matplotlib를 활용하여 시각화를 수행합니다.

import networkx as nx
import matplotlib.pyplot as plt

# GraphFrame을 NetworkX 객체로 변환 (주의: toNetworkX는 사용자 정의 함수 필요할 수 있음)
nx_graph = nx.DiGraph()
nodes = vertices.collect()
edges = edges.collect()

for row in nodes:
    nx_graph.add_node(row['id'], label=row['name'])
for row in edges:
    nx_graph.add_edge(row['src'], row['dst'], label=row['relationship'])

# 시각화
pos = nx.spring_layout(nx_graph)
nx.draw(nx_graph, pos, with_labels=True, node_size=2000, node_color="lightblue")
labels = nx.get_edge_attributes(nx_graph, 'label')
nx.draw_networkx_edge_labels(nx_graph, pos, edge_labels=labels)
plt.show()

이 방식은 간단한 그래프나 테스트 목적의 데이터에 적합하며, 대규모 그래프에는 적절한 축소 또는 필터링이 필요합니다.


마무리

PySpark의 GraphFrames를 활용하면 대규모 데이터에 대한 그래프 분석과 네트워크 모델링을 효과적으로 수행할 수 있습니다. 노드 간 관계를 탐색하고, 알고리즘을 적용하며, 시각화를 통해 패턴을 도출할 수 있습니다.

앞으로는 실제 데이터셋을 활용하여 소셜 네트워크 분석, 추천 시스템, 교통망 분석 등 다양한 사례를 실습해보는 것도 좋은 방향이 될 것입니다.

320x100
320x100