ラベル ネットワーク科学 の投稿を表示しています。 すべての投稿を表示
ラベル ネットワーク科学 の投稿を表示しています。 すべての投稿を表示

1998年に、Wattsとその指導教員のStrogatzは本格的な複雑ネットワーク研究の幕開けとなる論文を発表しました。
彼らのモデルは、平均次数を大きくしすぎずに、小さい平均距離(L)と大きいクラスター係数(C)を同時に達成するネットワーク、すなわち、スモールワールド・ネットワークとなるものです。

WSモデルの作り方
(1)平均頂点Nと平均次数<k>を定める。<k>は偶数とする。
(2)拡張サイクルを作る。すなわち、頂点N個を輪状に置き、拡張点を輪の右隣<k>/2個までの頂点と隣接させる。拡張点の次数は<k>となる。
(3)枝は合計<k>N/2ある。そのうち、割合p(0=<p=<1)だけの枝、つまりp<k>N/2本を選ぶ。各枝は等確率で選ばれるとする。
(4)選んだ枝のそれぞれについて、片方の端点とはつないだままにして、もう片方の端点から切り離す。どちらの端点を切り離すかは半々の確率で決める。
(5)宙に浮いた各枝の新しい端点をネットワーク全体の中から等確率に1つ選び、枝を作る。この操作をつなぎかえ、新しい枝を近道またはショートカットと呼ぶ。新しい端点を選ぶときには、
(ⅰ)ループと多重辺を避け
(ⅱ)元の拡張サイクルの枝を復元してしまうような頂点をさける
こと。



####### RでWSモデルのシュミレーション############

####レギュラーグラフ(拡張サイクル)の作成関数の定義#####
regular.g <- function(n, k){
reg <- matrix(0, n, n)
for(i in 1 : n){
for(j in 1 : k){
if(i + j <=n)
reg[i, i+j] <- 1
else
reg[i, i+j-n] <- 1
}
}
(reg <- symmetrize(reg))
}
#######################################

#regular.g関数のテスト
test.g <- regular.g(20,4)

#グラフの描写
library(sna)
png("regular.png")
gplot(test.g, gmode="graph", mode="circle", main="Regular graph (n=20, k=4)")
dev.off()

#pを変化させて辺の架け替えを行う

g <- regular.g(20,4)

#p = 0
rew.g1 <- rewire.ws(g, 0)

#p = 0.2
rew.g2 <- rewire.ws(g1, 0.2)

#p = 1.0
rew.g3 <- rewire.ws(g1, 1.0)

#図示
png("ws1.png")
gplot(rew.g1, gmode="graph", mode="circle", main="p = 0")
dev.off()

png("ws2.png")
gplot(rew.g2, gmode="graph", mode="circle", main="p = 0.2")
dev.off()

png("ws3.png")
gplot(rew.g3, gmode="graph", mode="circle", main="p = 1.0")
dev.off()
pが小さいうちはレギュラーグラフに類似した構造で、p値を大きくするとランダムグラフに近づくことが定性的に理解することができます。

それでは、クラスター係数、平均距離、そして次数分布はpの値の変化に伴ってどのように変化しているのでしょうか。以下では、これらの値を計算し、可視化を行います。





【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、121 - 131pp
増田直紀 今野紀雄『複雑ネットワーク』2010 近代科学社  83-86pp

Facebookの友達ネットワークを測定してR + igraphで描写する

今回は、NameGenWebというアプリケーションを使ったFacebookの友達ネットワークの解析について紹介します。

NameGenWebのプライバシーポリシーを記します。

Privacy Policy
NameGenWeb is a research application developed at the Oxford Internet Institute, University of Oxford by Joshua R. Melville and Bernie Hogan based on earlier code from Bernie Hogan and Arber Ceni. This application is designed principally as a research and teaching utility for accessing a particular social network, classically referred to as the 'personal network'. The principal motivation is to help individuals make sense of the connections within their own network, and to familiarize themselves with network analysis as an analytical technique.

要するに、オックスフォードの研究グループの個人ネットワークの研究のアプリケーションだそうです。アカデミアがベースになっているのは安心感があります。

今回は、NameGenDevで自分の友達ネットワークを解析し、解析結果をGraphML形式で取得。最後に、R + igraph環境で可視化をします。


# Step  0
Facebookの検索窓で"NameGenDev"を検索します。


# Step1
開発者からのコンタクトを希望するならば、下のチェックを入れます。


# Step 3
適当に属性を入れます。今回はデフォルトのFull Name & Facebook User IDだけを使用します。



# Step 3
ファイルをダウンロードします。
 # step 4
ダウンロードのファイル形式を選択します。今回は、GraphMLを選択します。また、プライバシーの観点からAnonymise Networkにチェックを入れました。

ダウンロードしたファイルをカレントディレクトリに移動させて(今回はmygraph.graphmlとする)、Rによる可視化作業に移行します。


##############以下 Rのスクリプト###############
#Rの起動
$ R

#igraphのロード
library(igraph)

#ダウンロードしたgraphmlファイルをロードしてgというオブジェクトにする
g <- read.graph("./mygraph.graphml", format=c("graphml"))

#vertexの大きさを1に統一
V(g)$size <- 1

#グラフを描写
png("mygraph.png")
plot(g, main = "My Facebook Friends Network")
dev.off()

大きなクラスターが3つと、小さなクラスターが4つ存在することがわかります。これは私の所属大学や出身高校のクラスターを反映しています。

次数分布も求めてみます。
ただし、ここで描写されるのは"私の友達ネットワーク"における次数分布であることに注意しなくてはなりません。このネットワーク内で多くの次数を持っている方(vertex)は、私の人生の様々なところで関わってくださった方と言えるかもしれません。

###########Rのソースコード : 次数分布を求める#############


#g次数分布の配列を計算
#握手問題を考慮して1/2倍している。
degree <- degree(g)/2

#次数分布を描写
png("degree-dsit.png")
hist(degree, xlab = "degree", ylab="Frequency")


次数中心度をノードの大きさに反映させる


#igraphのロード
library(igraph)

#n=50、p = 0.1の無向ランダムグラフを作成する。
g <- random.graph.game(50, p=0.1, direct=F)

#次数中心を計算する
c <- dgree(g)

#各vertexの次数中心度をvertexの大きさに反映させて描写
png("dgree.png")
 plot(g, vertex.size=c, main="random graph : n = 50, p = 0.1")
dev.off()

R + igraphで作成したランダムグラフをcytoscapeで可視化する

まずは下記のサイトからcytoscapeをDL & installします。今回はv2.8.3です。
http://www.cytoscape.org/

インストール先のパスは/Applications/Cytoscape_v2.8.3です。


#Rの起動
$ R


#igraphのロード
library("igraph")

#テストとして、頂点50個、p = 0.1の無向ランダムグラフを作成する。
g <- random.graph.game(50, p=0.1, direct=F)
png("random.graph.png")
plot(g, main = "random graph n = 50, p = 0.1")
dev.off()


#グラフのedgelistのテキストファイルへの書き出し
write.graph(g, "random-graph.txt", "edgelist")


#Rの終了
q()

#グラフのedgelistファイルの確認
$ head random-graph.txt 
0 17
0 34
0 36
1 9
1 23
1 46
2 16
3 10
3 32
4 7

#cytoscapeの起動
$ open -a cytoscape

File->Import->Network from Table -> Select File(s)
でファイルを選択

Source interaction -> Column 1
Interaction Type -> Default interaction
Target interaction -> Column 2
以上です。あとはimportをクリックすればOKです。ちょっとLayoutを工夫(Circular)した最後に提示して終わります。



【参考文献】

ランダムグラフの性質を調べる



現実世界に実在する巨大なネットワークを解析するときは、個々の構成要素よりもネットワーク全体としての特徴が注目されます。その特徴とは主として、
  1. 平均距離
  2. クラスター係数
  3. 次数分布
の3つが挙げられます。
今回はランダムグラフを生成して、これら3つの性質を調べてみたいと思います。
※snaパッケージを使用します。snaパッケージはネットワークの情報を隣接行列で管理するような仕様となっています.


###snaパッケージを使用します####
#snaのインストール
install.packages("sna")
#ロード
library(sna)

#vertexが100個、p = 0.01のランダムグラフ(無向グラフ)を作成.
rg <- rgraph(100, tprob = 0.05, mode = "graph")

#####グラフの描写####
png("random_graph.png")
gplot(rg, main = "random graph : p = 0.05, vertex = 100", gmode="graph")
dev.off()



#####(1)平均距離を調べる####
distance <- geodist(rg)$gdist
#edgeを持たない頂点は平均距離が無限大になってしまうので、無限大の場合はのぞいて計算します
#対角にある0の値をのぞいて計算します
mean(distance[-c(which(distance == Inf), which(distance == 0))])
[1] 2.888283

#結果の解釈
平均距離が3程度ということは、このグラフから任意の二つの頂点を選択したとき、その二点の距離は平均して3程度であるということです。100個もvertexがあるのにも関わらず、案外小さな距離で任意の二点間を行き来することができます。





#####(2)クラスター係数を調べる####

#vertexごとのクラスター係数を計算する関数を定義
clust.coeff <- function(matrix){
n <- nrow(matrix)
output <- rep(0,n)
for(i in 1 : n){
m <- sum(matrix[i, ])
output[i] <-
sum(t(matrix * matrix[i, ]) * matrix[i, ])/(m * (m - 1))
}
output[which(output == "NaN")] <- 0
output}

#ネットワークのクラスター係数を計算
#各頂点に定義されるクラスター係数の平均値を取ればよい
mean(clust.coeff(rg))
[1] 0.05315657

#結果の解釈
#クラスター係数が0.05ということは、ある頂点に隣接する2つの頂点の間に辺がある確率が5%であるということです。これはグラフ全体で2つの頂点間にedgeのある確率(p = 0.05)と同じです。以上より、このグラフではグラフ内部に密度の高い集団(cluster)が形成されていないと結論づけることができます。






#####(3)次数分布を調べる####
#無向グラフであるため、度数表のカウントが2倍になることを考慮
degree <- degree(rg)/2
#ヒストグラムに描写
png("degree-dsit.png")
hist(degree, xlab = "degree", ylab="Frequency")
abline(h=0)
dev.off()

#結果の解釈
次数が3-5のあたりにピークがあることがわかります。これは明らかにスケールフリーネットワークで登場するベキ乗分布とは異なる性質です。


【まとめ】
一般的にランダムグラフは、頂点間の平均距離が短く、クラスター度が低く、次数分布にピークが見られるという傾向があるとされています。今回のシミュレーションでも同様の性質が確認できました。


【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、121 - 131pp



現実世界に実在する巨大なネットワークを解析するときは、個々の構成要素よりもネットワーク全体としての特徴が注目されます。その特徴とは主として、
  1. 平均距離
  2. クラスター係数
  3. 次数分布
の3つが挙げられまs。
今回はこれらのうち、平均の計算を行いたいと思います。
次数分布とはグラフに含まれる頂点の次数がどのように分布しているかを示すものです。
それではRを用いた具体的な計算です。次数分布を計算してヒストグラムで表示させます。


#igraphをロード
library(igraph)


####隣接行列を作成して、そこからグラフを作る####
A <- matrix(c(
0,1,1,1,1,0,0,0,0,
1,0,1,1,1,1,0,0,0,
1,1,0,1,0,0,1,0,0,
1,1,1,0,0,0,0,1,1,
1,1,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,0,
0,0,0,1,0,0,0,0,0),
nrow = 9)

#隣接行列よりグラフを作成
g <- graph.adjacency(A)

#グラフを描写
png("graph.png")
plot(g, main = "The graph for cluster coefficient calculation")
dev.off()



#最短距離を求める。
#第2引数no
mode = "out"は有向グラフを分析するときに必要である。
> shortest.paths(g, mode = "out")
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,] 0 1 1 1 1 2 2 2 2
 [2,] 1 0 1 1 1 1 2 2 2
 [3,] 1 1 0 1 2 2 1 2 2
 [4,] 1 1 1 0 2 2 2 1 1
 [5,] 1 1 2 2 0 2 3 3 3
 [6,] 2 1 2 2 2 0 3 3 3
 [7,] 2 2 1 2 3 3 0 3 3
 [8,] 2 2 2 1 3 3 3 0 2
 [9,] 2 2 2 1 3 3 3 2 0



#平均距離の計算
average.path.length(g)
[1] 1.888889

【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、121 - 131pp

次数分布の計算



現実世界に実在する巨大なネットワークを解析するときは、個々の構成要素よりもネットワーク全体としての特徴が注目されます。その特徴とは主として、
  1. 平均距離
  2. クラスター係数
  3. 次数分布
の3つが挙げられまs。
今回はこれらのうち、次数分布の計算を行いたいと思います。
次数分布とはグラフに含まれる頂点の次数がどのように分布しているかを示すものです。
それではRを用いた具体的な計算です。次数分布を計算してヒストグラムで表示させます。


#igraphをロード
library(igraph)


####隣接行列を作成して、そこからグラフを作る####
A <- matrix(c(
0,1,1,1,1,0,0,0,0,
1,0,1,1,1,1,0,0,0,
1,1,0,1,0,0,1,0,0,
1,1,1,0,0,0,0,1,1,
1,1,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,0,
0,0,0,1,0,0,0,0,0),
nrow = 9)

#隣接行列よりグラフを作成
g <- graph.adjacency(A)

#グラフを描写
png("graph.png")
plot(g, main = "The graph for cluster coefficient calculation")
dev.off()


#次数分布を計算
dd <- degree.distribution(g)

#片対数グラフを描写
png("degree.png")
plot(dd[-1],log = "x",  xlab = "degree", ylab = "frequency", main="Degree distribution")
dev.off()



【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、121 - 131pp

クラスター係数の計算


現実世界に実在する巨大なネットワークを解析するときは、個々の構成要素よりもネットワーク全体としての特徴が注目されます。その特徴とは主として、
  1. 平均距離
  2. クラスター係数
  3. 次数分布
の3つが挙げられまs。
今回はこれらのうち、クラスター係数の計算を行いたいと思います。
クラスター係数とは「中止となる点以外の各頂点間にどの程度つながりがあるかを示す指標」です。
具体的には、ある頂点を選んだときに、その頂点aと隣接する頂点すべてをピックアップします。これら隣接する頂点の間で張ることできるedgeの最大数をNとしたときに、実際に張られているedgeの数をnとします。そして、この頂点aに関するクラスター係数を n/N として定義します。
この計算を対象とするグラフの全vertexに対して行い、それらの平均値をとったものがグラフ全体のクラスター係数となります。

それではRを用いた具体的な計算です。

#igraphのロード
library(igraph)

####隣接行列を作成して、そこからグラフを作る####
A <- matrix(c(
0,1,1,1,1,0,0,0,0,
1,0,1,1,1,1,0,0,0,
1,1,0,1,0,0,1,0,0,
1,1,1,0,0,0,0,1,1,
1,1,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,0,
0,0,0,1,0,0,0,0,0),
nrow = 9)

#隣接行列よりグラフを作成
g <- graph.adjacency(A)

#グラフを描写
png("graph.png")
plot(g, main = "The graph for cluster coefficient calculation")
dev.off()




#####transitivity()を用いた計算方法#####

#vertexごとのクラスター係数を計算
clust <- transitivity(g, type = "local")
#次数が0や1の頂点はクラスター係数がNaNとなるため0に置換
clust[which(clust == "NaN")] <- 0
#クラスター係数の平均値を求める
mean(clust)
[1] 0.3185185


#####直接計算する方法#####

#vertexごとのクラスター係数を計算する関数を定義
clust.coeff <- function(matrix){
n <- nrow(matrix)
output <- rep(0,n)
for(i in 1 : n){
m <- sum(matrix[i, ])
output[i] <-
sum(t(matrix * matrix[i, ]) * matrix[i, ])/(m * (m - 1))
}
output[which(output == "NaN")] <- 0
output}

#すべてのvertexのクラスター係数の平均をとる
mean(clust.coeff(A))
[1] 0.3185185

【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、121 - 131pp

2つの頂点間に複数の辺がある場合を多重辺 multiple edgeと呼びます。また、ある頂点からその頂点自身に張られる辺をループ loopと呼びます。そして、multiple edgeやloopを含むグラフのことをmultiple graphと呼びます。
今回は、Rとigraphを用いてmultiple graphを作成します。nodeは2つです。

####以下スクリプト####
library(igraph)

#edge listを作成
g1 <- matrix(c(

"1","1",
"1", "2",

"1", "2",
"2", "1"
),
ncol=2, byrow=TRUE)

g <- graph.edgelist(g1, directed=TRUE)

#vertexの情報を表示
> V(g)
Vertex sequence:
[1] "1" "2"
#edgeの情報を表示
> E(g)
Edge sequence:
          
[1] 1 -> 1
[2] 1 -> 2
[3] 1 -> 2
[4] 2 -> 1

png("multiple.png")
plot(g, vertex.label=V(g)$name, main="multiple graph")
dev.off()



【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、11 - 12pp


重み付きグラフ


実際のネットワークでは、vertex間の関係の有無だけでなく、重みを考慮しなくてはなりません。
そのようなグラフを重み付きグラフ weighied graphまたは有値グラフ valued graphと呼びます。

今回は、Rとigraphパッケージを使用して、weighted graphを作成します。
igraph新たに学んだ点としては、E()とV()を用いてedgeやvertexの属性を操作することです。plotするときも、これらの関数使用することが必要となります。



#####以下 Rのスクリプト#####

library(igraph)

#edge listを作成
wg <- matrix(c(
"1", "2",
"1", "4",
"2", "3",
"2", "4"),
ncol=2, byrow=TRUE)

#edge listからグラフを作成
g <- graph.edgelist(wg, directed=FALSE)

###igraph付属のedgeを編集する関数を用いてedgeに重みを指定
#edgeを表示
> E(g)
Edge sequence:
          
[1] 2 -- 1
[2] 4 -- 1
[3] 3 -- 2
[4] 4 -- 2
#$weightの属性を調べる
> E(wg)$weight
NULL

#重みを追加
E(g)$weight <- c(2,4,3,1)

> E(g)$weight 
[1] 2 4 3 1

#vertexの確認
> V(g)
Vertex sequence:
[1] "1" "2" "4" "3"


###グラフを可視化
png("weighted-graph.png")
#vertex.labelとedge.labeをそれぞれ個別に与えていることに注意!!!!!!
plot(g, vertex.label=V(g)$name, edge.label=E(g)$weight, main = "weighted graph")
dev.off()



【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、13 - 15pp






辺リスト

#パッケージのロード
library(igraph)

#辺リストの作成
e.list <- c(1,2,1,3,2,1,2,3,4,1)
e.matrix <- matrix(e.list, ncol = 2, byrow = TRUE)
e.matrix
     [,1] [,2]
[1,] 1 2
[2,] 1 3
[3,] 2 1
[4,] 2 3
[5,] 4 1
g <- graph.edgelist(e.matrix)
png("graph.png")

plot(g, vertex.label=V(g)$name)
dev.off()



【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、2 - 6 pp



ランダムグラフの作成


ランダムグラフの作り方

まずn個の頂点を用意します。各2点間(全部で n(n-1)/2ペア)について、それぞれさいころをふって出た数によって確率pでエッジを与え、確率1-pで与えないだけです。
頂点の数n = 50の条件で、pの値を0.01, 0.05, 0.1, 0.3と変化させて、どのようなグラフができるかを見てみます。

library(igraph)

#pの値を変化させて目的のグラフを作成
g1 <- random.graph.game(50, p=0.01, direct=F)
g2 <- random.graph.game(50, p=0.01, direct=F)
g3<- random.graph.game(50, p=0.1, direct=F)
g4 <- random.graph.game(50, p=0.3, direct=F)

#各々をプロットする
png("random.graph.png")
par(mfrow=c(2,2))
plot(g1, main = "random graph n = 50, p = 0.01")
plot(g2, main = "random graph n = 50, p = 0.05")
plot(g3, main = "random graph n = 50, p = 0.1")
plot(g4, main = "random graph n = 50, p = 0.3")
dev.off()



pの値が小さいと、ネットワークが分断してしまいました。pの値を大きくすると、ネットワークは密になり、pが0.3では極めて密なネットワークが生成しました。

【参考文献】
増田直紀 今野紀雄 『「複雑ネットワーク」とは何か』 講談社 2006 54 - 57pp

ネットワーク分析 - 歴史、トピック、用語集


###歴史的な視点から####
#グラフ理論の創始者
オイラー(1707 - 1783)
ケーニヒスベルグの橋の問題

#グラフ理論を数学的に体系化 
ジョージ・ポリア(1887 - 1985)

#近代グラフ理論の父
フランク・ハラリー(1921 - 2005)
グラフ理論の数学的側面だけでなく、応用面にも広く興味を示した。
グラフ理論が様々な分野で実用化される契機を作った立役者
数学、物理学、人類学、生物学、化学、コンピュータ科学、地理学、言語学、音楽、政策科学、心理学など多岐にわたる分野で論文を約700報執筆

#日本のグラフ理論の開拓者
秋山仁
アメリカにハラリーに師事

###トピック###
#エルデシュ数
20世紀の大数学者、ポール・エルデシュ(1913 - 1996)の共著関係のネットワーク。
エルデシュからスタートして、ある研究者に到達するのに必要な枝数をエルデシュ数と呼ぶ。
#ケビン・ベーコンゲーム
アメリカの有名俳優ケビン・ベーコンと他の俳優の共有関係を結びつけるゲーム
ケビン・ベーコンの神託(http://oracleofbacon.org//movielinks.php)

Kevin Baconとleonardo DiCaprioの関係

#ベースボールのネットワーク
アメリカのベースボールで同じチームでプレイしたことのある選手を結んだ線によるネットワーク
ベースボールの神託(http://www.baseball-reference.com/oracle/)
#ミルグラムのスモールワールド実験
1960年代後半、アメリカの心理学者スタンレー・ミルグラム(1933 - 1984)のチームが行った社会実験。アメリカ東海岸北部にあるボストンにすむX氏に向けて、ボストン市内やアメリカ中部から手紙をリレーして届けるというものである。現実の人間関係ネットワークを模擬するために、手紙を渡していい相手はファースト・ネームで呼び合えるくらいの関係に限定。この実験の結果、平均6回程度のリレーでX氏まで手紙が到達した。すなわちネットワークの平均距離は6であるといえる。

#ワッツのスモールワールド実験
コロンビア大学のダンカン・ワッツ(1971 -)の率いるスモールワールド・プロジェクトによって行われた、現代版スモールワールド実験。国をまたぐ形で実験計画が組まれた。その結果、スタートとゴールが同じ国の場合は5, 違う国の場合は7と推定された。これは、ミルグラムのスモールワールド実験を指示する結果であった。

#スモールワールド実験が示唆するもの
異なる職業の人々や離れたところに住む人々を結びつける近道が、たくさんではないにしても適量存在することが、情報を早く伝えるためには重要である。

#現実のネットワークが持っているべき特徴
・スモールワールド性(小さい平均距離、大きいクラスター係数)
・大きすぎない平均次数

#ネットワークの種類と比較



###用語###
#ネットワークの平均距離
ネットワークのすべての頂点対の距離の平均。
ネットワークの平均距離が6の場合、「6次の隔たり」と呼ぶことがある。

#次数
一つの頂点から出る枝のこと数のこと。

#クラスター係数
ネットワーク全体の三角形を数えて、最も多いときを1、最も少ないときを0とするおうに調節して、クラスター係数は定義されている。


###ネットワークの種類####


【参考文献】
増田直紀 今野紀雄 『「複雑ネットワーク」とは何か』 講談社 2006 

隣接行列から有向グラフを作成する



##以下, Rのスクリプト##

dg <- matrix(c(0,1,1,0,  1,0,1,0,  0,0,0,0,  1,0,0,000) , nrow = 4, ncol = 4, byrow = T)

dg
      [,1] [,2] [,3] [,4]
[1,]    0    1    1    0
[2,]    1    0    1    0
[3,]    0    0    0    0
[4,]    1    0    0    0

#igraphで利用可能なグラフオブジェクトを作成する。
g <- graph.adjacency(dg, mode="directed")

png("directed-graph.png")
plot(g)
dev.off()

【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、2 - 5 pp


######数式のtexスクリプト#####
%graph.tex
\documentclass{jarticle}
\usepackage{amsmath}
\begin{document}
ある特定のネットワークを数学的にグラフ$G$として表記するには以下のようにします。
\begin{eqnarray} 
G = (V, E)
\end{eqnarray}
ここで$V$と$E$はそれぞれ頂点と辺の集合を表しています。\\
今、頂点と辺の数を各々$i$, $j$とすると、$V$と$E$は以下のように表すことができます。
\begin{eqnarray} 
V = \{v_1, v_2, \dots, v_i\} \\
E = \{e_1, e_2, \dots, e_j\} 
\end{eqnarray}
グラフの特徴を知るにためにはさまざまな演算をするので、グラフを隣接行列: adjacency matrixによって
表現します。隣接行列は、頂点間の関係性の有無を総当たりで記述するものですので、$n$個の頂点から構成される
グラフの隣接行列$A$は$n \times n$の正方行列となります。
\begin{eqnarray} 
A= (a_{k,l})
=\left[ 
\begin{array}{ccc}
a_{0,0} & \cdots & a_{1,n} \\
\vdots & \ddots & \vdots \\
a_{n,1} & \cdots & a_{n,n} \\
\end{array} 
\right]
\end{eqnarray}
ただし、$a_{i,j}$は以下の値を取る。
\begin{eqnarray}
a_{i,j} = \begin{cases}
1 & 頂点iから頂点jへの辺がある \\
0 & 頂点iから頂点jへの辺がない
\end{cases}
\end{eqnarray}
隣接行列から有向グラフを作成する例として、以下の隣接行列を考えたい。
\begin{eqnarray}
\left(
\begin{array}{cccc}
0 & 1 & 1 & 0\\
1 & 0 & 1 & 0 \\
0 & 0 & 0 & 0 \\
1 & 0 & 0 & 0 \\
\end{array}
\right)
\end{eqnarray}
この隣接行列が示す有向グラフをRを用いて作成する。
\pagestyle{empty}
\end{document}



#####ここまで####


R : igraphのインストールとテスト


#Rの起動
$ R

#igraphのインストール
> install.packages("igraph")

#igraphのロード
> library("igraph")

#テストとして、頂点50個、p = 0.1の無向ランダムグラフを作成する。
> g <- random.graph.game(50, p=0.1, direct=F)
> png("random.graph.png")
> plot(g, main = "random graph n = 50, p = 0.1")
> dev.off()


ネットワーク分析とは


『Rで学ぶデータサイエンス 8 ネットワーク分析』 の冒頭の文書から、ネットワーク分析とはいかなる学問であるかがわかる部分を抜粋します。

##ネットワーク分析とは##
ネットワーク分析とは、さまざまな対象における構成要素間の関係構造を探る研究方法である。
さまざまな種類のネットワークは”複数の点が何らかの関係でつながったものという点で共通しており、それゆえ同じ方法で研究することができる"という発想が根本にある。
ネットワーク分析では、人間関係やウェブページのリンクなどの構造を、点と線によって構成される構造として抽象化してとらえる。

##ネットワークの具体例##
人間関係などの社会ネットワーク
流通網
WWW
食物連鎖
神経ネットワーク

##部分と全体##
全体について何か知ろうとするとき、その構成要素について知るだけでは十分ではない。
例えば、集団の構成員を知るだけではその集団を十分にわかったことにはならないし、物質に含まれる分子を知っただけではその物質を知ったことにはならない。
重要なのはそれらの構成要素がどのように結合して全体としてのネットワークを形作っているかということである。
ネットワーク分析には、個々の構成要素だけでなく、それらの間の関係についての情報が必要となる。

##ネットワークとグラフ##
人間関係やコンピュータネットワークのような具体的な関係構造のことをネットワーク: network
それらを点(頂点 node)と辺(edge / link)の抽象化したものをグラフ: graph

【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、1,2pp