Computer >> 컴퓨터 >  >> 네트워킹 >> 네트워킹

프로그래밍 언어 영향 그래프 시각화

Gephi 및 Sigma.js를 사용한 네트워크 시각화 자습서

다음은 오늘 만들 내용의 미리보기입니다. 프로그래밍 언어가 그래프에 영향을 미칩니다. 링크를 확인하여 과거와 현재의 250개 이상의 프로그래밍 언어 간의 "디자인 영향" 관계를 살펴보십시오!

당신의 차례입니다!

오늘날의 초연결 세상에서 네트워크는 현대 생활의 유비쿼터스 요소입니다.

지금까지 하루를 시작하세요. 저는 런던의 교통망을 이용했습니다. 마을로 여행을 갑니다. 그런 다음 지점으로 이동했습니다. 내가 좋아하는 커피숍에서 내 크롬북을 사용하여 Wi-Fi 네트워크에 연결했습니다. . 다음으로 다양한 소셜 네트워킹에 로그인했습니다. 내가 자주 찾는 사이트.

지난 수십 년 동안 가장 영향력 있는 기업 중 일부가 네트워크의 힘 덕분에 성공했다는 것은 비밀이 아닙니다.

Facebook, Twitter, Instagram, LinkedIn 및 기타 소셜 미디어 플랫폼은 소셜 네트워크의 작은 세계 속성에 의존합니다. 이를 통해 사용자를 서로(및 광고주)와 효과적으로 연결할 수 있습니다.

Google이 현재 성공할 수 있었던 것은 검색 엔진 시장의 초기 지배력 덕분입니다. 부분적으로는 페이지 순위 네트워크 알고리즘의 도움으로 관련 결과를 반환할 수 있는 능력이 있기 때문입니다.

Amazon의 효율적인 유통 네트워크를 통해 일부 주요 도시에서는 당일 배송이 가능합니다.

네트워크는 인공 지능 및 기계 학습과 같은 분야에서도 매우 중요합니다. 신경망은 매우 활발한 연구 분야입니다. Computer Vision에 필수적인 많은 기능 감지 알고리즘은 네트워크를 사용하여 이미지의 다른 부분을 모델링하는 데 크게 의존합니다.

네트워크 모델의 관점에서 광범위한 과학적 현상을 이해할 수도 있습니다. 여기에는 양자 역학, 생화학적 경로, 생태 및 사회 경제적 시스템이 포함됩니다.

부인할 수 없는 중요성을 감안할 때 네트워크와 그 속성을 더 잘 이해할 수 있는 방법은 무엇입니까?

네트워크에 대한 수학적 연구는 "그래프 이론"으로 알려져 있으며 수학에서 접근하기 쉬운 분야 중 하나입니다. 이 문서는 사전 지식이나 경험이 거의 없다고 가정하고 소개를 제공하는 것을 목표로 합니다.

우리는 Python 3.x와 Gephi라는 멋진 오픈 소스 소프트웨어를 사용하여 과거와 현재의 다양한 프로그래밍 언어가 영향력에 의해 연결되는 방식에 대한 네트워크 시각화를 구성할 것입니다.

하지만 먼저…

네트워크란 정확히 무엇입니까?

위에서 설명한 예는 몇 가지 단서를 제공합니다. 전송 네트워크는 목적지 로 구성됩니다. 경로로 연결됨 . 소셜 네트워크는 개인으로 구성됩니다. , 관계를 통해 연결됨 서로에게. Google의 검색 엔진 알고리즘은 다양한 웹페이지 의 "순위"를 평가합니다. 링크한 페이지를 확인하여 다른 사람들에게.

보다 일반적으로 네트워크는 노드로 설명할 수 있는 모든 시스템입니다. 가장자리 , 또는 구어체 용어로 "점과 선".

프로그래밍 언어 영향 그래프 시각화
에지로 연결된 노드(언어)의 예(디자인 영향)

일부 시스템은 이러한 방식으로 쉽게 추상화됩니다. 소셜 네트워크가 아마도 가장 확실한 예일 것입니다. 컴퓨터 파일 시스템은 또 다른 것입니다. 폴더와 파일은 "상위" 및 "하위" 관계로 연결됩니다.

그러나 네트워크의 진정한 힘은 처음에는 방법이 명확하지 않더라도 수많은 시스템을 네트워크 용어로 추상화하고 모델링할 수 있다는 사실에서 나옵니다.

대표 네트워크

우리는 네트워크를 수학적으로 분석하고 설명하기 위해 펜과 종이 스케치를 조금 넘어서야 합니다. 점과 선의 그림을 우리가 계산할 수 있는 숫자로 바꾸려면 어떻게 해야 합니까?

한 가지 해결책은 인접 행렬 을 작성하는 것입니다. 네트워크를 대표합니다.

행렬은 익숙하지 않은 경우 약간 위협적으로 들릴 수 있지만 두려워하지 않는 개념 중 하나입니다. 한 번에 많은 계산을 수행하는 데 사용할 수 있는 숫자 그리드로 생각하십시오. 다음은 예입니다.

      Python Java Scala C#
Python     0    1     0  0
Java       0    0     0  1
Scala      0    1     0  0
C#         0    1     0  0

이 행렬에서 각 행과 열의 교집합은 각 언어의 연결 여부에 따라 0 또는 1입니다. 위의 그림과 대조하여 확인할 수 있습니다!

대부분의 경우 인접 행렬은 네트워크를 수학적으로 표현하는 좋은 방법입니다. 그러나 계산적 관점에서 보면 때때로 다소 번거로울 수 있습니다.

예를 들어, 노드 수가 비교적 적더라도(예:1000) 행렬에 훨씬 더 많은 수의 요소가 있습니다(예:1000² =1,000,000).

많은 실제 시스템에서 희소 네트워크가 생성됩니다. . 이러한 네트워크에서 대부분의 노드는 다른 모든 노드 중 일부에만 연결됩니다.

컴퓨터 메모리의 1000노드 희소 네트워크를 인접 행렬로 표현하면 RAM에 1,000,000바이트의 데이터가 저장됩니다. 대부분은 0이 될 것입니다. 이에 대해 보다 효율적인 방법이 있어야 합니다.

다른 접근 방식은 가장자리 목록으로 작업하는 것입니다. 대신에. 이것이 바로 그들이 말하는 것입니다. 이는 단순히 서로 연결된 노드 쌍의 목록입니다.

예를 들어, 위의 프로그래밍 언어 네트워크는 다음과 같이 나타낼 수 있습니다.

Java, Python
Java, Scala
Java, C#
C#, Java

더 큰 네트워크의 경우 이것은 훨씬 더 계산적으로 효율적인 방법입니다. 물론 에지 목록에서 인접 행렬을 생성하는 것도 가능합니다(반대의 경우도 마찬가지). 둘 중 하나를 선택해야 하는 것은 아닙니다.

네트워크를 나타내는 또 다른 방법은 인접 목록입니다. 여기에는 모든 노드와 연결된 노드가 나열됩니다. 예:

Java: Python, Scala, C#
C#: Java

데이터 수집, 연결

모든 네트워크 모델과 시각화는 그것을 구성하는 데 사용된 데이터만큼만 좋습니다. 이는 데이터가 정확하고 완전하다는 것을 보장할 뿐만 아니라 노드 사이의 가장자리를 추론하는 수단도 정당화해야 함을 의미합니다.

여러 면에서 이것은 중요한 단계. 네트워크에 대한 후속 분석 및 추론은 "연결 기준"을 정당화할 수 있는지에 달려 있습니다.

예를 들어 소셜 네트워크 분석에서 소셜 미디어에서 서로를 팔로우하는지 여부에 따라 사람들을 연결할 수 있습니다. 분자 생물학에서는 공동 발현을 기반으로 유전자를 연결할 수 있습니다.

종종 노드를 연결하는 데 사용되는 방법은 가중치를 허용합니다. 가장자리에 할당하여 "강도"를 측정합니다.

예를 들어 온라인 소매의 경우 함께 구매하는 빈도에 따라 제품을 연결할 수 있습니다. 함께 자주 구매하는 제품은 더 높은 가중치로 연결됩니다. 가끔 같이 사는 제품보다 우연히 예상했던 것보다 더 자주 함께 구매되는 제품은 전혀 연결되지 않습니다.

상상할 수 있듯이 노드를 서로 연결하는 방법은 원하는 만큼 정교할 수 있습니다.

그러나 이 튜토리얼에서는 프로그래밍 언어를 연결하는 더 간단한 방법을 사용할 것입니다. 우리는 Wikipedia의 정확성에 의존할 것입니다.

우리의 목적을 위해 이것은 괜찮을 것입니다. Wikipedia의 성공은 그것이 옳은 일을 하고 있다는 증거입니다. 기사를 작성하는 오픈 소스 협업 방식은 어느 정도 객관성을 보장해야 합니다.

또한 비교적 일관된 페이지 구조로 인해 웹 스크래핑 기술을 시도하기에 편리한 놀이터가 됩니다.

또 다른 보너스는 정보 검색을 더욱 쉽게 해주는 광범위하고 잘 문서화된 Wikipedia API입니다. 시작하겠습니다.

1단계 — Gephi 설치

Gephi는 Linux, Mac 및 Windows에서 사용할 수 있습니다. 여기에서 다운로드할 수 있습니다.

이 프로젝트에서는 Lubuntu를 사용했습니다. Ubuntu/Debian을 사용하는 경우 아래 단계에 따라 Gephi를 시작하고 실행할 수 있습니다. 그렇지 않으면 설치 프로세스가 익숙한 것과 거의 동일할 수 있습니다.

시스템에 최신 버전의 Gephi(작성 당시 v.0.9.1)를 다운로드합니다. 준비가 되면 파일을 추출해야 합니다.

cd Downloads
tar -xvzf gephi-0.9.1-linux.tar.gz
cd gephi-0.9.1/bin./gephi

Java JRE의 버전을 확인해야 할 수도 있습니다. Gephi는 최신 버전이 필요합니다. Lubuntu를 비교적 새로 설치할 때 default-jre를 설치하기만 하면 모든 것이 작동했습니다.

apt install default-jre
./gephi

시작할 준비가 되기 전에 한 단계 더 있습니다. 그래프를 웹으로 내보내려면 Gephi용 Sigma.js 플러그인을 사용할 수 있습니다.

Gephi의 메뉴 표시줄에서 "도구" 옵션을 선택하고 "플러그인"을 선택합니다.

"Available Plugins" 탭을 클릭하고 "SigmaExporter"를 선택합니다.

"설치" 버튼을 누르면 프로세스가 진행됩니다. 완료되면 Gephi를 다시 시작해야 합니다.

2단계 — Python 스크립트 작성

이 튜토리얼에서는 Python 3.x와 함께 생활을 더 쉽게 해주는 몇 가지 모듈을 사용할 것입니다. pip 모듈 설치 프로그램을 사용하여 다음 명령을 실행합니다.

pip3 install wikipedia

이제 새 디렉토리에서 script.py과 같은 파일을 만듭니다. , 즐겨 사용하는 코드 편집기/IDE에서 엽니다. 다음은 주요 논리의 개요입니다.

  1. 먼저 포함할 프로그래밍 언어 목록이 필요합니다.
  2. 다음으로 해당 목록을 살펴보고 관련 Wikipedia 기사의 HTML을 검색합니다.
  3. 여기에서 각 언어가 영향을 받은 프로그래밍 언어 목록을 추출합니다. 이것은 대략적으로 준비된 연결 기준이 될 것입니다.
  4. 그 동안 각 언어에 대한 메타데이터를 가져오는 것이 좋습니다.
  5. 마지막으로 수집한 모든 데이터를 .csv 파일에 쓰고 싶을 것입니다.

전체 스크립트는 이 요지에서 찾을 수 있습니다.

일부 모듈 가져오기

script.py에서 , 작업을 더 쉽게 만드는 몇 가지 모듈을 가져오는 것으로 시작하십시오.

import csv
import wikipedia
import urllib.request
from bs4 import BeautifulSoup as BS
import re

확인 — 포함할 노드 목록을 만드는 것으로 시작합니다. 여기에서 Wikipedia 모듈이 유용합니다. Wikipedia API에 매우 쉽게 액세스할 수 있습니다.

다음 코드를 추가하세요.

pageTitle = "List of programming languages"
nodes = list(wikipedia.page(pageTitle).links)
print(nodes)

이 스크립트를 저장하고 실행하면 "프로그래밍 언어 목록" Wikipedia 기사의 모든 링크가 출력되는 것을 볼 수 있습니다. 좋아요!

그러나 자동으로 수집된 데이터는 항상 수동으로 검사하는 것이 좋습니다. 간단히 살펴보면 많은 실제 프로그래밍 언어와 함께 스크립트가 몇 가지 추가 링크도 선택했음을 알 수 있습니다.

예를 들어 "마크업 언어 목록", "프로그래밍 언어 비교" 등이 표시될 수 있습니다.

Gephi를 사용하면 포함하고 싶지 않은 노드를 제거할 수 있지만 계속 진행하기 전에 데이터를 "정리"하는 것은 문제가 되지 않습니다. 나중에 시간을 절약할 수 있습니다.

removeList = [
    "List of",
    "Lists of",
    "Timeline",
    "Comparison of",
    "History of",
    "Esoteric programming language"
    ]

nodes = [i for i in nodes if not any(r in i for r in removeList)]

이 행은 데이터에서 제거할 하위 문자열 목록을 정의합니다. 그런 다음 스크립트는 데이터를 살펴보고 원하지 않는 하위 문자열이 포함된 요소를 제거합니다.

Python에서는 한 줄의 코드만 있으면 됩니다!

일부 도우미 기능

이제 Wikipedia를 스크랩하여 에지 목록을 작성하고 메타데이터를 수집할 수 있습니다. 이를 쉽게 하려면 먼저 몇 가지 함수를 정의하십시오.

HTML 가져오기

첫 번째 함수는 BeautifulSoup 모듈을 사용하여 각 언어의 Wikipedia 페이지에 대한 HTML을 가져옵니다.

base = "https://en.wikipedia.org/wiki/"

def getSoup(n):
    try:
        with urllib.request.urlopen(base+n) as response:
            soup = BS(response.read(),'html.parser')
            table = soup.find_all("table",class_="infobox vevent")[0]                return table
     except:
         pass

이 함수는 urllib.request 모듈을 사용하여 “https://en.wikipedia.org/wiki/” + “programming language”에 있는 페이지의 HTML을 가져옵니다. .

그런 다음 이것은 BeautifulSoup에 전달되며 HTML을 읽고 정보를 검색하는 데 사용할 수 있는 개체로 구문 분석합니다.

다음으로 find_all()을 사용합니다. 원하는 HTML 요소를 추출하는 메소드입니다.

여기에서 이것은 각 프로그래밍 언어 기사의 맨 위에 있는 요약 표가 될 것입니다. 어떻게 식별할 수 있습니까?

가장 쉬운 방법은 프로그래밍 언어 페이지 중 하나를 방문하는 것입니다. 여기에서 단순히 브라우저의 개발자 도구를 사용하여 관심 요소를 검사할 수 있습니다.

요약 테이블에는 HTML 태그 <tab이 있습니다. le> 및 CSS classes "in fobox" and "v 이벤트"이므로 이를 사용하여 HTML에서 테이블을 식별할 수 있습니다.

인수와 함께 이것을 지정하십시오:

  • "table" 그리고
  • class_="infobox vevent"

find_all() 기준과 일치하는 모든 요소의 목록을 반환합니다. 실제로 관심이 있는 요소를 지정하려면 [0] 색인을 추가하세요. . 함수가 성공하면 table를 반환합니다. 물체. 그렇지 않으면 None을 반환합니다. .

프로그래밍 언어 영향 그래프 시각화
우리가 찾는 데이터는 이 HTML 요소에 있습니다!

자동화된 데이터 수집 절차에서는 예외를 철저히 처리하는 것이 항상 중요합니다. 그렇지 않으면 최상의 시나리오에서 스크립트가 충돌하고 다시 시작해야 합니다.

최악의 경우, 불일치와 오류로 가득한 데이터 세트로 끝날 것입니다. 이것은 라인에서 작업하는 것을 악몽으로 만들 것입니다.

메타데이터 검색

다음 함수는 table를 사용합니다. 일부 메타데이터를 찾는 개체입니다. 여기에서 해당 언어가 처음 등장한 연도의 테이블을 검색합니다.

def getYear(t):
    try:
        t = t.get_text()
        year = t[t.find("appear"):t.find("appear")+30]
        year = re.match(r'.*([1-3][0-9]{3})',year).group(1)
        return int(year)
    except:
        return "Could not determine"

이 짧은 함수는 table를 사용합니다. 객체를 인수로 사용하고 BeautifulSoup의 get_text()를 사용합니다. 문자열을 생성하는 함수입니다.

다음 단계는 year이라는 하위 문자열을 만드는 것입니다. . "appear"라는 단어가 처음 나타난 후 30자가 필요합니다. . 이 문자열은 언어가 처음 등장한 연도를 포함해야 합니다.

연도만 추출하려면 정규 표현식을 사용하세요. (re 제공 모듈) 1에서 3 사이의 숫자로 시작하고 뒤에 3자리 숫자가 오는 모든 문자와 일치합니다.

re.match(r'.*([1-3][0-9]{3})',year)

성공하면 함수는 year를 반환합니다. 정수로. 그렇지 않으면 슬픈 모양의 "결정할 수 없음"이 반환됩니다. 패러다임, 디자이너 또는 타이핑 분야와 같은 추가 메타데이터를 스크랩할 수 있습니다.

기능이 하나 더 있습니다. 이번에는 table을 입력합니다. 주어진 언어에 대한 개체를 선택하고 다른 프로그래밍 언어 목록을 받을 수 있기를 바랍니다.

def getLinks(t):
    try:
        table_rows = t.find_all("tr")
        for i in range(0,len(table_rows)-1):
            try:
                if table_rows[i].get_text() == "\nInfluenced\n":
                    out = []
                    for j in table_rows[i+1].find_all("a"):
                        try:
                            out.append(j['title'])
                        except:
                            continue
                    return out
            except:
                continue
        return
    except:
        return

와우, 중첩된 것 좀 보세요... 실제로 여기서 무슨 일이 벌어지고 있는 걸까요?

이 함수는 table 객체는 일관된 구조를 가지고 있습니다. 테이블의 정보는 행에 저장됩니다(관련 HTML 태그는 < 트> ). 이 행 중 하나에는 ` 텍스트 "\nInfluenced\n"가 포함됩니다. . 함수의 첫 번째 부분은 이것이 어떤 행인지 찾습니다.

이 행을 찾으면 다음 행을 확신할 수 있습니다. 행에는 현재 언어의 영향을 받는 각 프로그래밍 언어에 대한 링크가 포함되어 있습니다. find_all("a")을(를) 사용하여 이 링크를 찾으십시오. — 여기서 인수 "a" HTML 태그 <a>에 해당 .

각 링크에 대해 j , ["title"] 추가 out이라는 목록에 대한 속성 . ["title"]에 관심을 가져야 하는 이유 속성은 정확히 일치하기 때문입니다. nodes에 저장된 언어 이름 .

예를 들어 Java는 nodes에 저장됩니다. "Java (programming language)"로 , 따라서 데이터 세트 전체에서 이 정확한 이름을 사용해야 합니다.

성공하면 getLinks() 프로그래밍 언어 목록을 반환합니다. 나머지 함수는 모든 단계에서 문제가 발생할 경우를 대비하여 예외 처리를 처리합니다.

데이터 수집

마침내, 당신은 앉아서 스크립트가 그 일을 하도록 거의 준비가 되었습니다. 데이터를 수집하고 두 개의 목록 개체에 저장합니다.

edgeList = [["Source,Target"]]
meta = [["Id","Year"]]

이제 nodes의 모든 항목에 앞서 정의한 기능을 적용하는 루프를 작성하십시오. , 출력을 edgeList에 저장 및 meta .

for n in nodes:
    try:
        temp = getSoup(n)
    except:
        continue
    try:
        influenced = getLinks(temp)
        for link in influenced:
            if link in nodes:
                edgeList.append([n+","+link])
                print([n+","+link])
    except:
        continue
    year = getYear(temp)
    meta.append([n,year])

이 함수는 nodes의 각 언어를 사용합니다. Wikipedia 페이지에서 요약 테이블을 검색하려고 시도합니다.

그런 다음 해당 언어의 영향을 받은 것으로 테이블에 나열된 모든 언어를 검색합니다.

nodes에도 나타나는 각 언어에 대해 목록, edgeList에 요소 추가 ["source,target"] 형식으로 . 이런 식으로 Gephi에 피드할 에지 목록을 작성하게 됩니다.

디버깅을 위해 edgeList에 추가된 각 요소를 인쇄합니다. — 모든 것이 제대로 작동하는지 확인하기 위해서입니다. 더 철저했다면 except에 print 문을 추가할 수 있습니다. 조항도 있습니다.

다음으로 언어의 이름과 연도를 가져와 meta에 추가합니다. 목록.

CSV에 쓰기

루프가 실행되면 마지막 단계는 edgeList의 내용을 작성하는 것입니다. 및 meta 쉼표로 구분된 값(CSV) 파일로. csv로 쉽게 수행할 수 있습니다. 이전에 가져온 모듈입니다.

with open("edge_list.csv","w") as f: 
    wr = csv.writer(f)
    for e in edgeList:
        wr.writerow(e)

with open("metadata.csv","w") as f2:
    wr = csv.writer(f2)
    for m in meta:
        wr.writerow(m)

완료! 스크립트를 저장하고 터미널에서 다음을 실행합니다.

$ python3 script.py

에지 목록을 구성할 때 각 소스-대상 쌍을 출력하는 스크립트가 표시되어야 합니다. 인터넷 연결이 안정적인지 확인하고 스크립트가 마법을 부리는 동안 가만히 앉아 있으십시오.

3단계 — Gephi를 사용한 그래프 작성

Gephi가 더 일찍 설치되어 실행되기를 바랍니다. 이제 새 프로젝트를 만들고 수집한 데이터를 사용하여 방향 그래프를 작성할 수 있습니다. 이것은 다른 프로그래밍 언어가 서로에게 얼마나 영향을 미쳤는지 보여줄 것입니다!

Gephi에서 새 프로젝트를 생성하여 시작하고 "데이터 연구소" 보기로 전환합니다. 이것은 Gephi에서 데이터를 처리하기 위한 스프레드시트와 같은 인터페이스를 제공합니다. 가장 먼저 할 일은 에지 목록을 가져오는 것입니다.

  • '스프레드시트 가져오기'를 클릭합니다.
  • edge_list.csv 선택 Python 스크립트에 의해 생성된 파일. Gephi가 쉼표를 구분 기호로 사용할 수 있도록 합니다.
  • 목록 유형에서 "에지 목록"을 선택합니다.
  • "다음"을 클릭하고 소스 및 대상 열을 모두 문자열로 가져오고 있는지 확인하십시오.

그러면 노드 목록이 있는 Data Lab이 업데이트됩니다. 이제 metadata.csv을 가져옵니다. 파일. 이번에는 목록 유형에서 "노드 목록"을 선택해야 합니다.

"미리보기" 탭으로 전환하여 네트워크가 어떻게 보이는지 확인하세요.

아… 조금… 모노크롬. 그리고 지저분하다. 스파게티 한 접시처럼. 이 문제를 해결해 보겠습니다.

예쁘게 만들기

프레젠테이션을 작업할 수 있는 모든 방법이 있으며 여기에 약간의 창의적 자유가 있습니다. 네트워크 시각화를 사용할 때 기본적으로 고려해야 할 세 가지 사항이 있습니다.

  1. 포지셔닝 네트워크에 대한 레이아웃 패턴을 생성할 수 있는 몇 가지 알고리즘이 있습니다. 인기 있는 선택은 Gephi에서 사용할 수 있는 Fruchterman-Reingold 알고리즘입니다.
  2. 크기 조정 그래프의 노드 크기는 흥미로운 속성을 나타내는 데 사용할 수 있습니다. 종종 이것은 중심성 측정값입니다. . 중심성을 측정하는 방법에는 여러 가지가 있지만, 모두 네트워크의 나머지 부분과 얼마나 잘 연결되어 있는지 면에서 주어진 노드의 "중요도"를 반영합니다.
  3. 채색 색상을 사용하여 노드의 일부 속성을 표시하는 것도 가능합니다. 종종 색상은 커뮤니티 구조를 나타내는 데 사용됩니다. . 이것은 "그래프의 나머지 부분보다 서로 더 많이 연결된 노드 그룹"으로 광범위하게 정의됩니다. 소셜 네트워크에서 이것은 우정, 가족 또는 전문 그룹을 드러낼 수 있습니다. 커뮤니티 구조를 감지할 수 있는 몇 가지 알고리즘이 있습니다. Gephi에는 Louvain 방식이 내장되어 있습니다.

이러한 변경을 수행하려면 몇 가지 통계를 계산해야 합니다. "개요" 창으로 전환합니다. 여기서 오른쪽에 패널이 표시됩니다. 여기에는 "통계" 탭이 포함되어야 합니다. 이것을 열면 다양한 옵션이 표시됩니다.

Gephi에는 다양한 통계 기능이 내장되어 있습니다. 각각에 대해 "실행"을 클릭하면 네트워크에 대한 통찰력을 보여주는 보고서가 생성됩니다.

알아두면 유용한 몇 가지 사항은 다음과 같습니다.

  • 평균 학위 평균적인 언어는 약 4개의 다른 언어와 연결되어 있습니다. 보고서에는 정도 분포 그래프도 표시됩니다. 이것은 대부분의 언어가 연결이 거의 없는 반면 소수의 언어는 연결이 많다는 것을 보여줍니다. 이는 이것이 무척임을 나타냅니다. 네트워크 . 규모 없는 네트워크와 네트워크를 생성하는 프로세스에 대해 많은 연구가 수행되었습니다.
  • 직경 이 네트워크의 지름은 12입니다. 이는 두 언어 간의 "가장 넓은" 연결 수를 의미합니다. 평균 경로 길이는 4개 미만입니다. 즉, 평균적으로 두 언어는 네 모서리로 구분됩니다. 이 수치는 네트워크의 "크기"를 측정한 것입니다.
  • 모듈성 이것은 네트워크가 얼마나 "구획화"되었는지를 보여주는 점수입니다. 여기서 모듈성 점수는 약 0.53입니다. 이는 상대적으로 높기 때문에 이 네트워크 내에 고유한 모듈이 있음을 나타냅니다. 다시 말하지만, 이는 기본 시스템에 대해 흥미로운 점을 나타냅니다. 언어는 별개의 "영향 그룹"에 속하는 경향이 있습니다.

어쨌든 네트워크의 모양을 수정하려면 왼쪽 패널로 이동하십시오.

"레이아웃" 탭에서 사용할 레이아웃 알고리즘을 선택할 수 있습니다. "실행"을 누르고 실시간으로 그래프 이동을 확인하십시오! 어떤 레이아웃 알고리즘이 가장 효과적이라고 생각하는지 확인하세요.

레이아웃 탭 위에는 "모양" 탭이 있습니다. 여기에서 노드 및 에지 색상, 크기 및 레이블에 대해 다양한 설정을 사용할 수 있습니다. 속성을 기반으로 구성할 수 있습니다(Gephi에서 계산하도록 하는 통계 포함).

제안으로 다음을 수행할 수 있습니다.

  • Modularity 속성에 따라 노드의 색상을 지정합니다. 커뮤니티 회원에 따라 색상이 지정됩니다.
  • 차수별로 노드 크기를 조정합니다. 더 잘 연결된 노드는 덜 연결된 노드보다 크게 나타납니다.

그러나 가장 좋아하는 레이아웃을 실험하고 생각해 내야 합니다.

그래프 모양이 마음에 들면 마지막 단계인 웹으로 내보내기로 넘어갈 차례입니다!

4단계 — Sigma.js

이미 Gephi에서 탐색할 수 있는 네트워크 시각화를 구축했습니다. 스크린샷을 찍거나 그래프를 SVG, PDF 또는 PNG 형식으로 저장할 수 있습니다.

그러나 이전에 Sigma.js 플러그인을 설치했다면 그래프를 HTML로 내보내지 않겠습니까? 이렇게 하면 온라인으로 호스팅하거나 GitHub에 업로드하여 다른 사람들과 공유할 수 있는 대화형 시각화가 생성됩니다.

이렇게 하려면 Gephi의 메뉴 모음에서 "내보내기> Sigma.js 템플릿..."을 선택합니다.

필요에 따라 세부 정보를 입력합니다. 프로젝트를 내보낼 디렉토리를 선택해야 합니다. 제목, 범례, 설명, 호버 동작 및 기타 여러 세부 사항을 변경할 수 있습니다. 준비가 되면 "확인"을 클릭하십시오.

이제 프로젝트를 내보낸 디렉터리로 이동하면 Sigma.js에서 생성한 모든 파일이 포함된 폴더가 표시됩니다.

index.html 열기 좋아하는 브라우저에서. 타다! 당신의 네트워크가 있습니다! CSS와 JavaScript를 조금 알고 있다면 생성된 다양한 파일을 살펴보고 원하는 대로 출력을 조정할 수 있습니다.

이것으로 이 튜토리얼을 마칩니다!

요약

  • 많은 시스템을 네트워크로 모델링하고 시각화할 수 있습니다. 그래프 이론은 네트워크 구조와 속성을 이해하는 데 도움이 되는 도구를 제공하는 수학의 한 분야입니다.
  • Python을 사용하여 Wikipedia에서 데이터를 스크랩하여 프로그래밍 언어 영향 그래프를 작성했습니다. 연결 기준은 주어진 언어가 다른 사람의 디자인에 영향을 미치는 것으로 나열되었는지 여부였습니다.
  • Gephi와 Sigma.js는 네트워크를 분석하고 시각화할 수 있는 오픈 소스 도구입니다. 이미지, PDF 또는 웹 형식으로 네트워크를 내보낼 수 있습니다.

읽어 주셔서 감사합니다. 귀하가 가질 수 있는 의견이나 질문을 기다리겠습니다! 그래프 이론에 대해 자세히 알아볼 수 있는 환상적인 리소스는 Albert-László Barabási의 대화형 온라인 책을 참조하십시오.

이 튜토리얼의 전체 코드는 여기에서 찾을 수 있습니다.