Python

【Python】相関関係をグラフ(ネットワーク)で可視化する【Pyvis】

こんにちは。

現役エンジニアの”はやぶさ”@Cpp_Learningです。最近は統計的因果推論を勉強中です。

本記事では相関関係をグラフ(ネットワーク)で可視化する方法を紹介します。

モチベーション -なぜ相関をインタラクティブなグラフで可視化するのか-

相関の可視化には、ヒートマップがよく使われます(下図参照)。

相関係数のヒートマップ

上図の場合は、変数同士の相関の強さを色の濃さで表現しています。例えば、”RAD”と”TAX”には強い相関があるようです。

すごい!分かりやすい!!

と感じる人もいれば…

くるる
くるる
そう?鳥目の”くるる”には分かりにくい…

というフクロウもいるかと。

個人的にはヒートマップ大好きですが、説明変数の数や色彩感覚によっては、ヒートマップによる可視化は分かりにくいケースがあります。

そこで、以下の記事のようにグラフで相関関係を可視化したいと思います。

CausalNexで因果推論
【構造学習】CausalNexで有向非循環グラフ(DAG)推定 -説明変数(テーブルデータ)の因果推論に挑戦-こんにちは。 現役エンジニアの”はやぶさ”@Cpp_Learningです。最近、因果推論・因果探索を勉強してます。 今回は有...

上記の記事では、グラフ(ネットワーク)構造を NetworkX で可視化しましたが、今回はPyvisを使ってインタラクティブなグラフを作成します。

インタラクティブなグラフを活用することで、ノードやエッジの色や位置を調整しならがら、関係性やグラフ構造についてのプレゼンができます

実践!相関関係をインタラクティブなグラフで可視化する

機械学習チュートリアルでお馴染みの ボストンの住宅価格データセット を採用し、各変数の相関関係を可視化します。

インストール

本記事のソースコードはGoogle Colabで動作確認しました(2021/02/07)。

Google Colabの場合は、以下のコマンドでインストールするだけで環境構築完了です。

pip install pyvis

以降からコード書いていきます。

Import

まずはimportから

データセット

データをダウンロードして、中身(頭の3行)を確認しておきます。

ボストン市の住宅価格データセット

相関係数の算出とヒートマップによる可視化

以下のコード1行で相関係数を算出できます。

本題ではありませんが、よく使うのでヒートマップによる相関関係の可視化も紹介します。

相関係数のヒートマップ

冒頭のヒートマップと同じものです。seaborn使って可視化してます。

以降から、本題のグラフによる相関関係の可視化を実践します。

前処理

ヒートマップの「右上の三角行列」と「左下の三角行列」は同じ情報なので、「右上の三角行列」にマスクをして、Noneに置き換えます。

マスクの使い方については、以下の記事で紹介済みなので、参考にしてくださいな。

pandas.DataFrame.mask
【Python】pandas.DataFrame.maskの使い方 -条件を満たす値を任意の値に変換-こんにちは。現役エンジニアの”はやぶさ”@Cpp_Learningです。 今回はデータ分析などに役立つ Pandas の mask...

エッジリスト作成

以下のコードでエッジリストを作成します。

array([(‘ZN’, ‘CRIM’, -0.20046921966254821),
(‘INDUS’, ‘CRIM’, 0.4065834114062593),

(‘PRICE’, ‘B’, 0.33346081965706653),
(‘PRICE’, ‘LSTAT’, -0.7376627261740143)], dtype=object)

エッジリストの中身は上記の通りで、例えば ‘PRICE’ と ‘LSTAT’ の相関係数は約-0.74のようです(ヒートマップでも確認できます)

networkxグラフをpyvisグラフに変換

pyvisグラフを作成する方法がいくつかありますが、以下の手順が簡単でした。

  1. networkxグラフを作成
  2. networkxグラフをPyvisグラフに変換
  3. エッジの太さなどを調整(オプション)
  4. インタラクティブなグラフを出力

順番に実装していきます。

以下のコードでPyvisグラフを作成できました。

[{‘from’: ‘ZN’, ‘to’: ‘CRIM’, ‘weight’: -0.20046921966254821},
{‘from’: ‘ZN’, ‘to’: ‘INDUS’, ‘weight’: -0.5338281863044747},

{‘from’: ‘B’, ‘to’: ‘PRICE’, ‘weight’: 0.33346081965706653},
{‘from’: ‘LSTAT’, ‘to’: ‘PRICE’, ‘weight’: -0.7376627261740143}]

エッジリストのフォーマットが上記のように変換されます。 ‘PRICE’ ⇒ ‘LSTAT’ のweight(相関係数)は約-0.74という定義です。

相関関係からは矢印の向きは分かりません。なので、可視化するときは有向グラフではなく、無向グラフを採用します

weightに応じて、エッジの太さを変更

先ほど作成した、pyvisグラフを出力しても良いのですが、weightに応じてエッジ太さ(width)を調整した方が、相関関係の強弱が際立ちます。

今回は相関係数の絶対値が0.5以上のエッジを強調してみます。

インタラクティブなグラフをhtmlで保存

作成したグラフをhtmlで保存します。

適当なブラウザ(Chromeなど)で”boston-corr.html”を開けば、以下のようにグラフをぐりぐり動かせます。

※冒頭で見せたものと同じです

はやぶさ
はやぶさ
”PRICE”(住宅価格)と強い相関があるのは、これですね~
くるる
くるる
”B”と”CHAS”は孤立してますね~

みたいなデータ分析結果のプレゼンが捗りますね。

htmlファイルなら、pythonコードの提供や環境構築不要でインタラクティブなグラフを共有できるのも嬉しいですね。

boston-corr.html

今回作成したグラフ(boston-corr.html)を公開するので、自由に触ってみて下さい(*・ω・)ノ♪

スポンサーリンク

まとめ

相関係数をインタラクティブなグラフで可視化する方法を紹介しました。データ分析やプレゼン資料作成などの参考になれば嬉しいです。

グラフの見せ方ひとつで印象がガラッと変わります。自分が本当に伝えたいことが伝わらないのは勿体ないです(><)

分析手法も重要ですが、データの可視化デザインや見せ方を工夫することも重要ですね。

はやぶさ
はやぶさ
因果推論もデータ可視化デザインも勉強中なので、情報共有しながら一緒に成長できたら嬉しいです。よろしくお願いします。

おまけ -因果推論と可視化について-

本記事で説明していた…

くるる
くるる
相関関係からは矢印の向きは分かりません

ってどういう意味?気になって昼寝できない!フクロウなので!!

はやぶさ
はやぶさ
(ワロタ)

原因⇒結果の関係は因果関係と呼ばれています。相関関係≠因果関係なので、相関のみでは、矢印の向きは分かりません。因果関係を把握するには、因果推論が強力な武器になります。

因果推論入門におすすめ本は以下の記事で紹介中なので、ご参考までに。

因果推論入門におすすめの本
【データ解析】因果推論入門におすすめの本3選こんにちは。 現役エンジニアの”はやぶさ”@Cpp_Learningです。仕事でもプライベートでも機械学習で色々やってます。 ...
くるる
くるる
pyvis以外にもカッコイイ可視化ができるライブラリってあるの?

以下の記事をオススメしておきますね。

Bokehでデータ可視化
【Python】Bokehでインタラクティブなデータ可視化 -ソースコードあり-こんにちは。 現役エンジニアの”はやぶさ”@Cpp_Learningです。仕事でもプライベートでも機械学習で色々やってます。 ...
PythonプログラミングでGIFアニメーションをつくる
PythonでグラフのGifアニメーションをつくる -データ分析のための可視化-こんにちは。 現役エンジニアの”はやぶさ”@Cpp_Learningです。最近ダイエットしてます。 ダイエット期間中の体重デ...

あと使ったことないけど、ネットワークの可視化なら netwulf も良さそうでした。

(完)

『ドラゴン桜2』のKindle本1円セール

現在ドラマ公開中の『ドラゴン桜2』

Kindleで1巻~3巻まで各巻

0

0円セール中に買わなきゃ損。

勉強のモチベーションをアップしよう!

>>『ドラゴン桜2』をチェックする

PICK UP BOOKS

  • 数理モデル入門
    数理モデル
  • Jetoson Nano 超入門
    Jetoson Nano
  • 図解速習DEEP LEARNING
    DEEP LEARNING
  • Pythonによる因果分析
    Python