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
結果が一致することを確認。