スタートページ>
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
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
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
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