WHAT' CHA GONNA DO FOR ME?

Python、統計、機械学習、R、ファイナンスとか

Pythonの相関係数

Pythonの相関係数の挙動が予想と違っていたので、忘れないようにメモ。

確認のため、コレスキー分解を用いて相関を持つ多変量正規乱数を発生させ、相関係数を計算させる。

相関係数の計算には、NumPyのcorrcoefか、pandasのデータフレームのcorr()が使えるが、以下のように挙動が異なっているため注意が必要。

NumPyのcorrcoefはデフォルトでは行間の相関係数を計算する。そのため、Rのcor関数と同じ出力を得るためには転置するか、rowvar=Falseをオプションとして指定する必要あり。
一方のpandasのデータフレームのcorr()メソッドは、列間の相関を計算するためRのcor関数と同じように使える。

共分散を計算させるのも同じような考慮が必要。

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

#乱数の数
N=10000
#次元
d=3
#相関行列
covmat=np.array([[1,0.5,0.4],[0.5,1,0.3],[0.4,0.3,1]])
#コレスキー分解
L=np.linalg.cholesky(covmat)
#mat(L)*mat(L.T)
#多変量正規乱数を発生させる(N×d)
x=mat(np.random.randn(N,d))*mat(L.T)

#NumPyのcorrcoefは行と行の相関係数を計算するため転置する必要あり
#np.corrcoef(x)
np.corrcoef(x.T)
np.corrcoef(x, rowvar=False)

#pandasのデータフレームに変換
df=pd.DataFrame(x)
#データフレームの相関は列と列の相関を計算するためそのままでOK
df.corr()

相関を計算するところだけ抜き出してみる。
NumPyのcorrcoefは行間の相関を計算するため転置する必要あり。

In [142]: np.corrcoef(x.T)
Out[142]: 
array([[ 1.        ,  0.5107785 ,  0.39861475],
       [ 0.5107785 ,  1.        ,  0.29336877],
       [ 0.39861475,  0.29336877,  1.        ]])

pandasのデータフレームのcorr()メソッドはRのcorのように使える。

In [144]: df=pd.DataFrame(x)
     ...: #データフレームの相関は列と列の相関を計算するためそのままでOK
     ...: df.corr()
Out[144]: 
          0         1         2
0  1.000000  0.510778  0.398615
1  0.510778  1.000000  0.293369
2  0.398615  0.293369  1.000000

結果が一致することを確認。