こんにちは。

最近、温度差が激しすぎて体調を崩しがちで非常に困っています。kzです。

今回はピープルアナリティクスというキーワードで行われるネットワーク分析のためのライブラリ、NetworkXというものを使ってみようと思います。僕も使いはじめなのでまだまだ使用が分かっていないんですがかっこいいPlotがたくさんあるのでやっていて楽しいです。

NetworkXとは?

めっちゃ綺麗なサイトだと思いませんか?まあそれは置いておいて、NetworkXはグラフ・ネットワークを扱うためのPythonライブラリです。数学で言うとグラフ理論という分野です。最短経路問題など扱います。キーワードで言いますと、

  • 深さ優先探索(DFS)
  • 広さ優先探索(BFS)
  • ダイクストラ法
  • オイラー経路
  • ハミルトングラフ
などですね。懐かしいです。とはいえ、身近な例、欲しいですよね。

この日本の都道府県をノードとしたネットワークは非常にわかりやすいので入門にオススメです。このようにネットワークは身近に多数存在します。そこで、LineやSlackも人をノード(県)、メッセージの向きをエッジ(繋がり)と思うとネットワークです。こうして分析したいネットワークを構成していろいろ分析していくことをネットワーク分析と言います。

ネットワーク分析の指標

指標というのは例えば、誰が重要かです。SNSのデータを使ったネットワークを例にしますと、いろんな人がいろんな話題で発言する中で、中心人物は誰だったり、会話に積極的な人は誰だったりというような「ある基準に対して誰がどのくらいそうなのか」を数値化したものです。ネットワーク分析ではその指標のことを「中心性」といい、具体的には例えば次のような指標があります。

次数中心性 (Degree)

これはあるノードが持つエッジの数です。つまり、Aさんがいろんな人に喋れば喋るほどAさんの次数中心性は高いです。一番単純かつ、直感的な指標だと思います。

近接中心性 (Closeness)

iさんの近接中心性はiさんと他の人との距離が近ければ近いほど高い指標です。ここで距離なんですが、SNEを例にとると例えば、発言数の逆数を使ったりします。式は次のとおりです。

    \[\frac{N-1}{\sum_{j=1 \atop j \neq i}^{N} d\left(v_{i}, v_{j}\right)}\]

媒介中心性 (Betweenness)

言葉の通り、媒介すればするほど高い指標です。都道府県を例でいうと、任意の2都道府県を選んだ時に最も中継されやすい都道府県が高くなります。式はなかなか複雑です。

あるノードi(都道府県)以外の2都道府県を選び方は総数をNとすると(N-1)(N-2)/2ですね。
gはi_s, i_tを結ぶ最短路でiを通るものの数。
Nはi_s, i_tを結ぶ最短経路数。

    \[b_{i} = \frac{ \sum_{i_s = 1,i_s \neq i }^{N}   \sum_{i_t = 1,i_t \neq i }^{i_s -1} \frac{ g_i^{(i_s i_t)}} { N_{i_s i_t}}  }{(N-1)(N-2)/2}\]

最も使われている中心性のようですが、個人的には次数中心性と組み合わせることで威力が出るんじゃないかなと思っています。

固有ベクトル中心性 (Eigenvector)

あるノードの周辺ノードの中心性を扱うのですが、、難しいので少しだけ解説をします。
上のようなネットワークを考えます。Adjは隣接行列と言います。繋がっていると1を成分に持ちます。この5 \times 5行列に次のようなベクトルを右からかけてみましょう。
[8,6,8,7,3]というベクトルが得られました。これすごいんですよ。これをもとのノードと比べると
例えば右のネットワークの真ん中の8についてなんですけど、これって左の図の真ん中のノードに繋がってるノードの値の総和なんですよね。つまり、このベクトルの演算で広がりのようなものを計算したんですよね。で、この広がりが均等、つまり飽和した感じを考えると下のような式になります。
これまさに固有ベクトルですよね。しかも対象行列は固有値が実数です。はい神。正直僕も完璧に理解できてないんですけどイメージは得られました。皆さんも良い例を思いつけばコメントください!

Code

では簡単にコードを貼ってお終いです。
実は最近Vim始めました。Tmuxが使いこなせません、涙

Reference