당신은 주제를 찾고 있습니까 “파이썬 네트워크 분석 – [Data@KU] Python으로 네트워크를 그리고 Gephi파일로 저장하기“? 다음 카테고리의 웹사이트 https://you.charoenmotorcycles.com 에서 귀하의 모든 질문에 답변해 드립니다: https://you.charoenmotorcycles.com/blog/. 바로 아래에서 답을 찾을 수 있습니다. 작성자 KUDatahub 이(가) 작성한 기사에는 조회수 1,811회 및 좋아요 24개 개의 좋아요가 있습니다.
파이썬 네트워크 분석 주제에 대한 동영상 보기
여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!
d여기에서 [Data@KU] Python으로 네트워크를 그리고 Gephi파일로 저장하기 – 파이썬 네트워크 분석 주제에 대한 세부정보를 참조하세요
아래의 링크를 통해 Google Colab 실습 코드와 함께 시청해보세요 🙂
코드 : https://colab.research.google.com/drive/1HOhdwhqPlPx0LrQ4VKf0lj_X9FheXPAw?usp=sharing
실습파일 : https://drive.google.com/file/d/1-aHTkjWjzS1JwehZdMIFXyXMhn2zIsfO/view?usp=sharing
파이썬 네트워크 분석 주제에 대한 자세한 내용은 여기를 참조하세요.
파이썬 네트워크 시각화 분석하기(python networkx 예제 …
파이썬 네트워크 시각화 분석하기(python networkx 예제) / 파이썬 데이터 분석 실무 테크닉 100. Everly. 2022. 4. 16. 19:33. 이번 포스팅에서는 python networkx …
Source: suy379.tistory.com
Date Published: 7/9/2021
View: 1952
파이썬의 응용 소셜 네트워크 분석 – Coursera
Offered by University of Michigan. 이 과정은 NetworkX 라이브러리를 사용한 튜토리얼을 통해 학습자에게 네트워크 분석을 소개합니다. 과정 처음에는 네트워크 분석 …
Source: www.coursera.org
Date Published: 8/17/2022
View: 3705
NetworkX 파이썬 패키지를 이용한 네트워크 그래프 작성 – 유병혁
NetworkX는 그래프와 네트워크 연구를 위한 파이썬 라이브러리입니다. … 이전 글: 빅카인즈 뉴스 데이터를 이용한 ‘깃대종’ 연관규칙 분석 …
Source: foss4g.tistory.com
Date Published: 4/28/2021
View: 6681
[python] NetworkX를 사용해서 데이터분석 및 시각화 해보기
[python] NetworkX를 사용해서 데이터분석 및 시각화 해보기. anweh 2020. 11. 2. 15:03. NetworkX는 파이썬 기반의 모듈로, 다양한 그래포 알고리즘을 제공한다.Source: anweh.tistory.com
Date Published: 11/16/2021
View: 9366
[NetworkX] 파이썬 네트워크 분석 4 (멀티그래프, Multigraph)
멀티 그래프(Multi Graph) 생성하고 그리기. 노드와 노드는 단 하나의 관계만으로 정의되지 않는 경우가 많습니다.
Source: brain-nim.tistory.com
Date Published: 1/9/2021
View: 5975
Networkx를 활용한 네트워크 분석 기초 입문 정리 #1 – velog
Networkx를 활용한 네트워크 분석 기초 입문 정리 #1. … (3) Node는 파이썬 객체로서 다양한 형태 (Text, 이미지, 시계열 데이터 등)로 변이 용이
Source: velog.io
Date Published: 1/8/2021
View: 2386
[팀 컨피던스]네트워크 분석 – 확진이 어떻게 진행되었을까 …
저희는 Python을 활용하여 전체적인 역학관계를 네트워크로 시각화하고 분석하였습니다. 아래의 글을 읽어보시고 유익하셨다면, 투표 부탁드립니다. !!< ...
Source: dacon.io
Date Published: 2/27/2021
View: 5592
파이썬으로 네트워크 시각화하기 | FEAT
Network analysis using NetworkX … NetworkX를 이용한 네트워크 분석 … 는 NetworkX 그래프를 입력으로 사용하는 대화형 네트워크 시각화 Python 패키지입니다.
Source: www.feat.com
Date Published: 9/6/2021
View: 5007
[Python] 연관어 네트워크 분석 with networkx package
전에 UCINET으로 네트워크 시각화 하는 방법에 대해서 적었는데, 이번에는 아예 Python으로 동시출현단어 쌍을 만들고 -> Gephi용 확장자인 graphml로 output을 산출 …
Source: gahwan.com
Date Published: 8/14/2021
View: 3036
NetworkX를 사용하여 단어 동시 출현 분석하기 – Python 3 …
시각화하기 전에 몇 가지 알고 가야 할 개념들이 있다. 네트워크를 구성하는 중심성을 결정하는 몇 가지 척도들이 있는데 Networkx에서 이것들을 모두 …
Source: foreverhappiness.tistory.com
Date Published: 5/28/2021
View: 7480
주제와 관련된 이미지 파이썬 네트워크 분석
주제와 관련된 더 많은 사진을 참조하십시오 [Data@KU] Python으로 네트워크를 그리고 Gephi파일로 저장하기. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.
주제에 대한 기사 평가 파이썬 네트워크 분석
- Author: KUDatahub
- Views: 조회수 1,811회
- Likes: 좋아요 24개
- Date Published: 2021. 1. 3.
- Video Url link: https://www.youtube.com/watch?v=TMZtwltQ1pE
파이썬 네트워크 시각화 분석하기(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 라이브러리를 활용해 경로를 시각화하는 방법을 배웠습니다. 다음 포스팅에서는 목적 함수와 제약조건을 설정하는 방법을 배우고, 직접 이를 설정하여 최적화를 진행해봅니다. 궁금한 점 있으시다면 언제든 댓글 주세요! 감사합니다 🙂 반응형
NetworkX 파이썬 패키지를 이용한 네트워크 그래프 작성
안녕하세요? 이번 글은 NetworkX 파이썬 패키지를 이용한 네트워크 그래프 작성 방법을 정리합니다.
NetworkX는 그래프와 네트워크 연구를 위한 파이썬 라이브러리입니다. NetworkX 깃허브 | https://networkx.github.io/
앞서 정리한 단어 연관규칙(association rules)을 네트워크 그래프를 그려 가시화한다고 보시면 됩니다.
이전 글: 빅카인즈 뉴스 데이터를 이용한 ‘깃대종’ 연관규칙 분석 | http://blog.daum.net/geoscience/1407
자, 그럼 시작해볼까요?! 일단 분석을 위한 라이브러리를 추가합니다.
앞서 빅카인즈에서 1900년부터 2019년 6월까지 ‘깃대종’이 언급된 뉴스 데이터를 내려받고,
이 중 ‘제목’ 컬럼을 텍스트 파일로 별도 저장했었습니다. 빅카인즈(BIG KINDS) | https://www.bigkinds.or.kr/
해당 텍스트 파일을 열고,
단어빈도 분석을 위한 한나눔을 불러옵니다.
한국어 NLP를 위한 코엔엘파이(KoNLPy) 설치하기 | http://blog.daum.net/geoscience/1398
반복문을 통해 텍스트 파일을 한줄씩 읽어와 정규표현식을 적용하고 dataset에 기록해 갑니다.
re.sub()는 문자열에서 일치하는 텍스트를 다른 텍스트로 치환(substitution)할 때 사용합니다.
정규표현식에서 [], 즉 대괄호는 그 안에 있는 문자열을 포함하라는 의미입니다. ^는 이 패턴으로
시작해야 한다는 의미이며, 가-힣는 한글, a-zA-Z는 영문, \s는 공백(white space)을 정의합니다.
아래와 같이 단어들이 2차원 리스트로 추출된 결과를 확인합니다.
이제 어프라이어리(Apriori) 알고리즘을 적용하여 연관규칙 분석을 수행해 봅니다. 이전 글은
Mlxtend 라이브러리를 통해 구현했었는데요, 이번엔 보다 간단한 Apyori 패키지를 사용해 봤습니다.
Apyori | https://github.com/ymoch/apyori
연관 규칙(association rules)의 개념은 아래 글을 참고하시기 바랍니다.
Complete guide to Association Rules (1/2) | https://towardsdatascience.com/association-rules-2-aa9a77241654
Complete guide to Association Rules (2/2) | https://towardsdatascience.com/complete-guide-to-association-rules-2-2-c92072b56c84
아래 화면은 항목 개수가 2개이고 지지도(support)가 0.01 이상인 항목집합만 추려낸 결과입니다.
이제 위 항목들을 네트워크 그래프로 작성해 보겠습니다. 아래와 같이 네트워크 그래프를 정의합니다.
네트워크의 자료 구조는 노드와 엣지로 구성됩니다. 패이지랭크는 노드 순위를 제공하므로 노드 색상과 크기를 지정하는데 유용하게 사용됩니다.
NetworkX 패키지는 아래와 같이 다양한 레이아웃을 제공합니다.
네트워크 그래프를 그려볼까요?! 아래와 같이 단어간 연관성을 한눈에 보실 수 있습니다. 노드의 색상과 크기는 패이지랭크에 따라 다르게 표현됩니다.
레이아웃 지정에 따라 전혀 다른 느낌의 네트워크 그래프를 그려볼 수 있습니다. 간단하죠?!
그래프 레이아웃 | https://networkx.github.io/documentation/latest/reference/drawing.html#module-networkx.drawing.layout
[python] NetworkX를 사용해서 데이터분석 및 시각화 해보기
NetworkX는 파이썬 기반의 모듈로, 다양한 그래포 알고리즘을 제공한다.
우연히 알게된 라이브러리인데 생각보다 적용할 수 있는 영역이 다양하고, 무엇보다 그래프라는 툴을 사용하면 데이터 간의 상관관계나 연결성 등 분석할 수 있는 카테고리가 상당히 많아진다.
처음엔 데이터에 그래프라는 개념을 접목시킨다는 점이 다소 생소해서 해당 라이브러리에 익숙해지기까지 꽤나 시간이 걸렸지만…
일단 익숙해지고 나니까 그래프의 파워(?)를 느끼고 매우 신기했었다 ㅋㅋ
어쨌든~~ 오늘 사용할 데이터는 바로 이 데이터다.
Pokemon.csv 0.04MB
어디서 얻었는지 기억이 안나는 포켓몬 데이터다.
총 12개의 열이 있고, 행은 포켓몬 종류를 나타낸다. 총 800종이 있다.
포켓몬 종류가 이렇게 많은지 처음 알았음…;;
1. 필요한 라이브러리 불러오기
import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt import networkx as nx
일단 필요한 라이브러리부터 불러오기~~
networkx는 nx로 줄여쓰는 것이 일반적이다. numpy를 np로 줄여쓰는 것과 똑같음.
2. 데이터 불러오기
data = pd.read_csv(‘C:/Users/user/Desktop/PyStudy/Pokemon.csv’) data.head() #상위 다섯개 data.tail() #하위 다섯개 print(len(data.isnull().any())) #null값이 있는지 확인 data.isnull().any() data[‘Type 2’].replace(np.nan, ‘0’, inplace = True) #null값 채워주기 data[‘Type 2’].head(10) #’Type 2’컬럼의 상위 열개 출력 print(“Number of pokemon are: ” + str(data[‘Name’].nunique())) #포켓몬 종류 name = pd.DataFrame(data[‘Name’].unique().tolist(), columns = [‘Pokemon’]) #포켓몬 종류 DataFrame npoke_total = data.copy() print(npoke_total.columns) #컬럼명확인 npoke_total = pd.concat([npoke_total[‘Name’], data[‘Total’]], axis=1) #포켓몬 종류와 각각의 종류 별로 몇마리인지
pd.read_csv를 사용하면 엑셀 시트를 불러올 수 있다. data라는 변수에 할당.
data.head()와 data.tail()은 상위/하위 다섯개 (조정 가능)의 데이터를 확인해주는 코드인데, 엑셀 시트안에 데이터가 어떻게 들어가 있는지 대충 확인할 때 사용하기 좋다.
엑셀 데이터로 분석을 시작하기 전엔 항상 null값이 있는지 확인을 해줘야한다.
print(len(data.isnull().any())로 null값의 갯수를 확인하고, null값이 들어가있는 컬럼을 찾아서 0으로 일괄 입력 해주었다.
print(“Number of pokemon are: ” + str(data[‘Name’].nunique())) 로 포켓몬 종류가 총 몇 개인지 확인해줬다.
포켓몬 종류수
그리고 포켓몬의 종류 이름들을 ‘name’이라는 리스트에 저장해줬다. 컬럼명은 ‘Pokemon’.
name 리스트
npoke_total에는 포켓몬의 종류 이름과 각각의 종류가 몇 마리씩 있는지 (엑셀 시트의 ‘Total’컬럼) 정보를 넣어주었다.
npoke_total 리스트
3. 분석 및 시각화
3.1 포켓몬 종류 별 몇 마리?
포켓몬 종류 별 개체수 상위 30에 대한 시각화 결과이다.
sns.set() plt.figure(figsize=(8,20)) ax = sns.barplot(x = ‘Total’, y = ‘Name’, data = npoke_total.sort_values(by = ‘Total’, ascending = False).head(30)) ax.set(xlabel = ‘Overall’, ylabel = ‘Pokemon’) plt.show()
개체수 상위 30 종류
3.2 종류 별 연관 그래프
데이터의 Type1 컬럼을 보면 다른 종류임에도 동일한 Type1 정보를 가지고 있는 케이스가 잇다.
포켓몬을 본지가 너무 오래돼서… Type1이 정확히 뭘 의미하는지는 모르겠지만 (아마도 속성일 것이라 추정)
포켓몬 종류별로 Type1에 대한 연관성 그래프를 시각화 했다. (드디어 NetworkX 라이브러리 사용!)
#Network analysis g = nx.Graph() g = nx.nx.from_pandas_edgelist(data, source = ‘Name’, target = ‘Type 1’) print(nx.info(g)) plt.figure(figsize=(20, 20)) pos = nx.spring_layout(g, k = 0.15) nx.draw_networkx(g,pos, node_size = 25, node_color = ‘blue’) plt.show()
출력 결과 시각화 결과
3.3 Type1 별 비율
시각화 결과, 물속성의 포켓몬의 개체수가 가장 많고, 요정속성?의 포켓몬 개체수가 가장 적은 것을 확인할 수 있었다.
파이팅 속성은 도대체 뭐지… 공격형 포켓몬이라는 건가?
gen1 = data[data.Generation == 1] types = gen1[‘Type 1’] explode = np.arange(len(types.unique())) * 0.01 colors = [ ‘red’, ‘blue’, ‘yellow’, ‘green’ ] types.value_counts().plot.pie( explode=explode, colors=colors, title=”Percentage of Different Types of Pokemon”, autopct=’%1.1f%%’, shadow=True, startangle=90, figsize=(9,9) ) plt.tight_layout() plt.show()
3.4 전설의 포켓몬 vs. 비전설의 포켓몬
types = gen1[‘Legendary’] explode = np.arange(len(types.unique())) * 0.01 colors = [ ‘yellow’, ‘green’ ] types.value_counts().plot.pie( explode=explode, colors=colors, title=”Percentage of Legendary to NoN-Legendary”, autopct=’%1.1f%%’, shadow=True, startangle=90, figsize=(6,6) ) plt.tight_layout() plt.show()
3.5 1세대 포켓몬 대상으로 Type1 연결성 분석
g = nx.from_pandas_dataframe(gen1,source=’Name’,target=’Type 1′) print(nx.info(g)) nx.Graph() plt.figure(figsize=(20, 20)) pos=nx.spring_layout(g, k=0.0319) nx.draw_networkx(g,pos,node_size=805, node_color=’pink’, font_size=15) plt.show()
[NetworkX] 파이썬 네트워크 분석 4 (멀티그래프, Multigraph)
멀티 그래프(Multi Graph) 생성하고 그리기
노드와 노드는 단 하나의 관계만으로 정의되지 않는 경우가 많습니다.
친구이면서도 직장동료일 수도 있고, 학교 선후배이면서도 커플일 수도 있습니다.
한 쌍의 노드가 여러개의 관계, 엣지를 동시에 가질 수 있는 그래프를 멀티그래프(Multigraphs)라고 부릅니다.
그래프 생성하기
import networkx as nx # %matplotlib notebook G = nx.MultiGraph() family = [(‘G’,’F’),(‘D’,’E’)] friend = [(‘A’,’B’),(‘C’,’F’),(‘C’,’E’),(‘E’,’J’)] coworker = [(‘B’,’C’),(‘C’,’F’),(‘I’,’J’),(‘E’,’H’),(‘G’,’F’),(‘E’,’I’)] neighbor = [(‘E’,’I’),(‘A’,’B’)] G.add_edges_from(family,relation=’family’) G.add_edges_from(friend,relation=’friend’) G.add_edges_from(coworker,relation=’coworker’) G.add_edges_from(neighbor,relation=’neighbor’) # 아래에 계속…
그리고 그래프를 그릴때는 각 관계들마다 서로다른 색깔을 부여하고자 했습니다.
pos=nx.spring_layout(G) # 각 노드, 엣지를 draw하기 위한 position 정보 relation = nx.get_edge_attributes(G, ‘relation’) nx.draw(G,pos, with_labels=True, edge_color=’white’) nx.draw_networkx_edges(G,pos, edgelist=family, edge_color=’Y’) nx.draw_networkx_edges(G,pos, edgelist=friend, edge_color=’B’) nx.draw_networkx_edges(G,pos, edgelist=coworker, edge_color=’R’) nx.draw_networkx_edges(G,pos, edgelist=neighbor, edge_color=’violet’)
draw_networkx_edges에서 edge_color를 추가해주면 해당 엣지들의 색상을 지정할 수 있습니다.
nx.draw에서 아예 선을 안그리는 방법을 못찾겠어서 그냥 edge_color=’white’라고 해버렸습니다 (머쓱)
어… 엣지가 다 겹쳐서 나오네??
하지만 이렇게 하니 문제가 발생했습니다.
서로 다른 엣지가 겹쳐서 나온다는 것입니다.
이를 해결해주려면 엣지에 곡선을 부여해 줘야 합니다.
그래프 그리기
하지만 불행하게도 MultiGraph()로 만든 그래프는 엣지가 휘지 않았습니다. (혹시라도 방법을 아는 분께서는 댓글 부탁드리겠습니다ㅜㅜ)
그래서 여기저기 검색한 내용을 짜깁기 해서 다른 방법으로 그려보았습니다.
import networkx as nx # %matplotlib notebook G = nx.DiGraph() family = [(‘G’,’F’),(‘D’,’E’)] friend = [(‘A’,’B’),(‘C’,’F’),(‘C’,’E’),(‘E’,’J’)] coworker = [(‘B’,’C’),(‘C’,’F’),(‘I’,’J’),(‘E’,’H’),(‘G’,’F’),(‘E’,’I’)] neighbor = [(‘E’,’I’),(‘A’,’B’)] G.add_edges_from(family,relation=’family’) G.add_edges_from(friend,relation=’friend’) G.add_edges_from(coworker,relation=’coworker’) G.add_edges_from(neighbor,relation=’neighbor’) pos=nx.spring_layout(G) # 각 노드, 엣지를 draw하기 위한 position 정보 relation = nx.get_edge_attributes(G, ‘relation’) nx.draw(G,pos, with_labels=True, edge_color=’white’) nx.draw_networkx_edges(G,pos, edgelist=family, edge_color=’Y’, connectionstyle=’arc3, rad = 0.2′, arrowstyle=’-‘) nx.draw_networkx_edges(G,pos, edgelist=friend, edge_color=’B’, connectionstyle=’arc3, rad = 0.2′, arrowstyle=’-‘) nx.draw_networkx_edges(G,pos, edgelist=coworker, edge_color=’R’, connectionstyle=’arc3, rad = -0.2′, arrowstyle=’-‘) nx.draw_networkx_edges(G,pos, edgelist=neighbor, edge_color=’violet’, connectionstyle=’arc3, rad = -0.4′, arrowstyle=’-‘)
한결 낫군요…
stackoverflow에서는 “엣지 여러개 그리려면 어떻게 해야돼요?”라는 질문들에
대다수 DiGraph()를 사용해서 해결법을 제시하고 있었습니다. (…..)
MultiGraph와 DiGraph는 무방향성, 방향성이라는 점에서 매우 다르지만,
여기서는 단순히 그래프를 그려보려는 것 뿐이니까 그들의 방법을 빌려왔습니다.
그리고 connectionstyle을 이용해서 각 엣지에 곡선 성질을 부여해 주었습니다.
그리고 우리는 화살표가 없는 엣지를 그리고 싶으므로,
DiGraph(Direction Graph)의 엣지를 그릴때의 디폴트 값인 arrowstyle=’-\|>’를 arrowstyle=’-‘로 변경해 주었습니다.
[팀 컨피던스]네트워크 분석 – 확진이 어떻게 진행되었을까?(Python)
‘안녕하세요! 저희는 ‘팀 컨피던스’입니다.
통계학과와 물리학과 전공생들이 뭉쳐서 올해 초부터 극성이었던 Covid19에 대해서 분석하고 시각화해보았습니다.
저희는 Python을 활용하여 전체적인 역학관계를 네트워크로 시각화하고 분석하였습니다.
아래의 글을 읽어보시고 유익하셨다면, 투표 부탁드립니다. !!
조금 번거로우시겠지만, 저희의 본 게시글인 https://www.dacon.io/competitions/official/235590/codeshare/988 으로 들어와서 추천 눌러주시면 더 감사하겠습니다!!
[Python] 연관어 네트워크 분석 with networkx package
전에 UCINET으로 네트워크 시각화 하는 방법에 대해서 적었는데, 이번에는 아예 Python으로 동시출현단어 쌍을 만들고 -> Gephi용 확장자인 graphml로 output을 산출하는 과정에 대해서 적어보고자 한다.
동시출현 단어쌍 만들기
먼저 pandas를 불러온 후에, readlines 명령어로 미리 형태소분석이 된 데이터를 불러온다.
import pandas as pd f = open(“파일 위치/파일명.txt”, encoding=’UTF8′) lines = f.readlines() #라인으로 불러오기 len(lines) #라인 갯수 알아보기 lines #데이터 잘 불러와졌는지 확인
word_list를 만들어서 lines의 데이터를 넣어준다. (append)
words_list=[] for text in lines: #list에 있는 lines데이터를 하나씩 불러올 때 text로 불러오는데 탭 구분으로 strip(앞뒤 공백 없애기) 해라 words_list.append(text.split(‘\t’)[2].strip()) words_list[0] #확인하기
우선 동시출현 단어쌍을 만드는 방법에 대해서 이해해보자. temp2에 단어 4개를 집어넣은 다음에, 아래와 같이 for문을 돌려보자.
temp2 = [“빠빠”,”엄마”,”누나”,”나”] count = {} #이 괄호는 dictionary for i, a in enumerate(temp2): #i(0,1,2,3)에는 인덱스가 나오고 a에는 temp2의 빠빠”,”엄마”,”누나”,”나”가 나옴 for b in temp2[i+1:]: #b에는 i에 하나씩 더해서 비교함 #if a == b: continue #같은 단어의 경우는 세지 않음 #[가,나]와 [나,가]를 같은 것으로 취급 (정렬하고 싶다) 카운트에서 if a>b: #가나다 순으로 안 되어있으면 b, a로 바꿔서 keyvalue값을 넣어줘라 count[b, a] = count.get((b, a),0) + 1 #key값이 없으면 디폴트로 0 넣기 else :#가나다 순으로 되어 있으면 그대로 가면 됨 count[a, b] = count.get((a, b),0) + 1
count 딕셔너리를 조회해보면
count
아래와 같이 4C2 (조합ㅎㅎ)인 6개 동시출현쌍에서 동시출현 횟수를 알 수 있다!
count = {} #동시출현 빈도가 저장될 dict for line in words_list: #하나의 문서에서 동일한 단어가 두번 나와도 두번의 동시출현으로 고려X words = list(set(line.split())) #한줄씩 읽어와서 단어별로 분리(unique한 값으로 받아오기) #split은 띄어쓰기를 단어로 구분하라는 함수 for i, a in enumerate(words): for b in words[i+1:]: if a>b: count[b, a] = count.get((b, a),0) + 1 else : count[a, b] = count.get((a, b),0) + 1
set([“아빠”,”아빠”,”엄마”])
count.get((“a”, “b”),0) #a, b라는 key가 없을 때는 디폴트를 0으로 해라 count
#dictionary형 자료형을 판다스 데이터프레임으로 만들어줌 #orient=index를 넣어야 행으로 쭉 나열이 됨 df=pd.DataFrame.from_dict(count, orient=’index’) df.head()
list1=[] for i in range(len(df)): #index를 중심으로 계속 중첩해서 list에 넣는다 list1.append([df.index[i][0],df.index[i][1],df[0][i]])
#pandas 이용해서 df형태로 만들기 df2=pd.DataFrame(list1, columns=[“term1″,”term2″,”freq”])
#pandas 이용해서 sorting 하기 (디폴트가 오름차순이라서 false 꼭 써줘야 내림차순으로 나옴) df3=df2.sort_values(by=[‘freq’],ascending=False)
df3.head(100)
Networkx패키지로 네트워크 분석하기
#추천 참고자료
박건영. 2019. Networkx를 활용한 네트워크 분석 기법 기초 입문
import numpy as np import networkx as nx import operator #np.where는 조건문 만드는 것: (슬라이싱) 빈도가 5개 이상인 것만 잘라내면 1027개가 나온다. (참인 조건의 인덱스 추출) len((np.where(df3[‘freq’]>=5))[0])
G=nx.Graph() for i in range(1027): #print(pair) G.add_edge(df3[‘term1’][i], df3[‘term2’][i], weight=int(df3[‘freq’][i]))
# Compute centralities for nodes. # The degree centrality values are normalized by dividing by the maximum possible degree in a simple graph n-1 where n is the number of nodes in G. dgr = nx.degree_centrality(G) btw = nx.betweenness_centrality(G) cls = nx.closeness_centrality(G)
# itemgetter(0): key 또는 itemgetter(1): value로 sort key, reverse=True (descending order) 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)
print(“** degree **”) for x in range(20): print(sorted_dgr[x]) print(“** betweenness **”) for x in range(20): print(sorted_btw[x]) print(“** closeness **”) for x in range(20): print(sorted_cls[x])
#단어끼리 서로 빈도를 세는 데이터셋을 만들었을 때 Gaphi로 시각화하는 것 전단계: graphml 확장자 형식으로 만들기 class MakeGraphml: def make_graphml(self, pair_file, graphml_file): out = open(graphml_file, ‘w’, encoding = ‘utf-8’) entity = [] e_dict = {} count = [] for i in range(len(pair_file)): e1 = pair_file.iloc[i,0] e2 = pair_file.iloc[i,1] #frq = ((word_dict[e1], word_dict[e2]), pair.split(‘\t’)[2]) frq = ((e1, e2), pair_file.iloc[i,2]) if frq not in count: count.append(frq) # ((a, b), frq) if e1 not in entity: entity.append(e1) if e2 not in entity: entity.append(e2) print(‘# terms: %s’% len(entity)) #create e_dict {entity: id} from entity for i, w in enumerate(entity): e_dict[w] = i + 1 # {word: id} out.write( “
” + “ ” + “ ” + “ ” + ” “) # nodes for i in entity: out.write(“
” + ” “) out.write(“” + i + “” + ”
“) out.write(““) # edges for y in range(len(count)): out.write(“
” + ” “) out.write(“” + str(count[y][1]) + “” + ”
“) #out.write(“
“+” “) #out.write(“” + str(count[y][1]) +”“+”
“) out.write(““) out.write(“ “) print(‘now you can see %s’ % graphml_file) #pairs.close() out.close()
gm = MakeGraphml()
graphml_file = ‘파일명.graphml’
#iloc는 인덱스 index of location 열에서 : 써야 함 (열 전체 보여주려면) gm.make_graphml(df3.iloc[0:1027,:], graphml_file)
f.close()
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(간선)으로 표현될 수 있는 데이터라면 뭐든 시각적으로 분석이 가능할 것이다.
키워드에 대한 정보 파이썬 네트워크 분석
다음은 Bing에서 파이썬 네트워크 분석 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.
이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!
사람들이 주제에 대해 자주 검색하는 키워드 [Data@KU] Python으로 네트워크를 그리고 Gephi파일로 저장하기
- 동영상
- 공유
- 카메라폰
- 동영상폰
- 무료
- 올리기
YouTube에서 파이썬 네트워크 분석 주제의 다른 동영상 보기
주제에 대한 기사를 시청해 주셔서 감사합니다 [Data@KU] Python으로 네트워크를 그리고 Gephi파일로 저장하기 | 파이썬 네트워크 분석, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.