ネットワーク分析におけるコミュニティ抽出

この記事はR言語 Advent Calendar 2023 シリーズ2の18日目の記事です。

qiita.com

ネットワーク分析にコミュニティ抽出という手法があります。まあ、クラスター分析ですね。

Rのigraphパッケージには以下のコミュニティ抽出の方法が実装されています。

  • ラベル伝播法 cluster_label_prop()
  • ウォークトラップ cluster_walktrap()
  • 辺媒介法 cluster_edge_betweenness()
  • 貪欲アルゴリズム cluster_fast_greedy()
  • スペクトラル最適化法 cluster_leading_eigen()
  • 焼きなまし法 cluster_spinglass()
  • インフォマップ法 cluster_infomap()
  • ルーバン法 cluster_louvain()
  • ライデン法 cluster_leiden()

どんなふうにコミュニティ抽出されるか試してみましょう。

ライブラリー呼び出し。

library(conflicted)
library(tidyverse)
library(igraph)
library(igraphdata)

有名な空手クラブのデータで試します。

data(karate)
karate |>
  plot()

コミュニティ抽出

cl_lp <- karate |> cluster_label_prop()# ラベル伝播法
cl_wt <- karate |> cluster_walktrap() # ウォークトラップ法
cl_eb <- karate |> cluster_edge_betweenness() # 辺媒介法
cl_fg <- karate |> cluster_fast_greedy() #貪欲アルゴリズム
cl_sp <- karate |> cluster_leading_eigen() #スペクトラル最適化法
cl_sg <- karate |> cluster_spinglass() |> with_seed(1234, code=_) # 焼きなまし法
cl_im <- karate |> cluster_infomap() |> with_seed(1234, code=_) # インフォマップ法
cl_lo <- karate |> cluster_louvain() |> with_seed(1234, code=_) # ルーバン法
cl_le <- karate |> cluster_leiden() |> with_seed(1234, code=_) #ライデン法

結果を描画

plot(cl_lp, karate, main = "ラベル伝播法", layout = layout_with_kk)
plot(cl_wt, karate, main = "ウォークトラップ法", layout = layout_with_kk)
plot(cl_eb, karate, main = "辺媒介法", layout = layout_with_kk)
plot(cl_fg, karate, main = "貪欲アルゴリズム", layout = layout_with_kk)
plot(cl_sp, karate, main = "スペクトラル最適化法", layout = layout_with_kk)
plot(cl_sg, karate, main = "焼きなまし法", layout = layout_with_kk)
plot(cl_im, karate, main = "インフォマップ法", layout = layout_with_kk)
plot(cl_lo, karate, main = "ルーバン法", layout = layout_with_kk)
plot(cl_le, karate, main = "ライデン法", layout = layout_with_kk)

個人的な経験ではルーバン法がいい感じのグループ分けをしてくれるように思います。

Enjoy!