Posted at

{igraph} カレーなるネットワーク解析

More than 3 years have passed since last update.


0. イントロ

男女19人でカレーを食べに行きました。

「Bセット」は、7種類の中から2種類のカレーを選びます。

重複してはいけません。

肉カレー
野菜カレー
その他

キーマ
ほうれん草(サグ)
日替わり

チキン
ベジタブル

マトン
ミックス豆

集計結果がこちら。

> head(dat)

カレー1 カレー2 性別
1 チキン キーマ m
2 サグ キーマ f
3 ベジ 日替わり m
4 チキン サグ f
5 チキン ベジ f
6 日替わり ベジ m

もう、血湧き肉躍りますよね。

あれ、やっちゃいましょうよ、兄貴

AさんとBさんに矢印を引っ張って、秘密のカンケーを一目瞭然にするやつ。

library(igraph)


1. データ整形

みんな大好き$for$文を使ったりしながら泥臭く揃えると、こうなる。

注意した点は、curry1, curry2の順番は(心理学的な解析を行わない限り)意味がないので、逆順の行を追加して矢印を引っ張る(両側矢印になる, 矢印数の比は保存されている)。

> dat1

curry1 curry2 weight 男女比
1 キーマ サグ 2 1.000
2 キーマ チキン 2 0.000
3 キーマ マトン 1 0.000
4 キーマ ミックス豆 1 0.000
5 キーマ 日替わり 1 0.000
6 サグ キーマ 2 1.000
7 サグ チキン 2 0.500

ここまでで取り敢えずplotしてみる。

g <- graph.data.frame(dat1[,1:2])

plot(g)

スクリーンショット 2015-10-27 15.05.12.png

いいですねぇ。


2. オプションの指定

nodeの大きさを、「そのカレーがチョイスされた数」に従って変えたい。

size <- dat1 %>% group_by(curry1) %>%

summarise(v.size = sum(weight))

パスの色は、男女比によって変えたい。

男100%:blue, 女性100%:red, 50%50%:灰色で、グラデーション。

Col <- colorRamp(c("Blue", "grey", "Red"))

その他、

・太さをweightで与える

・肉カレーのnodeはオレンジ、野菜カレーは緑、日替わりは白

などのオプションを指定する。

g <- graph.data.frame(dat1[,1:2])

E(g)$weight <- dat1$weight
E(g)$color <- rgb(Col(dat1$男女比)/255)
V(g)$size <- size$v.size*5
V(g)$color <- c(rep(c("orange", "green"),3), "white")

で、plot。

plot(g, edge.width=E(g)$weight^3)


3. 結果

スクリーンショット 2015-10-27 11.11.27.png

・「肉-肉」ペアを結ぶ矢印は全て真っ青(100%男)。

・中身の知らない日替わりカレーにトライするのも100%男。

・女性陣は、少なくとも1つの野菜カレーを頼む。

・「マトン-サグ(ほうれん草)」の組み合わせ最強。

・チキン万能。

・ミックス豆(ぇ