【相関分析】相関係数行列の算出→ヒートマップ化

散布図行列の描画に続いて、こちらもやっていきます。

[散布図行列の描画](https://qiita.com/tmp_llc/items/80388d5469b3f42f9061)

相関係数については以下２通りの算出方法をご紹介します。
1. pandasを用いた方法
2. scipyを用いた方法

まずは、例のごとくサンプルデータの作成

```python3:python
from sklearn import datasets
import pandas as pd
iris = datasets.load_iris()
df = pd.DataFrame(data=iris['data'],
                  columns=iris['feature_names']
                 )
```
*# dfの中身*

|  | sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) |
|--:|--:|--:|--:|--:|
| 0 | 5.1 | 3.5 | 1.4 | 0.2 |
| 1 | 4.9 | 3.0 | 1.4 | 0.2 |
| 2 | 4.7 | 3.2 | 1.3 | 0.2 |
| ... | ... | ... | ... | ... |


## 1. pandasを用いた方法

```python3:python
corr_mat = df.corr(method='pearson')
# method='spearman'でスピアマン、'kendall'でケンドールも指定可能
```
corr_matの中身

|| sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) |
|:--------:|--------:|--------:|--------:|--------:|
|sepal length (cm)| 1.000000 | -0.109369 | 0.871754 | 0.817954 |
|sepal width (cm)| 1.000000 | -0.109369 | 0.871754 | 0.817954 |
|petal length (cm)| 0.871754 | -0.420516 | 1.000000 | 0.962757 |
|petal    width      (cm)| 0.817954 | -0.356544 | 0.962757 | 1.000000 |

## 2.scipyを用いた方法

```python
import scipy.stats as sts

corr_mat = np.zeros((df.shape[1], df.shape[1]))

for i in range(df.shape[1]):    
    for j in range(df.shape[1]):        
        corrtest = sts.pearsonr(df[df.columns[i]], df[df.columns[j]])
        # stats配下にspearmanrやkendalltauも存在
        corr_mat[i,j] = corrtest[0]

df_corr = pd.DataFrame(corr_mat, columns=df.columns, index=df.columns)
```

df_corrの中身

|| sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) |
|:--------:|--------:|--------:|--------:|--------:|
|sepal length (cm)| 1.000000 | -0.109369 | 0.871754 | 0.817954 |
|sepal width (cm)| -0.109369 | 1.000000 | -0.420516 | -0.356544 |
|petal length (cm)| 0.871754 | -0.420516 | 1.000000 | 0.962757 |
|petal    width      (cm)| 0.817954 | -0.356544 | 0.962757 | 1.000000 |

ちなみにこのやり方だと、p値行列もだせます。

```python
import scipy.stats as sts

pval_mat = np.zeros((df.shape[1], df.shape[1]))

for i in range(df.shape[1]):    
    for j in range(df.shape[1]):        
        corrtest = sts.pearsonr(df[df.columns[i]], df[df.columns[j]])
        pval_mat[i,j] = corrtest[1] # 第2要素にはp値が入っている!

df_corr = pd.DataFrame(pval_mat, columns=df.columns, index=df.columns)
df_corr
```
結果(小数点第3位以下は丸めてます)

|| sepal length (cm) | sepal width (cm) | petal length (cm) | petal width (cm) |
|:--------:|--------:|--------:|--------:|--------:|
|sepal length (cm)| 0.0 | 0.18 | 0.0 | 0.0 |
|sepal width (cm)|0.18| 0.0 | 0.0 | 0.0 |
|petal length (cm)| 0.0 | 0.0 | 0.0 | 0.0 |
|petal width (cm)| 0.0 | 0.0 | 0.0 | 0.0 |

## 仕上げにヒートマップ化

```python
import seaborne as sons
sns.heatmap(corr_mat,
            vmin=-1.0,
            vmax=1.0,
            center=0,
            annot=True, # True:格子の中に値を表示
            fmt='.1f',
            xticklabels=corr_mat.columns.values,
            yticklabels=corr_mat.columns.values
           )
plt.show()
```

出力
![corr_heatmap.png](https://qiita-image-store.s3.amazonaws.com/0/215267/81e6d22d-9378-6ca5-77de-662e58e0980c.png)

直感的に相関を把握できます。
ちなみに、heatmapにはcmap=といったパラメータもあり
お好みの色相を選べます。