library(sna)
load(file="0Mat.rda")
dim(Mat)
gden(Mat) #密度 =0でないペアの割合
#degreeを算出
dg<-degree(Mat)
stem(dg)
#50回以上の出入りがあった者に限定
m<-Mat[dg>50,dg>50]
dim(m) #[1] 132 132
#イメージ図をみてみる 色が白い=やりとりが多い
image(m)
rownames(m)
#図をみてみる 色が濃い=やりとりが多い に逆転する
max(m) # 108
image(108-m)
rownames(m)
#この人達だけに限定して degree
dg2<-degree(m)
stem(dg2)
#単純に合計のやりとり数が大きい順に行列を並び替える
od<-order(dg2,decreasing = T)#多い順番
m2<-m[od,od]
image(108-m2)
- やりとりが多い人達を階層クラスター分析でグループにまとめてみる
- そのためには距離行列に変換する
- 現在のデータはメッセージのやりとりの多さ。 距離=値が大きいほど離れている にするために 最大値から引く。それを距離行列に変換
d<-dist(108-m)
#これが各人の距離 値が大きいほど疎遠
d
**練習 もっとも距離が近いのは誰と誰?
#階層型クラスター分析 =距離がちかいものから順に結合する。
res.h<-hclust(d)
plot(res.h) #縦軸は距離 下に行くほど距離が近いことになる。
#どのような順番で結合したか? マイナス付はもともとの人の番号
#マイナスなしの 例えば 2 は2段階目でつくられたクラスタの意味
res.h$merge
# [,1] [,2]
# [1,] -69 -113
# [2,] -5 -74
# [3,] -19 2
# [4,] -57 -98
# [5,] 3 4
# [6,] -8 -127
#人名リスト
rownames(m)
- この結果を使ってmをブロックモデルで分割 k=4でブロック数を指定
res.b<-blockmodel(m,res.h,k=4)
table(res.b$block.membership) #各ブロックに含まれる人数
# 1 2 3 4
#112 18 1 1
res.b$block.membership[order(res.b$block.membership)]#各ブロックのメンバー
plot(res.b)#イメージプロット
mb<-m[order(res.b$block.membership),order(res.b$block.membership)]
image(108-mb)
- 練習
- 階層型クラスタ分析のツリーをみながら、ブロック数を適宜指定して、ブロックモデルを実行してみる
- 全メンバーに対して同様のことをしてみる。いくつくらいのブロックが適当か?それぞれのブロック(に含まれる人)の特徴は?