相関分析とは
2つのデータの関係の強さを表す指標(相関係数)を計算し、数値化する分析手法です。
相関係数は 1 に近づくほど正の相関(正比例)の関係が強くなり、-1 に近づくほど負の相関(反比例)の関係が強くなります。
また、0 に近づくほど無関係になります。
- 正の相関
片方の数値が大きくなる(小さくなる)と、もう片方の値も大きなる(小さくなる) - 負の相関
片方の数値が大きくなる(小さくなる)と、もう片方の値は小さくなる(大きくなる) - 無相関
片方の数値が大きくなる(小さくなる)としても、もう片方の値に決まった変化が見られない。
正の相関
負の相関
無相関
相関係数について
相関関係の強さを示す数値で、-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で実行すれば一度…