前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于Python的社交网络分析与实践

基于Python的社交网络分析与实践

作者头像
Coder-ZZ
发布2024-07-25 11:08:59
3370
发布2024-07-25 11:08:59
举报
文章被收录于专栏:C/C++进阶专栏

一,社交网络基础

1.社交网络分析的基本概念

社交网络分析(Social Network Analysis,简写为SNA),又称为社会网络分析,是指基于信息学、数学、社会学、管理学、心理学等多学科的融合理论和方法,为理解人类各种社交关系的形成、行为特点分析以及信息传播的规律提供的一种可计算的分析方法。社交网络是由多个节点及其关系所组成的集合,节点通常代表个人或组织,节点之间的边则代表他们的联系或交互。社交网络分析涉及的理论很广泛,有网络科学、复杂网络分析、图神经网络等。

社交网络中的连接强度划分:

a.强连接:通常指那些紧密而频繁的关系,这种连接是双向的、交互频繁的。在社交网络中,强连接形成的核心群体往往对个体的行为有直接影响力。社交关系中的强连接有亲人、恋人等。

b.弱连接:相对较松散但覆盖面广的关系,它对于扩大个人视野和获取信息特别重要。社交关系中的弱连接有泛泛之交、偶尔互动的同事等。

社交网络分析中的连接强度揭示了社交网络的结构特点,如中心化程度、群组划分程度等。对强连接和弱连接的了解有助于分析社区的凝聚力和资源流动等现象。

2.与社交网络相关的古典理论

a.邓巴数字(Dunbar's number)

一个人可交往的朋友人数上限是150人,超过这一数值不仅无法正常的工作和生活,还会降低自己在各方面的效率。

按人数划分如下:

5人以内:亲密同盟

15人以内:最佳小组

50人以内:强关系

150人以内:邓巴数

500人以内:弱关系

(by: Emmanuel Lafont)

b.六度分隔理论(Six Degrees of Separation)

哈佛心理学教授Stanley Milgram提出,一个人和任何一位陌生人之间所间隔的人数不会超过6个,也就是说通过不断认识六个人,我们可以认识任何一位陌生人。

(wiki百科)

c.社会资本理论(social capital theory)

社会资本理论强调的是个体在社交网络中通过网络形式积累资源的能力。

(https://www.wallstreetmojo.com/social-capital/)

3.社交网络分析的应用场景

网络这个名词诞生没多久,而我们已生活在了一个基于网络高度连接的世界里,比如有好友关系网络、交通网络等。因此,社交网络分析的应用场景也特别多,常见应用场景如下:

社交领域:好友推荐、社区发现、社区治理等。

科研领域:合作者推荐、学术影响力评估等。

电商领域:精准营销、个性化推荐、用户兴趣识别等。

金融领域:金融风险分析、价格波动预测、信贷评估、欺诈检测等。

医疗领域:疾病传播预测、新药发现、精准治疗等。

(https://www.touchgraph.com/news)

4.社交网络的分类

(1),按研究群体分类

a.自我中心网络(ego-centric network)

视角以个体为中心,关注与个体相关的朋友、家人、同事等成员,分析个体成员之间关系。

b.整体网络(whole network)

宏观分析整个网络结构,综合分析整个社交系统。

(2),按节点类型分类

a.1-模网络(1-mode)

只研究一个集合内部的行动者,分析集合内部各行动者之间的关系。

b.2-模网络(2-mode)

研究一类行动者集合与另一类行动者集合,分析两类集合之间的关系。

(3),按连接形式分类

a.同质网络(homogeneous)

在这类网络中,用户通常基于共同的兴趣、职业、年龄、性别等特征形成群体。在这种网络中,联系通常是紧密且相关的。比如,专业领域的LinkedIn就是一个典型的同质网络,大部分用户都是某个行业的从业者。同质网络强调小圈子互动。

b.异质网络(heterogeneous)

在这类网络中,用户的属性差异较大,连接跨越了不同的群体。在异质网络中,人们通过多种不同的纽带进行交流,使得信息传播更广泛。比如,Facebook就包含了各种不同的群体,有学生、老师、商业伙伴等,形成了混合的社交图谱。异质网络强调多样性和跨越群体的信息交换。

二,社交网络中的节点度量

1.节点度量的基本概念

度(Node Degree):是指和该节点相关联的边的条数。在社交网络中,当一个人(Node)拥有更多度(degree)数时,他在社区的影响力更大。

中心性(Degree Centrality):可以简单理解为节点与其他节点直接连接的总量。中心性是一种衡量节点重要性的指标,它基于邻接节点的多少来确定其影响力或信息传播的能力。简单来说,度中心性越高,表示这个节点与其他节点的联系越紧密,通常意味着它在社交网络中扮演着枢纽的角色。

出度(in-degree):指有向图中,一个节点连接到其他节点的数量,即有多少条边从这个节点出发。

入度(out-degree):指有向图中,有多少条边指向这一个节点。

在社交网络中,高度中心的节点被称为"关键节点"或"中心人物",因为他们控制了大量的信息流通,并对网络的连通性和稳定性有着重要影响。例如,推特上的意见领袖、Facebook上的活跃分子等都体现了这种高度中心的作用。

2.节点的中心性分类

社交网络分析中的节点中心性主要指衡量网络中每个节点的重要性的指标,它可以帮助我们识别哪些个体在网络中扮演关键角色、帮助我们找出信息传播的关键路径等。了解节点中心性有助于我们在社交网络分析中识别关键人物、意见领袖,或者是信息传播的核心节点。

(1).点度中心性(Degree Centrality):

最简单的衡量方法,即一个节点的度数。

(2).中介中心性(Betweenness Centrality):

是一种检测节点对图中信息或资源流的影响程度的方法。如果一个节点位于其他节点的多条最短传输路径上,通过该节点的信息传输次数较多,则该节点具有很大的中介中心性。表示该节点作为最短路径上的桥梁的重要性。

(3).接近中心性(Closeness Centrality):

又称为紧密中心性,一个拥有很高的紧密中心性的节点拥有着到所有其他节点的距离最小值。计算的是节点到其他所有节点平均距离的倒数,节点越靠近其他所有节点,中心性越高。适用于连通图,非连通图使用调和中心性(Harmonic Centrality)。

(4).特征向量中心性(eigenvector centrality):

类似于pagerank算法,对邻接矩阵求特征值,绝对值最大的特征值称为主特征值,主特征值对应的特征向量即为主特征向量,它包含矩阵最多的信息。节点的价值不仅来自自身直接连接的节点,还包括那些间接相连节点的价值。特征向量中心性强调节点所处的周围环境,例如在疾病传播中,特征向量中心性较大的节点距离传染源更近的可能性更大。

(图源:neo4j.com)

三,社交网络中的常见算法

1.路径搜索算法

a.图搜索算法

常见于深度优先搜索(DFS)和广度优先搜索(BFS)。

b.最短路径算法

常见于Dijkstra算法,是一种用于寻找图中两个节点之间最短路径的经典算法。它由荷兰计算机科学家Edsger Dijkstra于1956年发明,该算法的工作原理基于贪心策略,算法会逐步更新每个未访问节点的最短距离,直到找到目标节点。

c.随机游走算法

随机游走算法(Random Walk)是一种在数学、计算机科学等领域广泛应用的概率模型,通常用于描述粒子在网格状空间中的移动过程。算法基于模拟的随机过程,在这个过程中,每一步都是独立进行的,粒子可以选择向前、向后、向上或向下等方向移动,游走完统计出访问某节点的概率分布。其核心思想是每次随机选择下一个位置,直到达到停止条件。

2.社群发现算法

a.标签传播算法

标签传播算法(Label Propagation Algorithm)是一种半监督的机器学习算法,它基于相邻节点的信息,通过迭代的方式更新每个节点的标签,当节点的标签在其相邻节点中出现得最频繁时,算法就会停止迭代,最终使得相似的节点拥有相同的标签,从而将整个网络划分为若干个紧密相关的社区。

b.Louvain模块度算法

Louvain模块度算法是一种图论方法,用于发现网络中的社区结构,算法的主要目的是找到网络中的一系列社区划分,使得社区内部节点之间相似度很高,社区与社区之间,节点的相似度很低,使模块的划分特别清晰。

四,社交网络分析实践

编程环境:

Python 3.12.2

matplotlib 3.9.1

networkx 3.3

Demo1:社群划分模拟

代码语言:javascript
复制
import networkx as nx
import matplotlib.pyplot as plt

G = nx.Graph()

# 添加节点
G.add_node(1)
G.add_nodes_from([2, 3, 4, 5, 6])
G.add_nodes_from([7, 8, 9, 10, 11])
G.add_node(12)

# 添加边
G.add_edge(1, 2)
G.add_edges_from([(2, 3), (3, 1)])
G.add_edges_from([(5, 3), (3, 4)])
G.add_edges_from([(3, 6), (5, 1), (4, 6)])
G.add_edges_from([(3, 7), (3, 8), (4, 7)])
G.add_edges_from([(7, 8), (5,8), (6, 2)])
G.add_edges_from([(6, 9), (6, 10)])
G.add_edges_from([(6, 11), (6, 12)])
G.add_edges_from([(9, 10), (10, 11)])
G.add_edges_from([(11, 12), (12, 9)])

# 获取节点6的度
degree = G.degree(6)
print("节点6的度数:", degree)

# 计算图的密度
density = nx.density(G)
print("图的密度:", density)

# 社区检测
modularity = nx.algorithms.community.louvain_communities(G)
print("社区的划分:", modularity)

if __name__ == "__main__":
    nx.draw(G, with_labels=True)
    plt.show()

运行结果:

代码语言:javascript
复制
节点6的度数:7
图的密度: 0.3333333333333333
社区的划分: [{1, 2, 3, 4, 5, 7, 8}, 
{6, 9, 10, 11, 12}]

Demo2:星球大战的关系图谱

代码语言:javascript
复制
import networkx as nx
import matplotlib.pyplot as plt

characters = ["R2-D2", "CHEWBACCA",
               "C-3PO","LUKE","DARTH VADER",
               "CAMIE","BIGGS","LEIA",
               "BERU","OWEN","OBI-WAN",
               "MOTTI","TARKIN","HAN",
               "DODONNA","GOLD LEADER",
               "WEDGE","RED LEADER","RED TEN"]

edges = [("CHEWBACCA", "R2-D2"),("C-3PO", "R2-D2"),
        ("BERU", "R2-D2"),("LUKE", "R2-D2"),
        ("OWEN", "R2-D2"),("OBI-WAN", "R2-D2"),
        ("LEIA", "R2-D2"),("BIGGS", "R2-D2"),
        ("HAN", "R2-D2"),("CHEWBACCA", "OBI-WAN"),
        ("C-3PO", "CHEWBACCA"),("CHEWBACCA", "LUKE"),
        ("CHEWBACCA", "HAN"),("CHEWBACCA", "LEIA"),
        ("CAMIE", "LUKE"),("BIGGS", "CAMIE"),
        ("BIGGS", "LUKE"),("DARTH VADER", "LEIA"),
        ("BERU", "LUKE"),("BERU", "OWEN"),
        ("BERU", "C-3PO"),("LUKE", "OWEN"),("C-3PO", "LUKE"),
        ("C-3PO", "OWEN"),("C-3PO", "LEIA"),("LEIA", "LUKE"),
        ("BERU", "LEIA"),("LUKE", "OBI-WAN"),("C-3PO", "OBI-WAN"),
        ("LEIA", "OBI-WAN"),("MOTTI", "TARKIN"),
        ("DARTH VADER", "MOTTI"),("DARTH VADER", "TARKIN"),
        ("HAN", "OBI-WAN"),("HAN", "LUKE"),("C-3PO", "HAN"),
        ("LEIA", "MOTTI"),("LEIA", "TARKIN"),("HAN", "LEIA"),
        ("DARTH VADER", "OBI-WAN"),("DODONNA", "GOLD LEADER"),
        ("DODONNA", "WEDGE"),("DODONNA", "LUKE"),
        ("GOLD LEADER", "WEDGE"),("GOLD LEADER", "LUKE"),
        ("LUKE", "WEDGE"),("BIGGS", "LEIA"),
        ("LEIA", "RED LEADER"),("LUKE", "RED LEADER"),
        ("BIGGS", "RED LEADER"),("BIGGS", "C-3PO"),
        ("C-3PO", "RED LEADER"),("RED LEADER", "WEDGE"),
        ("GOLD LEADER", "RED LEADER"),("BIGGS", "WEDGE"),
        ("RED LEADER", "RED TEN"),("BIGGS", "GOLD LEADER"),
        ("LUKE", "RED TEN")]

if __name__ == "__main__":
    G_starWars = nx.Graph()
    G_starWars.add_nodes_from(characters)
    G_starWars.add_edges_from(edges)

    nx.draw(G_starWars, with_labels = True)
    plt.show()

    pos = nx.circular_layout(G_starWars)
    nx.draw(G_starWars, pos=pos, with_labels=True)
    plt.show()

运行结果:

五,参考阅读

https://www.toptal.com/data-science/graph-data-science-python-networkx

https://gist.github.com/codingthat/be03565bd97e789a3835b50235ad562f

https://guides.co/g/the-network-effects-bible/121732

https://neo4j.com/product/graph-data-science/#graph-data-science-resources

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员与背包客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档