JavaScript、google apps script で相関係数を計算する

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

JavaScript、google apps script で相関係数を計算する

  1. 相関係数の計算式
  2. プログラム
  3. プログラムの解説
  4. まとめ

1.相関係数の計算式

相関係数 = 共分散 /(Xの標準偏差 × Yの標準偏差)

X、Yは配列

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

標準偏差を求める手順

  • 平均 ――数値の合計/数値の個数
  • 偏差 ――それぞれの 数値−平均
  • 分散 ――偏差の二乗の合計/数値の個数
  • 標準偏差 ――分散の平方根

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

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

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

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

目次へ

2.コード

相関係数の計算

function Correl(xx,yy){ //xx yy is array.
  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); //xxの総和
      sumy += (yy[i]-0); //yyの総和
    }
    xm = sumx/n; //xxの平均
    ym = sumy/n; //yyの平均
    for(i=0; i<n; i++){
      xxi = (xx[i]-0);
      yyi = (yy[i]-0);
      sumxxm += (xxi-xm) * (xxi-xm); //(xi-average(x))^2
      sumyym += (yyi-ym) * (yyi-ym);
      sumxym += (xxi-xm) * (yyi-ym); //(xi-average(x))*(yi-average(y))
    }                                  
    return sumxym / m.sqrt(sumxxm) / m.sqrt(sumyym); // = sumxym/Math.sqrt(sumxxm*sumyym); //sqrtは平方根を返す
  }else{
    throw new Error("Array length is not same.");
  }
}

目次へ

3.プログラムの解説

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

例外をなくす

function Correl(xx,yy){ //xx yy is array.
  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); //xxの総和
      sumy += (yy[i]-0); //yyの総和
    }
    
    // 総和を配列の個数で除する(つまり平均)
    xm = sumx/n; //xxの平均
    ym = sumy/n; //yyの平均
    
    for(i=0; i<n; i++){
    
      // 「-0」をすると、ゼロが文字列であっても、数値に宣言し直すことができます(念のため)
      xxi = (xx[i]-0);
      yyi = (yy[i]-0);
      
      // 偏差の二乗(標準偏差用)
      sumxxm += (xxi-xm) * (xxi-xm); //(xi-average(x))^2
      sumyym += (yyi-ym) * (yyi-ym);
      
      // Xの偏差 × Yの偏差(共分散用)
      sumxym += (xxi-xm) * (yyi-ym); //(xi-average(x))*(yi-average(y))
    }                            
    
    // 共分散/Xの標準偏差/Yの標準偏差
    // それぞれの平均を算出する処理は 平均/平均 であるから省略している
    // つまり、return (sumxym/n) / m.sqrt((sumxxm/n)) / m.sqrt((sumyym/n)); と一緒。
    return sumxym / m.sqrt(sumxxm) / m.sqrt(sumyym);

目次へ

4.まとめ

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

テスト用のスプレッドシートも作成しました。
表計算にはあらかじめCRREL関数があるので、それと算出結果の比較です。関数があるので、表計算上でコードは不要ですが、自動処理に組み込むには必要です。

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

目次へ

Back to Top

Investment Tech Hack

Sorry... doesn't support your browser

To get the best possible experience using our site we recommend that you upgrade to a modern web browser. Investment Tech Hackではご利用中のブラウザサポートはしていません。
Internet Explorerのアップグレード行う、もしくはその他のブラウザを使用しての閲覧をお願いします。