社會網路分析及其Python實現

郝hai發表於2024-05-02

社會網路分析(Social Network Analysis, SNA)在人類學、心理學、社會學、數學以及統計學等領域中發展起來,是綜合運用圖論、數學模型來研究社會行動者之間的關係或透過這些關係流動的各種有形或無形的東西,如資訊、資源等,近年來逐漸成為一種熱門的社會科學研究方法。社會網路分析旨在理解和揭示人際關係網路的結構、特徵和演化規律。它藉助於圖論、統計學、電腦科學等多個學科的理論和技術,透過分析個體之間的連線關係和資訊流動,揭示社會系統中的隱含規律和重要特徵。社會網路分析的核心思想是將個體視為節點,他們之間的關係視為邊,從而構建起整個社會網路的拓撲結構。社會網路分析的歷史可以追溯到20世紀30年代的社會學研究,但其真正迅速發展起來是在20世紀70年代。隨著計算機和網際網路技術的發展,社會網路分析方法得到了廣泛應用,並在學術界和實踐中取得了重要進展。近年來,隨著大資料和機器學習技術的興起,社會網路分析在規模化資料處理和模型構建方面有了更多創新。

一、社會網路分析概述

社會網路分析揭示了人際關係網中的模式與結構,透過節點(個體)和邊(關係)來描繪社交動態。它幫助我們理解資訊如何在網路中傳播,識別關鍵人物及其影響力,從而洞察社會現象的深層次原因。

1.1 社會網路中的要素

在社會網路分析中,有一些重要的要素和概念,它們幫助我們理解社會網路的結構、特徵和動態。以下是社會網路中的一些關鍵要素:
節點(Node): 節點是網路中的基本單元,代表個體、組織或其他實體。在社會網路中,節點可以是人、團體、公司、網站等,它們透過連線來相互聯絡。
連線(Edge): 連線是節點之間的關係或聯絡,也稱為邊。在社會網路中,連線可以表示各種關係,如友誼、合作、資訊傳播等。連線可以是雙向的(例如,朋友關係)也可以是單向的(例如,追隨關係)。
權重(Weight): 權重表示連線的強度或重要性。在一些社會網路中,連線可能具有不同的權重,表示不同程度的關係緊密程度、資源交換等。權重可以用來衡量節點之間的關係強度。
網路密度(Network Density): 網路密度是指網路中實際連線數與可能連線數之比。高密度網路表示節點之間的連線較為緊密,低密度網路表示節點之間的連線較為稀疏。網路密度可以反映網路的緊密程度和資訊傳播的效率。
中心性(Centrality): 中心性是衡量節點在網路中重要性和影響力的指標。常見的中心性指標包括度中心性、接近中心性、介數中心性和特徵向量中心性等,它們用來確定節點在網路中的位置和影響力程度。
社團(Community): 社團是網路中緊密連線的子群體,其中的節點之間具有較高的內部連線強度,而與其他社團之間的連線較弱。社團在網路中可以代表共同的興趣、背景、行業等。
結構洞(Structural Hole): 結構洞是指網路中連線不同社團的節點或子群體,他們可以在不同的社團之間傳播資訊和資源,具有架起橋樑的作用。Burt的結構洞理論認為,掌握結構洞的個體在資訊傳播、創新和影響力方面具有優勢。
社會資本(Social Capital): 社會資本是個體或群體透過社會關係所擁有的資源,包括資訊、支援、信任等。Lin的社會資本理論強調了社會網路對個體和組織的價值,以及社會關係對於資源獲取、創新和成功的重要性。

1.2 社會網路分析的應用

社會網路分析的應用潛力和多樣性是令人驚歎的,以下是一些主要領域:
社交網路分析:社交網路分析是社會網路分析中最為人熟知的領域之一,主要關注線上社交網路中的使用者行為、關係和資訊傳播。應用包括:

  • 使用者行為分析: 透過分析使用者在社交網路上的活動、興趣和互動模式,瞭解使用者行為特徵和趨勢,為個性化推薦、精準營銷等提供支援。
  • 資訊傳播研究: 研究資訊在社交網路中的傳播路徑、速度和影響力,揭示資訊病毒傳播的機制,預測熱點話題和輿情發展趨勢。
  • 社群檢測和發現: 識別社交網路中的群體結構和社群,發現使用者之間的隱含聯絡和共同興趣,為社群管理和社交網路最佳化提供參考。

組織網路分析:組織網路分析關注組織內部成員之間的關係和資訊流動,揭示組織的結構和運作方式。應用包括:

  • 組織結構分析: 分析組織內部的連線關係和層級結構,瞭解組織的權力中心、資訊流動路徑和決策機制,為組織設計和管理提供參考。
  • 團隊合作研究: 研究團隊成員之間的協作模式和資訊交流,發現團隊內部的協作障礙和最佳化空間,提高團隊績效和創新能力。
  • 知識管理和轉移: 透過分析組織內部的知識流動和知識共享情況,最佳化知識管理策略,促進知識轉移和創新。

影響力分析:影響力分析旨在識別社會網路中的關鍵節點和領袖人物,瞭解他們在資訊傳播和意見影響中的作用。應用包括:

  • 領導者識別: 透過分析社會網路結構和資訊傳播模式,識別具有較高影響力和領導力的節點和個體,為領導力培養和選拔提供參考。
  • 輿論引導: 透過選擇合適的社交網路節點或個體進行資訊傳播和輿論引導,影響社會輿論和公眾意見,推動特定議題或產品的傳播和接受。
  • 意見領袖挖掘: 透過監測社交網路中的話題和討論,發現具有一定影響力和專業知識的意見領袖,為品牌營銷和公關策略提供參考。

犯罪網路分析:犯罪網路分析利用社會網路分析方法來追蹤犯罪團伙的組織結構和活動路徑,輔助犯罪調查和打擊。應用包括:

  • 犯罪網路識別: 透過分析犯罪分子之間的聯絡和交易模式,識別犯罪網路的關鍵成員和組織結構,為犯罪打擊和預防提供線索。
  • 犯罪活動預測: 基於犯罪網路的演化規律和行為模式,預測犯罪活動的發生時間、地點和形式,提前採取預防和打擊措施。
  • 犯罪證據收集: 透過監測和分析犯罪分子在社交網路和通訊平臺上的活動,收集犯罪證據和線索,為案件偵破提供支援。

健康行為分析:健康行為分析關注人們在健康相關決策和行為中的社會網路影響,例如吸菸、飲食和鍛鍊行為的傳播。應用包括:

  • 健康資訊傳播: 透過社交網路傳播健康知識、宣傳健康活動,促進健康行為的養成和傳播。
  • 疾病監測和預防: 透過分析社交網路中的健康行為資料和使用者交流,監測疾病傳播路徑和風險因素,提出針對性的預防措施。
  • 行為干預和治療支援: 基於社交網路分析結果,設計個性化的健康行為干預方案,提供社群支援和治療指導,幫助使用者改善健康行為和生活方式。
    上述展示了社會網路分析在不同領域的廣泛應用,它的影響力正在不斷擴大,為解決複雜社會問題提供了新的視角和方法。

1.3 社會網路分析的優缺點

優點 缺點
深入洞察社會結構: 社會網路分析能夠深入洞察社會結構和人際關係的細微變化,揭示人們之間的聯絡和互動模式。透過分析網路中的節點和邊的連線關係,可以發現隱藏在背後的社會結構和規律,為社會研究提供新的視角和方法。 資料收集和處理難度: 社會網路分析需要大量的資料支援,包括人際關係資料、行為資料等。然而,獲取這些資料並進行清洗、整理和分析是一項複雜而費時的工作,需要克服資料收集和處理的難度。
預測和干預能力: 社會網路分析可以預測資訊傳播路徑、群體行為趨勢和社會變化模式,幫助決策者制定更加有效的政策和干預措施。透過識別關鍵節點和影響力人物,可以有針對性地進行資訊傳播和輿論引導,影響社會輿論和公眾行為。 隱私和倫理問題: 社會網路分析涉及到個人和組織的敏感資訊,包括個人隱私、商業機密等。因此,需要嚴格遵守隱私保護和倫理規範,保護被研究物件的合法權益和隱私。
跨學科應用: 社會網路分析方法具有跨學科的特點,適用於各種領域的研究和應用,包括社會科學、管理學、醫學、安全領域等。它可以幫助解決複雜的社會問題,促進不同領域的交叉合作和創新發展。 侷限性: 社會網路分析方法可能無法捕捉到一些非正式的、暫時性的關係,例如隱性的社會聯絡和短期的互動行為。因此,在解釋社會現象時存在一定的侷限性,需要結合其他方法進行分析和驗證。
發現潛在價值: 社會網路分析可以幫助發現潛在的社會資源和價值,識別具有影響力和潛力的個體和組織,為合作伙伴選擇、資源配置和創新發展提供參考。 網路結構演化: 社會網路是動態變化的,其結構和成員關係會隨著時間和環境的變化而發生演化。因此,需要不斷更新和調整分析模型,以適應社會網路的變化和發展。
資料驅動決策: 社會網路分析基於大量的實際資料和統計方法,能夠為決策者提供客觀、科學的資料支援,幫助他們做出基於證據的決策和行動計劃。 樣本偏差: 社會網路分析可能受到樣本偏差的影響,即研究樣本不夠代表性或不完整,導致分析結果失真或不準確。因此,需要採取合適的取樣方法和資料校正技術,減少樣本偏差對分析結果的影響。

二、社會網路分析指標

2.1 社會網路分析的分析角度

社會網路分析法可以從多個不同角度對社會網路進行分析,包括中心性分析、凝聚子群分析、核心—邊緣結構分析以及結構對等性分析等,這裡僅介紹常用的前3種。

中心性分析:“中心性”是社會網路分析的重點之一。個人或組織在其社會網路中具有怎樣的權力,或者說居於怎樣的中心地位,這一思想是社會網路分析者最早探討的內容之一。個體的中心度(Centrality)測量個體處於網路中心的程度,反映了該點在網路中的重要性程度。因此一個網路中有多少個行動者/節點,就有多少個個體的中心度。除了計算網路中個體的中心度外,還可以計算整個網路的集中趨勢(可簡稱為中心勢)(Centralization)。與個體中心度刻畫的是個體特性不同,網路中心勢刻畫的是整個網路中各個點的差異性程度,因此一個網路只有一箇中心勢。根據計算方法的不同,中心度和中心勢都可以分為3種:點度中心度/點度中心勢,中間中心度/中間中心勢,接近中心度/接近中心勢。
凝聚子群分析:當網路中某些行動者之間的關係特別緊密,以至於結合成一個次級團體時,這樣的團體在社會網路分析中被稱為凝聚子群。分析網路中存在多少個這樣的子群,子群內部成員之間關係的特點,子群之間關係特點,一個子群的成員與另一個子群成員之間的關係特點等就是凝聚子群分析。由於凝聚子群成員之間的關係十分緊密,因此有的學者也將凝聚子群分析形象地稱為“小團體分析”。
核心-邊緣結構分析:核心—邊緣(Core-Periphery)結構分析的目的是研究社會網路中哪些節點處於核心地位,哪些節點處於邊緣地位。核心邊緣結構分析具有較廣的應用性,可用於分析精英網路、科學引文關係網路以及組織關係網路等多種社會現象中的核心—邊緣結構。

2.2 社會網路分析統計指標

社會網路分析指標是用來描述和量化社會網路結構、節點特徵、關係特徵等的各種度量和指標。這些指標幫助研究者理解網路的形態、特徵和動態,進而揭示個體和組織在網路中的位置、影響力以及其它屬性。以下是一些常用的社會網路分析統計指標:
節點度(Degree): 節點度是指一個節點與其他節點之間的連線數量。在有向網路中,分為入度和出度。節點度越高,表示該節點在網路中與其他節點有更多的連線。
中心性(Centrality): 中心性指標衡量了節點在網路中的重要性和影響力程度。常見的中心性指標包括:
度中心性(Degree Centrality): 節點的度數與網路中所有節點的最大度數之比。
接近中心性(Closeness Centrality): 衡量節點到達網路中其他節點的平均路徑長度的倒數。接近中心性高的節點距離網路中其他節點更近,具有更高的中心性。
介數中心性(Betweenness Centrality): 衡量節點在網路中的“中介”程度,即節點在網路中連線其他節點的最短路徑的數量。
特徵向量中心性(Eigenvector Centrality): 衡量節點與網路中其他重要節點的連線程度,即節點連線到的節點的中心性之和。
群體結構(Clustering): 群體結構指標描述了網路中群體的聚集程度和結構。常見的指標包括:
聚類係數(Clustering Coefficient): 表示節點鄰居之間存在連線的比率,用來度量節點所在群體的緊密程度。
傳播路徑長度(Path Length): 衡量網路中節點之間資訊傳播的距離,常用平均最短路徑長度來描述。
社群發現(Community Detection): 社群發現指標用來發現網路中的子群體或社群,揭示網路的模組化結構和群體之間的關聯。一些常用的社群發現方法包括模組度、譜聚類、Louvain演算法等。
結構洞(Structural Hole): 結構洞理論由Burt提出,用來描述網路中連線不同社群的節點,這些節點通常具有資訊傳播和控制的優勢。
社會資本(Social Capital): 社會資本理論關注個體和組織透過社會網路所獲得的資源,一些指標包括:
關係密度(Relation Density): 描述了網路中關係的豐富程度,即節點之間的連線密度。
信任度(Trust): 描述了網路中節點之間的信任程度,即節點之間的關係質量。
這些指標提供了對社會網路結構和節點特徵的量化描述,幫助研究者深入理解網路的形成、演化和影響力分配。在實際應用中,研究者可以根據具體問題選擇合適的指標來分析和解釋社會網路的特性和行為。

三、社會網路分析Python

3.1 網路中心度

  • 度中心度(Degree Centrality):度中心度衡量了節點在網路中的連線數量。公式:

\[C_{\text{degree}}(v) = \frac{{\text{degree}(v)}}{{N-1}} \]

其中,\(degree(v)\) 是節點 \(v\) 的度數,\(N\) 是網路中的節點數量。

  • 介數中心度(Betweenness Centrality):介數中心度衡量了節點在網路中作為最短路徑之間的中介程度。公式:

\[C_{\text{betweenness}}(v) = \sum_{s \neq v \neq t} \frac{{\sigma_{st}(v)}}{{\sigma_{st}}} \]

其中,\(\sigma_{st}\)​ 是節點 \(s\)\(t\) 之間的最短路徑數量,\(\sigma_{st}(v)\) 是透過節點 \(v\) 的最短路徑數量。

  • 接近中心度(Closeness Centrality):接近中心度衡量了節點到網路中其他節點的平均最短路徑長度的倒數。公式:

\[C_{\text{closeness}}(v) = \frac{{N-1}}{{\sum_{u \neq v} d(v, u)}} \]

其中,\(d(v,u)\) 是節點 \(v\) 到節點 \(u\) 的最短路徑長度。

import networkx as nx
def calculate_degree_centrality(G):
    return nx.degree_centrality(G)

def calculate_betweenness_centrality(G):
    return nx.betweenness_centrality(G, normalized=True)

def calculate_closeness_centrality(G):
    return nx.closeness_centrality(G)

# 測試示例
G = nx.barabasi_albert_graph(100, 2)

degree_centrality = calculate_degree_centrality(G)
betweenness_centrality = calculate_betweenness_centrality(G)
closeness_centrality = calculate_closeness_centrality(G)

print("度中心度:", degree_centrality)
print("介數中心度:", betweenness_centrality)
print("接近中心度:", closeness_centrality) 

3.2 網路中心勢(Network Centrality)

網路中心勢是基於網路結構的中心度指標,它考慮了節點的鄰居節點對節點本身的影響。在有向圖中,網路中心勢可以透過計算節點的入度和出度以及鄰居節點的中心度得到。

  • 度數中心勢(Degree Centrality Potential):度數中心勢是節點的鄰居節點的度中心度之和。公式:

\[C_{\text{degree}}(v) = \sum_{u \neq v} C_{\text{degree}}(u) \]

其中,\(C_{\text{degree}}(u)\)是節點 \(u\) 的度中心度。

  • 接近中心勢(Closeness Centrality Potential):接近中心勢是節點的鄰居節點的接近中心度之和的倒數。公式:

\[C_{\text{closeness}}(v) = \left( \sum_{u \neq v} C_{\text{closeness}}(u) \right)^{-1} \]

其中,\(C_{\text{closeness}}(u)\) 是節點 \(u\) 的接近中心度。

  • 中介中心勢(Betweenness Centrality Potential):中介中心勢是節點的鄰居節點的介數中心度之和。公式:

\[C_{\text{betweenness}}(v) = \sum_{u \neq v} C_{\text{betweenness}}(u) \]

其中,\(C_{\text{betweenness}}(u)\)是節點 \(u\) 的介數中心度。

import networkx as nx
def calculate_degree_centrality_potential(G):
    degree_centrality = nx.degree_centrality(G)
    degree_centrality_potential = {}
    for node in G.nodes():
        neighbors = set(G.neighbors(node))
        node_potential = sum(degree_centrality[n] for n in neighbors)
        degree_centrality_potential[node] = node_potential
    return degree_centrality_potential

def calculate_closeness_centrality_potential(G):
    closeness_centrality = nx.closeness_centrality(G)
    closeness_centrality_potential = {}
    for node in G.nodes():
        neighbors = set(G.neighbors(node))
        node_potential = sum(closeness_centrality[n] for n in neighbors)
        closeness_centrality_potential[node] = 1 / node_potential
    return closeness_centrality_potential

def calculate_betweenness_centrality_potential(G):
    betweenness_centrality = nx.betweenness_centrality(G, normalized=True)
    betweenness_centrality_potential = {}
    for node in G.nodes():
        neighbors = set(G.neighbors(node))
        node_potential = sum(betweenness_centrality[n] for n in neighbors)
        betweenness_centrality_potential[node] = node_potential
    return betweenness_centrality_potential

# 測試示例
G = nx.barabasi_albert_graph(100, 2)

degree_centrality_potential = calculate_degree_centrality_potential(G)
closeness_centrality_potential = calculate_closeness_centrality_potential(G)
betweenness_centrality_potential = calculate_betweenness_centrality_potential(G)

print("度數中心勢:", degree_centrality_potential)
print("接近中心勢:", closeness_centrality_potential)
print("中介中心勢:", betweenness_centrality_potential) 

3.3 度和度相關性

  • 密度(Density):衡量網路中各個節點間的連線強度。將密度接近0的網路稱為稀疏網路。公式\(D = \frac{{2m}}{{n(n-1)}}​\),其中 \(m\) 是連線數量,\(n\) 是節點數量。
  • 同配性(Assortativity):同配性描述了網路中節點之間連線模式的傾向性,即度高的節點更傾向於連線到度也高的節點,或者度低的節點更傾向於連線到度也低的節點。公式\(r = \frac{{\sum_{jk} jk (e_{jk} - q_j q_k)}}{{\sigma^2}}\),其中\(r\) 是同配係數;\(j\)\(k\) 分別是節點 \(j\)\(k\) 的度;\(e_{jk}\) 是節點\(j\)\(k\) 之間的邊的數量;\(q_j\)​ 和\(q_k\)分別是節點\(j\)\(k\) 的度的比例;\(\sigma^2\)是度的方差。同配係數r是一種基於度的皮爾遜相關係數。\(r\)是正值時,表示度大的節點傾向於連線度大的節點;\(r\)是負值時,表示度大的節點傾向於連線度小的節點;\(r\)=+1時,表示網路具有很好的同配性;\(r\)=-1時,表示網路具有很好的異配性。社交網路就表現出很明顯的同配性;而科技網路,生物網路以及金融網路則表現出很強的異配性。
import networkx as nx

# 建立圖
G = nx.Graph()
G.add_edges_from([(1, 2), (1, 3), (2, 3), (2, 4)])

# 計算網路密度
density = nx.density(G)
print("網路密度:", density)

# 計算同配性
assortativity = nx.degree_assortativity_coefficient(G)
print("同配性:", assortativity)

3.4 距離和路徑

  • 直徑(Diameter):直徑是網路中任意兩個節點之間的最長路徑長度,表示網路的最大距離。公式 \(\text{diameter} = \max_{u,v \in V} d(u,v)\),其中 \(d(u,v)\) 表示節點\(u\)到節點\(v\)的最短路徑長度。
  • 節點偏心率(Node Eccentricity):指網路中其他節點與某一節點之間的最長路徑長度。公式\(\text{eccentricity}(v) = \max_{u \in V} d(u,v)\),其中\(d(u,v)\) 表示節點\(u\)到節點\(v\)的最短路徑長度。
  • 半徑(Radius):網路中偏心率最小的節點對之間的距離,表示網路中最短路徑的最大長度
  • 維納指數(Wiener Index):維納指數是網路中所有節點對之間最短路徑長度的總和。公式 \(W = \sum_{u,v \in V} d(u,v)\)
    網路全域性效率(Global Efficiency):網路全域性效率是網路中資訊傳播的效率,與節點間的平均距離成反比。公式 \(GE = \frac{1}{n(n-1)} \sum_{i \neq j} \frac{1}{d(i,j)}\),其中 \(n\)是網路中節點的數量,$d(i,j) $是節點 \(i\) 和節點 \(j\) 之間的最短路徑長度。
  • 網路平均一致估計(Mean Nodal Efficiency):網路平均一致估計是網路全域性效率的倒數,表示網路中資訊傳播的平均效率。公式 \(MN = \frac{1}{GE}\)
  • 平均路徑長度:平均路徑長度是衡量網路結構緊密程度的重要指標之一,它表示網路中任意兩個節點之間的平均最短路徑長度。公式\(L = \frac{1}{{n(n-1)}} \sum_{i \neq j} d_{ij}\),其中\(L\)表示平均路徑長度;\(n\)表示網路中節點的數量;\(d_{ij}\)表示節點 \(i\) 到節點 \(j\) 的最短路徑長度;求和是對網路中所有不同的節點對\((i,j)\) 進行的。
import networkx as nx
# 建立圖
G = nx.Graph()
G.add_edges_from([(1, 2), (1, 3), (2, 3), (2, 4)])

# 計算直徑
diameter = nx.diameter(G)
print("直徑:", diameter)

# 計算節點偏心率
eccentricity = nx.eccentricity(G)
print("節點偏心率:", eccentricity)

# 計算半徑
radius = nx.radius(G)
print("半徑:", radius)

# 計算維納指數
wiener_index = nx.wiener_index(G)
print("維納指數:", wiener_index)

# 計算網路全域性效率
global_efficiency = nx.global_efficiency(G)
print("網路全域性效率:", global_efficiency)

# 計算網路平均一致估計
mean_nodal_efficiency = 1 / global_efficiency
print("網路平均一致估計:", mean_nodal_efficiency)

# 計算平均路徑長度
average_path_length = nx.average_shortest_path_length(G)
print("平均路徑長度:", average_path_length)

3.5 網路結構

  • 聚類係數(Clustering Coefficient):網路聚類係數用於度量網路中節點的積聚情況。它表示一個節點的鄰居之間實際存在的邊數與可能存在的邊數之間的比率。如果聚類係數趨近於1,說明節點的鄰居之間幾乎全部相連;如果聚類係數趨近於0,說明節點的鄰居之間連線較為稀疏。公式 \(CC(v) = \frac{{2 \cdot T(v)}}{{deg(v) \cdot (deg(v) - 1)}}\),其中 \(CC(v)\) 是節點\(v\)的聚類係數;\(T(v)\)是節點\(v\)的鄰居節點之間實際存在的邊數;\(deg(v)\) 是節點\(v\)的度數。
    區域性聚類係數(Local Clustering Coefficient):區域性聚類係數是網路中節點區域性積聚的能力的量化指標。它是所有節點的聚類係數的平均值。公式\(CC = \frac{1}{n} \sum_{v \in V}CC(v)\),其中 \(n\) 是網路中節點的數量。
  • 模組化係數(Modularity Coefficient):模組化係數用於度量網路中某一特定聚類的可能性,即度量網路中聚類的強度。它描述了網路中節點集中於特定社團的程度。公式 $$Q = \frac{1}{2m} \sum_{i,j} \left( A_{ij} - \frac{k_i k_j}{2m} \right) \delta(c_i, c_j)$$ 其中:\(Q\) 是模組化係數;\(A\_{ij}\)是節點 \(i\) 和節點 \(j\) 之間的邊的數量;\(k_i\)\(k_j\) 分別是節點\(i\) 和節點\(j\) 的度;\(m\)是網路中邊的總數;\(\delta(c_i, c_j)\)是指示函式,當節點 \(i\) 和節點 \(j\) 屬於同一個社團時為1,否則為0。
import networkx as nx
# 建立圖
G = nx.Graph()
G.add_edges_from([(1, 2), (1, 3), (2, 3), (2, 4)])

# 計算網路聚類係數
clustering_coefficient = nx.average_clustering(G)
print("網路聚類係數:", clustering_coefficient)

# 計算區域性聚類係數
local_clustering_coefficient = nx.clustering(G)
average_local_clustering_coefficient = sum(local_clustering_coefficient.values()) / len(local_clustering_coefficient)
print("區域性聚類係數:", average_local_clustering_coefficient)

# 計算模組化係數
modularity_coefficient = nx.algorithms.community.quality.modularity(G, nx.algorithms.community.greedy_modularity_communities(G))
print("模組化係數:", modularity_coefficient)

3.6 互惠性(Reciprocity):

計算公式:\(R = \frac{{\text{{number of edges in both directions}}}}{{\text{{number of edges}}}}\)​ 該指標表示網路中存在雙向連線的邊的比例。

import networkx as nx
import matplotlib.pyplot as plt  
  
# 建立一個圖物件  
G = nx.Graph()  
  
# 新增節點和邊  
G.add_edges_from([('A', 'B'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('D', 'E'), ('E', 'D')]) 

reciprocity = nx.reciprocity(G)
print("互惠性:", reciprocity)

3.7 介數(Betweenness Centrality):

介數衡量節點在網路中承擔資訊傳遞的程度,計算公式:

\[b(v) = \sum_{s\neq v\neq t} \frac{{\sigma_{st}(v)}}{{\sigma_{st}}} \]

\(\sigma_{st}\)是從節點 \(s\) 到節點 \(t\) 的最短路徑數量,\(\sigma_{st}(v)\) 是透過節點\(v\)的最短路徑數量。

import networkx as nx
G = nx.Graph()

# 新增節點和邊  
G.add_edges_from([('A', 'B'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('D', 'E'), ('E', 'D')]) 
betweenness_centrality = nx.betweenness_centrality(G)
print("介數中心性:", betweenness_centrality)

3.8 度分佈(Degree Distribution):

度分佈描述了網路中節點的度數分佈情況,通常用機率分佈函式表示。無標度網路(Scale-Free Networks)是社會網路研究中的一個重要概念,其特點是網路中節點的度(連線數)分佈滿足冪律分佈(Power-Law Distribution)。在這種網路中,少數節點擁有大量的連線,而大多數節點只有很少的連線。冪律分佈的一般形式為:\(P(k) \sim k^{-\gamma}\),其中\(P(k)\) 是具有 \(k\) 個連線的節點的機率,\(\gamma\)是冪律指數。

import networkx as nx
import matplotlib.pyplot as plt

G = nx.Graph()

# 新增節點和邊  
G.add_edges_from([('A', 'B'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('D', 'E'), ('E', 'D')])

degree_sequence = [d for n, d in G.degree()]
degree_count = nx.degree_histogram(G)
degrees = range(len(degree_count))

plt.bar(degrees, degree_count, width=0.80, color='b')
plt.title("Degree Distribution")
plt.ylabel("Frequency")
plt.xlabel("Degree")
plt.show()

3.9 K-核(K-Core)

核是網路中的一個子圖,其中每個節點的度至少為 \(k\),並且核中的所有節點都至少連線到其他核中的 \(k\) 個節點。

import networkx as nx
G = nx.Graph()

# 新增節點和邊  
G.add_edges_from([('A', 'B'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('D', 'E'), ('E', 'D')])

k_core = nx.k_core(G)
print("K-Core子圖:", k_core.nodes())

3.10 小世界效應

小世界效應是指在許多真實網路中觀察到的現象,即網路中的大多數節點之間可以透過相對較少的步驟互相到達。在複雜網路分析中,小世界效應通常透過計算網路的平均最短路徑長度和隨機網路(例如隨機圖)的平均最短路徑長度來進行比較。小世界效應計算步驟:

計算原始網路的平均最短路徑長度 \(L_{\text{real}}\)
建立一個隨機網路(例如隨機圖),保持節點數量和度分佈與原始網路相同。
計算隨機網路的平均最短路徑長度 \(L_{\text{random}}\)​。
比較實際網路和隨機網路的平均最短路徑長度,如果實際網路的平均最短路徑長度接近於隨機網路,那麼網路具有小世界效應。

import networkx as nx
import numpy as np

def calculate_small_world_effect(G):
    # 計算原始網路的平均最短路徑長度
    L_real = nx.average_shortest_path_length(G)
    
    # 建立一個隨機網路,保持節點數量和度分佈與原始網路相同
    G_random = nx.double_edge_swap(G, nswap=len(G.edges())*5, max_tries=len(G.edges())*10)
    
    # 計算隨機網路的平均最短路徑長度
    L_random = nx.average_shortest_path_length(G_random)
    
    # 計算小世界效應指數
    small_world_effect = L_real / L_random
    
    return small_world_effect

# 建立一個圖物件
G = nx.watts_strogatz_graph(100, 6, 0.1)  # 使用 Watts-Strogatz 小世界模型建立一個圖

# 計算小世界效應指數
small_world_effect = calculate_small_world_effect(G)
print("小世界效應指數:", small_world_effect) 

3.11 凝聚子群分析(Agglomerative Hierarchical Clustering)

凝聚子群分析是一種常見的聚類演算法,用於將節點分組成具有相似特徵或連線模式的群組。在網路分析中,凝聚子群分析可以用於發現網路中的社群結構,即節點之間緊密連線的子圖。該演算法從每個節點開始,逐步合併具有相似連線模式的節點對,直到形成一組滿足某些停止條件的子群。

import networkx as nx  
import matplotlib.pyplot as plt  
from networkx.algorithms.community import greedy_modularity_communities  
  
# 構建圖(注意這裡應該是karate_club_graph()而不是karate_club_graph)  
G = nx.karate_club_graph()  
  
# 執行凝聚子群分析  
communities = list(greedy_modularity_communities(G))  
  
# 建立一個新的圖形和軸物件  
fig, ax = plt.subplots()  
  
# 繪製結果  
pos = nx.spring_layout(G)  
nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=500, ax=ax)  
ax.set_title('Karate Club Network with Agglomerative Hierarchical Clustering')  
plt.show()  
  
# 輸出社群  
print("Detected communities:")  
for idx, community in enumerate(communities):  
    print(f"Community {idx + 1}: {community}")

3.12 核心和邊緣

給定一個網路,我們可以根據節點的度來將節點劃分為核心節點和邊緣節點。通常情況下,節點的度高於某個閾值的節點被視為核心節點,而度低於該閾值的節點被視為邊緣節點。

import networkx as nx  
import matplotlib.pyplot as plt  
  
def core_and_periphery_partition(G, threshold):  
    core_nodes = [node for node, degree in G.degree() if degree >= threshold]  
    periphery_nodes = [node for node, degree in G.degree() if degree < threshold]  
    core_subgraph = G.subgraph(core_nodes)  
    periphery_subgraph = G.subgraph(periphery_nodes)  
    return core_subgraph, periphery_subgraph  
  
# 建立一個簡單的網路  
G = nx.erdos_renyi_graph(n=20, p=0.2)  
  
# 設定閾值  
degree_threshold = 5  
  
# 劃分核心和邊緣  
core_subgraph, periphery_subgraph = core_and_periphery_partition(G, degree_threshold)  
  
# 建立一個圖形和兩個軸  
fig, axs = plt.subplots(1, 2, figsize=(12, 5))  
  
# 繪製核心子圖  
if core_subgraph.number_of_nodes() > 0:  
    nx.draw(core_subgraph, ax=axs[0], with_labels=True, node_color='lightblue', node_size=500)  
    axs[0].set_title('Core Nodes')  
else:  
    axs[0].set_title('No Core Nodes to Display')  
    axs[0].axis('off')  # 隱藏空的子圖座標軸  
  
# 繪製邊緣子圖  
if periphery_subgraph.number_of_nodes() > 0:  
    nx.draw(periphery_subgraph, ax=axs[1], with_labels=True, node_color='lightgreen', node_size=500)  
    axs[1].set_title('Periphery Nodes')  
else:  
    axs[1].set_title('No Periphery Nodes to Display')  
    axs[1].axis('off')  # 隱藏空的子圖座標軸  
  
# 顯示圖形  
plt.tight_layout()  
plt.show()

3.13 網路效率

網路效率是一種衡量網路中資訊傳輸效率的指標,它是指網路中節點之間資訊傳遞的速度或效率。網路效率可以透過全域性效率和區域性效率來衡量。

  • 全域性效率(Global Efficiency):全域性效率是網路中所有節點對之間最短路徑的倒數的平均值。它表示了網路中資訊傳輸的整體效率,是網路連通性的一個指標。公式: $$E_{global} = \frac{1}{n(n-1)} \sum_{i \neq j} \frac{1}{d(i,j)}$$

其中:\(E_{global}\)是全域性效率;\(n\) 是網路中節點的數量;\(d(i,j)\)是節點 \(i\)和節點\(j\)之間的最短路徑長度。

  • 區域性效率(Local Efficiency):區域性效率是每個節點的區域性最短路徑的倒數的平均值。它表示了網路中每個節點作為資訊傳輸中心的效率。公式: $$E_{local}(i) = \frac{1}{n_i(n_i-1)} \sum_{j \neq k \neq i} \frac{1}{d(j,k)}$$

其中:\(E_{local}(i)\)是節點\(i\) 的區域性效率;\(n_i\)是節點 \(i\) 的鄰居節點的數量;\(d(j,k)\) 是節點 \(j\) 和節點\(k\) 之間的最短路徑長度。

import networkx as nx
# 建立圖
G = nx.Graph()
G.add_edges_from([(1, 2), (1, 3), (2, 3), (2, 4)])

# 計算全域性效率
global_efficiency = nx.global_efficiency(G)
print("全域性效率:", global_efficiency)

# 計算每個節點的區域性效率
local_efficiency = nx.local_efficiency(G)
print("每個節點的區域性效率:", local_efficiency)

總結

社會網路分析是一種跨學科的研究方法,透過分析人際關係網路的結構、特徵和演化規律,揭示社會系統中的隱含規律和重要特徵。其優點包括深入洞察社會結構、預測和干預能力強、跨學科應用廣泛、發現潛在價值和資料驅動決策。然而,社會網路分析也面臨資料收集和處理難度、隱私和倫理問題、侷限性、網路結構演化和樣本偏差等挑戰。綜合來看,社會網路分析為我們提供了深入理解人類社會行為和組織結構的重要工具,同時需要克服各種挑戰,不斷髮展和完善其方法和應用。

參考文獻

  1. 一文讀懂社會網路分析(SNA)理論、指標與應用
  2. 社會網路分析圖】python實現
  3. 複雜網路分析-個人筆記 總結
  4. 利用python繪製社會網路關係圖(networks)
  5. [Network Analysis] 複雜網路分析總結(最後有資料)

相關文章