記事について
共起性分析の際に、ネットワークグラフでの可視化をRで行ったので、手順を備忘録として残す。
集計のためのSQLはHiveクエリーで記している。
想定するデータ
user_id | demographics |
---|---|
aaa | 男性:20~30歳代:会社員:未婚:収入400~600万円 |
bbb | 女性:30~40際代:既婚:子供あり |
というような直列のデモグラフィック属性値を各ユーザーが持っているデータ構造を想定。
※欠損値は単に連結されない
これを、以下のような形に展開する。
最終的にこの形になればどういう経緯でもOK。
user_id | dmg |
---|---|
aaa | 男性 |
aaa | 20~30歳 |
aaa | 会社員 |
aaa | 未婚 |
aaa | 収入400~600万円 |
bbb | 女性 |
bbb | 30~40歳 |
bbb | 既婚 |
bbb | 子供あり |
以下はHiveクエリーの例。
Rだとreshape2モジュールのmelt関数で同じようなことができるはず。
select
user_id,
dmg
from
user_demographics_tbl
lateral view
explode(split(demographics, ':')) dmgs as dmg
エッジサイズの集計
共起パターンとその数を集計をする。
select
a.dmg,
b.dmg,
count(1) edge
from
parsed_dmg_tbl a
left outer join
parsed_dmg_tbl b
on
a.user_id = b.user_id
where
a.dmg < b.dmg
group by
a.dmg, b.dmg
order by
edge desc
where a.dmg < b.dmg
で組み合わせの重複を除外する。
ノードサイズの集計
単純に各属性の出現回数をカウント。
select
dmg,
count(1) vertex
from
parsed_dmg_tbl
group by
demographics
order by
vertex desc
ネットワークグラフの描画
Rのigraphモジュールにエッジサイズとノードサイズの情報を渡す。
大きなコードじゃないので全体を載せるが、gistはこちら(network_graph.r)
network_graph.r
require(igraph)
vs <- read.delim("D:/tmp/r/network_graph_vertex.tsv", sep="\t", header=F, row.names = 1)
es <- read.delim("D:/tmp/r/network_graph_edges.tsv", sep="\t", header=F)
vsize <- 10000
esize <- 10000
# ノードラベル
vn <- read.delim("D:/tmp/r/network_graph_labels.tsv", sep="\t", header=F, row.names = 1)
# 描画
ng <- graph.data.frame(es, directed = F)
tkplot(ng,
edge.width=E(ng)$V3/esize,
vertex.size=vs[V(ng)$name,]/vsize,
vertex.label=vn[V(ng)$name,],
vertex.color = "#AACCFF88",
layout=layout.fruchterman.reingold
)
Layoutメニューから様々な形で自動配置できる。