google apps script:相関係数を計算する

Posted on January 2nd, 2017Updated on April 7th, 2019

どんな記事

先日、記事にした相関係数を算出するプログラムを少し掘り下げて解説してみます。ちなみに、JavaScriptとgoogle apps scriptは一緒だと思ってください(バージョンの違いはあるけど記述は一緒)。

相関係数の計算式

相関係数=共分散(Xの標準偏差×Yの標準偏差)\text{相関係数} = \cfrac{\text{共分散}}{(\text{Xの標準偏差} \times \text{Yの標準偏差})}

X、Yは配列

順を追って説明します(自分の復習もかねて)。

標準偏差を求める手順

  1. 平均 数値の合計/数値の個数
  2. 偏差 それぞれの 数値−平均
  3. 分散 偏差の二乗の合計/数値の個数
  4. 標準偏差 分散の平方根

偏差は、数値から平均を引くだけ、つまり、平均からみた偏りです。分散は、データのバラつきのことで、偏差の平均を算出すれば良さそうですが、偏差は合計するとゼロになってしまうので、二乗して平均しています。標準偏差はそれを平方根でもとに戻す感覚でしょうか。

共分散は、XとY、それぞれの偏差を順番に掛けあわせたものの平均

  • Xの配列の1つ目の偏差 × Yの配列の1つ目の偏差
  • Xの配列の2つ目の偏差 × Yの配列の2つ目の偏差
  • ―――これらの平均を算出する。

求めた共分散を、Xの標準偏差にY標準偏差を乗じた数値で除することで、相関係数を算出することができます。

コード

相関係数の計算
function Correl(xx,yy){
  var m = Math
     ,n;
  if (xx.length==yy.length){
    n = xx.length;
    var sumx=0, sumy=0, sumxx=0, sumyy=0, sumxy=0
       ,xm ,ym ,xxi ,yyi
       ,sumxxm=0, sumyym=0, sumxym=0
       ,i;
    for(i=0; i<n; i++){
      sumx += (xx[i]-0);
      sumy += (yy[i]-0);
    }
    xm = sumx/n;
    ym = sumy/n;
    for(i=0; i<n; i++){
      xxi = (xx[i]-0);
      yyi = (yy[i]-0);
      sumxxm += (xxi-xm) * (xxi-xm);
      sumyym += (yyi-ym) * (yyi-ym);
      sumxym += (xxi-xm) * (yyi-ym);
    }                                  
    return sumxym / m.sqrt(sumxxm) / m.sqrt(sumyym);
  }else{
    throw new Error("Array length is not same.");
  }
}

プログラムの解説

簡単にですが、順を追って解説していきます。

例外をなくす
function Correl(xx,yy){
  var m = Math
     ,n;
  if (xx.length==yy.length){



  }else{
    throw new Error("Array length is not same.");
  }
}

これは、ただの例外の処理ですね。配列Xの数と配列Yの数は一緒でなければいけません。違う場合はエラーを返します。

続いてメインの処理の解説です。

メイン処理

    n = xx.length;

    var sumx=0, sumy=0, sumxx=0, sumyy=0, sumxy=0
       ,xm ,ym ,xxi ,yyi
       ,sumxxm=0, sumyym=0, sumxym=0
       ,i;

    for(i=0; i<n; i++){
      sumx += (xx[i]-0);
      sumy += (yy[i]-0);
    }

    xm = sumx/n;
    ym = sumy/n;

    for(i=0; i<n; i++){
      xxi = (xx[i]-0);
      yyi = (yy[i]-0);

      sumxxm += (xxi-xm) * (xxi-xm);
      sumyym += (yyi-ym) * (yyi-ym);

      sumxym += (xxi-xm) * (yyi-ym);
    }                            

    return sumxym / m.sqrt(sumxxm) / m.sqrt(sumyym);

まとめ

活用事例は以前の記事で少し触れています。

テスト用のスプレッドシートも作成しました。

表計算にはあらかじめCRREL関数があるので、それと算出結果の比較です。関数があるので、表計算上でコードは不要ですが、自動処理に組み込むには必要です。

分からないことがあったり、ご指摘があれば、どしどしコメントください^^

タカハシ / 8年目の兼業トレーダー

元・日本料理の板前。現在は、投資やプログラミング、動画コンテンツの撮影・制作・編集などを。更新のお知らせは、各SNSやLINEで。LINEだと1対1でお話することもできます!

このブログと筆者について運用管理表

  • 記事をシェア
© Investment Tech Hack 2021.