

こんにちは、pythonのnumpyについて質問させていただきます。  
相関係数を計算する際に、 `numpy.corrcoef(XとYの二次元配列)` を使用すれば計算できますが、数式の確認のために公式である `共分散 /
(Xの標準偏差 * Yの標準偏差）` で相関係数を出したいと考え、 `numpy.cov(XとYの二次元配列）/
(numpy.std(X)*numpy.std(Y))` で計算しましたが、なぜか `numpy.corrcoef(XとYの二次元配列)`
と同じ結果になりませんでした。この原因をどなたか教えていただければ幸いです。

それぞれの値は以下のとおりです。  
・`numpy.corrcoef(XとYの二次元配列)`：

[code]

    array([[ 1.        , -0.55847735],
           [-0.55847735,  1.        ]])
    
[/code]

・`numpy.cov(XとYの二次元配列）`：

[code]

    array([[ 7.01969195e-01, -2.42092650e+01],
           [-2.42092650e+01,  2.67691160e+03]])
    
[/code]

・`numpy.std(X)`：

[code]

    0.8375159287888337
    
[/code]

・`numpy.std(Y)`：

[code]

    51.719112506809196
    
[/code]

・`numpy.cov(XとYの二次元配列）/ (numpy.std(X)*numpy.std(Y))`:

[code]

    array([[ 1.61935480e-02, -5.58477348e-01],
           [-5.58477348e-01,  6.17529897e+01]])
    
[/code]

よろしくお願いいたします。


CC BY-SA 4.0
2020-09-02T20:39:40.867
70090
2020-11-30T01:57:06.197
2020-09-02T23:36:24.830
32986
34178
question
python3 numpy
numpyの相関係数について


`np.cov()`はデフォルトで`ddof=1`である一方、`np.std()`はデフォルトでは`ddof=0`になっています。  
したがって`np.std()`に`ddof=1`を指定すると`np.corrcoef()`と同じ結果が得られます。

[code]

    In [1]: import numpy as np
    
    In [2]: np.random.seed(0)
       ...: X, Y = np.random.rand(2, 1000)
    
    In [3]: np.corrcoef(X, Y)
    Out[3]:
    array([[1.        , 0.00601658],
           [0.00601658, 1.        ]])
    
    # NG
    In [4]: np.cov(X, Y) / (np.std(X) * np.std(Y))
    Out[4]:
    array([[0.97301135, 0.0060226 ],
           [0.0060226 , 1.0297958 ]])
    
    # OK
    In [5]: np.cov(X, Y) / (np.std(X, ddof=1) * np.std(Y, ddof=1))
    Out[5]:
    array([[0.97203834, 0.00601658],
           [0.00601658, 1.028766  ]])
    
[/code]

なお念の為に言うと、左上と右下が`1.`になっていないのは、XとXの共分散（Xの分散）およびYとYの共分散（Yの分散）で割るべきところまでXとYの共分散で割っているからです。


CC BY-SA 4.0
2020-11-30T01:57:06.197
72282
2020-11-30T01:57:06.197
37167
70090
answer