StatsBeginner: 初学者の統計学習ノート

初学者が統計学、機械学習、R、Pythonの勉強の過程をメモっていくノート。

ネットワーク分析ライブラリiGraphをPythonから使うための準備(Macの場合)

ネットワーク分析のツール

 ネットワーク分析ってありますよね。
 表面的な理解としては、こんな風情の図を描いたりするやつです。


f:id:midnightseminar:20160321030214p:plain


 頂点(node, vertex)と、頂点を結ぶ線(link, edge)の集まりとしての「グラフ」の性質を記述するグラフ理論というものがあって、これに基づいてたとえばソーシャル・ネットワーク上の人間関係とかが分析されたりするわけです。
 ネットワーク分析のツールとしては、


igraph + Pythonによるネットワーク分析 ~ Blog of an immature researcher
Python/NetworkXで簡単ネットワーク分析 - あんちべ!
2章グラフ理論スピード入門


 このあたりの記事を拝読すると、RやPythonのユーザとしては、iGraphってやつとNetworkXってやつを知っておけばよさそうです。
 
 
 iGraphは(たぶん)Rのものが有名で、↑の図もRのigraphパッケージで適当に描画したものです。
 一応どういうもんなのかイメージするために書いておくと、こういうネットワーク分析には専用のファイル形式もあるようですが、単純化して言えば全てのノード間の関係を表す総当りの行列か、リンクされてるノードとノードの1つの組み合わせを1行とする行列というかリストみたいなものが元データになります。
 Rでやる場合、たとえば1組1行のリストをデータフレームにしておくと、

> head(d)  # 最初の6行を表示
  from to
1    A  B
2    A  D
3    A  E
4    A  N
5    B  C
6    B  F
> g <- graph.data.frame(d, directed=T)  # グラフ型のデータにする
> plot(g)  # 描画


 みたいに、2行書くだけでさっきのようなグラフが描画されます。A→B、A→Dとなるわけで、分かりやすいですね。


 iGraphはPython版が昔はなかったみたいですが(?)、今はPythonから使えるインターフェイスが提供されています。今回はとりあえずNetworkXは置いといて、iGraphをPythonから使うべくライブラリをインストールしてみました。
 RのigraphパッケージはCRANからインストールすればいいので何も悩むことはないんですが、Python版では何回か失敗したので、インストールの過程をメモしておきます。OSはMacのEl Capitanで、$で始まるのはターミナルから打ってるbashのコマンドです。
 
 

落とし穴

 まず大前提として、いきなり

$ pip install igraph


 で行けるかな?みたいなテキトーなことをやると、落とし穴にハマります(ハマりました)。
 インストールには成功するので「よっしゃ」とか思ってしまうのですが、これでインストールされるのはpipに存在している全然別のパッケージですw
 まぎらわしいのでjgraphという名前でインポートしてもらうようにしました、みたいな注意書きが出ますが。


 ネットワーク分析で使うiGraphを使うのに必要なライブラリは、"igraph"ではなくて、"python-igraph"です。


 なお、結論から言えばpython-igraphをpipでインストールすればいいんですが、いきなりこれをやるのもダメです。python-igraphはigraph本体ではなくて、igraphをPythonから動かすためのインターフェイスにすぎないので、igraph本体を先に入れておく必要があります。
 
 

インストール手順

 iGraphの公式サイトにインストールの説明がありますが、

http://igraph.org/python/

Installation on Mac OS X
Instead of letting pip compile the C core for you, you can install Homebrew and the homebrew/science/igraph formula. This will ensure that the C core is found by pip so running pip install python-igraph will compile the Python interface only and link it to the C core.


 と簡単に書いてあるだけで、細かいことは書かれていませんね・・・。


 手順としてはまず、パッケージ管理ソフトのHomebrewでigraph本体をインストールします。
 ちなみに余談ですが、私は今回、自分のMacBookにHomebrewが入ってないことに気づきました。そういえば去年、OS XがEl Capitanになったときに、usr/localのパーミッションがどうのこうのという問題でHomebrewまわりに不具合が起きていて、よく分からなかったのでひとまずアンインストールしたんでした。(Homebrewが入ったままEl Capitanにアップグレードすると何か危険なことが起きるよという脅しみたいな記事を読んだ記憶がある。)
 なのでまずHomebrewのインストールからやり直しだったんですが、ここに書かれてあるとおりやったらいけました。

$ sudo chown $(whoami):admin /usr/local && sudo chown -R $(whoami):admin /usr/local  # パーミッションを与えてる
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"  # homebrewのインストール


 さて次に、Homebrewでigraphをインストールします。

$ brew install homebrew/science/igraph


 "homebrew/science/"ってのは、homebrew-scienceというもの(参考リンク)の管理下に入れるための記述みたいですが、一応試してみたら別にこれを付けずに"brew install igraph"だけでもインストールはできました。


 で、次にpython-igraphをインストールしようとさっそくpipで、

$ pip install python-igraph


 とやってみると、ものすごい分量のログの後に下記のようなエラーメッセージが出ました。
 

    grep: /usr/lib/libiconv.la: No such file or directory
    sed: /usr/lib/libiconv.la: No such file or directory
    libtool: link: `/usr/lib/libiconv.la' is not a valid libtool archive
    make[3]: *** [libigraph.la] Error 1
    make[2]: *** [all] Error 2
    make[1]: *** [all-recursive] Error 1
    make: *** [all] Error 2
    Could not download and compile the C core of igraph.

    ----------------------------------------
Command "/Users/yk/anaconda/bin/python -u -c "import setuptools, tokenize;__file__='/private/var/folders/rw/7zgjy_d15vn9xvn_dbtm2_vc0000gn/T/pip-build-am6dhjuy/python-igraph/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /var/folders/rw/7zgjy_d15vn9xvn_dbtm2_vc0000gn/T/pip-u7joobhl-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /private/var/folders/rw/7zgjy_d15vn9xvn_dbtm2_vc0000gn/T/pip-build-am6dhjuy/python-igraph/

("/Users/yk/anaconda/"ってのは私がそこに入っているPythonを使ってるからそうなっています。)


 このエラーについては、ここに書かれてあるのと同じで、この質問者が自己解決した方法でいけました。先にhomebrewで"pkg-config"ってのを入れとけってことのようです。
 つまり、

$ brew install homebrew/science/igraph  # まずigraphをインストール


 をやった後に(べつにその前でもいいが)、

$ brew install pkg-config  # これを先に入れないと正常にインストールされない


 とした上で、

$ pip install python-igraph


 とすれば成功しました。
 
 

描画用のライブラリ

 さて、インストールできたのでさっそくテストに使ってみようと思いましたが、準備が必要です。
 公式サイトの説明によると、iGraphでのグラフの描画用の関数plotを使うためには、pycairoっていうライブラリを入れておかなければならないようです。
 ちなみにこのpycairoってのも、cairo(カイロ)というC言語のライブラリをPythonから操作するためのラッパーみたいなやつなので、pycairoの前にまずはcairo本体をインストールしないといけないわけですが、これもhomebrewでいけました。


 ここの説明をみてやりましたが、
 

$ brew install cairo --use-clang


 これでcairoはインストールは完了。
 次にこれをPythonから使えるようにするため、pycairoをインストールしますが、これは若干面倒です。
 まず、

$ cd ~/Dropbox/Python/MBA2012/iGraph/  # 私はここで作業するというだけの話
$ git clone git://git.cairographics.org/git/pycairo
$ cd pycairo


 このように、作業用に適当なディレクトリに移動してから、gitコマンドでソースをダウンロードして、自動的に展開されるディレクトリに入ります。
 ここから先のやり方は、このダウンロードしてきたファイル一式の中に入っている、"INSTALL"っていうテキストファイルを開くと書いてあるのですが、

$ ./waf configure
$ ./waf build
$ ./waf install


 というふうにやればインストール完了です。
 
 
 ・・・しかしこのやり方だと、私の場合は困ったことになりました。インストール自体は正常に完了してるのですが、インストール場所が/usr/local/配下となっています。私はAnacondaからPythonを使っているのですが、Anaconda配下のPythonからはそのままでは呼べないみたいです。インストーラの中身をいじってインストール場所を変えるというのは私の知識でやるのは危険そうだし、Anaconda配下のPythonから呼ぶためのパスの設定もよく分かりません。


 それで面倒だな〜と思ってググってみたら、なんとそもそも、Anacondaが正式にpycairoを配布してくれていて、condaコマンドでインストールできることが判明w


 Pycairo :: Anaconda Cloud


 つまり、

conda install -c https://conda.anaconda.org/vgauthier pycairo


 この一撃で終了です。
 cairoも一緒にインストールされるので、上述のようなHomebrewでのcairoのインストールも不要です。あくまでAnacondaユーザの場合の話ではありますが。
 
 

テスト

 最後に動作確認しておきます。
 Pythonで以下のようなコードを実行します。

from igraph import *
vertices = ["Yamada", "Tanaka", "Suzuki", "Sato", "Ito", "Obokata"]
edges = [(0,1),(1,3),(1,4),(1,5),(2,5),(3,5),(4,3),(0,5)]
g = Graph(vertex_attrs={"label": vertices}, edges=edges, directed=True)
plot(g)


 verticesはノード名のリストで、edgesはエッジのリストです。エッジは、verticesの要素のインデックスを使って、要素0と要素1、要素1と要素3……がつながっていることを表しています。
 これらを用いてGraphというクラスのインスタンスを生成してgという変数に入れています。directedのところがTrueになっていると、「有向」グラフになります。


 これをplot関数にわたすと、めでたく以下のような図が描画されます。


f:id:midnightseminar:20160321031352p:plain 
 
 
 しかしきちんと調整しないと、なんとなく図がダサいですね。
 とりあえず動作確認までできたので、寝ます。


 最近、「インストールしてみました」みたいな記事しか書いてないですが(私の知識では他に意味のある記事が書けるわけでもないですが)、後にインストールを試みる人の検索に引っかかるかもという意味で、こういうつまらない記事の蓄積はとても大事だと思っております。
 だいたい、インストール時にエラーが出て腹が立つ現象は、だれかのブログ記事かStackoverflowによって解決されることが多いし(プログラマの人とかは根本原因を自分でつぶせるんでしょうけど)。エラーのログを掲載しておくことも大事ですね。私も実際、エラーメッセージでググッて解決方法を見つけましたし。