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

# 入力ファイルは、各行の第1列に気になる用語、
# 第2列以降、任意の列数で、第1列と関連する用語を記載
# タブ区切り

my.knowledge.graph <- function(file,from=NULL,to=NULL,target.date=NULL,target.node=NULL,max.edge=NULL,alpha=1){	library(igraph)
	tmp <- as.matrix(read.table(file,sep="\t",fill=TRUE))
	dates <- as.numeric(tmp[,1])
	if(is.null(from))from<-min(dates)
	if(is.null(to))to<-max(dates)
	targets <- which(dates >= from & dates <= to)
	d <- tmp[targets,-1]
	# ノードとしてのユニークを取る
	u.d <- unique(c(d))
	# 入力データをユニークノードIDで表す
	d.id <- d
	null.id <- which(u.d=="")
	v.label <- c()
	for(i in 1:length(u.d)){
		d.id[which(d==u.d[i])] <- i
		v.label[i] <- u.d[i]
	}
	# エッジリストを表す行列を作る
	e <- matrix(0,0,2)
	for(i in 1:length(d[,1])){
		if(length(d[i,]) > 1){
			for(j in 2:length(d[i,])){
				if(length(null.id)>0){
					if(d[i,j]==""){
					}else{
						e <- rbind(e,c(d[i,1],d[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]))
	}
	selected.e <- 1:length(e.weight)
	if(is.null(max.edge)){
		selected.e <- which(e.weight >= quantile(e.weight,1-alpha))
	}else{
		sort.w <- sort(e.weight,decreasing=TRUE)
		tmp.max.edge <- min(max.edge,length(e.weight))
		tmp.w <- sort.w[tmp.max.edge]
		#print(tmp.w)
		selected.e <- which(e.weight >= tmp.w)
		#print(selected.e)
	}
#print(e.uniq[selected.e,])
	library(igraph)
	# 無向グラフオブジェクトにする
	g <- graph.edgelist(e.uniq[selected.e,],directed=FALSE)
	E(g)$weight <- e.weight
	v <- V(g)$name
	
	# ノードの色を付ける
	col <- rep(rgb(0.3,0.3,0.3,alpha=0.3) ,length(v))
	if(!is.null(target.date)){
		# ターゲットノードの文字列を指定して、そのノードの色を変える
		tmp.v <- which(dates[targets]==target.date)
		col[which(v %in% d[tmp.v,1])] <- rgb(1,0.3,0.3,alpha=0.5) 
		#print(dates)
		#print(dim(d))
		#print(tmp.v)
	}
	if(!is.null(target.node)){
		col[which(v %in% target.node)] <- 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.color=col,edge.width = e.w)
}

#my.knowledge.graph("test.txt")
my.knowledge.graph("統計基礎勉強会.txt",target.node="サポートベクターマシン")
my.knowledge.graph("統計基礎勉強会.txt",from=-1,to=20140501,target.date=20140402)
my.knowledge.graph("統計基礎勉強会.txt",from=-1,to=20131201,target.date=20140402)


my.knowledge.graph("統計基礎勉強会.txt",from=-1,to=20131113,target.date=dd.u[i],max.edge=20)

dd <- c(20131113,20131113,20131127,20131204,20131211,20131218,20131225,20131225,20131225,20131225,20140108,20140108,20140108,20140115,20140122,20140122,20140122,20140129,20140212,20140226,20140305,20140319,20140326,20140326,20140402,20140409,20140416,20140423,20140514,20140521,20140528)
dd.u <- unique(dd)

for(i in 1:length(dd.u)){
	jpeg(paste(dd.u[i],"s.jpeg"))
	my.knowledge.graph("統計基礎勉強会.txt",from=-1,to=dd.u[i],target.date=dd.u[i],max.edge=20)
dev.off()
}

for(i in 1:length(dd.u)){
	jpeg(paste(dd.u[i],"k.jpeg"))
	my.knowledge.graph("統計基礎勉強会.txt",from=-1,to=dd.u[i],target.date=dd.u[i])
dev.off()
}
  • 入力ファイル
20131113	ヒストグラム	分布	最適化							
20131113	カーネル密度推定	カーネル	ヒストグラム	推定	近似	平滑化				
20131127	楕円	回転	回転行列	固有値分解						
20131204	固有値分解	逆行列	楕円							
20131211	リサンプリング	クロスバリデーション	ギッブスサンプリング	パーミュテーション法	ジャックナイフ法	推定				
20131218	ニュートン法	最適化	微分							
20131225	二項分布	ベータ分布	分布							
20131225	共役事前分布	ベータ分布								
20131225	二項分布	離散								
20131225	ベータ分布	連続								
20140108	ワイブル分布	故障	最弱リンクモデル	形状パラメタ	尺度パラメタ					
20140108	分布	パラメタ								
20140108	最弱リンクモデル	確率モデル	モデル							
20140115	連検定	離散	組み合わせ	順列						
20140122	尤度関数	最尤推定	微分	極値	尤度					
20140122	尤度	確率	事前確率	事後確率	ベイズ					
20140122	尤度関数	ワイブル分布								
20140129	TeX	数学	表記							
20140212	アルゴリズム	線形計画法	動的計画法	貪欲法	分割統治法	数え上げ	ヒューリスティック	遺伝的アルゴリズム	モンテカルロ法	計算量
20140226	疑似乱数列	乱数	分布	シード	ギッブスサンプリング		線形合同法	メルセンヌ・ツイスター	素数	
20140305	MCMC	状態推移	状態推移行列	行列	モンテカルロ	乱数				
20140319	p値	検定								
20140326	LAPACK	線形代数	パッケージ							
20140326	線形代数	行列								
20140402	統計学	用語	定義							
20140409	統計学	記法								
20140416	データマイニング	データベース	データウェアハウス	分類	クラスタリング					
20140423	スプライン曲線	近似	微分	平滑化	推定					
20140514	オッカムの剃刀	ゲーム理論	ランダム	モデル	自由度					
20140521	自己相関	カーネル関数	周期性	畳みこみ	内積					
20140528	サポートベクターマシン	カーネル関数	内積	内積空間	分類	回帰				

有志のための統計学メニュー考、ごちゃごちゃ編

  • 統計学」の講義は「これこれができるようになりたいんです」「これができるのが最低ラインです」というのを基準にして構成しがち
  • なぜなら、需要がそこにあるから。「視聴率」を基準にすると、そこしか狙えない。マスコミ的講義構成は、「視聴率」主義
  • そうでない需要:「統計学とはどんなものだろうか」ということに興味があり、それを学ぶことで「統計学的な考え方」を身につけて「万能」を目指したい、という需要が少数にあったとしたら、「ミニコミ」「ニコ動」主義と言うことになるのだろう。いわゆる大学発のe-learningは「特定の物理的距離」の範囲に、「頻度の低い需要」を集めることはもう無理だから、「空間」を広げることで「需要が低濃度」であっても「ある程度の個体数」を確保したい、という、そういう動きなのだろう
  • 学会という制度もまあそんなもの
  • とは言え「ある程度の個体数」を確保したい、というところに「真のミニコミ」主義と相いれないものがあって、「個体数が少なくてももういいや」という開き直りも必要かもしれない
  • だらだらした蘊蓄はおいておいて
  • じゃあ、「有志」が集えるとなったとき、そのメニューはどうしたらよいのだろう
  • 『志はあるけれど、基礎はない』という前提で
  • まず定義?
  • 次いで分類?
    • ほげ
  • さらに亜分類?
    • はげ
  • 分けたら、閉じる。相互関係
    • もげ
  • とじた世界としての統計学と周辺との関連
    • めげ
  • この進め方はデジャヴゥな感じ。「数学に志はあるけど、基礎はない」というときにどうするの?というのを考えたことがあった…
    • そのときは、「すごろく方式」にした(こちら)。興味のあるところを適当にクリックしよう、解らなかったら、いつでも適当なところに戻りましょう、戻らなくても、近いところに飛んでみましょう、「志」があれば、なんとかなります、と、そんな感じ

有志のための統計学メニュー考、定義〜試行錯誤編

  • 定義は定めるものだけれど、応用範囲が広いので、天下り式に定めるのではなく
  • 『わたし・あなた』が「統計学」に求めているもの、それを(すり合わせて)「統計学」の定義としてみる
  • 求めているものは何か
    • 「よりよく解りたい何か」がある
    • 「その何か」を「直接」的に「解る」ことはできない
    • 「直接」的に「解る」ことはできないが、「間接」的に「解る」ヒントはある
    • 「間接」的に「解る」ことがどういうことなのかの「説明」が欲しい
  • 手垢のついた用語に翻訳(できるならば)してみよう
    • 「解りたい何か」→「未来」「過去」「モデル〜疑似真実」〜「真実」
    • 「直接は無理」〜Stochasticだから…(とは限らない???)
    • 「間接的ヒント」→「データ」〜「データは離散的?」
    • 「説明」→論理と言語〜曖昧は嫌だから「数学」的厳密さを求める?
  • さて、定義
    • 統計学とは
    • 「『直接的に知りえない、未来・過去・確率過程』について、『すべてではない情報』に基づいて、『論理学・数学という定義が厳密な手法』を適用したときの振る舞いに関する学問」
    • とでも言えるだろうか

有志のための統計学メニュー考、分類〜試行錯誤編

  • 分類するには尺度が必要
  • 尺度を列挙する
    • 「解りたい何か」はどんなものか
      • 目的に沿って
        • 棄却
        • 推定
      • 時間に沿って
        • 未来に関すること
        • 過去に関すること
        • 現在(の確率過程)に関すること
    • 「データ」はどんなものか
      • 観測可能性に沿って
        • 実観測可能なデータ
        • 実観測可能でなくてもよい抽象的な「すべてではない情報」としてのデータ
      • データの構成要素に沿って
        • 「変数」なのかそうでないのか
            • 変数はあるか、それは数え上げられるか
            • 変数は便宜的なものか、実在か
        • 「変数」ではないものとは
      • 変数のデータ型に沿って
        • カテゴリカル・量的
        • 離散
        • 連続
      • データの構造に沿って
    • 「手法」はどんなものか
      • アルゴリズムによる分類
      • 『論理学』『数学』の種類だけ分類ができる

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

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

# "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)