pythonで非線形相関 (MIC) 係数行列の計算

実践Data Scienceシリーズ RとStanではじめる ベイズ統計モデリングによるデータ分析入門 (KS情報科学専門書)

データ間の非線形な相関関係を示す指標であるMICの係数行列を求める方法について。

原著論文はこちら。

Just a moment...

(本ページにて紹介しているコードはgithubにて公開しています。)

DataAnalOji.hatena.sample/python_samples/blog_MIC_coefficient_array.ipynb at master · Data-Anal-Ojisan/DataAnalOji.hatena.sample
samples for my own blog. Contribute to Data-Anal-Ojisan/DataAnalOji.hatena.sample development by creating an account on GitHub.

minepyのインストール

事前準備としてsetuptoolsをインストールしておき,minepyをインストール。

$ pip install 'setuptools >=14.0' 
$ pip install minepy

以下MIC相関係数行列の計算方法について。

パッケージのインポート

# 数値処理
import pandas as pd 

# MIC相関
from minepy import MINE

# グラフ描画
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use("ggplot")
plt.rcParams["font.family"] = "Meiryo"
import seaborn as sns

# サンプルデータ
from sklearn.datasets import load_boston

# 警告非表示化
import warnings
warnings.filterwarnings('ignore')

サンプルデータの読み込み

サンプルデータとして有名なboston_housingのデータセットを利用。

# サンプルデータのインスタンスを生成
boston = load_boston()

# 特徴量をデータフレームに格納
df = pd.DataFrame(boston.data, columns=boston.feature_names) 
display(df)

MIC相関係数行列の計算

MICの相関係数行列を代入するためのデータフレームを作成し,forループ内でMIC相関係数の計算結果をデータフレームに代入する。

#インスタンスの生成
mine = MINE(alpha=1, c=0.1, est="mic_e") 

# MIC相関行列用に空のデータフレームを作成
df_mic = pd.DataFrame(columns=df.columns, index=df.columns)

# forループ内でMIC相関係数を求め,先ほどのデータフレームに格納
for column in df.columns:

    for index in df.columns:

        # MIC相関係数の計算
        mine.compute_score(df[column], df[index])
        # 計算結果をデータフレームに書き込み
        df_mic.loc[index, column] = mine.mic()

MIC相関係数行列のヒートマップ描画

seabornのheatmap()を利用して係数行列のヒートマップを描画する。

plt.figure(figsize=(8, 8))
sns.heatmap(df_mic.astype(float),
            linewidths=1,
            cmap='jet',
            square=True,
            annot=True,
            vmax=1,
            vmin=0,
            center=0, 
            fmt="1.2f")
plt.axes().set_ylim(df_mic.shape[1], 0)
plt.tick_params(axis='y', which='major', labelsize=6)
plt.tick_params(axis='x', which='major', labelsize=6)
plt.grid(None)
plt.title("MIC相関のヒートマップ")
plt.tight_layout()
plt.show()

minepyの利用方法の詳細については公式ドキュメントを参照のこと。

Python API — minepy 1.2.6 documentation

コメント