Python Networkx 예제 | Python의 Networkx 소개 18398 투표 이 답변

당신은 주제를 찾고 있습니까 “python networkx 예제 – Python의 NetworkX 소개“? 다음 카테고리의 웹사이트 https://you.tfvp.org 에서 귀하의 모든 질문에 답변해 드립니다: https://you.tfvp.org/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 Professor Foote 이(가) 작성한 기사에는 조회수 42,742회 및 좋아요 474개 개의 좋아요가 있습니다.

python networkx 예제 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 Python의 NetworkX 소개 – python networkx 예제 주제에 대한 세부정보를 참조하세요

Learn how to get network statistics, make visualizations, and import data for network analysis.

Jupyter Notebook at:
https://github.com/jdfoote/Intro-to-Programming-and-Data-Science/blob/summer2020/extra_topics/network_analysis.ipynb

python networkx 예제 주제에 대한 자세한 내용은 여기를 참조하세요.

파이썬 NetworkX 사용법 – 예제

파이썬 NetworkX 사용법 – 예제. 박범준2 2020. 3. 8. 23:31. 반응형. In [1]:. from IPython.core.display import display, HTML display(HTML(“<>.container …

+ 여기에 보기

Source: 95pbj.tistory.com

Date Published: 11/8/2021

View: 6211

파이썬 네트워크 시각화 분석하기(python networkx 예제 …

파이썬 네트워크 시각화 분석하기(python networkx 예제) / 파이썬 데이터 분석 실무 테크닉 100. Everly. 2022. 4. 16. 19:33. 이번 포스팅에서는 python networkx …

+ 여기에 더 보기

Source: suy379.tistory.com

Date Published: 1/20/2022

View: 220

[PYTHON] 네트워크 분석을 위한 networkx 예제

[PYTHON] 네트워크 분석을 위한 networkx 예제 · 1. 설치. pip install networkx · 2. 코드. 1) 라이브러리 호출 import networkx as nx import matplotlib.

+ 여기에 더 보기

Source: pbj0812.tistory.com

Date Published: 9/26/2022

View: 6257

[python] NetworkX를 이용한 왕좌의 게임 등장인물 네트워크 분석

왕좌의 게임이라는 미드를 한 번도 본적은 없는데, 외국에선 이 왕좌의 게임 내 인물 관계도를 네트워크 분석 예제로 많이 사용하는 듯 하여 자료를 …

+ 여기에 표시

Source: anweh.tistory.com

Date Published: 5/25/2021

View: 7947

Gallery — NetworkX 2.8.5 documentation

The following geospatial examples showcase different ways of performing network analyses using packages within the geospatial Python ecosystem. Example …

+ 여기를 클릭

Source: networkx.org

Date Published: 12/4/2022

View: 8100

NetworkX를 이용한 네트워크 분석

NetworkX with Network Analysis. 2014년 8월 30일 … 표: 네트워크 예제 … NetworkX is a Python language software package for the creation,.

+ 여기에 자세히 보기

Source: pythonkr.github.io

Date Published: 2/27/2022

View: 9313

파이썬 Networkx (node, edge 생성) – studyweb

Networkx는 파이썬 라이브러리 중 하나로 네트워크를 그리는데 유용한 라이브러리 … 아래의 예제에서는 무방향성 그래프 g1을 기준으로 작성하겠다.

+ 더 읽기

Source: studyweb.tistory.com

Date Published: 7/11/2022

View: 4144

Python Simple Networkx Example – deparkes

Networkx is a python package for creating, visualising and analysing graph networks. This post gives a simple networkx example to show how …

+ 여기를 클릭

Source: deparkes.co.uk

Date Published: 9/11/2022

View: 2378

NetworkX를 사용하여 단어 동시 출현 분석하기 – Python 3 …

이번에는 Python3의 NetworkX 모듈을 사용하여 동시 출현 분석을 해보려고 한다. 어떤 주제의 신문 기사에 A라는 단어와 B라는 단어가 동시에 들어가 …

+ 여기에 더 보기

Source: foreverhappiness.tistory.com

Date Published: 10/15/2021

View: 1098

주제와 관련된 이미지 python networkx 예제

주제와 관련된 더 많은 사진을 참조하십시오 Python의 NetworkX 소개. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

Python의 NetworkX 소개
Python의 NetworkX 소개

주제에 대한 기사 평가 python networkx 예제

  • Author: Professor Foote
  • Views: 조회수 42,742회
  • Likes: 좋아요 474개
  • Date Published: 2020. 6. 9.
  • Video Url link: https://www.youtube.com/watch?v=flwcAf1_1RU

파이썬 네트워크 시각화 분석하기(python networkx 예제) / 파이썬 데이터 분석 실무 테크닉 100

이번 포스팅에서는 python networkx 라이브러리를 활용해 네트워크를 가시화하는 방법을 알아보고, 실제 물류 데이터를 적용하여 효율적으로 운송이 이루어지고 있는지를 살펴봅니다.

최적화를 시각화하는 라이브러리는 다양하지만 여기서는 networkx를 사용합니다.

✔Table of Contents

Tech 53. 네트워크 가시화하기 (기초)

먼저 네트워크 시각화를 하기 위해선 다음이 필요합니다.

그래프 객체

노드(node) : 점

엣지(edge) : 점과 점을 연결하는 선

좌표 : 점의 좌표

위의 순서를 지켜, 가장 기본적인 네트워크를 만들어보겠습니다.

import networkx as nx import matplotlib.pyplot as plt #그래프 객체 설정 G = nx.Graph() #노드 설정 G.add_node(‘nodeA’) G.add_node(‘nodeB’) G.add_node(‘nodeC’) #엣지 설정 G.add_edge(‘nodeA’, ‘nodeB’) G.add_edge(‘nodeA’, ‘nodeC’) G.add_edge(‘nodeB’, ‘nodeC’) #좌표 설정 pos = {} pos[‘nodeA’] = (0,0) pos[‘nodeB’] = (1,1) pos[‘nodeC’] = (0,1) #그리기 nx.draw(G, pos, with_labels= True) plt.show()

코드는 간단합니다.

우선 그래프 객체 ‘G’를 설정하고 add_node를 사용해 노드(node)를 설정합니다. 여기선 노드를 nodeA, B, C 이렇게 3가지를 설정했습니다.

그리고 각 노드(점)을 잇는 엣지를 add_edge를 사용해 이어줍니다. 마지막으로 노드의 좌표를 설정해주면 됩니다. 좌표가 잘 이해가 되지 않는다면 다음 그림을 참고하세요:

우리가 고등학교 때 배웠던 좌표평면 위에 node A, B, C를 그렸다고 생각하면 됩니다.

Tech 54. 네트워크에 노드를 추가하기

이번엔 한 단계를 더 나아가보죠. 새로운 노드인 nodeD를 추가해봅니다. 이 노드는 nodeA하고만 연결이 되며, 좌표는 (1,0)으로 설정해보겠습니다. 코드는 어떻게 써야 할까요? 위에서 사용한 코드를 살짝만 변형합니다.

#앞서 만든 그림에 새로운 노드 nodeD(nodeA와 연결되는)를 추가한다. #노드 G.add_node(‘nodeD’) #엣지 G.add_edge(‘nodeA’, ‘nodeD’) #좌표설정 pos[‘nodeD’] = (1,0) #그리기 nx.draw(G, pos, with_labels = True)

노드-엣지-좌표 순으로 새로운 노드인 nodeD를 추가해주면 됩니다.

Tech 55. 경로에 가중치 부여하기

여기까지 우리가 기본적인 경로를 그려보았는데요. 하지만 우리가 마주하게 될 경로는 굉장히 복잡합니다. 이렇게 노드와 노드 간의 경로가 하나가 아닌 여러 개가 될 수도 있죠. 이렇게 많이 사용하는 경로와 적게 사용하는 경로는 어떻게 구분해서 그릴 수 있을까요?

바로 “가중치” 를 사용하면 됩니다. 가중치의 값이 커질수록, 노드 사이의 “엣지”의 굵기를 더 굵게 하면 됩니다 .

가중치를 얻어오는 방법은 여러가지가 있지만, 여기선 csv 파일에 저장된 가중치 정보를 데이터프레임으로 읽어 와서 사용하겠습니다.

import pandas as pd import numpy as np import matplotlib.pyplot as plt import networkx as nx #데이터 불러오기 df_w = pd.read_csv(‘6장/network_weight.csv’) #가중치 df_p = pd.read_csv(‘6장/network_pos.csv’) #좌표 display(df_w, df_p)

이렇게 가중치 정보가 담긴 데이터 ‘df_w’, 좌표 정보가 담긴 데이터 ‘df_p’를 불러왔습니다.

데이터를 보면 알겠지만, 노드는 node A~E까지 총 5개가 있네요. 그리고 각 노드 간 엣지의 굵기(가중치)가 df_w에 저장되어 있고, 노드의 좌표는 df_p를 사용하면 되겠네요!

우선 엣지 가중치를 리스트화해봅니다. 빈 리스트 edge_w를 만들고, 각 행, 열에 해당하는 가중치를 넣어줍니다. 예를 들어 노드A에 대해선 0번 인덱스에 해당하는 모든 열의 값을 가져오면 되겠죠?

그럼 노드A-A , 노드A-B, 노드A-C, 노드A-D, 노드A-E 를 연결하는 엣지의 가중치 값이 담길 것입니다. 코드로 만들어봅시다. (다만 가중치 값이 너무 작은 관계로 10을 곱한 값을 가중치로 사용합시다.)

size = 10 edge_w = [] for i in range(len(df_w)): for j in range(len(df_w.columns)): edge_w.append(df_w.iloc[i][j]*size) edge_w

이제 이렇게 가중치를 리스트로 저장했습니다.

엣지에 가중치를 설정할 때와 아닐 때의 그래프의 차이가 어떻게 나타나는지를 확인하기 위해, 먼저 가중치가 없을 때의 그래프를 그려봅시다. 위의 df_w와 df_p를 활용해, 노드, 엣지, 좌표만 설정 해봅니다.

#객체 G = nx.Graph() #노드 5개 설정 for i in range(len(df_w.columns)): G.add_node(df_w.columns[i]) #엣지 설정 for i in range(len(df_w.columns)): for j in range(len(df_w.columns)): G.add_edge(df_w.columns[i], df_w.columns[j]) #좌표 설정 pos = {} for i in range(len(df_w.columns)): node = df_w.columns[i] pos[node] = (df_p[node][0], df_p[node][1]) #pos[노드] = (좌표) 임을 이용 #그리기 nx.draw(G, pos, with_labels=True) plt.show()

모든 노드 간 엣지의 굵기가 똑같습니다. 그래서 어떤 노드들 간에 더 가중치값이 큰지를 전혀 알아볼 수가 없습니다.

이제 앞서 구한 가중치 리스트 edge_w 를 활용해 다시 그림을 그려봅시다. 엣지에 가중치를 추가하는 것은 width 옵션 으로 지정하면 됩니다.

#엣지에 가중치 추가, 꾸미기 nx.draw(G, pos, with_labels=True, font_size = 16, node_size = 1000, node_color= ‘k’, font_color = ‘w’, width = edge_w) #가중치는 width 옵션으로 지정 plt.show()

이렇게 가중치를 부여한 그림을 그리면, 어떤 경로가 더 부각되는지를 직관적으로 파악하기 쉽겠죠?

참고로 width 옵션 외에도 그림을 꾸미기 위한 다양한 옵션을 추가하였습니다. 노드와 폰트의 크기 및 색깔을 바꿨습니다.

Tech 56 – 57. 운송 경로 데이터를 불러오고 시각화하자.

이제는 어떻게 그리는지를 배웠으니, 물류 데이터를 직접 가져와서 networkx 라이브러리로 시각화를 해봅니다. 사용하는 데이터는 다음의 2가지입니다.

trans_route.csv : 운송 경로 데이터. 창고(W) 에서 공장(F) 으로의 운송량이 기록됨 (df_tr)

trans_route_pos.csv : 창고(W) 및 공장(F) 의 위치정보 (df_pos)

df_tr = pd.read_csv(‘6장/trans_route.csv’, index_col = ‘공장’) df_pos = pd.read_csv(‘6장/trans_route_pos.csv’) display(df_tr, df_pos)

2가지 데이터를 불러왔습니다. 참고로 문제를 단순화하기 위해, df_tr 데이터에서는 창고(W) -> 공장(F) 에서만 물류가 이동한다고 봅니다.

시각화를 할 때는 창고(W)와 공장(F)을 노드로 사용하고, 각 노드 간 가중치를 df_tr 데이터로 사용합니다. 그리고 창고와 공장의 위치정보는 df_pos 데이터를 활용하면 되겠죠?

책에 시각화 코드가 나와있는데, 좀 복잡하게 되어 있어서 더 간단하게 쓴 제 코드로 설명하겠습니다.

시각화 코드의 순서는 위에서 했던 것과 똑같습니다. 노드 설정 – 엣지 설정 – 좌표 설정의 순서 로 하면 됩니다. 여기서 주의할 점은 경로는 창고에서 공장으로의 이동만 있다는 점입니다. 따라서, 창고와 창고 간의 이동이나 공장과 공장 간의 이동은 없습니다.

그러므로, 엣지를 설정할 때 창고(W)에서 하나를 뽑고, 공장(F)에서 하나를 뽑아 연결짓는 방식으로 코드를 짰습니다.

가중치를 적용하지 않은 버전입니다.

#객체 G = nx.Graph() #노드 설정(W 3개, F 4개) for i in range(len(df_pos.columns)): G.add_node(df_pos.columns[i]) #엣지 설정(W에서 하나 – F에서 하나를 연결) for i in range(0, 3): for j in range(3, len(df_pos.columns)): G.add_edge(df_pos.columns[i], df_pos.columns[j]) #좌표 설정 pos = {} for i in range(len(df_pos.columns)): node = df_pos.columns[i] pos[node] = (df_pos[node][0],df_pos[node][1]) #그리기 nx.draw(G, pos, with_labels=True) plt.show()

엣지에 가중치를 설정해봅시다. 가중치로는 df_tr의 값을 사용하는데, 가중치 값이 너무 커서 값을 그대로 사용하면 선이 엄청 뚱뚱하게 그려집니다. 그래서 가중치 값에 0.1을 곱해 값을 좀 줄여줍니다.

sy = [] size = 0.1 #가중치 값이 너무 커서 줄임 (그대로 쓰면 엣지가 엄청 굵게나옴) for i in range(len(df_tr.index)): for j in range(len(df_tr.columns)): sy.append(df_tr.iloc[i,j]*size) sy

위에서 만든 가중치 리스트 sy를 넣어 그림을 다시 그려봅니다.

#그래프 다시 그리기 nx.draw(G, pos, with_labels=True, font_size = 16, node_size = 1000, node_color = ‘k’, font_color= ‘w’, width = sy) #width에 가중치 리스트 설정 plt.show()

이렇게 경로가 완성되었습니다. 이렇게 시각화하여 경로를 뽑아보니, 그냥 숫자로 볼 때보다 훨씬 더 직관적인 이해가 가능하죠? 창고 W2에서 공장 F3로 가는 경로가 가장 두드러지네요!

이번엔 책에 나온 방식으로 코드를 설명하겠습니다.

다른 점은 엣지와 가중치 설정 부분인데요. 저는 엣지와 가중치 설정 코드를 따로 썼지만 책에서는 for문으로 묶어 한번에 해결했습니다.

또한 저는 창고(W)와 공장(F) 간에만 엣지를 설정할 수 있기 때문에 W에서 하나, F에서 하나를 뽑아 엣지를 설정했지만, 책에서는 그냥 모든 조합을 만들고 W와 F를 연결하는 것이 아닌 경우엔 가중치(weight)를 0으로 두는 방법 을 썼습니다. 주석에 설명을 달아두었으니 참고하세요!

#객체 G = nx.Graph() #노드 설정(W 3개, F 4개) for i in range(len(df_pos.columns)): G.add_node(df_pos.columns[i]) #—————————————– 엣지와 가중치 리스트 설정을 한번에! num_pre = 0 edge_w = [] #가중치 리스트. for문을 통해 가중치(weight) 값을 하나하나 쌓을것 size = 0.1 for i in range(len(df_pos.columns)): for j in range(len(df_pos.columns)): if i != j : #이 경우에만 엣지 설정 -> 자기자신에 대해서는 X, 다만 W끼리, F끼리도 엣지 설정할 수 있음 (가중치만 안 넣어주면 됨) G.add_edge(df_pos.columns[i], df_pos.columns[j]) #엣지 가중치 추가 if num_pre < len(G.edges): #num_pre의 기본값인 0보다 len(G.edges)가 크다면 (즉, 엣지가 하나 이상 만들어진 경우) num_pre = len(G.edges) #num_pre 값을 len(G.edges)로 바꿔줌 weight = 0 #가중치 초기화 : W끼리/ F끼리의 엣지라면 0으로 넣게됨. ## 이제 weight를 추가해보자. (weight는 W와 F 간에만 존재) if (df_pos.columns[i] in df_tr.columns) and (df_pos.columns[j] in df_tr.index): #i에 해당하는 F 와 j에 해당하는 W값이 존재(True) 한다면 if df_tr[df_pos.columns[i]][df_pos.columns[j]]: #가중치값이 존재(True)한다면 weight = df_tr[df_pos.columns[i]][df_pos.columns[j]]*size #weight에 그 값을 넣기 elif (df_pos.columns[j] in df_tr.columns) and (df_pos.columns[i] in df_tr.index): #반대로, j에 해당하는 F와 i에 해당하는 W 값이 존재한다면 if df_tr[df_pos.columns[j]][df_pos.columns[i]]: #그리고 가중치값이 존재한다면 weight = df_tr[df_pos.columns[j]][df_pos.columns[i]]*size #weight에 그 값을 넣기 #weight(가중치) 리스트화 edge_w.append(weight) #--------------------------------------------- #좌표 설정 pos = {} for i in range(len(df_pos.columns)): node = df_pos.columns[i] pos[node] = (df_pos[node][0],df_pos[node][1]) #그리기 nx.draw(G, pos, with_labels=True, font_size = 16, node_size = 1000, node_color = 'k', font_color= 'w', width = edge_w) #width에 가중치 리스트 설정) plt.show() 좀더 자세히 설명하자면 if문이 한번 실행될 때마다 edge_w에 가중치(weight) 값이 차곡차곡 담깁니다. W끼리의 가중치이거나 F끼리의 가중치이면 기본값인 0이 담기고, W와 F 간의 가중치라면 df_tr에 있는 가중치값이 담깁니다. 이렇게 해서 총 21개의 가중치가 담기게 되는데요, 이는 7개의 가짓수(창고+공장 개수 = 7개) 에서 중복을 포함하지 않게 2개를 선택하는 경우인 7C2 = 21의 값과 동일합니다. 제가 한 것은 어차피 W끼리, F끼리의 가중치 값은 0이므로 애초에 포함시키지 않는 방법을 썼습니다. 즉, W와 F 각각에서 중복을 포함하지 않고 하나씩 뽑는 것이므로 3C1 * 4C1 =12개입니다. 앞서 21개 중에서 가중치 값이 있는 경우는 12개뿐이므로 제가 한 것과 교재에서 한 결과가 같은 이유입니다! (저는 개인적으로 제가 한 방법이 더 쉬운 거 같네요..!) 이로써 오늘의 포스팅을 마칩니다. 이번 포스팅을 통해, python networkx 라이브러리를 활용해 경로를 시각화하는 방법을 배웠습니다. 다음 포스팅에서는 목적 함수와 제약조건을 설정하는 방법을 배우고, 직접 이를 설정하여 최적화를 진행해봅니다. 궁금한 점 있으시다면 언제든 댓글 주세요! 감사합니다 🙂 반응형

[PYTHON] 네트워크 분석을 위한 networkx 예제

1. 설치

pip install networkx

2. 코드

1) 라이브러리 호출

import networkx as nx import matplotlib.pyplot as plt # 그래프 생성 G = nx.DiGraph()

2) 노드(점) 생성

G.add_nodes_from([1, 2, 3, 4, 5])

3) 엣지(선) 생성

G.add_edges_from([(1, 2), (2, 1), (2, 3), (2, 3), (2, 3), (2, 3), (2, 3), (2, 3), (2, 3), (2,4), (4, 2), (2, 3), (2, 3), (2, 3), (2, 3), (2, 3), (2, 3), (2, 3), (2, 3), (2, 3), (2, 3), (2, 3), (2, 3)])

4) degree 생성

– 결과 : [(1, 2), (2, 5), (3, 1), (4, 2), (5, 0)]

degree = nx.degree(G) print(degree)

5) 그래프 그리기

– 위의 degree 리스트를 순서대로 읽으면서 그 값에 따라 크기가 변하도록 조정

nx.draw(G,node_size=[500 + v[1]*500 for v in degree], with_labels=True)

3. 참고

– 김경훈님 슬라이드쉐어(잘 되어 있음)

– 유병혁님의 예제

– 네트워크 분석 설명

[python] NetworkX를 이용한 왕좌의 게임 등장인물 네트워크 분석

왕좌의 게임이라는 미드를 한 번도 본적은 없는데, 외국에선 이 왕좌의 게임 내 인물 관계도를 네트워크 분석 예제로 많이 사용하는 듯 하여 자료를 구해봤다.

asoiaf-all-edges.csv 0.12MB asoiaf-all-nodes.csv 0.02MB

1. 라이브러리 및 데이터 불러오기

import networkx as nx import pandas as pd import matplotlib.pyplot as plt import itertools import os os.chdir(‘C:/Users/user/Desktop/PyStudy/asoiaf-master/data/’) all_books = [‘asoiaf-all-edges.csv’, ‘asoiaf-all-nodes.csv’] li = [] for f in all_books: tmp = pd.read_csv(f) li.append(tmp)

asoiaf-all-edges.csv dataframe asoiaf-all-nodes.csv dataframe

2. 데이터 정제 및 그래프 생성

df = pd.concat(li, axis=0, ignore_index=True) #합치기 df = df[[‘Source’, ‘Target’]] #source, target 컬럼만 남기기 df.drop_duplicates(subset=[‘Source’, ‘Target’], inplace=True) #겹치는 데이터 삭제 G = nx.from_pandas_edgelist(df, source=’Source’, target=’Target’) print(len(G.nodes())) #797 print(len(G.edges())) #2824

3. 중심성 계산

”’ CENTRALITY ”’ # Compute the betweenness centrality of G: bet_cen bet_cen = nx.betweenness_centrality(G) sorted(bet_cen.items(), key=lambda x:x[1], reverse=True)[0:5] # Compute the degree centrality of G: deg_cen deg_cen = nx.degree_centrality(G) sorted(deg_cen.items(), key=lambda x:x[1], reverse=True)[0:5] # Compute the page rank of G: page_rank page_rank = nx.pagerank(G) sorted(page_rank.items(), key=lambda x:x[1], reverse=True)[0:5] # Compute the closeness centrality of G: clos_cen clos_cen = nx.closeness_centrality(G) sorted(clos_cen.items(), key=lambda x:x[1], reverse=True)[0:5]

NetworkX는 그래프를 활용한 다양한 계산에 대한 라이브러리가 잘 구축 되어 있다.

내가 왕좌의 게임 네트워크 분석에 사용한 연결중심성은 네 가지 이다.

betweenness centrality (매개중심성): 노드간 경로에 있는 사람이 더 중심도가 높다는 이론을 근거로 계산. 한마디로 노드와 노드 사이를 잇는 나들목에 여러번 등장하는 노드가 중요하다는 뜻이다.

degree centrality (연결중심성): 한 노드에 연결된 모든 간선의 갯수. 네트워크의 중심성 정도를 판단하는 방법.

page rank: 여태까지 등장한 중심성 알고리즘 중에 가장 성공한 알고리즘이라는데… 고유벡터 중심성의 변형인 Katz 중심성의 변형이라고 한다. 한마디로 끝판왕… Katz 중심성에선 한 노드의 중요성이 그와 연결된 다른 노드들에게도 전파되는 특징이 있다. 그러나 한 노드가 비정상적으로 중요하게 계산될 경우, 그 주변의 노드들도 함께 중요하게 계산 되는 편파적인? 계산이 나올 수 있다. 이러한 문제를 해결한 중심성이라고 한다.

closeness centrality (근접중심성): 중요한 노드일 수록 다른 노드까지의 거리가 짧다는 이론을 근거로 계산함.

그 외에도 수많은 중심성 척도가 있다 (참고: bab2min.tistory.com/554)

4. 중심성 계산 결과

betweenness centrality degree centrality page rank closeness centrality

어떤 중심성 계산을 하느냐에 따라 중요 인물의 순위가 바뀌는게 참 신기하다.

1위 2위는 번갈아가면서 나온다는게 신기…

네트워크 이론을 좀 더 깊게 공부해보고 싶어졌다!

데이터분석도 재밌지만 네트워크를 통한 데이터분석과 상관관계 확인도 매우 재밌는듯!

Jon Snow Tyrion Lannister

근데 주인공들이 둘 다 왜이렇게 억울하게 생긴거지….

Gallery — NetworkX 2.8.5 documentation

General-purpose and introductory examples for NetworkX. The tutorial introduces conventions and basic graph manipulations.

External libraries# Examples of using NetworkX with external libraries. Javascript# igraph#

파이썬 Networkx (node, edge 생성)

Networkx는 파이썬 라이브러리 중 하나로 네트워크를 그리는데 유용한 라이브러리이다.

이번 포스팅에서는 필자가 연구를 하면서 Networkx 라이브러리를 활용했던것을 정리할 것이다.

천천히 포스팅을 읽어보면 쉽게 이해할 수 있을 것이다.

1. Library import 방법

Import networkx as nx

Jupyter notebook에 위의 문장을 넣으면 networkx를 사용할 수 있다.

2. Graph 생성

g1 = nx.Graph()

g2 = nx.DiGraph()

위의 문장은 무방향성 그래프 g1과 방향성 그래프 g2를 정의하는 문장이다.

물론 다 아시겠지만 여기서 g1, g2는 사용자가 원하는 이름으로 바꿀 수 있다.

아래의 예제에서는 무방향성 그래프 g1을 기준으로 작성하겠다.

3. Graph에 Node 생성(추가)

g1.add_node(1) # 생성한 g1그래프에 노드 1을 생성(추가)

g1.add_node(“a”) # 생성한 g1그래프에 노드 “a”를 생성(추가)

g1.add_nodes_from( [2, 7, 3] ) # 생성한 그래프에 노드 2, 7, 3을 생성(추가)

노드를 1개 추가할때는 ‘add_node’를 쓰고, 동시에 여러개를 추가하고 싶으면 ‘add_nodes_from’을 사용하면 된다.

‘add_nodes_from’을 사용할때 list형태로 작성하는 것을 주의하면 좋을 것 같다.

4. Graph에 edge 생성(추가)

g1.add_edge(1,”a”) # 노드 1과 “a”를 연결하는 Edge를 생성(추가)

g1.add_edge(2,7) # 노드 2와 7을 연결하는 Edge를 생성(추가)

g1.add_edges_from( [ (2,7), (1,”a”)] ) # 노드 2와 7을 연결하는 Edge, 노드 1과 “a”를 연결하는 edge를 생성

노드를 추가하는 것과 마찬가지로 1개를 추가할때는 ‘add_edge’를 쓰고, 동시에 여러개를 추가하고 싶으면

‘add_edges_from’을 사용하면 된다.

‘add_edges_from’을 사용할때 list안의 원소가 tuple형태로 작성하는 것을 주의하면 좋을 것 같다.

5. Graph 그림 그리기

nx.draw(g1) #g1 그래프를 시각화

위의 명령어를 입력하면 다음과 같이 그림이 표현된다.

하지만 아래의 graph는 node의 이름과 edge의 굵기와 같은 속성들이 하나도 표시되지 않았다.

다음포스팅에서는 graph node와 edge에 속성을 부여하고 이를 graph에 시각화 하는 법을 작성해보겠다.

Python Simple Networkx Example

Networkx is a python package for creating, visualising and analysing graph networks. This post gives a simple networkx example to show how it works.

A simple Networkx Example

A graph network is built from nodes – the entities of interest, and edges – the relationships between those nodes. To create a graph we need to add nodes and the edges that connect them.

Networkx is capable of operating on graphs with up to 10 million rows and around 100 million edges, but for now we will just create a small example graph.

If we try to create an edge with a node that does not yet exist, networkx will create that node. This means that we can make a simple networkx example with the following code.

import networkx as nx # Create a networkx graph object my_graph = nx.Graph() # Add edges to to the graph object # Each tuple represents an edge between two nodes my_graph.add_edges_from([ (1,2), (1,3), (3,4), (1,5), (3,5), (4,2), (2,3), (3,0)]) # Draw the resulting graph nx.draw(my_graph, with_labels=True, font_weight=’bold’)

This will produce this output

Taking Things Further

To take things further, there are some extensions and additions you could try, such as:

Add new edges between existing nodes

Add new edges between existing nodes and new nodes

Add new nodes without edges

NetworkX를 사용하여 단어 동시 출현 분석하기 – Python 3, Windows 10 (Feat. NetworkX)

아래 글에서 이어지는 내용이다.

foreverhappiness.tistory.com/35

이번에는 Python3의 NetworkX 모듈을 사용하여 동시 출현 분석을 해보려고 한다.

어떤 주제의 신문 기사에 A라는 단어와 B라는 단어가 동시에 들어가 있을 때 두 단어는 연관성이 있다고 판단한다.

한 주제에 대해 모든 신문 기사를 조사했을 때 동시 출현하는 빈도수가 높을수록 그 두 단어의 연관성은 높아진다.

NetworkX는 단어들과 단어들 사이에 연관성이 깊은지, 또한 그 단어가 해당 주제와 얼마나 관련이 있는지 시각적으로 나타내 보여줄 수 있는 모듈이다.

먼저 cmd 혹은 명령 프롬프트 창을 열어 아래와 같이 입력해주자.

pip install networkx

위 명령을 입력하면 networkx가 설치될 것이다.

단어 쌍의 빈도수를 알아보기 위해 우리는 DTM(Document Term Matrix)을 사용할 것이다.

사실 이외에도 동시 출현 빈도수를 파악하는 방법은 여러 가지 많다.

해당 방식은 최적이 아님을 미리 알린다.

혹시나 DTM파일이 없어서 필요하다면 아래 링크를 참고하길 바란다.

https://github.com/happiness96/Web-Crawling/tree/master/crawling

이제 아래 코드를 참고하여 단어 쌍 동시 출현 빈도수를 파악해보자.

# -*- encoding: utf-8 -*- import pandas as pd from tqdm import tqdm if __name__ == ‘__main__’: # 단어쌍의 빈도를 체크하기위해 DTM을 불러온다. dataset = pd.read_csv(‘D:\crawling\DTM.csv’) # 단어들의 목록을 가져온다. # 이때 0번째 인덱스에는 빈 칸이 들어오므로 인덱싱을 통해 없애준다. column_list = dataset.columns[1:] word_length = len(column_list) # 각 단어쌍의 빈도수를 저장할 dictionary 생성 count_dict = {} for doc_number in tqdm(range(len(dataset)), desc=’단어쌍 만들기 진행중’): tmp = dataset.loc[doc_number] # 현재 문서의 단어 출현 빈도 데이터를 가져온다. for i, word1 in enumerate(column_list): if tmp[word1]: # 현재 문서에 첫번째 단어가 존재할 경우 for j in range(i + 1, word_length): if tmp[column_list[j]]: # 현재 문서에 두번째 단어가 존재할 경우 count_dict[column_list[i], column_list[j]] = count_dict.get((column_list[i], column_list[j]), 0) + max(tmp[word1], tmp[column_list[j]]) # count_list에 word1, word2, frequency 형태로 저장할 것이다. count_list = [] for words in count_dict: count_list.append([words[0], words[1], count_dict[words]]) # 단어쌍 동시 출현 빈도를 DataFrame 형식으로 만든다. df = pd.DataFrame(count_list, columns=[“word1”, “word2”, “freq”]) df = df.sort_values(by=[‘freq’], ascending=False) df = df.reset_index(drop=True) # 이 작업이 오래 걸리기 때문에 csv파일로 저장 후 사용하는 것을 추천한다. df.to_csv(‘D:\crawling\

etworkx.csv’, encoding=’utf-8-sig’)

DTM의 행은 문서의 번호, 열은 각 단어를 의미하며 해당 문서에 각 단어가 출현한 빈도수를 나타낸 것이 DTM이다.

각 문서별로 출현한 단어 쌍을 계산해 count_dict에 누적시키면 모든 문서에 대해 출현한 단어 쌍의 빈도수를 계산할 수 있다.

우리가 DTM을 만들 때 “화재 및 폭발 가능성”에 대한 단어들만 분류했었다.

이 작업을 거치고 나면 이 주제에 대해 어떤 단어들이 서로 연관성이 있고 어떤 단어들이 이 주제와 관련이 깊은지를 파악할 수 있다.

빈도수를 계산할 때 이 방법은 시간이 많이 걸린다. 즉 비효율적이라 다른 효율적인 방법이 많다.

현재 상황에서는 그 쉬운 방법을 구현하기 까다롭기 때문에 이 방법을 채택했다.

추후에 기회가 된다면 다른 효율적인 방법들도 올려보도록 하겠다.

시간이 오래 걸리다 보니 이를 DataFrame으로 만들어 csv파일로 저장해놓고 사용하기로 결정했다.

이제 이것으로 Networkx를 그릴 수 있다.

시각화하기 전에 몇 가지 알고 가야 할 개념들이 있다.

네트워크를 구성하는 중심성을 결정하는 몇 가지 척도들이 있는데 Networkx에서 이것들을 모두 제공하고 있기 때문에 짚고 넘어가야 할 부분이다.

네트워크 그래프적으로 생각한다면 연관어, 관련어 한 쌍이 함께 등장하는 횟수는 그래프에서 간선(Edge)에 해당하며 단어 하나는 node에 해당하고 단어가 등장하는 횟수는 node의 size로 볼 수 있다.

연결 중심성 (Degree Centrality)

연결된 노드가 많을수록 중심성의 크기가 커진다는 관점을 가진다.

여기서는 관련어, 연관어의 개수를 통해 해당 단어가 얼마나 중요한지를 노드의 크기를 통해 나타 낼 수 있다.

매개 중심성 (Betweenness Centrality)

노드와 노드 사이의 최단 경로를 계산할 때 해당 노드를 얼마나 거쳐가는가를 척도로 한다.

여기서는 크게 쓸 일이 없을 것이다.

근접 중심성 (Closeness Centrality)

다른 노드들까지의 최단 경로가 가까울수록 해당 노드가 중요하다는 척도를 가진다.

여기서는 연관어들 사이에 얼마나 연관성이 깊은지를 판단할 수 있을 것이다.

고유 벡터 중심성 (Eigenvector Centrality)

연결 중심성과 약간 비슷하다.

차이가 있다면 연결된 다른 노드의 중심성도 고려한다는 것이다.

중심성의 크기가 큰 노드들과 많이 연결될수록 중요하다고 판단한다.

페이지 랭크 (Page Rank)

다른 노드의 중심성과 연결되어있는 다른 노드의 개수에 따라 해당 노드의 중심성 크기를 상대적으로 결정하는 알고리즘이다.

여기서 상대적으로 결정한다는 것은 한 노드의 중심성이 A라고 한다면 연결되어있는 다른 노드의 중심성의 크기를 결정할 때 일정한 임의의 수로 나눠 A / x의 중심성을 가지게 된다. (물론 연결되어있는 다른 노드들도 많기 때문에 이 상대적인 값은 계속해서 조정된다.)

지금까지 등장한 중심성 알고리즘 중 가장 최적화된 알고리즘이다.

자 이제 아래 코드를 참고하여 단어 네트워크를 그려보자.

# -*- encoding: utf-8 -*- import pandas as pd import networkx as nx import operator import numpy as np if __name__ == ‘__main__’: # 단어쌍 동시출현 빈도수를 담았던 networkx.csv파일을 불러온다. dataset = pd.read_csv(‘D:\crawling\

etworkx.csv’) # 중심성 척도 계산을 위한 Graph를 만든다 G_centrality = nx.Graph() # 빈도수가 20000 이상인 단어쌍에 대해서만 edge(간선)을 표현한다. for ind in range((len(np.where(dataset[‘freq’] >= 20000)[0]))): G_centrality.add_edge(dataset[‘word1’][ind], dataset[‘word2’][ind], weight=int(dataset[‘freq’][ind])) dgr = nx.degree_centrality(G_centrality) # 연결 중심성 btw = nx.betweenness_centrality(G_centrality) # 매개 중심성 cls = nx.closeness_centrality(G_centrality) # 근접 중심성 egv = nx.eigenvector_centrality(G_centrality) # 고유벡터 중심성 pgr = nx.pagerank(G_centrality) # 페이지 랭크 # 중심성이 큰 순서대로 정렬한다. sorted_dgr = sorted(dgr.items(), key=operator.itemgetter(1), reverse=True) sorted_btw = sorted(btw.items(), key=operator.itemgetter(1), reverse=True) sorted_cls = sorted(cls.items(), key=operator.itemgetter(1), reverse=True) sorted_egv = sorted(egv.items(), key=operator.itemgetter(1), reverse=True) sorted_pgr = sorted(pgr.items(), key=operator.itemgetter(1), reverse=True) # 단어 네트워크를 그려줄 Graph 선언 G = nx.Graph() # 페이지 랭크에 따라 두 노드 사이의 연관성을 결정한다. (단어쌍의 연관성) # 연결 중심성으로 계산한 척도에 따라 노드의 크기가 결정된다. (단어의 등장 빈도수) for i in range(len(sorted_pgr)): G.add_node(sorted_pgr[i][0], nodesize=sorted_dgr[i][1]) for ind in range((len(np.where(dataset[‘freq’] > 20000)[0]))): G.add_weighted_edges_from([(dataset[‘word1’][ind], dataset[‘word2’][ind], int(dataset[‘freq’][ind]))]) # 노드 크기 조정 sizes = [G.nodes[node][‘nodesize’] * 500 for node in G] options = { ‘edge_color’: ‘#FFDEA2’, ‘width’: 1, ‘with_labels’: True, ‘font_weight’: ‘regular’, } # 폰트 설정을 위한 font_manager import import matplotlib.font_manager as fm import matplotlib.pyplot as plt # 폰트 설정 fm._rebuild() # 1회에 한해 실행해준다. (폰트 새로고침, 여러번 해줘도 관계는 없다.) font_fname = ‘./utils/NanumGothic.ttf’ # 여기서 폰트는 C:/Windows/Fonts를 참고해도 좋다. fontprop = fm.FontProperties(fname=font_fname, size=18).get_name() nx.draw(G, node_size=sizes, pos=nx.spring_layout(G, k=3.5, iterations=100), **options, font_family=fontprop) # font_family로 폰트 등록 ax = plt.gca() ax.collections[0].set_edgecolor(“#555555”) plt.show()

코드에서는 페이지 랭크에 따라 중심성의 크기를 결정했다.

이외에도 근접 중심성을 사용해도 나쁘지 않다.

코드 실행 결과는 아래와 같다.

단어 네트워크 (1)

노드의 크기는 해당 단어의 연결 중심성 크기를 나타낸 것이며 이는 해당 단어가 얼마나 많이 출현했는지, 즉 얼마나 중요한지를 말해준다.

그리고 Edge(간선)의 길이는 두 노드 사이의 페이지 랭크 척도를 나타낸 것이며 두 단어 사이의 연관성이 얼마나 가까운지를 말해준다.

현재 결과에서는 폭발이라는 단어가 “화재 및 폭발 가능성”에서 가장 많이 출현한 단어가 될 것이며, 이와 관련이 깊은 단어로는 공기, 분진, 화재 등이 있다고 볼 수 있다.

지금은 단어 쌍의 빈도수가 20000 이상인 것들만 나타내었지만 이를 조정하면 그래프는 달라질 수 있다.

이번에는 19700으로 조정하여 실행해보았다.

단어 네트워크 (2)

단어와 단어 사이의 연관성을 시각적으로 한눈에 알아볼 수 있다.

지금까지 NetworkX 모듈을 사용하여 단어 동시 출현 빈도 분석, 연관어 분석을 해보았다.

NetworkX는 꼭 단어와 단어 사이의 관계가 아니더라도 Node(노드)와 Edge(간선)으로 표현될 수 있는 데이터라면 뭐든 시각적으로 분석이 가능할 것이다.

키워드에 대한 정보 python networkx 예제

다음은 Bing에서 python networkx 예제 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 Python의 NetworkX 소개

  • 동영상
  • 공유
  • 카메라폰
  • 동영상폰
  • 무료
  • 올리기

Python의 #NetworkX #소개


YouTube에서 python networkx 예제 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 Python의 NetworkX 소개 | python networkx 예제, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

Leave a Comment