igraphでシンデレラガールズのアイドル紹介相関図

アイドルマスターシンデレラガールズ第6回総選挙が終わりましたね。楓さんおめでとうございます。

さて、今回の総選挙では、登場アイドルがお題に沿って他のアイドルを紹介する特設ページ開設され、話題になった。

www.nicovideo.jp

全アイドルを網羅する内容の丁寧さもさることながら、自分としては『おっ、これはいい有向重みなしグラフ…』と思ったので、Rのigraphパッケージ*1を使って相関図を作成してみた。

まずは、以下のように1列目に紹介する側、2列めに紹介される側のアイドルをタブ区切りで記入したファイルを作成し、エッジリストを作成。

卯月 まゆ
卯月 加蓮
卯月 美嘉
卯月 みく
卯月 雅
有香 亜季
有香 拓海
有香 早苗
有香 アヤ
有香 あやめ
ゆかり 星花
ゆかり 久美子

(以下略)

これをigraphに取り込んで、以下のスクリプトで相関図が描ける。

library(igraph)#igraphパッケージの呼び出し
cg <- read.table(file="cg_idol_edgelist.txt", header=FALSE)#エッジリストを読み込み
g <- graph.data.frame(cg[1:2], directed=T)#グラフオブジェクトに渡す
V(g)$color <- "pink"#ノードの色をcute仕様に
V(g)$size <- 6#ノードサイズの決定
V(g)$color[63:125] <- "cornflowerblue"#ノードの色をcool仕様に
V(g)$color[126:183] <- "yellow"#ノードの色をpassion仕様に
V(g)$label.cex <- 1.2#文字サイズ変更
png("cg_idol.png",width=2000,height=2000)pngで保存する準備
plot(g,layout=layout.kamada.kawai)#グラフをプロット
dev.off()#デバイスを閉じる

f:id:Fujinitaka:20170524023745j:plain

…いやー非常にごちゃごちゃしていて分かりにくい。

ただ、クラスタを形成しているように見えないことから、少なくとも全アイドルまんべんなく紹介されていることが示唆されている。また、よく見ると、左の方にアヤさん、渚さん、櫂くん、洋子さんが配置されていて、スポーツ系が集まっていることや、右端には蘭子、飛鳥くん、聖ちゃん、音羽さん、詩織さん、小梅ちゃんが位置してるのは、魂の共鳴を感じるCool不思議組のクラスタっぽいかな-とは思える。

全体的な傾向を見ると、例えば平均アイドル紹介数は以下で求まる。

gsize(g)/gorder(g)#エッジ数/ノード数
[1] 4.945355

任意のノード間の平均パス数を求めてみると、

mean_distance(g, directed = TRUE)

[1] 3.344262

となる。つまり、ランダムに1組のペアを選んだとき、一方のアイドルからもう一方のアイドルまでは平均約3.3回のクリックでたどり着ける計算になる。おもったより短くて済むという印象。

他のアイドルへの距離(最低必要クリック数)を求めて、テキストに一覧を出力するには、

dis <- distances(g, mode="out")#outでノードから出ていくエッジを数える
write.table(dis,"cg_dis_table.txt",append=T,quote=F,col.names=T)

とすればよい。

 

次に、マイ担当アイドルである「白菊ほたる」に注目して、周囲の関係性を調べてみた。まず、ほたるが紹介する・ほたるを紹介するアイドルを求める。

incident_edges(g,58,mode="all")
$ほたる
+ 9/905 edges (vertex names):
[1] ほたる->ネネ ほたる->朋 ほたる->晴 ほたる->海
[5] ほたる->巴 加奈 ->ほたる 裕美 ->ほたる 惠 ->ほたる
[9] 智香 ->ほたる

これで、ほたるの周囲の関係性は把握できた。惠さんと智香から矢印出てるのは意外な気がする。

つづいて、ほたるが所属するユニットであるGBNS(ガールズビーネクストステップ)のメンバーには、どのように到達できるか調べてみた。

shortest_paths(g,"ほたる","千鶴",mode="out")
$vpath
$vpath[[1]
+ 5/183 vertices, named:
[1] ほたる 海 晶葉 亜子 千鶴

shortest_paths(g,"ほたる","裕美",mode="out")
$vpath
$vpath[[1]
+ 5/183 vertices, named:
[1] ほたる 巴 夏樹 涼 裕美

shortest_paths(g,"ほたる","泰葉",mode="out")
$vpath
$vpath[[1]
+ 4/183 vertices, named:
[1] ほたる ネネ 薫 泰葉

という感じで、最短ルートを出すこともできる。こう見ると、アイドル全員ちゃんと繋がってるんだな…という温かみのようなものを感じる。

 

このグラフ、更に掘り下げて次数中心性など調べてみると面白そうだけど、今は時間と知識がちょっと足りないので別の機会に。とはいえこのエッジリストがあれば、誰でも同様の解析できるので、どこかのサイトにアップしようかと思う(果たして需要はあるのか?)。

 

参考サイト様:

第6回シンデレラガール総選挙のアイドル紹介をjson化 · isaisstillalive/imas_cg_hash@384e2a2 · GitHub

注:メアリーと美世さんだけ抜けている

igraph R manual pages

農薬の散布間隔図をRのigraphパッケージでプロットしてみた - もうカツ丼でいいよな

R seminar on igraph

先行文献:

【モバマス】第六回シンデレラガールズ総選挙「アイドル紹介」 アイドル毎に選ばれた人数まとめ:もばます!

 

 

Rのigraphで相関図

最近、「Rパッケージのigraph*1って相関図描くのに便利そうだな-」と思っているので、練習も兼ねて簡単な作図と計算をしてみた。たとえば、イロハ、すもも、梨子、てゐの4人に以下のような関係があったとする。

  • イロハはすもも、てゐを知っている
  • ももはイロハを知っている
  • 梨子はイロハ、すもも、てゐを知っている
  • てゐは他の3人のことを知らない

 この関係性を0と1で表すと、こんな行列ができる(グラフ理論では、隣接行列と呼ぶ)。

f:id:Fujinitaka:20170518230442p:plain

エクセルで作成して、適当な名前をつけてテキスト形式(タブ区切り)で保存したあと、Rを立ち上げて次のコマンドを打ち込む。これで基本的な相関図は作れる。

library(igraph)#igraphを呼び出す

d <- as.matrix(read.table(file="sample.txt",header=T,row.names=1))#1列目と1行目に名前をつけて読み込む

g <- graph.adjacency(d,mode="directed",weighted=NULL)#有向重みなしグラフとしてgに格納
plot(g)#とりあえず描く

f:id:Fujinitaka:20170516002555p:plain

それぞれの要素(ここでは人)は「ノード (node)」、ノード同士を結ぶ辺(ここでは2人の関係性)は「エッジ (edge)」とよばれる。エッジには方向性と重みを持たせることができる。上のグラフの場合は「重みなし有向グラフ」となる。

さらに、distanceコマンドを使うと、それぞれのノードから他のノードへの距離を知ることができる。

 distances(g, mode="out")#ノードから出るエッジの計算

f:id:Fujinitaka:20170518233200p:plain

Infは、infiniteつまりいかなるノードを経由してもたどり着けないことを表す。この例では、すももは1人の仲介でてゐにたどり着けるが、梨子とはどう頑張っても知り合いになれない。この行列は、距離行列とも呼ばれる。

次に、「すももを出発点としたとき、他のメンバーには平均何回の仲介でたどり着けるか?」を計算してみる。

dis <- distances(g, mode="out")#disに計算結果代入

dis[dis == Inf] <- 0#無限大が交じると計算できないので、ゼロに変換

mean(dis[2,])#すももの行の平均を求める
[1] 0.75 #割る数に値が0の要素も数えてしまっている

sum(dis[2,])/sum(dis[2,]>0)#1以上の値を持つ要素の数で2行目の合計を割る
[1] 1.5

というわけで、平均1.5回となる。次回はもう少し複雑な関係性にも挑戦したい。

参考サイト様:

igraphパッケージの使い方 1. グラフオブジェクトの作成と取り扱い - もうカツ丼でいいよな

R+igraph - Kazuhiro Takemoto

 

初投稿

このブログでは、

  • 生物学関係
  • 漫画やゲーム
  • 時事ネタ

などについて、統計初心者のブログ主が試行錯誤しながら何とか解析を試みる…という内容になる予定です。

どうぞよろしくお願いします。