社交網路分析的 R 基礎:(五)圖的匯入與簡單分析

張高興發表於2022-02-11

如何將儲存在磁碟上的鄰接矩陣輸入到 R 程式中,是進行社交網路分析的起點。在前面的章節中已經介紹了基本的資料結構以及程式碼結構,本章將會面對一個實質性問題,學習如何匯入一個圖以及計算圖的一些屬性。

圖的檔案表示

在計算機中,最常見的兩種表示圖的基本結構是鄰接矩陣鄰接表。以最簡單的無權無向圖為例,鄰接矩陣中第 \(i\) 行第 \(j\) 列的元素 \(a_{ij}\) 如果等於 1,則表示頂點 \(i\) 和頂點 \(j\) 之間有邊,即鄰接矩陣將所有節點之間的關係都表示出來。鄰接表則是對頂點 \(i\) 建立一個單連結串列,這個單連結串列由頂點 \(i\) 的所有鄰居節點構成,即鄰接表只是把存在關係的節點表示出來。

網路上許多公開的資料集更常使用三元組去表示一個圖。下面是一個三元組的示例,以第一行的三元組 (1, 2, 1) 為例,它表示有一條從頂點 1 指向頂點 2 的邊,並且該邊的權重為 1。對於無權圖而言,通常會省略三元組中的第三個元素。

1	2	1
1	3	-1
2	3	-1
1	4	-1
3	4	1

? 提示

公開資料集大多數可以從下面的網站上找到:

1. Stanford Large Network Dataset Collection:http://snap.stanford.edu/data

2. The KONECT Project:http://konect.cc/networks

匯入一個圖

下面以 Dolphins 網路為例,將其匯入到 R 程式中。Dolphins 是一個無權無向的真實網路,描述了生活在紐西蘭的一個峽灣附近的寬吻海豚社群,其中節點表示海豚,邊表示海豚間的社會關係。將資料集下載完成後,開啟名為 out 的檔案。

% sym unweighted
9	4
10	6
10	7
11	1
......

在讀取檔案之前還需要對其進行一下修改,可以看到該檔案的第一行“% sym unweighted”是由空格分隔的三個元素,R 語言還沒有太過智慧,在讀取到第二行時會因為只有兩個元素而報錯,因此需要將第一行刪除。下面使用 read.table() 將檔案讀入到 R 程式中:

graph.edges <- read.table(file = "out.dolphins", header = FALSE)

? 提示

也可以將 out 檔案中的製表符(\t)替換成逗號(,),將檔案更改為使用逗號分隔的 CSV 檔案,並使用 read.csv() 函式讀取。

你也許會好奇讀入的 graph.edges 到底是什麼東西,使用 class() 函式來看看變數的型別:

> class(graph.edges)
[1] "data.frame"

data.frame 似乎前面的章節並沒有介紹,受限於研究的方向,這有可能是你唯一一次接觸資料框型別,不用管它,下面將讀入的資料轉換為圖:

> library(igraph)
> graph <- graph_from_data_frame(graph.edges, directed = FALSE)

下面畫圖看看匯入的 Dolphins 網路:

> class(graph)
[1] "igraph"
> plot(graph)

image

輸出一下 Dolphins 網路的規模:

> cat(sprintf("Nodes: %s\nEdges: %s\n", length(V(graph)), length(E(graph))))
Nodes: 62
Edges: 159

這裡使用了兩個全新的函式 V()E(),其中 V() 是獲取圖的點集,E() 是獲取圖的邊集,今後的大部分分析是建立在這兩個集合之上,這兩個函式會伴隨你的 R 語言旅程直到結束。

匯入的網路可以儲存為 R 檔案,下次可以直接載入使用,使用同樣的方法也可以持久化實驗資料。

> save(graph, file = "dolphins.RData")  # 儲存 graph 變數
> load(file = "dolphins.RData")  # 匯入 RData 檔案中儲存的變數

生成人工網路

使用人工網路驗證演算法的有效性也是實驗中必不可少的一環,下面介紹幾種常見的人工網路結構。

  1. 全連線圖
    graph <- make_full_graph(10)
    
    image
  2. 樹狀圖
    graph <- make_tree(21, children = 3, mode = "undirected")
    
    image
  3. k-正則圖
    graph <- sample_k_regular(20, 3)
    
    image
  4. Erdos-Renyi Random
    graph <- sample_gnp(20, 0.1)
    
    image
  5. 小世界網路
    graph <- sample_smallworld(dim = 1, size = 20, nei = 2, p = 0.1)
    
    image

? 提示

其他人工結構請檢視 igraph 文件:https://igraph.org/r/doc

圖的基本分析

上文從匯入外部網路和生成人工網路兩個角度獲得了 igraph 圖物件,下面將使用 igraph 包中的函式對 Dolphins 網路進行簡單的分析。

  1. 判斷圖的連通性
    > is.connected(graph)
    [1] TRUE
    
  2. 計算圖的度
    > degree(graph)  # 計算圖中所有節點的度,其中第一行為節點的名稱,第二行為節點的度
    9 10 11  ...
    6  7  5  ...
    > degree(graph, v = "9")  # 計算圖中部分節點的度
    9 
    6
    
  3. 計算圖的密度
    > edge_density(graph)
    [1] 0.0840825
    
  4. 對圖的路徑分析
    > diameter(graph, directed = FALSE, weights = NA)  # 直徑
    [1] 8
    > radius(graph)  # 半徑
    [1] 5
    > distances(graph, v = V(graph)$name[1], to = V(graph)$name[10], algorithm = "unweighted", weights = NA)  # 計算節點間的最短距離
      20
    9  3
    > shortest_paths(graph, from = "1", to = "6", weights = NA)  # 計算節點1到節點6的最短路徑
    $vpath
    $vpath[[1]]
    + 6/62 vertices, named, from e1ce364:
    [1] 1  41 37 40 58 6
    
  5. 計算圖的聚類係數
    > transitivity(graph, type = "average")
    [1] 0.3029323
    

✏️ 練習

1. 試著在資料集網站中下載其他網路匯入到 R 程式中;

2. 試著計算匯入網路的平均度;

3. 查詢 igraph 文件,試著計算匯入網路的同配係數(Assortativity)。

相關文章