情報学部 菅沼ホーム SE目次 索引

多変量解析

    1. 1.多変量解析とは
    2. 2.重回帰分析
    3. 3.正準相関分析
    4. 4.主成分分析
    5. 5.因子分析
    6. 6.判別分析
    7. 7.クラスター分析
      1. 7.1 類似度と距離
      2. 7.2 クラスター構成方法
    8. 8.分散分析
        8.1 一元配置法
        8.2 二元配置法
    9. 9.多変量解析と数量化
1.多変量解析とは

  多変量解析とは,互いに関係のある多変量(多変数,多種類の特性値)のデータが持つ特徴を要約し,かつ,目的に応じて総合するための手法です.

  多変量解析には,その名のように多くの変数が出現しますが,大きく 2 つの種類に分類できます.一つは,原因とみなす変数であり,説明変数と呼ばれます.他の一つは,結果として扱いたい変数であり,基準変数目的変数)と呼ばれます.

  また,データは,その性質により,以下のように分類できます.

  1. 量的データ: 数量(数値)で表されるもの(「気温」,「所得」,「身長」,・・・)

    1. 間隔尺度: 差が計れる,つまり,測定単位が存在する(例:摂氏温度).

    2. 比率尺度比例尺度): 間隔尺度の中で,測定単位と絶対原点がある(例:長さ,重さ).

     

  2. 質的データ: 数量で表されないデータ(「好き,嫌い」,「買う,買わない」,「国籍」,・・・)

    1. 名義尺度: 同等関係がわかる.つまり,等しいものには同じ数字を与え,違ったものには違った数字を与えるといった方式でデータを扱う.与えられた数字の大小には意味がない.

    2. 順序尺度: より上位のものには大きな数字を,下位のものには小さな数字を与えるといった方式でデータを扱う(ただし,差には意味がない).たとえば,「嫌い」,「普通」,「好き」に,各々,0,1,2 を与えるといった方法である.

  多変量解析には多くの種類が存在します.多変量解析の目的,データの種類によって分類すれば,以下に示す表のようになります.
基準変数
(目的変数)
多変量解析の目的 説明変数
量的 質的
あり 量的 ・予測式(関係式)の発見
・量の推定
・重回帰分析
・正準相関分析
・数量化分析Ⅰ類
質的 ・標本の分類
・質の推定
・クラスター分析
・判別分析
・クラスター分析
・数量化分析Ⅱ類
なし ・多変量の統合整理(減らす)
・変量の分類
・代表変量の発見
・主成分分析
・因子分析
・数量化分析Ⅲ,Ⅳ類

2.重回帰分析

  N 組のデータ,
(yi, xi1, xi2, ・・・, xin)  i = 1, 2, ・・・, N		
が与えられたとき,これらのデータを元にして,y の値を,x1, x2, ・・・, xn の線形結合,
y = b0 + b1x1 + b2x2 + ・・・ + bnxn		
によって予測する方法について考えてみます.

  回帰直線による予測(最小 2 乗法による予測)は,n = 1 の場合に相当します.重回帰分析は,それを,n > 1 の場合に対して拡張したものです.回帰直線の係数を決めた場合と同様に,最小 2 乗誤差,
s = [y - Xb]T[y - Xb]		
を最小にする b は,以下のようにして得られます.
ただし,
y = [y1 y2 ・・・ yN]T
b = [b0 b1 b2 ・・・ bn]T
とします.得られた b のことを偏回帰係数(の推定値)と呼びます.

例1 : 偏回帰係数を計算するための C/C++ によるプログラム例   JavaScript 版では,任意のデータに対して画面上で結果を求めることができます.なお,他の言語( PHP,Ruby,Python,C#,VB )によるプログラム例に関しては,「プログラミング言語の落とし穴」第 9 章の「重回帰分析」をご覧ください.

  このプログラムに対して,説明変数の数(n)とデータの数(N)を与え,続いて,N 組のデータ(最初が,目的変数の値)を与えれば,偏回帰係数を計算できます.プログラム例に添付したデータに対して,偏回帰係数は以下のようになります.
b0  46.592245
b1  0.015153
b2  0.436445
b3  -0.389181			
  x = [y, x1, x2, x3] としたとき,この例で使用したデータの平均値,及び,相関行列 R は,

x の平均値 = [49.56 47.49 49.13 49.32]

のようになっています.相関行列からも明らかなように,y と,x2 及び x3 との間に強い相関があります.そして,その結果が,偏回帰係数にも現れています.

3.正準相関分析

  3 変数以上が存在したとき,2 変数間同士の関係は相関係数によって知ることができます.しかし,いくつかの変数の組同士の関係を,変数間同士の関係だけから推論することは非常に難しくなります.例えば,q 個の変数が存在したとき,それらの変数の r 個の組と,残りの (q - r) 個の組との関係を得たいような場合です.

  正準相関分析は,このような場合に使用される方法です.今,q 個の変数,
x1, x2, ・・・, xq		
で表されるデータがあったとします.このとき,
r 個の変数の組: x1, x2, ・・・, xr
s(= q - r ≧ r)個の変数の組: xr+1, xr+2, ・・・, xr+s		
を考え,それらの線形結合から成る 2 つの変数,
y = a1x1 + a2x2 + ・・・ + arxr
z = b1xr+1 + b2xr+2 + ・・・ + bsxr+s		
を考え,y と z との間の関係によって,2 つの組間の関係を見ることにします.ただし,y と z との間の相関係数 ryz を最大にするように上式の各係数を定めるものとします.

  各係数を求めるのに先立ち,以下に示すようなベクトル,及び,行列を定義しておきます.
ただし,C11,および,C22 は,X1,および,X2分散共分散行列,また,C12 = C21T は,X1X2 の分散共分散行列とします.さらに,以下の条件を付加しておきます.
E[X1] = E[X2] = 0,  V[y] = aTC11a = 1,  V[z] = bTC22b = 1		
  y と z の相関係数 ryz は,上記の条件(y と z の分散が 1 であるため,相関係数の分母が 1 になる)より,以下のようになります.
ryz = aTC12b		
結局,y,及び,z の分散が 1 であるという条件の下で,上式を最大にする a, b を求めることになります.つまり,ラグランジュの未定乗数法により,以下の式を最大にすればよいことになります.
f = aTC12b - 0.5 λ (aTC11a - 1) - 0.5 μ (bTC22b - 1)		
上式を, a, b で偏微分して 0 とおくと,
となります.b を消去するため,(1) 式の両辺に μ,(2) 式に左から C12C22-1 をかけると,
μ C12b - λμ C11a = 0
C12C22-1C21a - μ C12C22-1C22b = 0   ∴ C12C22-1C21a - μ C12b = 0		
となりますので,2 つの式を加えることによって以下の結果が得られます.
C12C22-1C21a - λμ C11a = 0		
左から C11-1 をかけることによって,結局,以下のようになります.
(C11-1C12C22-1C21a - λμ I) a = 0		
上式から明らかなように,λμ は,C11-1C12C22-1C21固有値であり,a は,対応する固有ベクトルとなります.

  次に,λμ について考えてみます.(1) 式に左から aT をかけると以下のようになります.
aTC12b - λ aTC11a = 0   ∴ aTC12b = ryz = λ		
同様に,(2) 式の転置を取った後,右から b をかけると以下のようになります.
aTC12b - μ bTC22b = 0   ∴ aTC12b = ryz = μ		
結局,λ = μ であり,λμ = λ2 となります.また,b は,得られた固有値 λ2,固有ベクトル a と,(2) 式より,以下のようにして計算できます.
b = C22-1C21 a / λ		
  以上の結果をまとめると,以下のようになります.
(C11-1C12C22-1C21 - λ2 I) a = 0  ただし,aTC11a = 1
   λ2 は,C11-1C12C22-1C21 の固有値であり,a は,対応する固有ベクトル
b = C22-1C21 a / λ  ただし,bTC22b = 1
ryz = λ		
  以上のようにして得られた変量 y, z を正準変量,また,その各係数を正準相関係数と呼びます.絶対値が最も大きな固有値に対応する正準変量,正準相関係数を第 1 正準変量,第 1 正準相関係数,また,2 番目に大きな固有値に対応するものを第 2 正準変量,第 2 正準相関係数,・・・と呼びます.

例2 : 正準相関分析を行うための C/C++ によるプログラム例   JavaScript 版では,任意のデータに対して画面上で結果を求めることができます.なお,他の言語( PHP,Ruby,Python,C#,VB )によるプログラム例に関しては,「プログラミング言語の落とし穴」第 9 章の「正準相関分析」をご覧ください.

  このプログラムに対して,各組の変数の数(r と s, r ≦ s)とデータの数(n)を与え,続いて,n 組のデータを与えれば,正準相関分析を実行できます.例1 と同じデータ(ただし,y を x1,x1 を x2,x2 を x3,x3 を x4 と読み替える)を使用して,正準相関分析を行ってみます.

  最初に,x1 と(x2, x3, x4)の組に対して正準相関分析を行うと以下のようになります.x1 と x3,及び,x4 の間に強い相関があるため,x3,及び,x4 に対する係数が大きくなっています.また,相関係数は,その定義より,必ず,各変数間の相関係数より大きな値になります.正準相関分析では,各データの平均値を 0 としていますので,重回帰分析における b0 に対応する部分がありませんが,基本的に,重回帰分析と同様の結果が得られています.なお,分散共分散行列 C は右のようになっています.
相関係数 0.904770
  a 0.048528
  b 0.000813 0.023409 -0.020874			
  次に,(x1, x2) と (x3, x4) に対して,正準相関分析を行うと以下のようになります.第 1 正準相関係数(0.904657)に対応する部分を見ると,データ間の相関から予想したような結果が得られています.第 2 正準相関係数は,第 1 正準相関係数に比較して非常に小さな値となっており,余り意味のないものとなっています.
相関係数 0.904657
   a 0.048516 0.000138
   b 0.023406 -0.020945

相関係数 0.041613
   a -0.004599 0.050679
   b -0.047911 -0.049606			

4.主成分分析

  今,以下に示すように,p 個の変量に対して,各 N 個のデータが得られたとします.
変量: x1, x2, ・・・, xp
N 個のデータ: x1i, x2i, ・・・, xpi  i = 1, 2, ・・・, N		
これらの変量には,互いに何らかの関係があったとします.このとき,これらのデータの変動に与える因子を一つの変量に要約し,その特徴を把握しようとするのが主成分分析です.

  主成分分析では,影響を与える変量を,p 個の変量の線形結合,
z = a1x1 + a2x2 + ・・・ + apxp = aTx
   ただし,a = [a1 a2 ・・・ ap]T, x = [x1 x2 ・・・ xp]T		
で表し,∥a∥ = 1 ( a の大きさが 1 )の条件の下で,z の分散が最大になる( z の変動が最も大きくなる)ように a の値を決めます(これを,a1 とする).このようにして決定された a1 の各要素の値を a11, a12, ・・・, a1p としたとき,
z1 = a11x1 + a12x2 + ・・・ + a1pxp		
を,第 1 主成分と呼びます.同様に,∥a∥ = 1 で,かつ,z1 とは無相関な z の内で,最大の分散を持つ
z2 = a21x1 + a22x2 + ・・・ + a2pxp		
第 2 主成分と呼びます.以下,同様に,第 3 主成分以下も定義されます.

  では,実際に,第 n 主成分を求めてみます.まず,z の分散は,以下のようになります.
V[z] = V[aTx] = aT V[x] a = aT C a		
ただし,C は,分散共分散行列です.一般に,基準化データに対する分散共分散行列を使用します.なお,基準化データとは,データの平均値 μ と標準偏差 σ を求めた後,各データを,以下の式で基準化したデータのことを言います.
(xi - μ) / σ		
  ∥a∥ = 1 の条件の下で,分散の最大値を求めるには,ラグランジュの未定乗数法より,
v = aTCa - λ (aTa - 1)		
を最大にすればよいことになります.そこで,a で微分し,0 とおくことにより,以下の結果が得られます.
Ca - λa = 0  ∴|C - λI| = 0		
この結果より,λ は,C固有値であり,a は,対応する固有ベクトルであることが分かります.また,上式に左から aT をかけると,
aTCa - λaTa = 0  ∴aTCa = λ		
となります.つまり,λ は,z の分散となります.以上の結果より,C に対する固有ベクトルを,固有値が大きい順に求めていけば,それらが,第 1 主成分,第 2 主成分,・・・ となることになります.

  分散が大きければ大きいほど,各変量は,その主成分の影響を強く受けることになりますので,小さな分散に対する主成分を計算してもほとんど意味を持ちません.そこで,以下の式によって,累積寄与率を定義し,一般に,累積寄与率が 0.8 程度までの主成分を考慮します.
   tr(C): トレース.行列 C の主対角線要素の和であり,固有値の和に等しい

  各主成分と変量 xi の相関係数を因子負荷量と呼びます.基準化データを使用した場合は,第 k 主成分と変量 xi との因子負荷量は,以下のようにして計算できます.
例3 : 主成分分析を行うためのC/C++ によるプログラム例(→   JavaScript 版では,任意のデータに対して画面上で結果を求めることができます.なお,他の言語( PHP,Ruby,Python,C#,VB )によるプログラム例に関しては,「プログラミング言語の落とし穴」第 9 章の「主成分分析」をご覧ください.

  このプログラムに対して,変数の数(p)とデータの数(n)を与え,続いて,n 組のデータを与えれば主成分分析を実行できます.再び,例1 と同じデータ(ただし,y を x1,x1 を x2,x2 を x3,x3 を x4 と読み替える)を使用します.主成分分析を行うと,以下に示すような結果になります(第 1 主成分から順には並べてありません).なお,分散共分散行列 C は右のようになっています.
主成分 0.118306 係数 0.796646 -0.008174 -0.462969 0.388520
主成分 0.987518 係数 -0.050663 0.995047 -0.080488 0.028908
主成分 2.551440 係数 0.601096 0.092426 0.563442 -0.559172
主成分 0.342736 係数 0.038354 0.035656 0.679496 0.731808			
  この結果の第 1 主成分(2.551440)を見ますと,互いに相関が強い変量 x1, x3, 及び, x4から構成され,また,第 2 主成分は,それらの変量と相関が少ない変量 x2 からなっているのがよく分かります.

5.因子分析

  因子分析は,主成分分析と非常に似ています.主成分分析は,データの変動に与える因子を一つの変量に要約し,その特徴を把握しようとするのです.しかし,一般に,データ内には誤差が存在します.そこで,因子分析では,その誤差を除去して因子を抽出しようとします.

  今,以下に示すように,p 個の変量に対して,各 N 個のデータが得られたとします.
変量: x = [x1 x2 ・・・ xp]T
N 個のデータ: x1i, x2i, ・・・, xpi  i = 1, 2, ・・・, N		
このとき,各変量は,共通因子と誤差によって,以下のように表現されると仮定します.
x = Af + e		
ただし,
f = [f1 f2 ・・・ fm]T
e = [e1 e2 ・・・ ep]T  特殊因子(誤差)
		
とし,A因子行列
[a1i a2i ・・・ api]T  i = 1, 2, ・・・, m		
を,fi に対する共通因子負荷量といいます.

  fi と fj(i ≠ j),fi と ej,および,ei と ej(i ≠ j)には相関がなく,また,fi の分散は 1 であるとすると,x分散共分散行列 C は,以下のようになります(データは,基準化されているものする).
C = V[x] = V[Af + e] = A V[f] AT + V[e] = AAT + E = R + E		
ただし,
R = AAT

   hi = Σj aij2  共通性と呼ぶ		
とします.因子分析は,R から A を求めることになります.

  R固有値を大きい順に λi(i = 1, 2, ・・・, p),対応する固有ベクトルを bi とすると,k 番目の因子負荷量 ak は,主成分分析の場合と同様に,
となります.しかし,共通性 hi が未知ですので,直接 R の固有値を計算できません.そこで,何らかの方法によって hi を計算する必要があります.計算方法としては,様々な方法が存在しますが,ここでは,主因子法について説明します.主因子法のアルゴリズムは,以下に示すとおりです.

  1. hi を適当な値に初期設定する.

  2. R から因子負荷量を計算する.因子負荷量の計算には,R の固有値の大きい方から順に m 個の固有値と固有ベクトルを利用する.

  3. 因子負荷量から共通性を計算する.もし,|新たに計算した共通性 - 前回の共通性| < ε であれば,

    1. 終了.

    そうでなければ,

    1. R の対角要素を,新たに計算した共通性で置き換えて,2 へ戻る.

例4 : 因子分析を行うためのC/C++ によるプログラム例   JavaScript 版では,任意のデータに対して画面上で結果を求めることができます.なお,他の言語( PHP,Ruby,Python,C#,VB )によるプログラム例に関しては,「プログラミング言語の落とし穴」第 9 章の「因子分析」をご覧ください.

  このプログラムに対して,共通因子負荷量の数(m),変数の数(p),及び,データの数(n)を与え,続いて,n 組のデータを与えれば因子分析を実行できます.再び,例1 と同じデータ(ただし,y を x1,x1 を x2,x2 を x3,x3 を x4 と読み替える)を使用します.因子分析を行うと,以下に示すような結果になります.主成分分析の結果と非常によく似た結果が得られています.なお,分散共分散行列 C は右のようになっています.
固有値 2.360858 共通因子負荷量 1.012595 0.161506 0.818013 -0.800175
固有値 0.984701 共通因子負荷量 -0.072858 0.986512 -0.070533 0.034812			

6.判別分析

  2 種類の集団に対して,複数の変量(n 個とする)に対するデータが得られていたとします.このとき,新しく得られたあるデータ x に対して,このデータがどちらの集団に属するのか判別したいような場合に使用されるのが判別分析です.例えば,「複数の検査データに基づき,病気の有無の判別」,「クレジットに対する申込者のデータから,クレジットカードを発行可能か否かの判別」等に利用されます.判別分析では,誤った判断(集団 1 に属しているのに,集団 2 に属していると判断するような場合や,または,その逆の場合)を行う確率をできるだけ小さくするように判別します.

  概念的に,どのような判断を下すべきかは,明らかだと思います.誤った判断(集団 1 に属しているのに,集団 2 に属していると判断するような場合や,または,その逆の場合)を行う確率をできるだけ小さくすればよいわけです.以下,各集団における変量の確率密度関数は,それぞれ,f1(x) 及び f2(x) であるとします.このとき,各判断が行われる確率は,dx = dx1dx2・・・dxn とすると,以下のようになります.
P(1|1) = ∫G1f1(x)dx : 集団 1 に属するものが,集団 1 に属すると正しく判断される確率
P(2|2) = ∫G2f2(x)dx : 集団 2 に属するものが,集団 2 に属すると正しく判断される確率
P(2|1) = ∫G2f1(x)dx : 集団 1 に属するデータが,集団 2 に属すると判断される確率
P(1|2) = ∫G1f2(x)dx : 集団 2 に属するデータが,集団 1 に属すると判断される確率		
  従って,今,
C(2|1) > 0 : 集団 1 に属するにもかかわらず,集団 2 に属すると判断されたときの損失
C(1|2) > 0 : 集団 2 に属するにもかかわらず,集団 1 に属すると判断されたときの損失		
とすると,誤って判断されたときの損失の期待値は,
C(2|1)・P(1)・P(2|1) + C(1|2)・P(2)・P(1|2)
  = C(2|1)・P(1)∫G2f1(x)dx + C(1|2)・P(2)∫G1f2(x)dx
  = ∫G2(C(2|1)・P(1)f1(x) - C(1|2)・P(2)f2(x))dx + C(1|2)・P(2)∫Sf2(x)dx
  = ∫G1(C(1|2)・P(2)f2(x) - C(2|1)・P(1)f1(x))dx + C(2|1)・P(1)∫Sf1(x)dx
    S は,標本空間全体		
となります.第 2 項は定数ですので,上式は,第 1 項の値によって決まります.従って,
C(1|2)・P(2)f2(x) = C(2|1)・P(1)f1(x)		
となる場合は,いずれと判断しても損失は同じになります.そうでない場合は,以下のように判断することになります.
C(1|2)・P(2)f2(x) ≦ C(2|1)・P(1)f1(x) : 集団 1 に属していると判断
C(1|2)・P(2)f2(x) > C(2|1)・P(1)f1(x) : 集団 2 に属していると判断		
  具体的には,以下に示すような方法で判別を行います.線形識別関数による方法は,2 つの集団における分散共分散行列が等しい場合に使用できる方法であり,マハラノビスの距離
d2 = (x - y)T C-1 (x - y)  C:分散共分散行列
が等しい位置に直線(超平面)を引き,新規のデータが,その直線のどちら側にあるかによって判別する方法です.各集団の分散共分散行列が異なる場合は,集団毎に異なる共分散行列を使用してマハラノビス距離を計算し,等距離になる場所を判別曲面( 2 次関数)とする方法です.なお,後に述べるニューラルネットも,与えられたデータを分類する機能を持っており,判別分析の方法としても利用できます.

7.クラスター分析

  クラスター分析は,与えられたデータを,それらの間の類似度や距離を基準として,いくつかのグループに分類するための手法です.

7.1 類似度と距離

  2 つのデータ間の類似度や距離は,様々な方法で定義可能です.また,データの性質(連続量,離散値,・・・)によっても異なります.その代表的な方法は以下に示す通りです.なお,以下の説明において,変量の数を n とし,2 つのデータを以下のように表現します.
x = [x1 x2 ・・・ xn]T
y = [y1 y2 ・・・ yn]T		

  1. 連続量で表されるデータ

    1. ユークリッド距離  d2 = Σ (xi - yi)2

    2. 重み付きユークリッド距離  d2 = Σ wi (xi - yi)2

    3. マハラノビスの距離  d2 = (x - y)T C-1 (x - y)  C: 分散共分散行列

    4. 内積による類似度  sxy = xT y

  2. カテゴリーデータ(各変量の値が 0 または 1 )

    以下の説明における変数の意味:

    • a = Σ xkyk   データ xy において,共に 1 となる変量の個数
    • b = Σ xk(1 - yk)   データ xで 1,データ y で 0 となる変量の個数
    • c = Σ (1 - xk)yk   データ x で 0,データ y で 1 となる変量の個数
    • d = Σ (1 - xk)(1 - yk)   データ xy において,共に 0 となる変量の個数
        → n = a + b + c + d





  3. 順位データ

      順位データとは,例えば,n 種類のものに対して,各人がそのものに対する好みを 1 から n の値で答えるような場合に得られるデータです.従って,各データは,1,2,・・・,n のいずれかになっていることになります.

      順位データに対しては,一般に,順位で表現された値を,連続な値に変換し,A で述べた方法を適用するか,または,以下に示すような順位相関係数を使用する方法が使用されます.

    1. Spearman の順位相関係数

    2. Kendall の順位相関係数

         ただし,C は,以下のような数値とします.まず,データ x を,[1 2 ・・・ n]T となるように各変量を入れ替えます.次に,この順序になるように,データ y を並べ替えます.そして,[1 2 ・・・ n]T となるように並べ替えるのにかかった入れ替え回数を C とします.

7.2 クラスター構成方法

  クラスターを構成する方法としては,大きく分けて,階層的に構成していく方法非階層的に構成していく方法とがあります.ここでは,階層的に構成する方法について説明します.

  データの数が N,かつ,分類したいクラスター数が L である場合,その基本的なアルゴリズムは以下に示す通りです.

  1. クラスター数 M = N とする

  2. クラスター(データ)間の類似度(距離)を計算する

  3. クラスターの中で最も類似度が大きい(距離が小さい)対を求め,それを 1 つのクラスターに融合する.

  4. M = M - 1 とし,もし,M > L ならば,融合されたクラスターと他のクラスタとの距離を計算し 3 へ戻り,そうでなければ終了する

  上記のアルゴリズムにおいて,クラスター間の類似度(距離)をどのように計算するかによって,以下に示すような手法が存在します.なお,各手法において使用される変数の意味は以下の通りであるとします.

  1. 最短距離法

  2. 最長距離法

  3. メジアン法

    Dko = 0.5 Dio + 0.5 Djo - 0.25 Dij

  4. 重心法

  5. 群平均法

    これは,クラスター間の距離を以下の式によって計算することに相当する.

    ただし,ΣΣ dij2 は,クラスター Ci に属するデータと,クラスター Cj に属するデータ間のユークリッド距離の 2 乗を,すべて加え合わせたものとする.

  6. ウォード法

      クラスターを融合することによって,クラスター Ck の重心まわりの偏差平方和が最小になるように融合する.結局,次の距離が最小になるものを融合する(データ間の距離としては,ユークリッド距離).

例5 : クラスター分析を行うためのC/C++ によるプログラム例   JavaScript 版では,任意のデータに対して画面上で結果を求めることができます.なお,他の言語( PHP,Ruby,Python,C#,VB )によるプログラム例に関しては,「プログラミング言語の落とし穴」第 9 章の「クラスター分析」をご覧ください.

  このプログラムに対して,クラスター間距離を計算する方法(method),クラスタの数(L,クラスタの数がこの値になったら終了),変数の数(n),及び,データの数(N)を与え,続いて,N 組のデータを与えればクラスター分析を実行できます.例として使用したデータは,(N(50, 202), N(50, 202)), (N(30, 152), N(-50, 152)), 及び, (N(-20, 202), N(10, 202)) となるデータを,各々,40,30,及び,30 個発生させたものであり,図示すれば以下のようになります.

  以下に,分類するクラスター数を 9,6,及び,3 に設定した場合に対する実行結果を示しておきます.すべてのデータに対して以下のような結果が出るとは限りません.データの種類によって,最適な分類方法を選ぶべきです.

8.分散分析

  分散分析は,今まで述べた多変量解析とは多少目的が異なります.その目的からいえば「確率と統計」の検定の箇所で述べた方が良いかもしれません.なぜなら,分散分析が平均値の差の検定の拡張になっているからです.例えば,同じ製品を複数の工場で生産する場合を考えてみて下さい.各製品の特性(大きさ,重さ,性能を表す数値等)や不良率などのデータは,工場毎に異なってくる可能性があります.また,複数の組織(例えば,学科)に対して同じアンケートを実施した場合も,その結果がすべての組織で同じであるとは限りません.工場や組織の数が 2 である場合は,平均値の差の検定を利用して,工場や組織間の平均値の差が有意なものであるか否かを検定することができますが,3 以上の場合は困難になります.さらに,平均値の差の検定においては,差を生む出す要因まで分析対象にすることができません.そのような場合に使用されるのが分散分析です.

  分散分析において,工場や組織のように結果に影響を及ぼすと考えられる要因を因子,工場や組織の違いを因子の水準と呼びます.工場や組織の違いなど,因子の数が 1 種類である場合に対する方法を一元配置法といいます.また,薬の種類と対象とする動物を変化させて,その効果を調べたいような場合は,因子の数が 2(薬の種類,動物の種類)になります.このような場合に対する方法を二元配置法といいます.一般的に,多元配置法も存在しますが,ここでは,一元配置法と二元配置法だけについて説明します.

8.1 一元配置法

  因子 P に対する Np 個の各水準 Pi( i = 1,2,...,Np )に対して,N 回の実験を行った際に得られるデータを xij( i = 1,2,...,Np, j = 1,2,...,N )とします.なお,後に述べる二元配置法についても同様ですが,水準毎に実験回数が異なる場合も同じような考え方で可能ですが,記述を簡単にするため,以下においてはすべての水準における実験回数は同じ( N 回)であるとします.当然,これらのデータには誤差が含まれると考えられますので,各水準 Pi における真の値を μi とすると,各データは以下のように表現できます.
xij = μi + εij ( i = 1,2,...,Np, j = 1,2,...,N )  (1)		
ただし,εij は,互いに独立な正規分布 N(0,σ2) に従うものとします.今,
とおくと,定義より,
となり,(1) 式は以下のようになります.
xij = μ + αi + εij ( i = 1,2,...,Np, j = 1,2,...,N )  (2)		
この式において,μを一般平均,αi主効果といいます.因子のすべての水準で μi が等しければ,つまり,各工場において生産される製品に差がなければ,αi( i = 1,2,...,Np )は 0 になるはずです.一元配置法では,この αi が有意に大きい値を持つか否か,つまり,因子の各水準における平均値の間に有意な差があるか否かを検定することになります.

  εij が正規分布 N(0,σ) に従うという仮定から,εij / σ = (xij - μ - αi) / σ の平方和は自由度 NpN の χ2分布となり,

のように分解され,第 1 項,第 2 項,第 3 項は,それぞれ独立に,自由度 Np - 1,Np(N - 1),1 のχ2分布になります.ただし,

とします.式 (3) からも明らかなように,第 1 項は水準間のばらつき,また,第 2 項は水準内のばらつきを表しています.

  では,具体的に,各水準間に有意な差があるか否かについて検定する方法について述べていきます.まず,

帰無仮説 H0: 因子 P の水準間に差はない(各水準における平均値は同じ)

を立てます.この帰無仮説の元では,αi = 0 ( i = 1,2,...,Np )となり,(3) 式の第 3 項も 0 となります.そこで,

とすると,SP / σ2,SE / σ2 は,互いに独立な,それぞれ自由度 Np - 1,Np(N - 1) のχ2分布になります.さらに,
VP ≡ SP / ( Np - 1 )
VE ≡ SE / Np( N - 1 )
F ≡ VP / VE		
とおけば,F は 自由度 Np - 1,Np( N - 1 ) の F 分布をします.そこで,実験から得られた F の値 F0 を F 分布の α% 値 F ( Np - 1, Np( N - 1 ) ; α ) と比較し,もし,
F0 > F ( Np - 1, Np( N - 1 ) ; α )		
であれば,危険率 α で仮説 H0 を棄却し,そうでなければ仮説を受け入れることになります.以下に,一元配置法において計算すべき値をまとめておきます(分散分析表).
  平方和 自由度 不偏分散 F
全変動 S NpN - 1    
水準間 SP Np - 1 VP = SP / ( Np - 1 ) F = VP / VE
水準内 SE = S - SP Np( N - 1 ) VE = SE / Np( N - 1 )  
例6 : 分散分析を行うためのC/C++ によるプログラム例   JavaScript 版では,任意のデータに対して画面上で結果を求めることができます.なお,他の言語( PHP,Ruby,Python,C#,VB )によるプログラム例に関しては,「プログラミング言語の落とし穴」第 9 章の「分散分析」をご覧ください.

  このプログラムは,一元配置法または二元配置法に対して適用可能です.ただし,各水準における実験回数(データ数)はすべて同じ場合だけを扱っています.なお,分散分析を行う関数は aov であり,他の関数は F 分布における α% 値を計算するためのものです.従って,関数 aov において α% 値を出力しない場合は,aov 以外の関数は必要ありません.

  このプログラムを使用した計算例として,3 つの工場で生産されたある製品の不良率(%)に差があるか否かを有意水準を 5% として検定してみます.各工場で生産された 6 つのロットに対する不良率を調べた結果が以下のようになったとします.

  工場1 工場2 工場3
ロット1 3.1 4.7 5.1
ロット2 4.1 5.6 3.7
ロット3 3.3 4.3 4.5
ロット4 3.9 5.9 6.0
ロット5 3.7 6.1 3.9
ロット6 2.4 4.2 5.4

  ここで,帰無仮説 H0 を,

H0 : 各工場の不良率に差はない

とし,分散分析を行ってみます.プログラムに対する入力データは,
1 6 5   // 因子の数 各水準におけるデータ数 有意水準(%)
工場 3   // 因子の名前 水準の数
3.1 4.7 5.1   // 各水準に対する1番目のデータ
4.1 5.6 3.7   // 各水準に対する2番目のデータ
3.3 4.3 4.5   // 各水準に対する3番目のデータ
3.9 5.9 6.0   // 各水準に対する4番目のデータ
3.7 6.1 3.9   // 各水準に対する5番目のデータ
2.4 4.2 5.4   // 各水準に対する6番目のデータ			
のようになります(コメント部分は除く).このデータの元でプログラムを実行すると以下のような結果が得られます.
全変動: 平方和 19.22 自由度 17
工場の水準間: 平方和 9.81 自由度 2 不偏分散 4.9039 F 7.81 5%値 3.68
水準内: 平方和 9.41 自由度 15 不偏分散 0.6277			
このように F の値( 7.81 )は F ( 2, 15 ; 0.05 ) = 3.68 より大きくなり,仮説は棄却されます.

8.2 二元配置法

  因子が 2 つ以上ある場合は,それぞれの因子による効果(主効果)と共に,それらの因子の相互作用による効果も考慮する必要があります.今,2 つの因子 P,Q があり,それぞれ,Pi( i = 1,2,...,Np )及び Qj( j = 1,2,...,Nq )の水準があり,各水準において N 回の実験を行うものとします.このとき,水準 Pi 及び 水準 Qj の元で得られたデータを xijk ( k = 1,2,...,N )とします.一般平均を μ,水準 Pi の主効果を αi,水準 Qj の主効果を βj,水準 Pi と Qj の相互作用を τij,誤差を εijk とすれば,(2) 式と同様,各データは以下のように表現できます.
xijk = μ + αi + βj + τij + εijk ( i = 1,2,...,Np, j = 1,2,...,Nq, k = 1,2,...,N )  (4)		
  一元配置法の場合と同様,各水準の平均,水準 Pi と Qj の組についての平均,及び,全体の平均を




		
とし,また,SP,SQ,SI,及び,SE を,




		
のように定義すると,二元配置法に対する分散分析表は以下のようになります.
  平方和 自由度 不偏分散 F
全変動 S NpNqN - 1    
P の水準間 SP Np - 1 VP = SP / ( Np - 1 ) FP = VP / VE
Q の水準間 SQ Nq - 1 VQ = SQ / ( Nq - 1 ) FQ = VQ / VE
相互作用 SI ( Np - 1 )( Nq - 1 ) VI = SI / ( Np - 1 )( Nq - 1 ) FI = VI / VE
水準内 SE NpNq( N - 1 ) VE = SE / NpNq( N - 1 )  
  上に示した分散分析表を使用して,具体的には,以下のような方法で検定を行います.まず,因子 P の水準間の差を検定するためには,

帰無仮説 H0: 因子 P の水準間に差はない

のような仮説を立て,
F0 > FP ( Np - 1,  NpNq( N - 1 ) ; α )		
であれば仮説を棄却します.同様に,因子 Q の水準間の差を検定するためには,

帰無仮説 H0: 因子 Q の水準間に差はない

のような仮説を立て,
F0 > FQ ( Nq - 1,  NpNq( N - 1 ) ; α )		
であれば仮説を棄却します.さらに,相互作用の効果を検定するためには,

帰無仮説 H0: 因子 P,Q の相互作用による効果はない

のような仮説を立て,
F0 > FI ( ( Np - 1 )( Nq - 1 ),  NpNq( N - 1 ) ; α )		
であれば仮説を棄却します.

例7 : 分散分析を行うためのC/C++ によるプログラム例   JavaScript 版では,任意のデータに対して画面上で結果を求めることができます.なお,他の言語( PHP,Ruby,Python,C#,VB )によるプログラム例に関しては,「プログラミング言語の落とし穴」第 9 章の「分散分析」をご覧ください.

  このプログラムは,例6 において使用したものと全く同じです.このプログラムを二元配置法に使用した計算例として,ある作物に対して,栽培時に施す薬剤及び品種によってその収穫量に差があるか否か,また,薬剤と品種の間に相互作用かあるか否かを検定してみます.5 種類の薬剤と 2 つの品種に対して,各 3 つのブロックで栽培し,その収穫量を示したのが以下の表です.なお,収穫量は,基準収穫量からの相対値で表現してあります.

  薬剤1 薬剤2 薬剤3 薬剤4 薬剤5
品種1 3 4 12 -4 -4
8 -8 31 12 19
7 -5 8 0 23
品種2 8 -10 9 10 15
-5 11 26 -1 13
10 -6 13 -7 -6

  プログラムに対する入力データは,
2 3 5   // 因子の数 各水準におけるデータ数 有意水準(%)
薬剤 5   // 1番目の因子の名前 その水準の数
品種 2   // 2番目の因子の名前 その水準の数
3 4 12 -4 -4   // 1番目の因子の各水準に対して,2番目の因子の水準1に対する1番目のデータ
8 -8 31 12 19   // 1番目の因子の各水準に対して,2番目の因子の水準1に対する2番目のデータ
7 -5 8 0 23   // 1番目の因子の各水準に対して,2番目の因子の水準1に対する3番目のデータ
8 -10 9 10 15   // 1番目の因子の各水準に対して,2番目の因子の水準2に対する1番目のデータ
-5 11 26 -1 13   // 1番目の因子の各水準に対して,2番目の因子の水準2に対する2番目のデータ
10 -6 13 -7 -6   // 1番目の因子の各水準に対して,2番目の因子の水準2に対する3番目のデータ			
のようになります(コメント部分は除く).このデータの元でプログラムを実行すると以下のような結果が得られます.
全変動: 平方和 3260.80 自由度 29
薬剤の水準間: 平方和 1289.80 自由度 4 不偏分散 322.4500 F 3.37 5%値 2.87
品種の水準間: 平方和 22.53 自由度 1 不偏分散 22.5333 F 0.24 5%値 4.35
相互作用: 平方和 34.47 自由度 4 不偏分散 8.6167 F 0.09 5%値 2.87
水準内: 平方和 1914.00 自由度 20 不偏分散 95.7000			
このように,薬剤の水準間に対する F の値( 3.37 )は F ( 4, 20 ; 0.05 ) = 2.87 より大きくなり,仮説は棄却されます.ただし,品種間の差及び相互作用に関しては棄却されません.

9.多変量解析と数量化

  例えば,「好き」,「嫌い」のような質的データに対し,数量化して分析した方がよい場合が存在します.そのような場合に使用されるのが,数量化分析です.数量化分析としては,以下のような方法がありますが,詳細については省略します.

  1. 数量化分析Ⅰ類: 重回帰分析と同じ目的で使用されます
  2. 数量化分析Ⅱ類: 判別分析と同じ目的で使用されます
  3. 数量化分析Ⅲ,Ⅳ類: 主成分分析や因子分析と同じ目的で使用されます

情報学部 菅沼ホーム SE目次 索引