有志のための統計学メニュー考、管理編

  • 「体系立てずに進める」場合、色々、トピックを挙げながら、その関係をつなぎつつ、頭の整理をしていくことになる
  • そうは言っても、「志あり、基礎なし」からだと、相互連携が見えてこないので、挫折しやすい
  • たとえば、こちらで扱っているトピックを、上記のようなことに気をつけながら、単純に、関連がある単語のペアワイズ関係に還元してグラフ表示すれば(そして、今回は『共役事前分布』がお題、と示すなら)

# "test.txt"ファイルは、各行の第1列に気になる用語、
# 第2列以降、任意の列数で、第1列と関連する用語を記載
# タブ区切り
d <- as.matrix(read.table("test.txt",sep="\t",fill=TRUE))
dim(d)
# ノードとしてのユニークを取る
u.d <- unique(c(d))
# 入力データをユニークノードIDで表す
d.id <- d
for(i in 1:length(u.d)){
	d.id[which(d==u.d[i])] <- i
}
# エッジリストを表す行列を作る
e <- matrix(0,0,2)
for(i in 1:length(d.id[,1])){
	if(length(d.id[i,]) > 1){
		for(j in 2:length(d.id[i,])){
			if(d.id[i,j]!="")
			e <- rbind(e,c(d.id[i,1],d.id[i,j]))
		}
		
	}
}
# 入力ファイルはひたすら思いつくままに書くので、エッジ重複が出る
# それを省く
e <- unique(e)
library(igraph)
# 無向グラフオブジェクトにする
g <- graph.edgelist(e,directed=FALSE)
# ノードの色を付ける
col <- rep(rgb(0.3,0.3,0.3,alpha=0.3) ,length(u.d))
# ターゲットノードの文字列を指定して、そのノードの色を変える
col[which(u.d=="共役事前分布")] <- rgb(1,0.3,0.3,alpha=0.5) 
plot(g,vertex.label=u.d,vertex.color=col)
  • test.txtの中身
共役事前分布	ベータ分布		
ベータ分布	二項分布	連続	分布
ベルヌーイ事象	二項分布	離散	
ベイズ推定	推定		
ベイズ推定	共役事前分布		
事前分布	事後分布		
事前分布	共役事前分布		
スプラインカーブ	回帰	微分	近似
オッカムの剃刀	推定	モデル	
自己相関	時系列	推定	近似
サポートベクターマシン	分類	回帰	
ヒストグラム	分布	推定	近似
楕円	幾何	距離	分布
固有値分解	回転	楕円	線形代数
リサンプリング	推定	アルゴリズム	
ニュートン法	近似	アルゴリズム	
ワイブル分布	故障	連続	分布
連検定	検定	離散	
尤度関数	尤度		
てふ	数式	表記	
アルゴリズムの分類	アルゴリズム		
疑似乱数発生	乱数	アルゴリズム	
MCMC	乱数	アルゴリズム	
p値	確率	累積確率	検定
LAPAK	線形代数	アルゴリズム	パッケージ
二項分布	離散	分布	
  • ごちゃごちゃしてきたら、「繰り返し登場するエッジ」だけでグラフを作り直したくなったり描き直したくなったりするはずなので、そのための小改変ソースが以下
# "test.txt"ファイルは、各行の第1列に気になる用語、
# 第2列以降、任意の列数で、第1列と関連する用語を記載
# タブ区切り
d <- as.matrix(read.table("test.txt",sep="\t",fill=TRUE))
dim(d)
# ノードとしてのユニークを取る
u.d <- unique(c(d))
# 入力データをユニークノードIDで表す
d.id <- d
for(i in 1:length(u.d)){
	d.id[which(d==u.d[i])] <- i
}
# エッジリストを表す行列を作る
e <- matrix(0,0,2)
for(i in 1:length(d.id[,1])){
	if(length(d.id[i,]) > 1){
		for(j in 2:length(d.id[i,])){
			if(d.id[i,j]!="")
			e <- rbind(e,c(d.id[i,1],d.id[i,j]))
		}
		
	}
}

# 入力ファイルはひたすら思いつくままに書くので、エッジ重複が出る
# それを省く
e.uniq <- unique(e)
e.weight <- rep(0,length(e.uniq[,1]))
for(i in 1:length(e.uniq[,1])){
	e.weight[i] <- length(which(e[,1]==e.uniq[i,1] & e[,2]==e.uniq[i,2]))
}
library(igraph)
# 無向グラフオブジェクトにする
g <- graph.edgelist(e.uniq,directed=FALSE)
E(g)$weight <- e.weight
# ノードの色を付ける
col <- rep(rgb(0.3,0.3,0.3,alpha=0.3) ,length(u.d))
# ターゲットノードの文字列を指定して、そのノードの色を変える
col[which(u.d=="共役事前分布")] <- rgb(1,0.3,0.3,alpha=0.5) 

e.w <- E(g)$weight
#e.w.2 <- e.w
#g2 <- g
#E(g2)$weight <- e.w-1
#e.w.3 <- as.numeric(e.w.2 > 0)
plot(g,vertex.label=u.d,vertex.color=col,edge.width = e.w)