共起ネットワーク

テキストマイニングでよく使われる語の共起ネットワークを
トランザクションデータで使用してみた。

今回もアソシエーション分析に使用したものと同じデータを使用。

行:ID
列:メディア名
値:メディアへの接触フラグ

このトランザクションデータから、メディアの類似度を計算し、
その類似行列を用いて、ネットワーク図を描画する。
スクリプトは、KH Coderを参考にして作成。
KH Coder: 計量テキスト分析・テキストマイニングのためのフリーソフトウェア

# データの用意
dat <- read.csv("共起ネットワーク作成用データ.csv", header=TRUE)
dat2 <- as.matrix(dat)
dat3 <- t(dat2)


# 負の値を0に変換する関数
neg_to_zero <- function(nums){
temp <- NULL
for (i in 1:length(nums) ){
if (nums[i] < 0){
temp[i] <- 0
} else {
temp[i] <- nums[i]
}
}
return(temp)
}

# 類似度計算
d <- dist(dat3 ,method="binary")
d <- as.matrix(d)
d <- 1 - d;

# 標準化
std <- d
std <- t(std)
std <- scale(std, center=T, scale=F)
std <- t(std)

if ( min(std) < 0 ){
std <- std - min(std);
}
std <- std / max(std)

d2 <- std


# グラフ作成
new_igraph <- 0
if (as.numeric( substr(sessionInfo()$otherPkgs$igraph$Version, 3,3) ) > 5){
new_igraph <- 1
}

n <- graph.adjacency(d, mode="lower", weighted=T, diag=F)
n <- set.vertex.attribute(
n,
"name",
(0+new_igraph):(length(d[1,])-1+new_igraph),
as.character( 1:length(d[1,]) )
)


# edgeリストの作成
el <- data.frame(
edge1 = get.edgelist(n,name=T)[,1],
edge2 = get.edgelist(n,name=T)[,2],
weight = get.edge.attribute(n, "weight"),
stringsAsFactors = FALSE
)


# edge.widthを計算
edg_width <- el[,3]
if ( sd( edg_width ) == 0 ){
edg_width <- 1
} else {
edg_width <- edg_width / sd( edg_width )
edg_width <- edg_width - mean( edg_width )
edg_width <- edg_width * 0.6 + 2 # 分散 = 0.5, 平均 = 2
edg_width <- neg_to_zero(edg_width)
}


# 出力する円の大きさ
v_size <- 25


# エッジの色
# これはエッジの幅が太ければ太いほど色を濃くしている
edg_color <- rep("gray85", length(edg_width))
edg_color <- replace(edg_color, edg_width>2.0, "gray70")
edg_color <- replace(edg_color, edg_width>2.5, "gray40")


# ノードの形
# コメントアウトしてあるところを変えれば、特定のノードを好きな形に変えられる
v_shape <- rep("circle", length(colnames(d)))
# v_shape[9:10] <- "square"   

# ノードの色
# これもコメントアウトしてあるところを編集すれば、好きな色に変えられる
v_col <- rep("green", length(colnames(d)))
# v_col[6:8] <- "blue"
# v_col[9] <- "orange"
# v_col[10] <- "red"


# 描画
plot.igraph(n,
vertex.label = colnames(d),
edge.width = edg_width,
layout = layout.circle,
vertex.size = v_size,
vertex.color =v_col,
edge.color = edg_color,
vertex.shape =v_shape,
vertex.label.font=2,
vertex.label.color="black")

参考
igraphパッケージの使い方 1. グラフオブジェクトの作成と取り扱い - もうカツ丼はいいよな
統計的テキスト解析(6)~語のネットワーク分析~
ネットワーク分析 - ベイジアン・ネットワーク - yokkunsの日記