【MQL5】CorrCoef関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク
  1. CorrCoef関数の働き・役割
    1. ピアソン相関係数とは
  2. CorrCoef関数の引数について
    1. 行列に対するCorrCoef関数の引数
    2. ベクトルに対するCorrCoef関数の引数
  3. CorrCoef関数の戻り値について
    1. 行列に対する戻り値
    2. ベクトルに対する戻り値
  4. CorrCoef関数を使ったサンプルコード
    1. ベクトル間の相関係数の計算
      1. ステップ1: 平均値を求める
      2. ステップ2: 平均値との差を計算
      3. ステップ3: 差を掛け合わせる
      4. ステップ4: 差の2乗をそれぞれ計算して合計する
      5. ステップ5: 差の2乗の合計を平方根で調整
      6. ステップ6: 相関係数を計算
    2. 行列の行間の相関係数の計算
    3. 転置行列を使用した列間の相関係数の計算
      1. ステップ1: 平均値を計算
        1. 計算:
      2. ステップ2: 平均値との差を計算
        1. 計算:
      3. ステップ3: 差の積を計算
        1. 計算:
      4. ステップ4: 差の2乗の合計を計算
        1. 計算:
      5. ステップ5: 分母の計算
        1. 計算:
      6. ステップ6: 相関係数の計算
        1. 計算:
    4. 複数ベクトルを含む行列の相関係数の計算
      1. 行1と行2の相関係数を計算
        1. ステップ1: 平均値を計算
        2. ステップ2: 平均値との差を計算
        3. ステップ3: 差の積を計算
        4. ステップ4: 差の2乗の合計を計算
        5. ステップ5: 分母を計算
        6. ステップ6: 相関係数を計算
      2. 行1と行3の相関係数を計算
        1. ステップ1: 平均値を計算
        2. ステップ2: 平均値との差を計算
        3. ステップ3: 差の積を計算
        4. ステップ4: 差の2乗の合計を計算
        5. ステップ5: 分母を計算
          1. ステップ6: 相関係数を計算
      3. 行2と行3の相関係数を計算
    5. matrix_a3の列間の相関係数計算
      1. 列1と列2の相関係数を計算
        1. ステップ1: 平均値を計算
        2. ステップ2: 平均値との差を計算
        3. ステップ3: 差の積を計算
        4. ステップ4: 差の2乗の合計を計算
        5. ステップ5: 分母を計算
        6. ステップ6: 相関係数を計算
      2. 列1と列3の相関係数を計算
        1. ステップ1: 平均値を計算
        2. ステップ2: 平均値との差を計算
        3. ステップ3: 差の積を計算
        4. ステップ4: 差の2乗の合計を計算
        5. ステップ5: 分母を計算
        6. ステップ6: 相関係数を計算
      3. 列間相関係数の最終結果
  5. 補足1:ピアソン相関係数の算式説明
    1. ピアソン相関係数の計算具体例
      1. 具体例:ベクトル {1, 2, 3} と {2, 4, 6} の相関係数を計算
        1. ステップ1: 平均値を求める
        2. ステップ2: 平均値との差を計算
        3. ステップ3: 差の積を求める
        4. ステップ4: 差の2乗をそれぞれ計算し、合計する
        5. ステップ5: 2乗の合計を使って調整する
        6. ステップ6: 相関係数を計算
      2. この例から分かること
      3. 結論

CorrCoef関数の働き・役割

CorrCoef関数は、データの間にどれくらいの関係性があるのかを数値で示す「相関係数」を計算するための関数です。

特に、ピアソン相関係数と呼ばれる値を算出します。この関数を使うと、数値データを含むベクトル(1次元配列)や行列(2次元配列)の間にどの程度の線形関係があるかを簡単に計算できます。

例えば、ある商品の価格と売上のデータがある場合、価格が上がると売上がどう変化するのかを数字で表すことができます。価格と売上が「どれくらい一緒に増減するか」を示すのが相関係数で、CorrCoef関数はその計算を行います。

ピアソン相関係数とは

ピアソン相関係数は、2つのデータがどれだけ強い関係を持っているかを示す値で、-1から1の範囲を取ります。

  • 値が1に近い場合、片方が増えるともう片方も増えるという「正の強い関係」を意味します。
  • 値が-1に近い場合、片方が増えるともう片方が減るという「負の強い関係」を意味します。
  • 値が0に近い場合、両者にほとんど関係がないことを示します。

簡単に言えば、この値が大きいほど「一緒に動く」、小さいほど「関係がない」ことを意味します。例えば、気温とアイスクリームの売上のように関連性がありそうなデータを比較するときに使われます。

CorrCoef関数の引数について

CorrCoef関数には、計算対象のデータや計算方法を指定するための引数があります。ベクトル行列の入力に対応しており、それぞれ異なる形式で使用します。

行列に対するCorrCoef関数の引数

matrix matrix::CorrCoef(
  const bool    rowvar=true // 観測値の行ベクトルまたは列ベクトル
);
 

行列の各行または各列の間の相関係数を計算する場合、CorrCoef関数には次の引数を指定します。

  • rowvar: 各行を観測値のベクトルとして扱う場合はtrueを指定し、各列を観測値のベクトルとして扱う場合はfalseを指定します。初期値はtrueです。

例えば、行列の各列間の相関係数を計算する場合、rowvarにfalseを指定します。

ベクトルに対するCorrCoef関数の引数

scalar vector::CorrCoef(
  const vector&  b          // 2番目のベクトル
);

ベクトル同士の相関係数を計算する場合、CorrCoef関数には次の引数を指定します。

1つ目のベクトルは、関数を呼び出すオブジェクトとして暗黙的に指定されます。このため明示的な引数として必要なのは次の1つです。

例えば、2つのベクトル相関係数を計算する場合、1つ目のベクトルを呼び出し元として使用し、2番目のベクトルをbに指定します。

CorrCoef関数の戻り値について

CorrCoef関数は、入力データの間のピアソン相関係数を返します。この相関係数は次のような特徴を持つ値です。

行列に対する戻り値

行列を入力した場合、戻り値行列形式で返されます。この戻り値の各要素は、行または列の間の相関係数を示しています。例えば、行列の2つの行の相関係数は、戻り値の対応する要素に格納されます。

戻り値行列の対角要素は常に1です(各行または列がそれ自体と完全に一致するため)。また、行列は対称性を持っています。

ベクトルに対する戻り値

2つのベクトルを入力した場合、CorrCoef関数はそれらの間のピアソン相関係数を1つの数値として返します。この値は、-1から1の範囲に収まり、以下のような解釈が可能です。

  • 値が1に近い場合、強い正の相関を持つことを意味します。
  • 値が-1に近い場合、強い負の相関を持つことを意味します。
  • 値が0に近い場合、相関がほとんどないことを示します。

相関係数の精度は入力データの品質や特性に依存します。特にデータに欠損値や異常値が含まれている場合、結果に影響を与える可能性があります。

CorrCoef関数を使ったサンプルコード

//+------------------------------------------------------------------+
//| スクリプトのエントリーポイント                                 |
//+------------------------------------------------------------------+
void OnStart()
{
    // 2つのベクトルを定義します。これらは相関係数を計算するデータセットです。
    vectorf vector_a = {1, 2, 3, 4, 5};  // ベクトルA:数値の増加傾向を持つ
    vectorf vector_b = {0, 1, 0.5, 2, 2.5};  // ベクトルB:数値の変動を含む

    // ベクトルAとベクトルBの間の相関係数を計算し、エキスパートログに出力します
    Print("ベクトル間の相関係数: ", vector_a.CorrCoef(vector_b));

    // 行列の例を作成します。行ごとに異なるベクトルを含む行列を定義します。
    matrixf matrix_a = {{1, 2, 3, 4, 5},  // 行列の1行目(ベクトルAと同じ)
                        {0, 1, 0.5, 2, 2.5}};  // 行列の2行目(ベクトルBと同じ)

    // 行列の行間の相関係数を計算し、エキスパートログに出力します
    Print("行列の行間の相関係数:\n", matrix_a.CorrCoef());

    // 元の行列を転置して列間の相関係数を計算します
    matrixf matrix_a2 = matrix_a.Transpose();  // 行列を転置(行と列を入れ替え)
    Print("転置された行列の列間の相関係数:\n", matrix_a2.CorrCoef(false));  // 列単位で計算

    // 複数のベクトルを含む別の行列を作成します
    matrixf matrix_a3 = {{1.0f, 2.0f, 3.0f, 4.0f, 5.0f},  // 行列の1行目
                         {0.0f, 1.0f, 0.5f, 2.0f, 2.5f},  // 行列の2行目
                         {0.1f, 1.0f, 2.0f, 1.0f, 0.3f}};  // 行列の3行目

    // 行間の相関係数を計算し、エキスパートログに出力します
    Print("行列の行間の相関係数:\n", matrix_a3.CorrCoef());

    // 列間の相関係数を計算し、エキスパートログに出力します
    Print("行列の列間の相関係数:\n", matrix_a3.CorrCoef(false));
}

実行結果の例(エキスパートログ出力)

ベクトル間の相関係数: 0.9149913787841797
行列の行間の相関係数:
[[1,0.91499138]
 [0.91499138,1]]
転置された行列の列間の相関係数:
[[1,0.91499138]
 [0.91499138,1]]
行列の行間の相関係数:
[[1,0.91499138,0.08474271]
 [0.91499138,1,-0.17123166]
 [0.08474271,-0.17123166,1]]
行列の列間の相関係数:
[[1,0.99587059,0.85375023,0.91129309,0.83773589]
 [0.99587059,1,0.80295509,0.94491106,0.88385159]
 [0.85375023,0.80295509,1,0.56362146,0.43088508]
 [0.91129309,0.94491106,0.56362146,1,0.98827404]
 [0.83773589,0.88385159,0.43088508,0.98827404,1]]


ベクトル間の相関係数の計算

最初に定義されたvector_aとvector_bの間の相関係数を計算しています。

vectorf vector_a = {1, 2, 3, 4, 5};  // ベクトルA
vectorf vector_b = {0, 1, 0.5, 2, 2.5};  // ベクトルB
Print("ベクトル間の相関係数: ", vector_a.CorrCoef(vector_b));

ベクトルvector_aは、1から5まで増加する単純なデータ列です。

ベクトルvector_bは、数値が増減する傾向を持つデータ列です。

CorrCoef関数を使用して、これら2つのベクトル間のピアソン相関係数を計算します。

計算過程は以下の通りです。

ステップ1: 平均値を求める

平均値 = (すべての要素の合計) / (要素数)

  • 平均値(vector_a) = (1 + 2 + 3 + 4 + 5) / 5 = 15 / 5 = 3.0
  • 平均値(vector_b) = (0 + 1 + 0.5 + 2 + 2.5) / 5 = 6 / 5 = 1.2

ステップ2: 平均値との差を計算

差 = 各要素– 平均値

  • 差(vector_a) = {-2, -1, 0, 1, 2} // 計算例: 1 – 3 = -2
  • 差(vector_b) = {-1.2, -0.2, -0.7, 0.8, 1.3} // 計算例: 0 – 1.2 = -1.2

ステップ3: 差を掛け合わせる

積 = (差(vector_a)の要素) * (差(vector_b)の要素)

  • 積 = (-2)(-1.2) + (-1)(-0.2) + (0)(-0.7) + (1)(0.8) + (2)*(1.3)
  • 積 = 2.4 + 0.2 + 0.0 + 0.8 + 2.6 = 6.0

ステップ4: 差の2乗をそれぞれ計算して合計する

差の2乗 = (差の値) * (差の値)

  • 差の2乗合計(vector_a) = (-2)(-2) + (-1)(-1) + (0)(0) + (1)(1) + (2)*(2)
  • 差の2乗合計(vector_a) = 4 + 1 + 0 + 1 + 4 = 10
  • 差の2乗合計(vector_b) = (-1.2)(-1.2) + (-0.2)(-0.2) + (-0.7)(-0.7) + (0.8)(0.8) + (1.3)*(1.3)
  • 差の2乗合計(vector_b) = 1.44 + 0.04 + 0.49 + 0.64 + 1.69 = 4.3

ステップ5: 差の2乗の合計を平方根で調整

調整値 = √(差の2乗の合計)

  • 調整値(vector_a) = √10 ≈ 3.162
  • 調整値(vector_b) = √4.3 ≈ 2.073

ステップ6: 相関係数を計算

相関係数 = (積の合計) / ((調整値(vector_a)) * (調整値(vector_b)))

  • 相関係数 = 6.0 / (3.162 * 2.073) = 6.0 / 6.556 ≈ 0.91499

実行結果は0.9149913787841797で、これはvector_aとvector_bが非常に強い正の相関を持つことを意味します。


    行列の行間の相関係数の計算

    次に、matrix_aという行列を定義し、行間の相関係数を計算します。

    matrixf matrix_a = {{1, 2, 3, 4, 5}, 
                        {0, 1, 0.5, 2, 2.5}};
    Print("行列の行間の相関係数:\n", matrix_a.CorrCoef());
    
    1. 行列matrix_aの1行目はvector_aと同じで、2行目はvector_bと同じです。
    2. CorrCoef関数を使用して、行ごとに相関係数を計算します。
    3. 実行結果は以下のようになります:
    [[1,0.91499138]
     [0.91499138,1]]
    
    1. 対角要素は1(自身との相関は完全一致)。
    2. 非対角要素(0.91499138)は、vector_avector_b相関係数と一致します。

    ※実行結果の行列([[1, 0.91499138], [0.91499138, 1]])は、以下のように解釈します:

    対角要素

    • 1という値は、「各行が自分自身との相関係数」を示します。
    • 自分自身との相関は完全一致なので、値は常に1になります。

    非対角要素

    • 0.91499138という値は、1行目と2行目の間の相関係数を表します。
    • この場合、1行目の{1, 2, 3, 4, 5}と2行目の{0, 1, 0.5, 2, 2.5}の相関係数を示しています。

      結果的に、行列の形式は次のように解釈できます:

      行1との相関行2との相関
      行11(自分自身)0.91499138
      行20.914991381(自分自身)

      matrix_a.CorrCoef()は、デフォルトで行を単位として計算します(行ごとに観測データをまとめて計算)。
      この挙動を変更したい場合は、引数falseを指定して列単位で計算することもできます。

      例:

      • matrix_a.CorrCoef() → 行ごとに相関を計算
      • matrix_a.CorrCoef(false) → 列ごとに相関を計算

      転置行列を使用した列間の相関係数の計算

      元の行列matrix_aを転置し、列単位での相関係数を計算します。

      ※転置とは、行列の行と列を入れ替える操作です。この場合、元の行列の1列目が転置後の行1になり、元の2列目が転置後の行2になります。

      matrix_a2 = {
        {1, 0},     // 元の行列の1列目
        {2, 1},     // 元の行列の2列目
        {3, 0.5},   // 元の行列の3列目
        {4, 2},     // 元の行列の4列目
        {5, 2.5}    // 元の行列の5列目
      }
      

      matrixf matrix_a2 = matrix_a.Transpose();
      Print("転置された行列の列間の相関係数:\n", matrix_a2.CorrCoef(false));
      

      Transpose関数で行と列を入れ替えた行列matrix_a2を作成します。

      CorrCoef(false)を使用して列単位での相関係数を計算します。

      ここでは、1列目 {1, 2, 3, 4, 5}2列目 {0, 1, 0.5, 2, 2.5}相関係数を計算します。計算過程は元の行列matrix_a の行間の計算と同様ですが、元の列が新しい行として扱われる点が異なります。


      ステップ1: 平均値を計算

      各列の平均値を求めます。
      計算式: 平均 = (要素の合計) / (要素数)

      計算:
      • 列1({1, 2, 3, 4, 5})の平均値:
        (1 + 2 + 3 + 4 + 5) / 5 = 15 / 5 = 3.0
      • 列2({0, 1, 0.5, 2, 2.5})の平均値:
        (0 + 1 + 0.5 + 2 + 2.5) / 5 = 6 / 5 = 1.2

      ステップ2: 平均値との差を計算

      要素から、それぞれの列の平均値を引きます。
      計算式: 差 = 要素 – 平均値

      計算:
      • 列1の差:
        {1 – 3, 2 – 3, 3 – 3, 4 – 3, 5 – 3} = {-2, -1, 0, 1, 2}
      • 列2の差:
        {0 – 1.2, 1 – 1.2, 0.5 – 1.2, 2 – 1.2, 2.5 – 1.2} = {-1.2, -0.2, -0.7, 0.8, 1.3}

      ステップ3: 差の積を計算

      差の値を対応する要素ごとに掛け合わせます。
      計算式: 積 = 差(列1) * 差(列2)

      計算:
      • (-2 * -1.2) = 2.4
      • (-1 * -0.2) = 0.2
      • (0 * -0.7) = 0.0
      • (1 * 0.8) = 0.8
      • (2 * 1.3) = 2.6

      積の合計: 2.4 + 0.2 + 0.0 + 0.8 + 2.6 = 6.0


      ステップ4: 差の2乗の合計を計算

      差を2乗して、その合計を求めます。
      計算式: 2乗合計 = Σ(差^2)

      計算:
      • 列1の差の2乗:
        (-2)^2 + (-1)^2 + 0^2 + 1^2 + 2^2 = 4 + 1 + 0 + 1 + 4 = 10
      • 列2の差の2乗:
        (-1.2)^2 + (-0.2)^2 + (-0.7)^2 + (0.8)^2 + (1.3)^2 = 1.44 + 0.04 + 0.49 + 0.64 + 1.69 = 4.3

      ステップ5: 分母の計算

      2乗合計の平方根を計算し、それらを掛け合わせて分母を求めます。
      計算式: 分母 = √(2乗合計(列1)) * √(2乗合計(列2))

      計算:
      • 列1: √10 ≈ 3.162
      • 列2: √4.3 ≈ 2.073
      • 分母: 3.162 * 2.073 ≈ 6.556

      ステップ6: 相関係数の計算

      差の積の合計と分母を使って相関係数を求めます。
      計算式: 相関係数 = 積の合計 / 分母

      計算:

      実行結果は以下のようになります:

      [[1, 0.91499138],
       [0.91499138, 1]]
      

      この結果は、元の行単位で計算した相関係数と同じであることを確認できます。


        複数ベクトルを含む行列の相関係数の計算

        複数のベクトルを含む新しい行列matrix_a3を作成し、行間と列間の相関係数を計算します。

        matrixf matrix_a3 = {{1.0f, 2.0f, 3.0f, 4.0f, 5.0f},
                             {0.0f, 1.0f, 0.5f, 2.0f, 2.5f},
                             {0.1f, 1.0f, 2.0f, 1.0f, 0.3f}};
        Print("行列の行間の相関係数:\n", matrix_a3.CorrCoef());
        Print("行列の列間の相関係数:\n", matrix_a3.CorrCoef(false));
        

        行列matrix_a3は、3つのベクトルを行として含みます。

        ※各要素の最後についている「f」は、その数値が 浮動小数点数型(float型) であることを示しています。C++やMQL5などのプログラミング言語では、小数点を含む数値はデフォルトで double型 (より高精度な浮動小数点型)として扱われます。このため、末尾に「f」を付けることで、その数値を明示的に float型 として扱うよう指定しています。

        行1と行2の相関係数を計算

        行1: {1.0, 2.0, 3.0, 4.0, 5.0}
        行2: {0.0, 1.0, 0.5, 2.0, 2.5}

        ステップ1: 平均値を計算
        • 行1の平均値: (1.0 + 2.0 + 3.0 + 4.0 + 5.0) / 5 = 15.0 / 5 = 3.0
        • 行2の平均値: (0.0 + 1.0 + 0.5 + 2.0 + 2.5) / 5 = 6.0 / 5 = 1.2
        ステップ2: 平均値との差を計算
        • 行1の差: {1.0 – 3.0, 2.0 – 3.0, 3.0 – 3.0, 4.0 – 3.0, 5.0 – 3.0} = {-2.0, -1.0, 0.0, 1.0, 2.0}
        • 行2の差: {0.0 – 1.2, 1.0 – 1.2, 0.5 – 1.2, 2.0 – 1.2, 2.5 – 1.2} = {-1.2, -0.2, -0.7, 0.8, 1.3}
        ステップ3: 差の積を計算
        • 積: (-2.0 * -1.2) + (-1.0 * -0.2) + (0.0 * -0.7) + (1.0 * 0.8) + (2.0 * 1.3)
          = 2.4 + 0.2 + 0.0 + 0.8 + 2.6 = 6.0
        ステップ4: 差の2乗の合計を計算
        • 行1の2乗合計: (-2.0)^2 + (-1.0)^2 + 0.0^2 + 1.0^2 + 2.0^2 = 4.0 + 1.0 + 0.0 + 1.0 + 4.0 = 10.0
        • 行2の2乗合計: (-1.2)^2 + (-0.2)^2 + (-0.7)^2 + 0.8^2 + 1.3^2 = 1.44 + 0.04 + 0.49 + 0.64 + 1.69 = 4.3
        ステップ5: 分母を計算
        • 分母 = √(行1の2乗合計) * √(行2の2乗合計) = √10.0 * √4.3 ≈ 3.162 * 2.073 ≈ 6.556
        ステップ6: 相関係数を計算
        • 相関係数 = 積の合計 / 分母 = 6.0 / 6.556 ≈ 0.914991

        行1と行3の相関係数を計算

        行1: {1.0, 2.0, 3.0, 4.0, 5.0}
        行3: {0.1, 1.0, 2.0, 1.0, 0.3}

        ステップ1: 平均値を計算
        • 行1の平均値: (1.0 + 2.0 + 3.0 + 4.0 + 5.0) / 5 = 3.0
        • 行3の平均値: (0.1 + 1.0 + 2.0 + 1.0 + 0.3) / 5 = 4.4 / 5 = 0.88
        ステップ2: 平均値との差を計算
        • 行1の差: {-2.0, -1.0, 0.0, 1.0, 2.0}
        • 行3の差: {0.1 – 0.88, 1.0 – 0.88, 2.0 – 0.88, 1.0 – 0.88, 0.3 – 0.88}
          = {-0.78, 0.12, 1.12, 0.12, -0.58}
        ステップ3: 差の積を計算
        • 積: (-2.0 * -0.78) + (-1.0 * 0.12) + (0.0 * 1.12) + (1.0 * 0.12) + (2.0 * -0.58)
          = 1.56 – 0.12 + 0.0 + 0.12 – 1.16 = 0.4
        ステップ4: 差の2乗の合計を計算
        • 行1の2乗合計: 10.0
        • 行3の2乗合計: (-0.78)^2 + 0.12^2 + 1.12^2 + 0.12^2 + (-0.58)^2
          = 0.6084 + 0.0144 + 1.2544 + 0.0144 + 0.3364 = 2.228
        ステップ5: 分母を計算
        • 分母 = √10.0 * √2.228 ≈ 3.162 * 1.492 ≈ 4.717
        ステップ6: 相関係数を計算

        行2と行3の相関係数を計算

        同様の手順で計算し、結果は以下の通りです:

        • 平均値(行2) = 1.2, 平均値(行3) = 0.88
        • 相関係数 = -0.171232

        行間の相関係数を計算した結果:

          [[1,0.91499138,0.08474271]
           [0.91499138,1,-0.17123166]
           [0.08474271,-0.17123166,1]]
          

          各行間の相関関係が行列形式で表されます。

          matrix_a3の列間の相関係数計算

          今度はmatrix_a3における列を基準として計算を行います。

          列番号データ
          列1{1.0, 0.0, 0.1}
          列2{2.0, 1.0, 1.0}
          列3{3.0, 0.5, 2.0}
          列4{4.0, 2.0, 1.0}
          列5{5.0, 2.5, 0.3}

          列1と列2の相関係数を計算

          ステップ1: 平均値を計算
          • 列1の平均値: (1.0 + 0.0 + 0.1) / 3 = 1.1 / 3 = 0.3667
          • 列2の平均値: (2.0 + 1.0 + 1.0) / 3 = 4.0 / 3 = 1.3333
          ステップ2: 平均値との差を計算
          • 列1の差: {1.0 – 0.3667, 0.0 – 0.3667, 0.1 – 0.3667} = {0.6333, -0.3667, -0.2667}
          • 列2の差: {2.0 – 1.3333, 1.0 – 1.3333, 1.0 – 1.3333} = {0.6667, -0.3333, -0.3333}
          ステップ3: 差の積を計算
          • 積: (0.6333 * 0.6667) + (-0.3667 * -0.3333) + (-0.2667 * -0.3333)
            = 0.4222 + 0.1222 + 0.0889 = 0.6333
          ステップ4: 差の2乗の合計を計算
          • 列1の2乗合計: (0.6333)^2 + (-0.3667)^2 + (-0.2667)^2
            = 0.4001 + 0.1345 + 0.0711 = 0.6057
          • 列2の2乗合計: (0.6667)^2 + (-0.3333)^2 + (-0.3333)^2
            = 0.4445 + 0.1111 + 0.1111 = 0.6667
          ステップ5: 分母を計算
          • 分母 = √(列1の2乗合計) * √(列2の2乗合計) = √0.6057 * √0.6667
            ≈ 0.7782 * 0.8165 ≈ 0.6351
          ステップ6: 相関係数を計算
          • 相関係数 = 積の合計 / 分母 = 0.6333 / 0.6351 ≈ 0.9972

          列1と列3の相関係数を計算

          ステップ1: 平均値を計算
          • 列1の平均値: 0.3667(前述)
          • 列3の平均値: (3.0 + 0.5 + 2.0) / 3 = 5.5 / 3 = 1.8333
          ステップ2: 平均値との差を計算
          • 列1の差: {0.6333, -0.3667, -0.2667}
          • 列3の差: {3.0 – 1.8333, 0.5 – 1.8333, 2.0 – 1.8333} = {1.1667, -1.3333, 0.1667}
          ステップ3: 差の積を計算
          • 積: (0.6333 * 1.1667) + (-0.3667 * -1.3333) + (-0.2667 * 0.1667)
            = 0.7389 + 0.4889 – 0.0445 = 1.1833
          ステップ4: 差の2乗の合計を計算
          • 列1の2乗合計: 0.6057(前述)
          • 列3の2乗合計: (1.1667)^2 + (-1.3333)^2 + (0.1667)^2
            = 1.3611 + 1.7777 + 0.0278 = 3.1667
          ステップ5: 分母を計算
          • 分母 = √(列1の2乗合計) * √(列3の2乗合計) = √0.6057 * √3.1667
            ≈ 0.7782 * 1.7795 ≈ 1.3844
          ステップ6: 相関係数を計算
          • 相関係数 = 積の合計 / 分母 = 1.1833 / 1.3844 ≈ 0.8548

          これと同じような計算ををすべての列の組み合わせに対して繰り返します。


          列間相関係数の最終結果

          matrix_a3.CorrCoef(false) の結果は以下の行列になります:

          [[1,0.99587059,0.85375023,0.91129309,0.83773589]
           [0.99587059,1,0.80295509,0.94491106,0.88385159]
           [0.85375023,0.80295509,1,0.56362146,0.43088508]
           [0.91129309,0.94491106,0.56362146,1,0.98827404]
           [0.83773589,0.88385159,0.43088508,0.98827404,1]]
          

          matrix_a3.CorrCoef(false) の出力は、行列の「各列同士」の相関関係を示す 相関行列を表しています。この行列要素は以下の意味を持ちます:

          1. 対角要素(1.0)
            • 対角部分(行と列のインデックスが同じ場所)は、その列が自分自身との相関係数を表します。
            • 自分自身との相関は常に1.0になります。
          2. 非対角要素(例:0.9972など)
            • 対角以外の部分は、対応する列同士の相関係数を表します。
            • 例えば、相関行列の2行3列目の値(0.8029)は「列2」と「列3」の相関係数を意味します。

          補足1:ピアソン相関係数の算式説明

          ピアソン相関係数は以下の式で計算されます: 相関係数 = Σ((Xi – Xmean) * (Yi – Ymean)) / (√(Σ(Xi – Xmean)^2) * √(Σ(Yi – Ymean)^2))
          ここで、

          • XiとYiは各データ点の値。
          • XmeanとYmeanはそれぞれの平均値。

          ピアソン相関係数の計算具体例

          ピアソン相関係数は、2つのデータがどれくらい一緒に増減するかを示す数値です。その計算は、平均値を使った計算式で行われます。


          具体例:ベクトル {1, 2, 3} と {2, 4, 6} の相関係数を計算

          以下の2つのデータを考えます:

          • データX: {1, 2, 3}
          • データY: {2, 4, 6}
          ステップ1: 平均値を求める

          各データの平均値を求めます。

          • データXの平均値: (1 + 2 + 3) / 3 = 2
          • データYの平均値: (2 + 4 + 6) / 3 = 4
          ステップ2: 平均値との差を計算

          次に、各データ点と平均値の差を計算します。

          • データXの場合:
            1 – 2 = -1, 2 – 2 = 0, 3 – 2 = 1 → 差分は {-1, 0, 1}
          • データYの場合:
            2 – 4 = -2, 4 – 4 = 0, 6 – 4 = 2 → 差分は {-2, 0, 2}
          ステップ3: 差の積を求める

          データXとデータYの差を掛け合わせます(要素ごとに掛け算)。

          • (-1) × (-2) = 2
          • 0 × 0 = 0
          • 1 × 2 = 2

          これらをすべて足し合わせます: 2 + 0 + 2 = 4

          ステップ4: 差の2乗をそれぞれ計算し、合計する

          データXの差を2乗します:
          (-1) × (-1) = 1, 0 × 0 = 0, 1 × 1 = 1 → 1 + 0 + 1 = 2

          データYの差を2乗します:
          (-2) × (-2) = 4, 0 × 0 = 0, 2 × 2 = 4 → 4 + 0 + 4 = 8

          ステップ5: 2乗の合計を使って調整する

          データXの2乗合計は2でした。この数値に「どれくらい散らばっているか」を調整するための計算をします。
          √2(2を「自分と同じ数を掛け合わせると2になる数」)= 1.414

          データYの2乗合計は8でした。同じく調整します。
          √8(8を「自分と同じ数を掛け合わせると8になる数」)= 2.828

          ステップ6: 相関係数を計算

          これまでの結果を使って相関係数を計算します:
          相関係数 = ステップ3の結果 / (ステップ5のXの結果 × ステップ5のYの結果)
          = 4 / (1.414 × 2.828) = 4 / 3.999 = 1.0


          この例から分かること

          • データXとデータYは、完全に一緒に増減しています(正の関係が非常に強い)。そのため、相関係数は「1」になりました。
          • データがどれくらい似た動きをするかを、このように計算することができます。

          結論

          ピアソン相関係数は、「どれくらい一緒に動くか」を計算するもので、手順は以下の通りです:

          1. 平均値を計算。
          2. 平均値との差を求める。
          3. 差を掛け合わせて合計。
          4. 各データの差を2乗して調整。
          5. 最後に割り算で相関係数を得る。

          この例のように、データが完全に一致して増減する場合は、相関係数が1になります。

          タイトルとURLをコピーしました