个性化阅读
专注于IT技术分析

Python中的社交网络分析

本文概述

如果你想了解网络分析, 请参加srcmini的Python网络分析(第1部分)课程。

网络无处不在, 道路网络, 社交媒体上的朋友和追随者网络, 以及办公室同事网络。从传播有用的信息到影响全国大选, 他们在我们的日常生活中发挥着重要作用。分析这些网络并基于它们做出明智决策的能力对于任何数据分析师而言都是至关重要的。

本教程的重点是教使用Python和NetworkX进行社交网络分析(SNA), 这是一个用于研究复杂网络的结构, 动态和功能的Python库。本教程假定读者熟悉Python的基本语法, 并且不需要SNA的先前知识。

介绍

让我们首先从社交网络的含义开始。在下面, 你可以看到一个宝莱坞演员网络作为节点。如果他们在至少一部电影中共同努力过, 他们之间将以实线相连。

Python中的社交网络分析1

因此, 我们可以看到Amitabh Bachchan和Abhishek Bachchan都与网络中的所有演员一起表演, 而Akshay Kumar仅与两个Bachchans一起表演过。有趣的权利!

这也是一个社交网络。个人之间具有联系的任何网络(其中的联系捕获了他们之间的关系)都是社交网络。分析这些网络可以使我们对网络中的人有深刻的了解, 例如真正的影响者, 联系最紧密的人等等。

每个网络包括:

  • 节点:我们正在建立其网络的个人。上例中的Actor。
  • 边缘:节点之间的连接。它表示网络节点之间的关系。在我们的示例中, 关系是演员一起工作。

使用NetworkX创建网络

网络有很多类型。我们将使用NetworkX开发和分析这些不同的网络。首先, 你需要安装networkX:可以使用以下任一方法:

pip install networkx

或者在Anaconda工作

conda install -c anaconda networkx

这将安装最新版本的networkx。本教程中的代码在Python = 3.5, NetworkX = 2.0版本上完成。

对称网络

我们上面创建的第一个演员网络是对称网络, 因为”在电影中一起工作”的关系是对称关系。如果A与B有关, 那么B也与A有关。让我们创建在NetworkX中上面看到的网络。

我们将使用Graph()方法创建一个新网络, 并使用add_edge()在两个节点之间添加一条边。

import networkx as nx
G_symmetric = nx.Graph()
G_symmetric.add_edge('Amitabh Bachchan', 'Abhishek Bachchan')
G_symmetric.add_edge('Amitabh Bachchan', 'Aamir Khan')
G_symmetric.add_edge('Amitabh Bachchan', 'Akshay Kumar')
G_symmetric.add_edge('Amitabh Bachchan', 'Dev Anand')
G_symmetric.add_edge('Abhishek Bachchan', 'Aamir Khan')
G_symmetric.add_edge('Abhishek Bachchan', 'Akshay Kumar')
G_symmetric.add_edge('Abhishek Bachchan', 'Dev Anand')
G_symmetric.add_edge('Dev Anand', 'Aamir Khan')

现在让我们可视化我们刚刚使用nx.draw_networkx(G_symmetric)构建的网络。

Python中的社交网络分析2

非对称网络

如果节点之间的关系是”子级”, 该关系将不再对称。如果A是B的子代, 则B不是A的子代。这种关系是非对称的(A与B相关, 不一定意味着B与A关联)的网络称为非对称网络。我们可以使用DiGraph方法在NetworkX中构建非对称网络, 这比Directional Graph短。让我们制作一个不对称图。

G_asymmetric = nx.DiGraph()
G_asymmetric.add_edge('A', 'B')
G_asymmetric.add_edge('A', 'D')
G_asymmetric.add_edge('C', 'A')
G_asymmetric.add_edge('D', 'E')

现在我们将其可视化。我们可以像以前一样使用draw_networkx()函数。但是, 节点可能不会分离出来, 并且在绘制的网络中清晰可见。为了解决这个问题, 我们可以使用该函数强制布局, 以一种可以清晰看到它们的方式定位节点。我们可以使用spring_layout()函数, 然后使用draw_networkx()函数来完成此操作。

nx.spring_layout(G_asymmetric)
nx.draw_networkx(G_asymmetric)

在下面, 你可以查看使用和不使用layout命令的网络。使用layout命令制作的脚本更加清晰。

Python中的社交网络分析3

加权网络

到现在为止, 我们没有权重的网络, 但是有可能使用权重来构建网络, 例如, 如果在我们的初始网络中, 我们将一起完成的电影数量视为权重, 我们将获得一个加权网络。让我们再选一个演员, 但是这次我们增加了网络的权重, 每个边缘都有权重, 表示他们一起完成的电影数量。

G_weighted = nx.Graph()
G_weighted.add_edge('Amitabh Bachchan', 'Abhishek Bachchan', weight=25)
G_weighted.add_edge('Amitabh Bachchan', 'Aaamir Khan', weight=8)
G_weighted.add_edge('Amitabh Bachchan', 'Akshay Kumar', weight=11)
G_weighted.add_edge('Amitabh Bachchan', 'Dev Anand', weight=1)
G_weighted.add_edge('Abhishek Bachchan', 'Aaamir Khan', weight=4)
G_weighted.add_edge('Abhishek Bachchan', 'Akshay Kumar', weight=7)
G_weighted.add_edge('Abhishek Bachchan', 'Dev Anand', weight=1)
G_weighted.add_edge('Dev Anand', 'Aaamir Khan', weight=1)
Python中的社交网络分析4

上图以圆形布局显示了参与者的加权网络。边缘宽度指定两个节点之间的权重。

多图

我们可以给边缘赋予不同的属性。例如, 我们可以使用关系属性定义两个节点” A”和” B”之间的邻居关系。如果在一个网络中, 两个节点连接了两个不同的边(关系), 我们就有一个多图。我们可以利用MultiGraph类制作一个多图。

G = nx.MultiGraph()
G.add_edge('A', 'B', relation ='neighbor')
G.add_edge('A', 'B', relation='friend)
G.add_edge('B', 'C', relation='neighbor')
G.add_edge('D', 'C', relation='friend')

这段代码将构造一个在A和B之间具有两个边的图形。我们可以使用G.edges()检查连接, 输出将显示:

MultiEdgeDataView([('A', 'B', {'relation': 'neighbor'}), ('A', 'B', {'relation': 'friend'}), ('B', 'C', {'relation': 'neighbor'}), ('B', 'D', {'relation': 'neighbor'}), ('C', 'D', {'relation': 'friend'})])

网络连接

现在已经建立了网络, 我们可以进一步了解网络中的特定节点吗?好吧, 让我们探索其中的一些。

学位

节点的度数定义节点具有的连接数。 NetworkX具有功能度, 我们可以使用它来确定网络中节点的度。

nx.degree(G_symmetric, 'Dev Anand`)

这将返回3的值, 因为Dev Anand仅与网络中的三个参与者合作。

聚类系数

据观察, 在社交网络中共享联系的人倾向于形成协会。换句话说, 社交网络中倾向于形成集群。我们可以确定节点的群集, 即本地群集系数, 它是节点的相互连接的朋友(即连接)对的分数。为了确定局部聚类系数, 我们使用nx.clustering(Graph, Node)函数。

在对称Actor网络中, 你会发现Dev Anand的局部聚类系数为1, 而Abhishek Bachchan的局部聚类系数为0.67。

对称Actor网络的平均聚类系数(所有局部聚类系数的总和除以节点数)为0.867。我们可以使用以下方法获取它:

nx.average_clustering(G_symmetric)

距离

我们还可以分别使用nx.shortest_path(Graph, Node1, Node2)和nx.shortest_path_length(Graph, Node1, Node2)函数确定两个节点之间的最短路径及其在NetworkX中的长度。

执行中

nx.shortest_path(G_symmetric, 'Dev Anand', 'Akshay Kumar')

退货

['Dev Anand', 'Amitabh Bachchan', 'Akshay Kumar']

我们可以使用广度优先搜索算法找到一个节点与网络中其他每个节点的距离, 从该节点开始。 networkX提供了bfs_tree函数来执行此操作。因此, 如果你尝试T = nx.bfs_tree(G_symmetric, ‘Dev Anand’)并绘制此树, 我们将得到一个网络结构, 该结构告诉我们如何从Dev Anand开始到达网络的其他节点。

Python中的社交网络分析5

偏心率

节点A的偏心率定义为A与所有其他节点之间的最大距离。可以使用nx.eccentricity()函数找到它。在对称的Actor网络中, Dev Anand的离心率是2, Abhishek Bachchan的离心率是1(连接到所有人)。

网络影响者

上面我们学习了一些网络距离度量, 它们对于了解信息如何通过网络传播非常有用。在本节中, 我们将学习如何查找网络中最重要的节点(个人)。这些参数称为集中度度量。

请记住, 你的高中或学校中顶级棒球运动员中的那个受欢迎的女孩。这些人有能力使你的高中经历地狱或​​天堂。是什么赋予了他们这种力量?集中度度量可以帮助我们确定网络中的知名度, 最喜欢和最大的影响者。

学位中心

通常最受欢迎或最喜欢的人是拥有更多朋友的人。度中心度是对特定节点在网络中具有的连接数的度量。它基于重要节点具有许多连接的事实。 NetworkX具有函数degree_centrality()来计算网络所有节点的度中心性。

特征向量中心性

不仅仅是一个人也要联系多少个人, 而且一个人所联系的人的类型可以决定一个节点的重要性。在德里路, 每当交警抓捕一个违反交通规则的人时, 交警听到的第一句话就是”你知道我与谁有关系吗?”。

特征向量中心性正是对此的一种度量。它确定一个节点是否重要, 如果该节点连接到其他重要节点。我们可以使用NetworkX的eigenvector_centrality()函数来计算网络中所有节点的特征向量中心性。

Google的Pagerank算法是特征向量中心性算法的一种变体。

中间性

中间性是控制的中心。它表示在连接点对的测地线(最短路径)上出现点的频率。它量化特定节点进入其他两个节点之间最短选择路径的次数。具有高度中间性的节点在网络内的通信/信息流中起着重要作用。具有高度中间性的节点可以对其他节点进行策略控制和影响。具有这种战略地位的个人可以通过隐瞒或涂色传输中的信息来影响整个团队。

Networkx具有betweenness_centrality()函数以针对网络对其进行测量。它具有选择我们是否希望对中间值进行归一化, 选择权重是否包括在中心度计算中以及是否将端点包括在最短路径计数中的选项。

结合所有。

让我们从Facebook数据开始, 在这里进行分析, 我们将使用Facebook组合的自我网络数据集, 其中包含十个人的Facebook朋友列表的汇总网络。你可以从斯坦福大学网站下载所需的facebook_combined.txt文件。

你可以使用Facebook / Twitter API获得自己的Facebook / Twitter数据。期待下一个即将到来的教程, 我们将学习如何使用Facebook和Twitter API获取数据以及如何使用此处获取的信息进行分析。

我们读入文件并构造Graph:

G_fb = nx.read_edgelist("facebook_combined.txt", create_using = nx.Graph(), nodetype=int)

该网络包含4, 039个节点, 通过88, 234个边缘连接!是的, 这是一个很大的网络。你可以使用info()函数获取信息。

[In]: print(nx.info(G_fb))


[Out]: Name:
       Type: Graph
       Number of nodes: 4039
       Number of edges: 88234
       Average degree:  43.6910

在下面你可以看到网络:

Python中的社交网络分析6

我们还可以可视化网络, 以使节点颜色随度数而变化, 而节点大小随居中性而变化。执行此操作的代码是:

pos = nx.spring_layout(G_fb)
betCent = nx.betweenness_centrality(G_fb, normalized=True, endpoints=True)
node_color = [20000.0 * G_fb.degree(v) for v in G_fb]
node_size =  [v * 10000 for v in betCent.values()]
plt.figure(figsize=(20, 20))
nx.draw_networkx(G_fb, pos=pos, with_labels=False, node_color=node_color, node_size=node_size )
plt.axis('off')

结果图为:

Python中的社交网络分析7

你还可以使用以下方法了解中间度中心度最高的节点的标签:

sorted(betCent, key=betCent.get, reverse=True)[:5]

下表列出了具有最高集中度度量的五个节点标签。

学位中心 特征向量中心性 中间性
107 1912 107
1684 2266 1684
1912 2206 3437
3437 2233 1912
0 2464 1085

我们可以看到, 度中心度和控制信息流的中间度中心之间存在一些共同点。当然, 连接更紧密的节点也位于其他节点之间的最短路径上。节点1912是重要的节点, 因为根据我们考虑的所有三个中心性度量, 节点1912至关重要。

参考文献

  • 演员数据是从IMDB网站获得的
  • 了解NetworkX及其功能的最佳场所是其文档

如果你想了解有关Python中社交网络分析的更多信息, 请参加srcmini的Python中分析社交媒体数据课程。

赞(0)
未经允许不得转载:srcmini » Python中的社交网络分析

评论 抢沙发

评论前必须登录!