1. 程式人生 > 其它 >用R語言作社群關係分析

用R語言作社群關係分析

在反映大量人群或事物之間的關係時,社交網路圖可以清晰的展示’群體’的內含和外延。例如,群體的規模、核心、與其他群體的交疊情況。

社交關係圖來表示應用人數和之間的交疊關係,這樣更加美觀,特別是當應用較多的時候。

兩種應用使用人數的示意圖

改進後的兩種應用使用人數的示意圖

資料的準備:

1、首先,整理一份原始資料,檔名是app_sub.txt,資料格式如下:

編號,應用名稱

11111,滴滴打車

99999,美圖秀秀

99999,微信

99999,優酷

22222,淘寶

22222,滴滴打車

22222,大眾點評

……

代表有2980名使用者使用APP的情況,各位在自行練習時可以採用隨機函式來生成號碼清單。

2.利用R讀入資料。

g<-read.table(“app_sub.txt”,header= FALSE,sep = “,”,colClasses =c(“character”,”character”))

3.去除NA值

g1<-na.omit(g)

開始繪製簡單的社交關係圖:

1.簡單的社交網路

library(igraph) #載入igraph包

x<-par(bg=”black”) #設定背景顏色為黑色

g2 = graph.data.frame(d = g1,directed = F); #資料格式轉換

V(g2) #檢視頂點

E(g2) #檢視邊

#使用layout.fruchterman.reingold方式呈現圖形

plot(g2,layout=layout.fruchterman.reingold,vertex.label=NA) #顯示網路圖

上面的社交網路圖中大部分頂點重疊在一起,根本不能看出社交網路中頂點之間的連線關係。下面需要對頂點和邊的格式做調整。

3.對頂點和邊的格式做調整

設定vertex.size來調整頂點大小, 設定vertex.color來改變顯示顏色。

plot(g2,layout=layout.fruchterman.reingold,vertex.size=2, vertex.color=”red”,edge.arrow.size=0.05,vertex.label=NA) #設定vertex大小和顏色後顯示網路圖

上圖中頂點明顯歸屬於某個或某幾個社群。但所有的點都是同一個顏色,不能直觀呈現出社群的概念。

劃分網路圖中的社群:

1.利用igraph自帶的社群發現函式實現社區劃分Igraph包中社群分類函式有以下幾種:

不同的分類演算法,速度和適用社群網路大小都有所側重。對於同一網路,採用什麼樣的分類演算法需要實踐後去人工判斷是否符合預期。

下面利用只有兩個社群網路的資料來驗證walktrap.community和edge.betweenness.community分類結果的不同之處。

下圖是walktrap演算法,step=10的情況下得出的結果。原本的2個社群網路被分為66類。把兩個大社群分成了一類,把兩大社群重疊的部分分成了很多類。顯然這不是我們所希望看到的分類結果。可見walktrap演算法不太適合網路數量較小的情況。

下圖是edge.betweenness演算法的出的結果。社群網路被分成兩類

edge.betweenness演算法演算法的呈現

2.美化圖形(以頂點分類)

利用walktrap.community進行社區劃分,對不同的社群賦值不同的顏色。為了呈現更多的點和線的關係,我們採用了透明化的處理方式。

com = walktrap.community(g2, steps = 10)V(g2)$sg=com$membershipV(g2)$color = rainbow(max(V(g2)$sg),alpha=0.8)[V(g2)$sg]plot(g2,layout=layout.fruchterman.reingold, vertex.size=1,vertex.color=V(g2)$color, edge.width=0.4,edge.arrow.size=0.08,edge.color = rgb(1,1,1,0.4),vertex.frame.color=NA,margin= rep(0, 4),vertex.label=NA)

完成最終的效果圖:

1.美化圖形(以邊線分類)

另一種呈現方式,是點的顏色不變,將不同社群的連線顏色分類。

E(g1)$color=V(g1)[name=ends(g1,E(g1))[,2]]$color #為edge的顏色賦值

V(g1)[grep(“1”, V(g1)$name)]$color=rgb(1,1,1,0.8) #為vertex的顏色賦值

plot(g1,layout=layout.fruchterman.reingold, vertex.size=V(g1)$size, vertex.color= V(g1)$color, edge.width=0.3,edge.color = E(g1)$color,vertex.frame.color=NA,margin= rep(0, 4),vertex.label=NA)

通過上圖可以看出本次實驗資料中使用者體量最大的APP分別是:微信、微博、淘寶、京東。社群交匯的點表示每兩個APP之間的共有使用者。例如,微信和微博的共有使用者位於上圖右上角橘黃色線條和黃色線條的交匯處。

社交網路圖是近年來展示覆雜網路的一種直觀的方式。利用社群發現演算法對複雜網路進行聚類,可以挖掘出複雜網路包含的深層意義。例如,發現公司組織架構的相關性,利用群體相似性進行“猜你喜歡”的推薦活動。

利用R語言的igraph作社群挖掘的圖

######測試程式碼######
if(T){
  library(igraph)
  library(grDevices)
  rm(list=ls())
  network=read.csv("./dataset/data/karate.txt",sep=" ",header=F)
  community=read.csv("./result/lporigin_karate/2.1_of_1",sep="t",header=F)
  label=community[,2]#獲取按頂點ID排序後的各頂點的標號
  #將label中各頂點的社群號對映為顏色
  ramp =colorRamp(c("red", "white","blue"));
  ramp(seq(0, 1, length = length(unique(label))))
  panel=rgb( ramp(seq(0, 1, length = length(unique(label)))), max = 255)#設定顏色,顏色數目等於社群數目
  g = graph.data.frame(network,directed=F,vertices=community[,1])
  map=rep(0,length(label))#產生一個全零向量
  color=rep("",length(label))#存放每個頂點的顏色
  index=1
  for(i in unique(label)){
    map[i]=index
    index=index+1
  }
  for(i in 1:length(label)){#將每個社群的頂點顏色設定為同一顏色
    color[i]=panel[map[label[i]]]
  }
  V(g)$color=color#設定頂點顏色
  plot(g,vertex.label.dist=1,vertex.label.font=3,vertex.label.cex=1.5,vertex.label.color=1)
}

藉助R語言的igraph包將使用者的社交關係以圖形化的方式展現出來,以歌手為例

據根據使用者分享的歌曲,使用協同過濾演算法計算歌手之間的關聯關係。使用了R語言的視覺化包igraph

library(igraph)#讀取資料,注意編碼格式是utf-8singer <- read.csv('c:/data/tmp/singers-sub.csv', head=T,fileEncoding='UTF-8',stringsAsFactors=F)
#載入資料框

g <- graph.data.frame(singer)
#生成圖片,大小是800*800px

jpeg(filename='singers.jpg',width=800,height=800,units='px')

plot(g,
    vertex.size=5,     #節點大小
    layout=layout.fruchterman.reingold,  #佈局方式
    vertex.shape='none',    #不帶邊框
    vertex.label.cex=1.5,    #節點字型大小
    vertex.label.color='red',  #節點字型顏色
    edge.arrow.size=0.7)    #連線的箭頭的大小#關閉圖形裝置,將緩衝區中的資料寫入檔案dev.off()