スタートページJavaScriptライブラリ目次

多変量解析関連 JavaScript関数ライブラリ ma.js の利用解説書

ご利用にあたって

多変量解析

多変量解析は、多くの統計技術を組み合わせた応用分野でもあり、AIのデータ処理技術の基盤技術でもあり、
その活用が盛んになっています。
それだけ複雑な処理ですので、素人が JavaScript のような言語で独自開発するのは不適切です。

実務的には、統計分野の言語である Python や R での オープンソースのパッケージを利用するとか、
単純なケースでは Excel を使うのが適切です。

ここに掲げた関数は、私が手法を理解するために作成したものであり、そのような利用だけに限定してください。

参照:「多変量解析の基礎」


補助機能


データの標準化 系列ごとに平均0分散1の値に変換
  [標準化行列, 平均, 標準偏差] = maStd(行列)  

多変量解析のデータでは、多様な尺度の系列データを対象にします。
成績[5段階評価]、試験の点数[点]、勉強時間[時間]など単位が異なり、それにより数値も様々です。
系列間で値の大小が大きく異なると、大きな系列の影響が大きくなる(見える)ことが発生します。
それを回避するために、入力データを平均0分散1の値に標準化することがあります。
 xs = (x - μ) / σ(分散は自由度ではなく標本数で割っています)
簡単な処理ですが、使う機会が多いので関数にしました。
(以下の関数の多くは、説明を容易にするために、このプロセスは省略しています。)

ケース1

入力       標本→
    var x = [ [ 3000, 1000, 2000, 4000, 5000],  ↓系列
              [ 0.01, 0.05, 0.03, 0.02, 0.04],
              [   -3,    8,    5,    7,   -2] ];
    var [ xs, μ, σ ] = maStd(行列);
出力
 xs[0][0]=0      xs[0][1]=-1.414 xs[0][2]=-0.707 xs[0][3]= 0.707 xs[0][4]= 1.414
 xs[1][0]=-1.414 xs[1][1]= 1.414 xs[1][2]= 0     xs[1][3]=-0.707 xs[1][4]= 0.707
 xs[2][0]=-1.303 xs[2][1]= 1.086 xs[2][2]= 0.434 xs[2][3]= 0.869 xs[2][4]=-1.086

 μ[0]=3000 μ[1]=0.03  μ[2]=3
 σ[0]=1414 σ[1]=0.014 σ[2]=4.604

データフレーム形式→行列形式 変換
  mtx = maDfMtx(df)  

多くの統計関係の関数は、データを [特性][標本] の形式で扱いますが、実務上では
リレーショナルデータベースやスプレッドシートのように [標本][特性] の形式でもち、
行名や列名も持つのが一般的です。その形式をここではデータフレーム形式といいます。
maDfMtx(df)は、データフレーム形式のデータを [特性][標本] の形式に変換します。
簡単な処理ですが、毎度記述するのが面倒なので関数にしました。

ケース1

入力 ケース2のデータを行列形式で与えます。
   「*」の項は、ダミーで任意の値でかまいませんが必須です。
              行名┐
    var df = [ [ "*", "国語", "英語", "数学"],  // 列名
               [ "A",   3,      5,      3   ],
               [ "B",   4,      3,      5   ],
               [ "C",   3,      4,      5   ],
               [ "D",   5,      3,      4   ],
               [ "E",   5,      5,      3   ] ];
    var rtn = maDfMtx(df);
出力
    rtn["行列"]  [ [ 3,  4,  3,  5.  5 ],     // 国語 ┐
                   [ 5,  3,  4,  3,  5 ],     // 英語 ├転置行列
                   [ 3,  5,  5,  4,  3 ] ]    // 数学 ┘
    rtn["行名"]    ["A","B","C","D","E"]      // ★あえて「行」名、「列」名は df での「行」「列」のままにしてある
    rtn["列名"]    ["国語","英語","数学"]     // (その後の処理で df を用いることが多いので)

ケース2























共分散行列・相関行列の生成
  maCovcorTrace(表示場所, x) 
  rtn = maCovcor(x) 

    rtn["共分散行列"]
    rtn["相関行列"]

ケース1

入力
        標本 x[*][k]
    var x = [[12, 20, 24, 26, 33],   ┐
             [ 3,  6,  7, 10, 14],  ├ 系列 x[i][*]
             [22, 16, 14, 19,  8]];  ┘
    var rtn = maCovcor(x);
出力
  rtn["共分散行列"]
     [[ 60,    31.5, -34.75],
        31.5,  17.5, -17.5],
       -34.7, -17.5,  28.2]]
  rtn["相関行列"]
    [[  1,     0.972, -0.844],
     [ 0.972,  1,     -0.787],
     [-0.844, -0.787,  1    ]]

ケース2

↓標本 系列→






























重回帰式係数の算出(連立方程式の定式化と解)
  [定式表, 係数] = maMregEq(y, x) 

多変量解析では重回帰式の作成が多用されますが、それには連立方程式の解を求める必要があります。
ここでは、対象行列に特化した簡便法を用います。

入力
   y[j]  :被説明変数  j;標本
   x[i][j]:説明変数  i:特性

   [定式表, 係数] = maMregEq(y, x)
出力
   定式表:連立方程式の定式化した配列
   係数  :連立方程式の解=重回帰式の係数=偏回帰係数
          [0] 定数項、 [i≧1] 特性[i-1] の係数
入力
  被説明変数
    var y =   [ 18, 12, 14,  6, 12,  8, 10, 16 ];
  説明変数
    var x = [ [  8,  7,  5,  4,  6,  2,  3,  9 ],
              [  4,  7,  8,  3,  8,  5,  6,  9 ],
              [  8,  7,  9,  3,  8,  3,  6,  7 ] ];

べき乗法による固有値・固有ベクトル
  maEigenPowerTrace(表示場所, 対称行列) 
  rtn = maEigenPower(対称行列) 

主成分分析や因子分析など多変量解析の解法では、相関行列や共分散行列から固有値・固有ベクトルを求める局面が多くあります。
直接に固有値を求めるには、変量の個数をnとすると、n次方程式の実根を求めることになるので複雑です。
しかし、多変量解析では次の特徴があります。
・対象行列が対称行列であること
・実務的には、すべての固有値ではなく、大きい固有値を2、3個得ればよい
その解法のうち、ここではべき乗法(Power Method)による近似解を得る方法を用います。

ケース1

入力 対称行列
    var a = [ [  1,      0.376, -0.097 ],
              [  0.376,  1,     -0.359 ],
              [ -0.097, -0.359,  1     ] ]; 
    var rtn = maEigenPower(a);
戻り値
    固有値(大きい順3個まで)           固有ベクトル
    rtn['λ'][0] = 1.570      rtn['V'][0][0] = 0.541 rtn['V'][0][1] = 0.674 rtn['V'][0][2] =-0.504
    rtn['λ'][1] = 0.902      rtn['V'][1][0] = 0.675 rtn['V'][1][1] =-0.006 rtn['V'][1][2] = 0.738
    rtn['λ'][2] = 0.526      rtn['V'][2][0] =-0.495 rtn['V'][2][1] = 0.739 rtn['V'][2][2] = 0.457

ケース2

対称行列なので右上半分だけでよい。










多変量解析

参照:「多変量解析の基礎」

重回帰分析(Multiple Regression)
  maRegTrace(表示場所, 被説明変数, 説明変数 [, 予測変数])  
  rtn = maReg(被説明変数, 説明変数 [, 予測変数])  

処理手順
1 一般統計処理:共分散行列、相関行列、2への各要素の算出
2 重回帰式の算出;連立方程式の定式化と解(重回帰式の係数)、実測値との比較
    予測変数がある場合の予測値の計算
3 重回帰式の信頼性の検定
4 各係数の信頼性の検定

参照:「重相関と重回帰」「相関・回帰直線・信頼区間・重相関」(Python)

ケース1

入力
  被説明変数
    var y =   [ 18, 12, 14,  6, 12,  8, 10, 16 ];
  説明変数
    var x = [ [  8,  7,  5,  4,  6,  2,  3,  9 ],
              [  4,  7,  8,  3,  8,  5,  6,  9 ],
              [  8,  7,  9,  3,  8,  3,  6,  7 ] ];
  予測変数  説明変数と同じ構成、省略可
    var xp = [[  5,  6],
              [  3,  4],
              [  6,  5] ];

ケース2

末尾の x だけがあり y がない部分は、予測変数 xp になります。
  y    x[0]   x[1]   x[2]   x[3]   x[4]   x[5]

























LDA 線形判別関数による判別分析
  maLdaTrace(表示場所, Df) 
  rtn = maLda(Df) 

ここでの判別分析は、いくつかの特性を持つ標本がA群とB群のいずれに属するかのデータを与えて、
その判別をする関数を見つけることとします。
判別分析には、
  線形判別関数による判別分析
  マハラノビス距離による判別分析
に2分されるが、ここでは前者を扱います。
しかも、ごく単純に重回帰式を求めて、それを判別関数として、与えた群区分値と判別関数から求めた評価値を比較して
一致・不一致の件数を表示するだけにします。

ケース1

入力 1標本を1行とする形式にするのが通常です。
                 群   特性
    var Df = [ [  1,   3, 8, 4 ],  // ↓標本
               [ -1,   6, 2, 6 ],
               [  1,   6, 7, 6 ],
               [ -1,   8, 6, 4 ],
               [ -1,   7, 3, 5 ],
               [  1,   4, 7, 3 ],
               [  1,   6, 3, 6 ],
               [ -1,   7, 5, 8 ],
               [   ,   3, 8, 4 ],  // ↓予測
               [   ,   6, 2, 6 ] ];
    var rtn = maLda(df);
出力
    rtn["係数"] :判別関数の係数
    rtn["判別値"]:標本、予測の判別関数の値
    rtn["評価表"]:一致度の表

ケース2

末尾の x だけがあり y がない部分は、予測変数 xp になります。
  y    x[0]   x[1]   x[2]   x[3]   x[4]   x[5]

























MTS マハラノビス距離(Mahalanobis' Distance)による判別分析
  maMtsTrace(表示場所, Df) 
  rtn = maMts(Df) 

ここでの判別分析は、いくつかの特性を持つ標本がA群とB群のいずれに属するかのデータを与えて、
その判別をする関数を見つけることとします。
判別分析には、
  線形判別関数による判別分析
  マハラノビス距離による判別分析
に2分されるが、ここでは後者を扱います。
この方法は複雑ですので、A群とB群の実測値と判別値の違いを示すだけにします。

ケース1

入力 1標本を1行とする形式にするのが通常です。
               標本名 群   特性
    var Df = [ ["A",   1,   3, 8, 4 ],  // ↓標本
               ["B",  -1,   6, 2, 6 ],
               ["C",   1,   6, 7, 6 ],
               ["D",  -1,   8, 6, 4 ],
               ["E",  -1,   7, 3, 5 ],
               ["F",   1,   4, 7, 3 ],
               ["G",   1,   6, 3, 6 ],
               ["H",  -1,   7, 5, 8 ],
               ["I",    ,   3, 8, 4 ],  // ↓予測
               ["J",    ,   6, 2, 6 ] ];
    var rtn = maMts(df);
出力
    rtn[i][j] : i:行番号、予測も含む
      j=0 正群中心点からのマハラノビス距離 D2[0]
      j=1 負群中心点からのマハラノビス距離 D2[1]
      j=2 判別群 距離の近い群 1, -1
      j=3 与えた群と判別群が異なるとき "*"、一致のときは ""

ケース2

末尾の x だけがあり y がない部分は、予測変数 xp になります。

























PCA 主成分分析
  maPcaTrace(表示場所, df) 
  rtn = maPca(df) 

手順
 1 入力データをデータフレーム形式で与え、転置行列 mtx[系列][標本] を生成する。maDfMtx(df)
 2 mtx から、相関行列 cor [系列][系列] を生成する。maCovcor(x)
 3 相関行列の大きい3つの固有値と固有ベクトルを求める。maEigenPower(cor)
  以降が本関数で処理する事項
 4 主成分の式を生成する
 5 その式により、各標本の得点を求める、

参照:「主成分分析」(Python)

ケース1

入力
              ↓標本  系列→
    var df = [ [ "*", "P", "Q", "R" ],
               [ "A",  8,   9,   4  ],
               [ "B",  2,   5,   7  ],
               [ "C",  8,   5,   6  ],
               [ "D",  3,   5,   4  ],
               [ "E",  7,   4,   9  ],
               [ "F",  4,   3,   4  ],
               [ "G",  3,   6,   8  ],
               [ "H",  6,   8,   2  ],
               [ "I",  5,   4,   5  ],
               [ "J",  6,   7,   6  ] ];
    var rtn = maPca(df);

ケース2



























非階層型クラスタリング k-means
  maClusterKM(表示場所, df, 群数) 
  群 = maClusterKM(df, 群数) 

クラスタリングには、階層型と非階層型に分類されますが、
ここでは非階層型の代表的なk-meansを用います。
群数を指定します。
単に各群の中心点から近い標本をその群に属するとするだけで、
各特性の影響を分析するプロセスは省略しています。

ケース1

入力
    var Df = [ [ "*",  "c0","c1","c2","c3","c4"],
               [ "A",    6,   6,   6,   4,   4 ],
               [ "B",    5,   6,   4,   5,   6 ],
               [ "C",    6,   6,   7,   4,   5 ],
               [ "D",    5,   5,   6,   5,   4 ],
               [ "E",    6,   6,   7,   6,   4 ],
               [ "F",    6,   6,   5,   5,   6 ],
               [ "G",    4,   4,   3,   6,   5 ],
               [ "H",    5,   5,   4,   4,   5 ],
               [ "I",    4,   5,   5,   5,   6 ],
               [ "J",    3,   4,   4,   5,   4 ] ];
    var 群数 = 2;

ケース2

↓群数