LoginSignup
2
3

More than 5 years have passed since last update.

共起性分析の可視化(ネットワークグラフ)

Last updated at Posted at 2017-12-08

記事について

共起性分析の際に、ネットワークグラフでの可視化を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
      )

ng2.png

Layoutメニューから様々な形で自動配置できる。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3