인공지능/그래프

[그래프 ML] 에고 그래프 - 파이썬 NetworkX, Gephi

백관구 2024. 3. 14. 17:28
반응형

목차

     

    ※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성·장기식 옮김)

     

    ※ 이전 글 참고

     

    [그래프 ML] 그래프 데이터셋 - networkx, Network Repository, SNAP

    ※ 출처 : 그래프 머신러닝 (클라우디오 스타밀레 외, 김기성·장기식 옮김) 1. networkx Graph generators — NetworkX 3.2.1 documentation [0] D.G. Corneil, H. Lerchs, L.Stewart Burlingham, “Complement reducible graphs”, Discrete

    data-science-note.tistory.com

     

    1. 파이썬 NetworkX 활용

    * 특정 노드의 에고 그래프(ego graph)를 그리려면 어떻게 해야할까?
      - 근방 노드들을 모두 그릴수도 있지만, 개수가 많은 경우 관계를 파악하기 어려울 수 있기 때문에 아래와 같은 방법이 주로 사용됨
      - 근방을 임의로 선택
      - 중심성이 높은 근방을 선택
      - 지역 군집 계수가 높은 근방을 선택

    import numpy as np
    import matplotlib.pyplot as plt
    plt.rc("font", family="Malgun Gothic")
    
    
    n_top = round(len(neighbors) * 0.1)  # 근방 노드 중 10% 추출
    idx = {
        "랜덤": np.random.choice(neighbors, n_top ,replace=False),  # 임의로 선택
        "중심성": stats.loc[neighbors].sort_values("betweenness_centrality", ascending=False).index[:n_top],  # 중심성 높은 근방 선택
        "지역 군집 계수": stats.loc[neighbors].sort_values("C_i", ascending=False).index[:n_top]  # 지역 군집 계수 높은 근방 선택
    }
    
    fig, subs = plt.subplots(ncols=3, figsize=(15, 5))
    for method, sub in zip(["랜덤", "중심성", "지역 군집 계수"], subs.flatten()):
        subgraph = nx.subgraph(G, list(idx[method]) + [5502])  # 부분그래프 추출
        nx.draw(subgraph, pos=nx.kamada_kawai_layout(subgraph),
                node_size=50,  # 노드 크기
                node_color=["k"]*n_top+["r"],  # 노드 색상(5502번만 red 색상)
                width=0.5,  # 간선 너비
                edge_color="grey",  # 간선 색상
                ax=sub)
        sub.set_title(method)  # 제목 설정

    ASTRO-PH 5502번 에고 그래프(ego graph). 10% 추출 방식(랜덤, 중심성, 지역 군집 계수)

     

    2. Gephi 활용

    * mtx 파일을 Gephi에서 사용하기 위해 데이터를 Gephi에서 인식할 수 있는 파일 형식(GEXF; Graph Exchange XML Format)으로 내보내야 함

    nx.write_gexf(G, "astro_ph.gexf")  # GEXF 형식으로 내보내기

     

    2.1. Gephi 실행

    ① Welcome 화면에서 "Open Graph File"을 클릭
    ② 위에서 저장한 "astro_ph.gexf" 파일을 선택

    초기화면에서 "Open Graph FIle" 선택
    "astro_ph.gexf" 파일 열기

    오른쪽 위에 있는 [Context] 탭을 통해 16,706개 노드(Nodes)와 121,251개 간선(Edges)으로 구성된 그래프임을 확인 가능합니다. 이제 위에서 NetworkX를 활용해 작업했던 것처럼, 차수가 가장 높은 노드의 에고 그래프를 그리는 작업에 대해 알아보겠습니다.

     

    2.2. 노드 차수 계산

    ① [Statistics] 탭 ▶ [Network Overview] ▶ "Average Degree"의 [Run] 실행
    ② 좌측 상단 [Data Laboratory] 탭 ▶ "Degree" 열 클릭하여 내림차순 정렬하여 가장 높은 차수의 노드 Id 확인

    Average Degree 실행
    Data Laboratory

     

    2.3. 에고 그래프(Ego graph) 생성

    ① [Filters] 탭 ▶ [Topology] ▶ "Giant Component" 필터를 아래 Queries로 드래그
    ② "Ego Network" 필터를 아래 Giant Component의 "subfilter"로 드래그
    ③ Ego Network를 클릭하여 "Node ID"에 5502 입력하고 "OK" 클릭

    5502번 노드의 에고 그래프(ego graph)

     

    2.4. 가시성 개선 : 노드/간선 색상, 노드 크기 변경

    * 노드 색상을 모듈성 기준으로, 간선 색상을 단일 색상인 회색으로 변경
    * 노드 크기를 차수 기준으로 변경
    ① [Statistics] 탭 ▶ [Community Detection] 탭 ▶ "Modularity"의 [Run] 실행
    ② [Appearance] 탭 ▶ [Nodes] 팔레트(Color) 아이콘 ▶ [Partition]에서 "Modularity Class" 선택하고 [Apply] 적용
    [Edges] 팔레트(Color) 아이콘 ▶ [Unique]에서 회색 선택하고 [Apply] 적용
    ④ [Nodes] 동심원(Size) 아이콘 ▶ [Ranking]에서 "Degree" 선택하고 Max size에 50 입력

    노드 색상 변경
    간선 색상 변경
    노드 크기 변경

     

    2.5. 가시성 개선 : 레이아웃 변경

    * 레이아웃을 Fruchterman Reingold로 변경
    ① [Layout] 탭 ▶ "Fruchterman Reingold" 선택하고 [Run] 실행

    레이아웃 변경

     

    2.6. 가시성 개선 : 노드 라벨 추가

    * 노드 라벨을 추가하고, 글자 크기를 차수 기준으로 변경
    ① 화면 하단 T 아이콘(Show Node Labels) 클릭
    ② [Appearance] 탭 ▶ [Nodes] TT (Label Size) 아이콘 ▶ [Ranking]에서 "Degree" 선택하고 Min size 0.5, Max size 1 입력

    노드 라벨 추가

     

    반응형