r?

时间:2016-08-30 10:34:21

标签: r

我在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  

最后,我想要想象一个社交网络,在那里我可以看到欺诈网络和颜色的边缘,以指出它是否是欺诈。如果可以,我想在边缘显示关系类型。

2 个答案:

答案 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)

结果如下:

enter image description here

至少在一开始,这应该提供一种更清晰的方式来理解数据背后的关系。

稍后,您可以返回并为网络的较小部分或修剪后的网络版本创建网络可视化。

在您的情况下,看起来您有一个带有分类&#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)

我建议您使用jsprit

我将它用于VRP及其衍生物用于我的研究比较。我认为,它同样适用于网络分析和优化。

检查,像“破坏和重新创建”这样的算法