我在381个节点之间有超过500个关系(边缘)。如何可视化社交网络图?我尝试使用i-graph。但由于边缘太多,其输出无法看到。那些边缘覆盖了所有节点。所以这个数字看起来像个圆圈。
我是否必须使用其他工具进行可视化?我有两个数据帧。一个就像下面。 CUST_ID和SUB_CUST_ID是节点键值。和fmly_reln_code是关系类型值。另一个数据集具有节点类型。
'data.frame': 426 obs. of 3 variables:
$ CUST_ID : int 21564 20672 1342 19239 1649 15039 15963 10455 12657 12921 ...
$ SUB_CUST_ID : int 20967 6462 12929 18556 13961 13961 5767 15377 17146 19488 ...
$ FMLY_RELN_CODE: int 13 12 17 13 13 13 14 12 99 13 ...
我有其他数据框指出边缘的类型。我想根据信息将节点表示为不同的颜色。我怎样才能实现这两个问题?而且,如果可以的话,我想在每个节点上表达关系类型。但有了这个,阅读和理解它的输出将会非常缓慢和复杂。
更新
好的,正如Keith所说,我会更新更新。有两个data.frames。 一个是获得与保险公司客户关系的数据。 CUST_ID和SUB_CUST_ID是关系,FMLY_RELN_CODE是关系的类型。
> str(network_df)
'data.frame': 257 obs. of 3 variables:
$ CUST_ID : int 21564 1342 15039 15963 10455 12657 9790 20267 21575 20534 ...
$ SUB_CUST_ID : int 20967 12929 13961 5767 15377 17146 19390 14629 5934 12708 ...
$ FMLY_RELN_CODE: int 13 17 13 14 12 99 14 14 17 14 ...
> summary(network_df)
CUST_ID SUB_CUST_ID FMLY_RELN_CODE
Min. : 14 Min. : 14 Min. :12.00
1st Qu.: 5949 1st Qu.: 5841 1st Qu.:13.00
Median :12469 Median :12277 Median :14.00
Mean :11648 Mean :11536 Mean :21.24
3rd Qu.:17057 3rd Qu.:17057 3rd Qu.:17.00
Max. :22242 Max. :22258 Max. :99.00
另一个是让我知道客户是否是欺诈。所以我想通过网络分析来分析欺诈网络。有326个顾客,这种关系不一定要有重量或方向。
> str(mapping)
'data.frame': 381 obs. of 2 variables:
$ CUST_ID : int 110 257 361 472 525 545 560 810 939 985 ...
$ SIU_CUST_YN: chr "N" "Y" "N" "Y" ...
> summary(mapping)
CUST_ID SIU_CUST_YN
Min. : 14 Length:381
1st Qu.: 5949 Class :character
Median :12082 Mode :character
Mean :11651
3rd Qu.:16964
Max. :22258
最后,我想要想象一个社交网络,在那里我可以看到欺诈网络和颜色的边缘,以指出它是否是欺诈。如果可以,我想在边缘显示关系类型。
答案 0 :(得分:1)
我建议,不要直接将网络直观化,而是可视化网络底层的邻接矩阵。
例如:
library(igraph)
library(gplots)
set.seed(1)
# generate a fake adj matrix with two highly connected modules
mat <- rbind(matrix(rep(c(1,1,1,0,0,0), 3), nrow=3, byrow=TRUE),
matrix(rep(c(0,0,0,1,1,1), 3), nrow=3, byrow=TRUE))
这导致邻接矩阵具有两个独立但完全连接的组件:
> mat
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 1 1 0 0 0
[2,] 1 1 1 0 0 0
[3,] 1 1 1 0 0 0
[4,] 0 0 0 1 1 1
[5,] 0 0 0 1 1 1
[6,] 0 0 0 1 1 1
显然,这是理想化的,但它应该让您了解可视化对真实数据的影响。
接下来,我们使用双聚类热图分配节点颜色并可视化矩阵:
# assign a color to nodes
node_colors <- c('red', 'red', 'red', 'blue', 'blue', 'blue')
# visualize as a heatmap
heatmap.2(mat, trace='none', col='redgreen',
RowSideColors=node_colors, ColSideColors=node_colors)
结果如下:
至少在一开始,这应该提供一种更清晰的方式来理解数据背后的关系。
稍后,您可以返回并为网络的较小部分或修剪后的网络版本创建网络可视化。
在您的情况下,看起来您有一个带有分类&#34;权重&#34;的边缘列表。您可以使用igraph中的graph.edgelist
函数阅读此内容:
network_df <- data.frame(CUST_ID=c(21564, 1342, 15039, 15963,10455), SUB_CUST_ID=c(20967,12929, 13961, 5767, 15377), FMLY_RELN_CODE=c(13, 17, 13, 14, 12))
> network_df
CUST_ID SUB_CUST_ID FMLY_RELN_CODE
1 21564 20967 13
2 1342 12929 17
3 15039 13961 13
4 15963 5767 14
5 10455 15377 12
# convert ids to character to avoid being treated as indices
network_df$CUST_ID <- as.character(network_df$CUST_ID)
network_df$SUB_CUST_ID <- as.character(network_df$SUB_CUST_ID)
g <- graph.edgelist(as.matrix(network_df[,1:2]), directed=FALSE)
> g
IGRAPH UN-- 10 5 --
+ attr: name (v/c)
+ edges (vertex names):
[1] 21564--20967 1342 --12929 15039--13961 15963--5767 10455--15377
最后,要将其转换为邻接矩阵,请使用get_adjacency
函数:
> get.adjacency(g, sparse=FALSE)
21564 20967 1342 12929 15039 13961 15963 5767 10455 15377
21564 0 1 0 0 0 0 0 0 0 0
20967 1 0 0 0 0 0 0 0 0 0
1342 0 0 0 1 0 0 0 0 0 0
12929 0 0 1 0 0 0 0 0 0 0
15039 0 0 0 0 0 1 0 0 0 0
13961 0 0 0 0 1 0 0 0 0 0
15963 0 0 0 0 0 0 0 1 0 0
5767 0 0 0 0 0 0 1 0 0 0
10455 0 0 0 0 0 0 0 0 0 1
15377 0 0 0 0 0 0 0 0 1 0
答案 1 :(得分:0)