Python で相関分析

  • 2022年7月17日
  • 2022年7月17日
  • Python
  • 33view

相関分析とは

2つのデータの関係の強さを表す指標(相関係数)を計算し、数値化する分析手法です。
相関係数は 1 に近づくほど正の相関(正比例)の関係が強くなり、-1 に近づくほど負の相関(反比例)の関係が強くなります。
また、0 に近づくほど無関係になります。

  1. 正の相関
    片方の数値が大きくなる(小さくなる)と、もう片方の値も大きなる(小さくなる)
  2. 負の相関
    片方の数値が大きくなる(小さくなる)と、もう片方の値は小さくなる(大きくなる)
  3. 無相関
    片方の数値が大きくなる(小さくなる)としても、もう片方の値に決まった変化が見られない。

正の相関

負の相関

無相関

相関係数について

相関関係の強さを示す数値で、-1 から 1 で示されます。
数値が大きければ、より強い相関があるということになり、例えば 0.8 では強い正の相関、-0.8 では強い負の相関があるということなります。

Python で相関分析

実行例

以下の血液検査の結果(sample.csv)を取込み、相関分析を行います。

日付 WBC HGB PLT T-P ALB CRP 治療
2021/1/1 5.4 12.3 280 7.1 3.7 1.68 治療薬A
2021/2/1 5.8 12.5 295 7.2 3.7 2.13 治療薬A
2021/3/1 5.8 12.8 271 7.2 3.8 1.03 治療薬A
2021/4/1 6 13.1 256 7.4 3.9 0.79 治療薬A
2021/5/1 6.3 12.8 254 7.4 4.1 0.32 治療薬B
2021/6/1 9 13.5 341 6.3 3.1 2.74 治療薬B
2021/7/1 6.7 12.3 239 7.5 4.3 0.17 治療薬C
2021/8/1 5.3 12.4 234 7.1 4.2 0.07 治療薬C
2021/9/1 5.8 12.6 220 7.1 4.3 0.09 治療薬C

次のコードを実行します。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

def main():

    df_data = pd.read_csv("sample.csv",index_col="日付")
    df_corr = df_corr = df_data.corr()
    sns.heatmap(df_corr, annot=True,fmt='.2f',cmap='Blues',square=True)
    plt.show()

if __name__ == '__main__':
    main()

実行すると、以下のような図が表示されます。
例として、この結果から CRP(炎症値)と PLT(血小板数)は強い正の相関(0.96)があり、CRP と ALB(蛋白質)は、強い負の相関(-0.95)であることがわかります。

解説

データフレーム読み込み

上記の CSV ファイル(sample.csv)を Pandas を使ってデータフレームとして読み込みます。

import pandas as pd

df_data = pd.read_csv("sample.csv",index_col="日付")
相関関係を確認

df_corr を呼び出すと相関関係を確認できます。
データから数値の列のみ抽出し、全ての組み合わせについて相関関係を計算します。

 df_corr = df_corr = df_data.corr()
相関係数を可視化

Seaborn ライブラリを使用し、相関係数を可視化・出力します。

import matplotlib.pyplot as plt
import seaborn as sns

sns.heatmap(df_corr, annot=True,fmt='.2f',cmap='Blues',square=True)
plt.show()
散布図の確認

pairplot メソッドを使用すると、全ての値の散布図を確認することができます。

import japanize_matplotlib

sns.pairplot(df_data,hue="治療")

実行結果は次のとおりとなり、治療薬 C では CRP(炎症値)が低く、効果が高いことがわかります。

以上

参考サイト

データサイエンス情報局

相関分析をPythonで実行し、可視化まで行ってみます。Excelでも相関分析は可能ですが、Pythonで実行すれば一度…