社会网络分析及其Python实现
社会网络分析(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): 描述了网络中节点之间的信任程度,即节点之间的关系质量。
这些指标提供了对社会网络结构和节点特征的量化描述,帮助研究者深入理解网络的形成、演化和影响力分配。在实际应用中,研究者可以根据具体问题选择合适的指标来分析和解释社会网络的特性和行为。
| 类别 | 节点重要度指标和算法 |
|---|---|
| 基于节点邻居数量 | 度中心性、半局部中心性、ClusterRank 算法、k-壳分解 |
| 基于路径 | 介数中心性、离心中心性、接近中心性、Katz 中心性、信息指标、流介数中心性、连通介数中心性、随机游走介数中心性、路由介数、子图中心性 |
| 基于特征向量 | 特征向量中心性、Alpha 中心性、累计提名、PageRank 算法、LeaderRank 算法、HITs 算法、自动信息汇集算法、SALSA算法 |
| 基于节点移除 | 节点删除的最短距离法、节点删除的生成树法、节点收缩宿法、残余接近中心性和收缩 |

三、社会网络分析Python
3.1 中心度分析指标
- 度中心度(Degree Centrality):度中心度衡量了节点在网络中的连接数量。公式:
其中,\(degree(v)\) 是节点 \(v\) 的度数,\(N\) 是网络中的节点数量。
- 介数中心度(Betweenness Centrality):介数中心度衡量了节点在网络中作为最短路径之间的中介程度。公式:
其中,\(\sigma_{st}\) 是节点 \(s\) 和 \(t\) 之间的最短路径数量,\(\sigma_{st}(v)\) 是通过节点 \(v\) 的最短路径数量。
- 接近中心度(Closeness Centrality):接近中心度衡量了节点到网络中其他节点的平均最短路径长度的倒数。公式:
其中,\(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}}(u)\)是节点 \(u\) 的度中心度。
- 接近中心势(Closeness Centrality Potential):接近中心势是节点的邻居节点的接近中心度之和的倒数。公式:
其中,\(C_{\text{closeness}}(u)\) 是节点 \(u\) 的接近中心度。
- 中介中心势(Betweenness Centrality Potential):中介中心势是节点的邻居节点的介数中心度之和。公式:
其中,\(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 度和度相关性
密度:衡量网络中各个节点间的连接强度。将密度接近0的网络称为稀疏网络。密度(Density):公式\(D = \frac{{2m}}{{n(n-1)}}\),其中 \(m\) 是连接数量,\(n\) 是节点数量。
网络同配性:网络同配性主要是根据网络中节点的度,从网络结构的角度考虑网络中节点相连的可能性。同配系数r是一种基于度的皮尔逊相关系数。\(r\)是正值时,表示度大的节点倾向于连接度大的节点;\(r\)是负值时,表示度大的节点倾向于连接度小的节点;\(r\)=+1时,表示网络具有很好的同配性;\(r\)=-1时,表示网络具有很好的异配性。社交网络就表现出很明显的同配性;而科技网络,生物网络以及金融网络则表现出很强的异配性。
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')])
density = nx.density(G)
print("密度:", density)
平均路径长度
复杂网络分析中的平均路径长度是衡量网络结构紧密程度的重要指标之一,它表示网络中任意两个节点之间的平均最短路径长度。
平均路径长度\(L\)的计算公式如下:
其中:
- L表示平均路径长度;
- n表示网络中节点的数量;
- \(d_{ij}\)表示节点 \(i\) 到节点 \(j\) 的最短路径长度;
- 求和是对网络中所有不同的节点对\((i,j)\) 进行的。
import networkx as nx
# 创建一个图对象
G = nx.Graph()
# 添加节点和边
G.add_edge('A', 'B', weight=4)
G.add_edge('A', 'D', weight=2)
G.add_edge('B', 'C', weight=1)
G.add_edge('B', 'D', weight=5)
G.add_edge('D', 'E', weight=3)
G.add_edge('E', 'D', weight=0.5)
# 计算平均路径长度
average_shortest_path_length = nx.average_shortest_path_length(G, weight='weight')
print("平均路径长度:", average_shortest_path_length)`
3.2 聚集系数\(C\)
聚集系数\(C\)是衡量网络中节点聚集程度的指标,计算公式如下:
其中:
- \(C\)表示聚集系数;
- "number of triangles" 表示网络中的三角形数量;
- "number of connected triples" 表示与某一节点相连的三个节点中的边的数量。
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')])
# 计算聚集系数
clustering_coefficient = nx.average_clustering(G)
print("聚集系数:", clustering_coefficient)
3.3
3.4 互惠性(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.5 介数(Betweenness Centrality):
介数衡量节点在网络中承担信息传递的程度,计算公式:
是从节点 \(s\) 到节点 \(t\) 的最短路径数量,\(σst(v)\sigma\_{st}(v)σst(v)\) 是通过节点 \(v\)的最短路径数量。
import networkx as nx
G = nx.Graph()
# 添加节点和边
# ...
betweenness_centrality = nx.betweenness_centrality(G)
print("介数中心性:", betweenness_centrality)
3.6 度分布(Degree Distribution):
度分布描述了网络中节点的度数分布情况,通常用概率分布函数表示。
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
# 添加节点和边
# ...
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.7 核(K-Core):
核是网络中的一个子图,其中每个节点的度至少为 kkk,并且核中的所有节点都至少连接到其他核中的 \(k\) 个节点。
import networkx as nx
G = nx.Graph()
# 添加节点和边
# ...
k_core = nx.k_core(G)
print("K-Core子图:", k_core.nodes())
3.11 小世界效应
小世界效应是指在许多真实网络中观察到的现象,即网络中的大多数节点之间可以通过相对较少的步骤互相到达。在复杂网络分析中,小世界效应通常通过计算网络的平均最短路径长度和随机网络(例如随机图)的平均最短路径长度来进行比较。小世界效应计算步骤:
计算原始网络的平均最短路径长度 LrealL_{\text{real}}Lreal。
创建一个随机网络(例如随机图),保持节点数量和度分布与原始网络相同。
计算随机网络的平均最短路径长度 LrandomL_{\text{random}}Lrandom。
比较实际网络和随机网络的平均最短路径长度,如果实际网络的平均最短路径长度接近于随机网络,那么网络具有小世界效应。
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.8 特征路径长度(Characteristic Path Length):
特征路径长度是网络中所有节点对的最短路径长度的平均值。
G = nx.Graph()
# 添加节点和边
# ...
characteristic_path_length = nx.average_shortest_path_length(G)
print("特征路径长度:", characteristic_path_length)`
3.9 群聚系数(Clustering Coefficient):
群聚系数衡量了网络中节点的聚类程度,即节点的邻居之间的连接密度。
计算公式: $$C_i = \frac{{2 \times \text{{number of triangles incident to node i}}}}{{deg(i) \times (deg(i) - 1)}}$$
其中,\(C_i\) 是节点 \(i\) 的群聚系数,number of triangles incident to node i是与节点\(i\) 相连的三角形数量,\(deg(i)\) 是节点 \(i\) 的度数。
G = nx.Graph()
# 添加节点和边
# ...
clustering_coefficient = nx.clustering(G)
print("群聚系数:", clustering_coefficient)`
3.15 度分布(Degree Distribution):
度分布描述了网络中节点的度数分布情况,通常用概率分布函数表示。
import matplotlib.pyplot as plt
G = nx.Graph()
# 添加节点和边
# ...
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.12 PageRank:
PageRank 是用于评估网络中节点重要性的算法,基于节点之间的连接关系和连接的强度进行计算。
G = nx.DiGraph() # 有向图
# 添加节点和边
# ...
pagerank = nx.pagerank(G)
print("PageRank:", pagerank)`
3.13 最大度(Maximum Degree):
最大度是网络中节点的最大度数。
import networkx as nx
G = nx.Graph()
# 添加节点和边
# ...
max_degree = max(dict(G.degree()).values())
print("最大度:", max_degree)`
3.23 特征向量中心性(Eigenvector Centrality):
特征向量中心性衡量了节点在网络中的重要性,考虑了节点的连接程度以及连接节点的重要性。
import networkx as nx
G = nx.Graph()
# 添加节点和边
# ...
eigenvector_centrality = nx.eigenvector_centrality(G)
print("特征向量中心性:", eigenvector_centrality)`
3.24 模块度(Modularity):
模块度衡量了网络中节点分布的模块化程度,即网络是否存在明显的社区结构。
import networkx as nx
G = nx.Graph()
# 添加节点和边
# ...
modularity = nx.algorithms.community.quality.modularity(G, partition)
print("模块度:", modularity)`
3.29 平均度(Average Degree):
平均度是网络中节点的平均度数。
G = nx.Graph()
# 添加节点和边
# ...
average_degree = sum(dict(G.degree()).values()) / len(G)
print("平均度:", average_degree)`
3.30 网络直径(Network Diameter):
网络直径是网络中所有节点对之间最短路径的最大长度。
G = nx.Graph()
# 添加节点和边
# ...
network_diameter = nx.diameter(G)
print("网络直径:", network_diameter)`
3. 无标度特性
无标度特性描述了网络中节点度分布的幂律分布,即少数节点具有极高的度,而大多数节点具有较低的度。下面是无标度特性的公式和对应的Python程序示例:
公式:
无标度网络的度分布满足幂律分布,其概率密度函数可以表示为:
其中,\(P(k)\) 表示节点的度为 \(k\) 的概率,\(\gamma\) 是幂律指数。
import numpy as np
import matplotlib.pyplot as plt
# 生成一个无标度网络
N = 1000 # 节点数量
gamma = 2.5 # 幂律指数
# 生成节点度序列,按照幂律分布生成度
degrees = np.random.pareto(gamma, N).astype(int)
# 确保节点的度至少为1
degrees[degrees < 1] = 1
# 根据度序列生成无标度网络
G = nx.configuration_model(degrees)
# 去除多重边和自环
G = nx.Graph(G)
# 计算度分布
degree_freq = nx.degree_histogram(G)
degrees = range(len(degree_freq))
# 绘制度分布图
plt.figure(figsize=(10, 6))
plt.plot(degrees, degree_freq, 'ro-')
plt.xscale('log')
plt.yscale('log')
plt.title("Degree Distribution of Scale-Free Network")
plt.xlabel("Degree (log scale)")
plt.ylabel("Frequency (log scale)")
plt.grid(True)
plt.show()`
3.1 幂律指数拟合:
对于给定的网络,可以使用拟合算法来估计其度分布的幂律指数。
# 生成一个无标度网络
# ...
# 计算度分布
degree_freq = nx.degree_histogram(G)
degrees = range(len(degree_freq))
# 进行幂律拟合
fit = powerlaw.Fit(degrees)
# 绘制度分布及拟合结果
fit.plot_pdf(color='b', linewidth=2)
plt.title("Power Law Fit of Degree Distribution")
plt.xlabel("Degree")
plt.ylabel("Frequency")
plt.show()
# 输出拟合结果
print("幂律指数:", fit.alpha)`
3.15 中心度分析指标
- 度中心度(Degree Centrality):度中心度衡量了节点在网络中的连接数量。公式:
其中,\(degree(v)\) 是节点 \(v\) 的度数,\(N\) 是网络中的节点数量。
- 介数中心度(Betweenness Centrality):介数中心度衡量了节点在网络中作为最短路径之间的中介程度。公式:
其中,\(\sigma_{st}\) 是节点 \(s\) 和 \(t\) 之间的最短路径数量,\(\sigma_{st}(v)\) 是通过节点 \(v\) 的最短路径数量。
- 接近中心度(Closeness Centrality):接近中心度衡量了节点到网络中其他节点的平均最短路径长度的倒数。公式:
其中,\(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.15 网络中心势(Network Centrality):
网络中心势是基于网络结构的中心度指标,它考虑了节点的邻居节点对节点本身的影响。在有向图中,网络中心势可以通过计算节点的入度和出度以及邻居节点的中心度得到。
- 度数中心势(Degree Centrality Potential):度数中心势是节点的邻居节点的度中心度之和。公式:
其中,\(C_{\text{degree}}(u)\)是节点 \(u\) 的度中心度。
- 接近中心势(Closeness Centrality Potential):接近中心势是节点的邻居节点的接近中心度之和的倒数。公式:
其中,\(C_{\text{closeness}}(u)\) 是节点 \(u\) 的接近中心度。
- 中介中心势(Betweenness Centrality Potential):中介中心势是节点的邻居节点的介数中心度之和。公式:
其中,\(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.14 网络直径(Network Diameter):
网络直径是网络中所有节点对之间最短路径的最大长度。公式: $$\text{diameter} = \max_{u,v \in V} d(u, v)$$
其中,\(d(u,v)\) 是节点 \(u\) 到节点 \(v\) 的最短路径长度。
3.17 聚类系数(Clustering Coefficient)
聚类系数衡量了网络中节点的局部聚类程度的平均值。公式:
其中,\(N\) 是网络中的节点数量,\(d(i,j)\) 是节点 \(i\) 到节点 \(j\) 的最短路径长度。
def calculate_network_efficiency(G):
num_nodes = nx.number_of_nodes(G)
total_efficiency = 0
for node1 in G.nodes():
for node2 in G.nodes():
if node1 != node2:
shortest_path_length = nx.shortest_path_length(G, node1, node2)
total_efficiency += 1 / shortest_path_length
network_efficiency = total_efficiency / (num_nodes * (num_nodes - 1))
return network_efficiency
# 测试示例
G = nx.barabasi_albert_graph(100, 2)
efficiency = calculate_network_efficiency(G)
print("网络效率:", efficiency)`
3. 凝聚子群分析(Agglomerative Hierarchical Clustering)
凝聚子群分析是一种常见的聚类算法,用于将节点分组成具有相似特征或连接模式的群组。在网络分析中,凝聚子群分析可以用于发现网络中的社区结构,即节点之间紧密连接的子图。该算法从每个节点开始,逐步合并具有相似连接模式的节点对,直到形成一组满足某些停止条件的子群。
import networkx as nx
import matplotlib.pyplot as plt
from networkx.algorithms.community import greedy_modularity_communities
# 构建图
G = nx.karate_club_graph()
# 执行凝聚子群分析
communities = list(greedy_modularity_communities(G))
# 绘制结果
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True, node_color='lightblue', node_size=500)
plt.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. 核心和边缘的划分:
给定一个网络,我们可以根据节点的度来将节点划分为核心节点和边缘节点。通常情况下,节点的度高于某个阈值的节点被视为核心节点,而度低于该阈值的节点被视为边缘节点。
import networkx as nx
import matplotlib.pyplot as plt
def core_and_periphery_partition(G, threshold):
core_nodes = [node for node, degree in dict(G.degree()).items() if degree >= threshold]
periphery_nodes = [node for node, degree in dict(G.degree()).items() 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)
# 绘制结果
plt.figure(figsize=(12, 5))
plt.subplot(1, 2, 1)
nx.draw(core_subgraph, with_labels=True, node_color='lightblue', node_size=500)
plt.title('Core Nodes')
plt.subplot(1, 2, 2)
nx.draw(periphery_subgraph, with_labels=True, node_color='lightgreen', node_size=500)
plt.title('Periphery Nodes')
plt.tight_layout()
plt.show()`
总结
社会网络分析是一种跨学科的研究方法,通过分析人际关系网络的结构、特征和演化规律,揭示社会系统中的隐含规律和重要特征。其优点包括深入洞察社会结构、预测和干预能力强、跨学科应用广泛、发现潜在价值和数据驱动决策。然而,社会网络分析也面临数据收集和处理难度、隐私和伦理问题、局限性、网络结构演化和样本偏差等挑战。综合来看,社会网络分析为我们提供了深入理解人类社会行为和组织结构的重要工具,同时需要克服各种挑战,不断发展和完善其方法和应用。
参考文献
- 一文读懂社会网络分析(SNA)理论、指标与应用
- 社会网络分析图】python实现
- 复杂网络分析-个人笔记 总结
- 利用python绘制社会网络关系图(networks)