서론: 이론에서 실제 데이터로의 전환
기존의 복잡계 네트워크 연구에서는 주로 무작위 네트워크(Random Network), 소세상 네트워크(Small-world Network), 척도 없는 네트워크(Scale-free Network)와 같은 이론적 모델을 생성하고 분석하는 데 집중했습니다. 하지만 실제 연구나 공학적 실무에서는 교통망(지하철, 버스), 전력망, 상수도망, 혹은 실제 사용자 간의 상호작용 데이터를 기반으로 한 실제 엔티티 네트워크(Entity Networks)를 다루어야 할 때가 많습니다.
이러한 네트워크는 알고리즘으로 자동 생성되는 것이 아니라, 엑셀 시트나 데이터베이스의 원시 기록으로부터 노드(Node)와 링크(Edge)를 추출하여 인접 행렬(Adjacency Matrix)을 직접 구축해야 합니다. 본 글에서는 대중교통망을 사례로 들어 Space L 모델을 구축하는 과정과 그 과정에서 발생하는 데이터 전처리 문제를 해결하는 방법을 살펴보겠습니다.
핵심 모델링 기법: Space L 모델
교통망과 같은 물리적 연결 구조를 가진 네트워크를 구축할 때 가장 보편적으로 사용하는 방법이 Space L 모델입니다.
Space L의 정의
Space L 모델의 논리는 매우 명확합니다. 동일한 노선 내에서 두 정류장이 물리적으로 인접해 있다면 이들 사이에 연결선(Edge)이 존재한다고 간주합니다.
- 노드(Node): 역 또는 정류장
- 연결선(Edge): 노선상의 물리적 경로
이 모델은 네트워크의 실제 물리적 위상 구조를 가장 잘 반영하며, 평균 경로 길이, 네트워크 효율성 및 취약성 분석의 기초 데이터가 됩니다.
데이터 전처리의 자동화 (MATLAB 구현)
수천 개의 정류장이 포함된 방대한 데이터를 수작업으로 번호 매기기란 불가능에 가깝습니다. 문자열(정류장 이름)을 컴퓨터가 이해할 수 있는 숫자 ID로 매핑하고 인접 행렬로 변환하는 자동화 프로세스가 필요합니다.
1. 원시 데이터 읽기 및 딕셔너리 생성
먼저 두 정류장의 연결 정보가 담긴 엑셀 파일(예: network_data.xlsx)을 불러옵니다. 첫 번째 열과 두 번째 열에 각각 인접한 정류장 이름이 기록되어 있다고 가정합니다.
% 데이터 로드 (문자열 배열로 읽기)
[~, ~, raw_excel_data] = xlsread('network_data.xlsx');
source_target_pairs = string(raw_excel_data);
% 전체 데이터에서 고유한 정류장 이름 추출 (노드 리스트 생성)
unique_stations = unique(source_target_pairs(:));
total_node_count = length(unique_stations);
fprintf('총 노드 수: %d\n', total_node_count);
2. 문자열을 숫자 ID로 매핑
정류장 이름을 기반으로 고유 번호를 할당하여 인접 리스트(Edge List)를 생성합니다.
% 인접 리스트 초기화
edge_list_numeric = zeros(size(source_target_pairs));
% 문자열 매핑 로직
for id = 1:total_node_count
current_name = unique_stations(id);
% 전체 데이터에서 현재 정류장 이름과 일치하는 위치를 찾아 ID 부여
match_idx = (source_target_pairs == current_name);
edge_list_numeric(match_idx) = id;
end
disp('매핑된 숫자 인접 리스트(상위 5행):');
disp(edge_list_numeric(1:5, :));
3. 인접 행렬 생성 함수
숫자로 변환된 인접 리스트를 활용해 최종적인 N x N 인접 행렬을 구축합니다.
function adj_matrix = build_matrix(edges)
% 최대 노드 번호 확인
n = max(edges(:));
adj_matrix = zeros(n, n);
num_edges = size(edges, 1);
for i = 1:num_edges
start_node = edges(i, 1);
end_node = edges(i, 2);
% 자기 자신으로의 연결(Self-loop) 제외 및 무향 그래프 처리
if start_node ~= end_node
adj_matrix(start_node, end_node) = 1;
adj_matrix(end_node, start_node) = 1;
end
end
end
% 함수 호출 및 저장
A = build_matrix(edge_list_numeric);
save('Network_Output.mat', 'A', 'unique_stations');
데이터 검증 및 시각화 (Gephi 활용)
코드가 정상적으로 작동하더라도 데이터 자체에 오류가 있을 수 있습니다. 예를 들어, "서울역"과 "서울역(1호선)"처럼 동일한 역이 다르게 표기된 경우 네트워크는 끊어지게 됩니다. 이를 확인하기 위해 Gephi와 같은 시각화 도구를 사용합니다.
검증 프로세스
- 데이터 내보내기: 생성된 인접 행렬을 CSV 포맷으로 저장하여 Gephi에서 불러옵니다.
- Force Atlas 레이아웃 적용: Gephi의 'Layout' 패널에서 Force Atlas 알고리즘을 실행합니다.
- 이상 징후 포착:
- 고립된 군집: 네트워크가 하나로 연결되지 않고 여러 덩어리로 나뉜다면, 환승역의 이름이 서로 달라 연결이 누락되었을 가능성이 큽니다.
- 외부로 튕겨 나간 노드: 중심부와 연결되지 못한 노드는 데이터 입력 오류이거나 실제 고립된 노드인지 확인이 필요합니다.
- 데이터 수정: Gephi의 'Data Laboratory'에서 라벨을 확인하고, 오류가 발견된 정류장 이름을 원본 엑셀에서 통일한 후 다시 프로세스를 가동합니다.
이러한 자동화 전처리와 시각화 검증 과정을 거치면, 복잡한 실제 엔티티 데이터를 신뢰할 수 있는 복잡계 네트워크 모델로 변환할 수 있습니다.