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

如何將存儲在磁盤上的鄰接矩陣輸入到 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)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章