主成分分析:分散が最大の方向を総当たりで探すと固有ベクトル【第24回】

はじめに

第22章は主成分分析です。多変量解析編の最初の回で、この編の土台になります。

前回の最後に「独立な増分に分解する発想が主成分分析でも形を変えて現れる」と書きました。実際そうなりました。今回やることは、データのばらつきを互いに影響しない方向に分けることです。

この章に入る前、私には具体的な弱点がありました。2019年6月の過去問で多次元正規分布が出て、手が完全に止まったのです。分散共分散行列という言葉は知っていても、それが何をしているのか分かっていませんでした。

そこで今回は1変数の正規分布から出発して、2変数に上げるときに何が追加されるのかを図で確かめ直しました。結論を先に書きます。多次元正規分布は1変数の拡張ではなく、同じ式の書き換えでした。 1/σ21/\sigma^2Σ1\Sigma^{-1} になっただけです。

そしてこの回の核心は「なぜ分散を最大にする方向を探すと固有値問題になるのか」です。教科書は「ラグランジュの未定乗数法で解くと固有値問題になる」と書いていますが、それではなぜそうなるのかが分かりません。

そこで固有値を一切使わず、角度を 0.05 度刻みで 3601 通り総当たりしてみました。分散が最大になったのは 29.6 度で、値は 1329.3。いっぽう分散共分散行列の最大固有値は 1329.32。ぴったり一致します。この一致がなぜ起きるのかを図で追いました。

もうひとつ驚いたのが寄与率です。「固有値を合計で割るだけ」という説明を読んで、それがなぜ「説明できた割合」になるのか納得できていませんでした。確かめたら、第16回の決定係数と小数第9位まで一致する同じものでした。類比ではありませんでした。

記事の後半では、検証中に見つけた落とし穴も記録します。マハラノビス距離で外れ値を検出しようとしたら、理論値と合わない。原因は外れ値自身が分散共分散行列を膨らませて、自分の異常度を隠していたことでした。

いつものように、出てくる数値はすべて自分で計算し、理論値と突き合わせています。

この回で扱う用語

先に略語と用語を並べておきます。本文では初出時に改めて説明します。

用語読み・スペルアウト一言で
主成分分析PCA(Principal Component Analysis)変数を減らして情報の損失を最小にする手法
分散共分散行列Σ\Sigma(シグマの大文字)対角に分散、非対角に共分散を並べた行列
相関行列RR全変数を標準化してから作った分散共分散行列
固有値λ\lambda(ラムダ)行列を掛けたときの倍率。主成分分析ではその主成分の分散
固有ベクトルuu行列を掛けても向きが変わらない方向
寄与率proportion of variance固有値 ÷ 固有値の合計
主成分得点PC score個体(データ1件ごと)に付く値
主成分負荷量loading変数に付く値。主成分と元の変数の相関係数
マハラノビス距離Mahalanobis distanceばらつきの形をものさしに組み込んだ距離
主成分回帰PCR(Principal Component Regression)固有値の小さい主成分を捨ててから回帰する
VIFVariance Inflation Factor=分散拡大要因多重共線性の指標。10 を超えると疑わしい
OLSOrdinary Least Squares=通常の最小二乗法第16回でやった普通の回帰

何のための手法なのか

定義から入らず、困りごとから始めます。

このブログのアクセス解析には、記事ごとに複数の指標があります。PV、セッション、平均滞在時間、スクロール率、直帰率、被リンク数。6つの数字を同時に睨んでも、どの記事が良いのか判断がつきません。

「PV は多いが滞在時間が短い記事」と「PV は少ないが最後まで読まれている記事」のどちらを評価すべきか。指標が6つあると、記事どうしを並べて比較することすらできません。

ここで欲しくなるのが「6つの数字を2つにまとめる」操作です。2つなら平面にプロットできるので、記事の位置関係が一目で分かります。

これが次元削減(dimensionality reduction)で、主成分分析はその代表的な手法です。目的は3つあります。

目的中身
次元圧縮変数を減らす。6個 → 2個
可視化減らした結果、平面に描ける
多重共線性の回避相関のある変数を、相関のない変数に組み替える(第16回の問題への対処)

ただし減らせば情報は失われます。問題は「どう減らせば損失が最小になるか」です。その答えが固有値分解でした。

多次元正規分布:1変数から積み上げる

主成分分析の道具立ては分散共分散行列です。そしてその意味は、多次元正規分布を通すと一番はっきりします。過去問で詰まった場所なので、ここは丁寧に行きます。

ステップ1:1変数の正規分布を部品に分ける

いきなり2変数に行く前に、1変数の式を分解しておきます。

f(x)exp(12z2),z=xμσf(x) \propto \exp\left(-\frac{1}{2} z^2\right), \quad z = \frac{x-\mu}{\sigma}

1変数正規分布の3つの部品。左は中心μ=50からのズレの絶対値がV字を描くグラフ。中央はそれをσ=10で割って2乗した放物線で、1σ→1、2σ→4、3σ→9の点が赤く打たれている。右はexp(−z²/2)を正規化した釣鐘型の密度

読み方はこうです。正規分布の中身は「中心からどれだけ離れているか」を σ\sigma で割って(ものさしを揃えて)2乗しただけです。中央のパネルを見てください。1σ 離れると 1、2σ で 4、3σ で 9 になります。

1変数の正規分布で本質的なのは z2z^2 という1つの数字だけです。exp(/2)\exp(-\cdot/2) と前の係数は、その数字を確率の形に整えるための飾りにすぎません。

だから2変数に上げるときの問題は1つに絞られます。2次元での z2z^2 は何か。

ステップ2:2変数だと z2z^2 が作れない

2次元の点 (x,y)(x, y) が中心からどれだけ離れているかを測りたい。素朴にやるとこうなります。

z2=(xμxσx)2+(yμyσy)2z^2 = \left(\frac{x-\mu_x}{\sigma_x}\right)^2 + \left(\frac{y-\mu_y}{\sigma_y}\right)^2

xxyy を別々に標準化して足しただけです。両者が独立ならこれで正解ですが、相関があると間違った距離になります。その修正が「非対角成分」の仕事です。

正しい形は、σ\sigma で割る代わりに行列の逆行列を挟む形になります。

z2=(xμ)Σ1(xμ)z^2 = (\mathbf{x} - \boldsymbol{\mu})^\top \Sigma^{-1} (\mathbf{x} - \boldsymbol{\mu})

Σ\Sigma分散共分散行列です。2次元なら中身はこうなります。

場所中身意味
左上(対角)V[x]=σx2V[x] = \sigma_x^2xx 方向の広がり
右下(対角)V[y]=σy2V[y] = \sigma_y^2yy 方向の広がり
右上・左下(非対角)Cov[x,y]\mathrm{Cov}[x, y]2つが連動する度合い。今回の主役

ここが私の理解の転換点でした。1変数の 1/σ21/\sigma^2Σ1\Sigma^{-1} に置き換わっただけなのです。実際、1次元では Σ=[σ2]\Sigma = [\sigma^2] なので Σ1=1/σ2\Sigma^{-1} = 1/\sigma^2 となり、元の式に戻ります。

拡張ではなく、同じ式の書き換えでした。 過去問で手が止まったのは、この対応が見えていなかったからです。

試験で必要になるので、密度の全体も書いておきます。pp 変数の場合はこうです。

f(x)=1(2π)p/2Σ1/2exp(12(xμ)Σ1(xμ))f(\mathbf{x}) = \frac{1}{(2\pi)^{p/2} |\Sigma|^{1/2}} \exp\left(-\frac{1}{2}(\mathbf{x}-\boldsymbol{\mu})^\top \Sigma^{-1} (\mathbf{x}-\boldsymbol{\mu})\right)

前の係数にある Σ1/2|\Sigma|^{1/2}(行列式の平方根)が σ\sigma の多次元版です。1次元なら Σ1/2=σ|\Sigma|^{1/2} = \sigma に戻ります。幾何的には等確率楕円の広さに対応していて、Σ\Sigma が「大きい」ほど楕円が広がり、密度は薄くなります。ここも書き換えの対応が付いていました。

なお「z2z^2 が本質」というのは等高線の形が z2z^2 で決まるという意味に限定しておきます。exp\exp の部分を別の関数に替えると、同じ楕円形の等高線を持つ別の分布(楕円分布)になるので、exp\exp 自体が正規分布を特徴づけています。

ステップ3:非対角成分だけを動かす

対角成分と非対角成分の役割を分離するために、4通りを並べました。①②は非対角が 0、③④で非対角だけを入れています。

4枚のパネル。①分散1と1で非対角0、等確率楕円は真円。②分散2.25と0.36で非対角0、横に長い軸平行の楕円。③分散1と1で非対角0.8、右上に傾いた細長い楕円。④非対角−0.8で左上に傾いた楕円。各パネルに青の密度の等高線と黒い散布点、赤の等確率楕円3本

見るべき点は2つあります。

①→②で楕円は伸びるが傾かない。 つまり対角成分は「各軸方向の伸縮」しか担当していません。

②→③で楕円が傾く。 傾きを生むのは非対角成分だけです(非対角が 0 なら絶対に傾きません)。④は符号を反転させた場合で、傾きの向きが逆になります。

ただし傾きの角度そのものは対角成分にも依存します。非対角を 0.8 に固定しても、対角が (1, 1) なら 45.0 度、(2.25, 0.36) なら 20.1 度になります。だから②③は対角を揃えて比べています。また非対角は細長さも変えます(次の節で見ます)。

赤い線が等確率楕円で、内側から z2=1,4,9z^2 = 1, 4, 9 に対応します。1変数の 1σ・2σ・3σ の線が、2次元では楕円になったものです。

ただし対応するのは z2z^2 の値だけで、内側に入る確率は一致しません。 ここは混同しやすいので数値を並べます。

z2z^21次元で内側に入る確率2次元で楕円の内側に入る確率
168.3%39.3%
495.4%86.5%
999.7%98.9%

2次元の方が確率が小さくなります(次元が増えると外側に散らばるため)。2次元の確率は 1ez2/21 - e^{-z^2/2} で計算できます。これは後半で扱う χ²(2) の性質から出てきます。「2σ の楕円だから95%」とはならないので注意が必要でした。

図が正しいことの確認として、指定した Σ\Sigma から20万点を発生させ、標本共分散を計算し直しました。

指定した Σ\Sigma(左上, 右上, 左下, 右下)標本から計算した共分散
1, 0, 0, 11.003, −0.000, −0.000, 1.001
2.25, 0, 0, 0.362.247, −0.001, −0.001, 0.359
1, 0.8, 0.8, 11.000, 0.797, 0.797, 0.997
1, −0.8, −0.8, 10.998, −0.799, −0.799, 1.000

非対角成分の正体は「等確率楕円を傾ける唯一の担当」でした。 そしてこれが主成分分析そのものの伏線になります。あとで見るように、主成分分析がやるのは非対角成分を 0 にする座標に移ることだけなので。

共分散と相関係数を分けておく

ここで用語を整理します。私は最初この2つを混同していました。同じものを指しているように見えて、実は別の数字です。

ρ=Cov[x,y]σxσy\rho = \frac{\mathrm{Cov}[x,y]}{\sigma_x \sigma_y}

ρ\rho(ロー)が相関係数です。共分散をそれぞれの標準偏差で割っただけ。なぜ割る必要があるのかを数値で見ます。

記事10本について、平均滞在時間とスクロール率を並べたデータを使います。

記事12345678910平均
滞在時間(秒)3045506570859010511013078.0
スクロール率(%)2028253842455558627745.0

3枚のパネル。①生データの散布図で平均の交点を赤い破線で示し、各点から平均の交点までを対角とする緑の長方形が10個描かれている。共分散568.33で単位は秒·パーセント。②横軸を分に変えた同じ散布図で、点の配置は同じ形なのに共分散は9.472。③両軸を標準化した散布図で共分散が相関係数0.9887に一致

①の長方形が共分散の正体です。各点について「平均からの横のズレ × 縦のズレ」を長方形の面積(符号つき)として描き、その和を n1n-1 で割ったものが共分散です(不偏共分散)。nn で割る流儀もありますが、この記事では numpy.cov の既定に合わせて n1n-1 で割っています。

この例では負の点が1つもありません(9点が正、記事6は ssˉ=0s-\bar{s}=0 なので積がちょうど 0)。だから非常に強い正の相関になります。

積 = [1200, 561, 560, 91, 24, 0, 120, 351, 544, 1664]
和 = 5115
和 ÷ (10−1) = 568.3333   ← 図①の数値
(参考:和 ÷ 10 = 511.5。こちらは「平均」だが図の値とは違う)

①と②を見比べてください。 点の並びの形はまったく同じなのに、共分散が 568.33 から 9.472 に変わりました。秒を分にしただけです。

計算を1行ずつ追います。

単位
VV[滞在時間]1006.6667秒²
VV[スクロール率]328.2222
σ滞在=1006.6667\sigma_{\text{滞在}} = \sqrt{1006.6667}31.7280
σスクロール=328.2222\sigma_{\text{スクロール}} = \sqrt{328.2222}18.1169%
Cov\mathrm{Cov}[滞在, スクロール]568.3333秒·% ← 意味不明な単位
ρ=568.3333÷(31.7280×18.1169)\rho = 568.3333 \div (31.7280 \times 18.1169)0.988727なし(無次元)

共分散の単位は「秒·%」のような掛け算した単位になります。これでは大きさを比較できません。「568 は大きいのか」に答えられないのです。単位を変えるだけで数字が60分の1になってしまうので。

ρ\rhoσ\sigma で割ったことで無次元になります。だから大きさを比較できます。検証すると、秒→分に変えたとき共分散は 568.3333 → 9.4722(ちょうど 1/60)、ρ\rho は 0.988727 のまま不変でした。

そして ρ\rho必ず −1 以上 +1 以下に収まるのは、無次元だからではなくコーシー・シュワルツの不等式 Cov[x,y]σxσy|\mathrm{Cov}[x,y]| \le \sigma_x \sigma_y が成り立つからです。この2つは別の事実なので分けておきます(無次元でも有界でない量はあります。歪度がその例です)。

そしてここが重要です。相関行列 RR は「標準化してから作った Σ\Sigma」です。 別の道具ではありません。上の図③で見た通り、標準化すると分散が 1・共分散が ρ\rho になるので、Σ\Sigma を作り直すと自動的に RR になります。

Σ\Sigma(分散共分散行列)RR(相関行列)
対角成分1006.667 と 328.2221 と 1(必ず 1
非対角成分568.333(単位つき)0.988727(=ρ\rho
固有値1329.3164 と 5.57251.988727 と 0.011273
固有値の和1334.8892.000(=変数の数)

相関を強めると楕円が細長くなる

5枚のパネル。ρ=−0.9, −0.5, 0.0, 0.5, 0.9 の順で、ρ=0で真円、絶対値が大きくなるほど楕円が細長くなる。各パネルのタイトルに固有値が表示され、ρ=±0.9で1.90と0.10、±0.5で1.50と0.50、0で1.00と1.00

ρ=0\rho = 0 では真円、相関が強まるほど細長くなります。この図は対角成分を 1 に固定して非対角だけを動かしているので、非対角成分が細長さを変えていることが分かります(傾きはどれも45度のまま)。タイトルの固有値に注目してください。楕円の細長さ(アスペクト比)は λ1/λ2\sqrt{\lambda_1/\lambda_2}、つまり固有値のの平方根です(差ではありません)。ρ=0.9\rho = 0.9 なら 1.9/0.1=4.36\sqrt{1.9/0.1} = 4.36 倍の細長さになります。

ρ\rho固有値(大)固有値(小)理論値 1+ρ1+\vert\rho\vert / 1ρ1-\vert\rho\vert楕円の形
−0.91.900.101.90 / 0.10非常に細長い(左上向き)
−0.51.500.501.50 / 0.50やや細長い
0.01.001.001.00 / 1.00真円
+0.51.500.501.50 / 0.50やや細長い
+0.91.900.101.90 / 0.10非常に細長い(右上向き)

2変数の相関行列(対角が 1)の場合、固有値は 1+ρ1+\vert\rho\vert1ρ1-\vert\rho\vert という手計算できる形になります。上の表は numpy.linalg.eigh の実測値で、理論値と完全に一致しました。

これは2変数限定の話です。pp 変数で全ペアの相関が等しく ρ\rho の場合(等相関)は 1+(p1)ρ1+(p-1)\rho が1個と 1ρ1-\rhop1p-1 個になり、一般の相関行列ではこうした簡単な形にはなりません。実際、あとで扱う6指標の相関行列の固有値は 3.349, 2.560, 0.066, 0.025, 0.0002, 0.00004 で、1±ρ1\pm\vert\rho\vert の形をしていません。

固有値の和はどの行でも 2.00 で一定です。この「和が保存される」性質が、あとで寄与率の分母になります。

なぜ分散最大化が固有値問題になるのか

ここが今回の核心です。教科書は「ラグランジュの未定乗数法で解く」と書きますが、それではなぜ固有値が出てくるのかが見えません。順序を逆にします。まず総当たりで探して、一致に気づいてから理由を考えます。

やりたいことを図にする

主成分分析の目的を一文で言うと、2つの数字で表されているデータを1つの数字で表したい。情報の損失をできるだけ小さくして。

「1つの数字にする」とは、平面上の点を1本の直線の上に落とすことです(射影)。問題はどの向きの直線を選ぶかです。

選ぶ基準として「落とした後の分散が最大になる向き」を採ります。なぜ分散かというと、分散が大きい=点どうしがよく離れて残っている=元の違いが保たれているということなので。逆に分散が小さい向きに落とすと、全部が団子になって区別がつかなくなります。

先ほどの n=10 のデータ(滞在時間とスクロール率)で、角度を 0 度から 180 度まで 0.05 度刻みで 3601 通り試しました。

3枚のパネル。①中心化した10点の散布図に0度、45度、29.6度、90度の直線が引かれ、29.6度の線には各点から垂線が下りて赤い四角の射影点が並んでいる。②横軸が軸の角度、縦軸が射影後の分散の曲線で、29.6度で最大1329.3、119.6度で最小5.6。最大固有値1329.32と最小固有値5.57の水平破線。③極座標で全方向の分散を描いた8の字型

①で赤い線が「選ばれた向き」、赤い四角がそこに落とした点です。②が総当たりの結果で、29.6 度で最大 1329.3、119.6 度で最小 5.6 になりました。

この2つの角度差はちょうど 90.0000 度でした。偶然ではありません(後述します)。

③は同じことを極座標にしたものです。原点からの距離がその向きの分散です。この8の字の形が Σ\Sigma の形そのものです。

ここまで固有値を一切使っていません。 ただの総当たりです。にもかかわらず、②の破線を見てください。

総当たりで見つけた値Σ\Sigma の固有値
最大1329.3163041329.3164061.02×10⁻⁴
最小5.5725855.5724831.02×10⁻⁴
最大の角度29.6000°29.5841°0.016°

ぴったり一致します。 差はスキャンの刻み幅 0.05 度による誤差で、刻みを細かくすればいくらでも縮みます。

まず固有ベクトルを定義する

なぜ一致するのかを説明する前に、固有ベクトルを定義します。ここを飛ばすと先に進めません。

第22回で「行列を掛けても向きが変わらない方向」という言い方をしました。それを図にします。行列を「向きを入れると別の向きを返す装置」として見るのが要点です。

3枚のパネル。①長さ1のあらゆる向きを表す青い単位円と、そこから伸びる7本の矢印。②行列Mを掛けた出力で、円が斜めの楕円に変形し、各矢印が長さと向きを変えている。点線が入力から出力への移動を示す。③2本の固有ベクトルだけが向きを変えず長さだけ1.971倍と0.629倍に変わっている様子

この図だけは、見やすさのため穏やかな行列 M=(1.60.60.61.0)M = \begin{pmatrix} 1.6 & 0.6 \\ 0.6 & 1.0 \end{pmatrix} を使っています(実データの Σ\Sigma は相関 0.99 で楕円が潰れてしまうため)。

①→②で、行列を掛けると単位円が楕円に変形します。ほとんどの矢印は向きも長さも変わります。

ところが③を見ると、2本だけ向きが変わらず長さだけ変わる特別な向きがあります。これが固有ベクトル(eigenvector)で、その倍率が固有値(eigenvalue、λ\lambda)です。この例では 1.971 倍と 0.629 倍。

Σu=λu\Sigma \mathbf{u} = \lambda \mathbf{u}

左辺は行列を掛けた結果、右辺はただの定数倍です。実データの Σ\Sigma で確認しました。

u₁ = [−0.8696, −0.4937]
  Σu₁   = [−1156.016, −656.284]
  λ₁·u₁ = [−1156.016, −656.284]   一致

比較:固有ベクトルでない u = [1, 0] のとき
  Σu = [1006.667, 568.333]  ← [1, 0] の定数倍ではない(第2成分が生えた=向きが変わった)

核心:Σu\Sigma uuu とズレている限り、まだ分散を増やせる

分散を式にすると、Σu\Sigma u という掛け算が現れます。

(u 方向に落としたときの分散)=uΣu=u と Σu の内積(u \text{ 方向に落としたときの分散}) = u^\top \Sigma u = u \text{ と } \Sigma u \text{ の内積}

この式がどこから来るのかは次の節で導出します。いまは形だけ受け取ってください。

内積は「2つのベクトルがどれだけ同じ向きを向いているか × 長さ」です。つまり uuΣu\Sigma u の関係が分散を決めている。そこで筋道はこうなります ── まず「向きが完全に揃う方向」を探し、そのうち分散が大きいものを選ぶ

6枚のパネル。u=0度、15度、29.6度、45度、70度、90度のそれぞれで、青い矢印uと赤い矢印Σuが原点から伸びている。両者の角度差が紫の弧でズレとして表示され、0度でズレ29.4度・分散1006.7、15度でズレ14.5度・分散1245.4、29.6度でズレ0度・分散1329.3を赤枠で強調、45度でズレ15.3度・分散1235.8、70度でズレ40.2度・分散772.9、90度でズレ60.0度・分散328.2

紫の弧が uuΣu\Sigma u のズレです。ズレが 0 のところで分散が停留していることを確認してください(この図の範囲では最大になっていますが、範囲を広げると事情が変わります。次の節で扱います)。

uu の角度uuΣu\Sigma u のズレ分散
29.45°1006.67
15°14.52°1245.39
29.5841°0.00°1329.32 ← 最大
45°15.35°1235.78
70°40.21°772.90
90°59.99°328.22

答えはこうです。 分散は「uuΣu\Sigma u の内積」なので、Σu\Sigma uuu からズレている限り、uu をズレの方向へ少し回せば分散を動かせます。動かせなくなる(=停留する)のは、回す先がなくなったとき、つまり Σu\Sigma uuu と完全に平行になったときです。

「平行である」を式で書いたものが Σu=λu\Sigma u = \lambda u ── 固有値問題の定義そのものです。

だから「分散を最大にする方向を探す」問題は、探し方を工夫した結果として固有値問題になるのではなく、停留する条件を書き下すと自動的に固有値問題の形になるのでした。ここが納得できた瞬間、この章の見通しが一気に良くなりました。

ただし「ズレ0=最大」ではない(査読で気づいた誤り)

最初に書いたとき、私は「ズレが小さいほど分散が大きい」と説明していました。これは誤りです。 上の表が 0〜90 度しかサンプルしていないので、たまたま単調に見えていただけでした。範囲を広げて測り直します。

uu の角度ズレ分散
110°78.99°42.27
115°82.42°14.03
119.5841°0.00°5.57 ← 最小なのにズレ0
125°82.05°17.36
135°73.71°99.11

最小固有値の方向でも、ズレはちょうど 0 です。 115 度(ズレ 82.42 度)で分散 14.03 なのに、119.58 度(ズレ 0 度)で分散 5.57 まで下がっています。ズレが減る方向に分散も減っている。

Σu=λu\Sigma u = \lambda u停留点の条件であり、最大・最小の両方(変数が3個以上なら鞍点も)が該当します。固有値問題は「最大の条件」ではなく「停留の条件」を与えているわけです。

そのうえで、どの停留点がどれかは固有値の大小で決まります。

方向固有値何か
29.5841°λ1\lambda_1 = 1329.32最大(第1主成分)
119.5841°λ2\lambda_2 = 5.57最小(2変数なので第2主成分)

だから実際に第1主成分を求めるときは、平行になる方向を全部(p 本)見つけて、そのうち固有値が最大のものを選ぶという手順になります。「最大固有値を使う」という言い方の意味がここでようやく分かりました。

λ\lambda が分散そのものになる理由

上の式に Σu=λu\Sigma u = \lambda u を代入するだけです。

分散=uΣu=u(λu)=λ(uu)=λ1=λ\text{分散} = u^\top \Sigma u = u^\top (\lambda u) = \lambda (u^\top u) = \lambda \cdot 1 = \lambda

uu は長さ1に決めてあるので uu=1u^\top u = 1。よって固有値がそのまま「その主成分の分散」です。これが「最大固有値を使う」理由であり、あとで寄与率の話につながります。

uΣuu^\top \Sigma u はどこから来たのか

ここは飛ばしやすい箇所ですが、飛ばすと納得できません。uΣuu^\top \Sigma u は定義ではなく、導ける事実です。

定義なのは内積だけ

まず記号です。u\mathbf{u} は「向き」を表す2つの数字の組で、^\top(転置)は「縦に並んだものを横に倒す」記号です。そして横ベクトル × 縦ベクトルは「成分ごとに掛けて足す」という約束になっています。

ux=uxx1+uyx2u^\top \mathbf{x} = u_x x_1 + u_y x_2

これが内積の定義です。 ここだけが定義で、あとは全部これの組み合わせです。

そして幾何的な意味はこうです。uu の長さが1のとき、uxu^\top x「点 xxuu の直線上に垂直に落としたときの、原点から見た符号つきの座標」になります。これが射影です。

「距離」と書きたくなりますが、距離は負にならないので不正確です。uu の向きと逆側に落ちた点は負の値になります(次の表で y1=51.6188y_1 = -51.6188 のように負が並ぶのはこのためです)。

段階1:各点を45度の軸に落とす

u=45°u = 45° の場合を、10点すべてについて計算します。

3枚のパネル。①中心化した散布図に45度の赤い直線、点10(52,32)から紫の破線で垂直に落ちた射影点が赤い四角で示され、原点からの距離59.40が注記されている。②落とした10個の値を1次元の数直線上に赤い点で並べたもの、分散1235.78。③3項への分解の棒グラフで503.3と568.3と164.1、合計1235.78の水平破線

it−t̄s−s̄yi=ux(ttˉ)+uy(ssˉ)y_i = u_x(t-\bar{t}) + u_y(s-\bar{s})yiy_iyi2y_i^2
1−48−250.7071×(−48) + 0.7071×(−25)−51.61882664.50
2−33−170.7071×(−33) + 0.7071×(−17)−35.35531250.00
3−28−200.7071×(−28) + 0.7071×(−20)−33.94111152.00
4−13−70.7071×(−13) + 0.7071×(−7)−14.1421200.00
5−8−30.7071×(−8) + 0.7071×(−3)−7.778260.50
6700.7071×7 + 0.7071×04.949724.50
712100.7071×12 + 0.7071×1015.5563242.00
827130.7071×27 + 0.7071×1328.2843800.00
932170.7071×32 + 0.7071×1734.64821200.50
1052320.7071×52 + 0.7071×3259.39703528.00
合計≈011122.00

図①が射影の様子です。点10(52, 32)を45度の線に垂直に落とすと、原点からの距離が 59.40 になります。表の y10y_{10} と同じ数字です。

図②が結果です。落とした後はただの1変数(10個の数字が数直線上に並んだだけ)。

段階2:定義通りに分散を計算する

特別なことは何もしません。第3回でやった分散の定義そのままです。平均が 0 なので、偏差は値そのものです。

分散=11122.0000101=1235.777778\text{分散} = \frac{11122.0000}{10-1} = 1235.777778

段階3:uΣuu^\top \Sigma u で計算する

いっぽう、射影を1回もせずに Σ\Sigmauu だけから出します。

Σ = [[1006.6667, 568.3333], [568.3333, 328.2222]]

まず Σu を計算(行列 × 縦ベクトル = 各行と内積を取る)
  1行目: 1006.6667×0.7071 + 568.3333×0.7071 = 1113.6932
  2行目:  568.3333×0.7071 + 328.2222×0.7071 =  633.9605
  → Σu = [1113.6932, 633.9605]

次に u と Σu の内積
  0.7071 × 1113.6932 + 0.7071 × 633.9605 = 1235.777778

段階2 = 1235.777778、段階3 = 1235.777778、差 = 0.00。 同じ数になりました。だから uΣuu^\top \Sigma u は定義ではなく、計算すると一致するという事実です。

45度だけの偶然ではないことを、10度刻みで確認しました。

uu の角度射影して分散を計算uΣuu^\top \Sigma u
1006.6666671006.666667
30°1329.2466601329.246660
60°990.024438990.024438
90°328.222222328.222222
120°5.6422295.642229
150°344.864451344.864451

最大の差は 4.55×10⁻¹³(倍精度計算の丸め誤差)。全角度で一致します。

なぜ一致するのか:第3回とつながる

uΣuu^\top \Sigma u を展開すると、3つの項になります。

uΣu=ux2V[t]+2uxuyCov[t,s]+uy2V[s]u^\top \Sigma u = u_x^2 V[t] + 2 u_x u_y \mathrm{Cov}[t,s] + u_y^2 V[s]
計算
ux2V[t]u_x^2 V[t]0.7071² × 1006.6667503.333333
2uxuyCov2 u_x u_y \mathrm{Cov}2 × 0.7071 × 0.7071 × 568.3333568.333333
uy2V[s]u_y^2 V[s]0.7071² × 328.2222164.111111
合計1235.777778

これは第3回でやった公式そのものです。

V[aX+bY]=a2V[X]+2abCov[X,Y]+b2V[Y]V[aX + bY] = a^2 V[X] + 2ab\,\mathrm{Cov}[X,Y] + b^2 V[Y]

射影 y=uxt+uysy = u_x t + u_y s「2つの変数の重み付き足し算」にすぎません。だからその分散は第3回の公式で計算できます。uΣuu^\top \Sigma u は、この公式を行列で書き直した略記でした。 新しい概念ではありませんでした。

「内積」と呼ぶと何が便利なのか

uΣuu^\top \Sigma uu(Σu)u^\top (\Sigma u) と読むと、内積のもう1つの表し方が使えます。

u(Σu)=u×Σu×cos(なす角)=Σu×cos(ズレ角)u^\top (\Sigma u) = |u| \times |\Sigma u| \times \cos(\text{なす角}) = |\Sigma u| \times \cos(\text{ズレ角})

u=1|u| = 1 なので消えます。実データで検証しました。45度のとき Σu=1281.4907|\Sigma u| = 1281.4907、ズレ角 15.3497 度、cos=0.964328\cos = 0.964328。掛けると 1235.777778 で完全一致です。

これで前の節の議論がつながります。 ズレ角が動くと cos\cos が動くので分散も動く。逆にズレ角 0 度では cos\cos が停留するcos\cos の微分がそこで 0 になる)ので、分散も停留します。厳密には分散は Σu×cos|\Sigma u| \times \cos という積なので Σu|\Sigma u| 側も確認が必要ですが、こちらもその点で停留しています(29.58度の前後で 1329.266 → 1329.316 → 1329.266)。だから停留の条件が「平行」、つまり Σu=λu\Sigma u = \lambda u になるのです。

なお cos(0°)=1\cos(0°) = 1 は最大ですが、分散が最大になるとは限りません。分散は Σu×cos(ズレ角)|\Sigma u| \times \cos(\text{ズレ角}) という積なので、Σu|\Sigma u| の方が小さければ全体は小さくなります。実際、最小固有値の方向では cos=1\cos = 1 でも Σu=λ2=5.57|\Sigma u| = \lambda_2 = 5.57 しかありません。

第22回の固有ベクトルと同じものか

私が気になっていた点です。同じ道具で、使い方が違うという理解で正しいです。ただし「何を表す行列か」が違うので整理します。

第22回:マルコフ連鎖今回:主成分分析
行列の中身推移確率行列 PP(状態 i から j へ移る確率)分散共分散行列 Σ\Sigma
行列の性質各行の和が 1。対称でない対称Cov[x,y]=Cov[y,x]\mathrm{Cov}[x,y]=\mathrm{Cov}[y,x])かつ半正定値
使う固有値λ=1\lambda = 1最大の λ\lambda(次に2番目…)
なぜその固有値か「掛けても変わらない」=分布が動かない状態を探しているから。1 という値に意味があるλ\lambda がそのまま分散なので、大きいほど情報が多い。値の大小に意味がある
固有ベクトルの意味定常分布(確率の配分)主成分の向き(座標軸)
固有値は実数か複素数になりうる(非対称だから)。eig が必要必ず実数、しかも 0 以上。異なる固有値の固有ベクトルは必ず直交eigh が使える

対称行列であることが決定的です。 Σ\Sigma は対称なので、固有ベクトルが必ず直交することが数学的に保証されます。だから総当たりのスキャンで、最大 29.6 度と最小 119.6 度の差がちょうど 90.0000 度になったわけです。偶然ではなく対称性の帰結でした。

これが「第2主成分は第1主成分と直交する」という性質の出どころです。

ただし正確に言うと、第2主成分の定義は「第1主成分と直交する方向のうち分散が最大のもの」で、直交は制約として課されています。ポイントは制約付きの解がちょうど第2固有ベクトルになり、それが自動的に第1主成分と直交していることです(制約を外せば第1主成分がもう一度出てくるので、制約自体は効いています)。直交性を人為的に押し付けた結果ではない、という意味で理解しておきます。

なお固有値が重複する場合(真円のように λ1=λ2\lambda_1 = \lambda_2)は固有ベクトルの選び方に自由度が出ますが、その中から直交する組を選べることは保証されています。

2×2 の固有値を手で求める

線形代数の計算に自信がなかったので、実データで型を1回通しました。2×2 なら3ステップです。

  1. トレース(対角の和)を出す:tr=1006.6667+328.2222=1334.8889\mathrm{tr} = 1006.6667 + 328.2222 = 1334.8889
  2. 行列式を出す:det=1006.6667×328.2222568.33332=7407.5926\det = 1006.6667 \times 328.2222 - 568.3333^2 = 7407.5926
  3. λ2trλ+det=0\lambda^2 - \mathrm{tr}\cdot\lambda + \det = 0 を解の公式で解く
判別式 = 1334.8889² − 4 × 7407.5926 = 1752297.9753,  √ = 1323.7439
λ = (1334.8889 ± 1323.7439) / 2
  λ₁ = 1329.3164   λ₂ = 5.5725

numpy.linalg.eigh の結果: λ₁ = 1329.316406, λ₂ = 5.572483   一致

検算が2本あります。 試験で計算ミスを見つけるのに使えます。

検算左辺右辺
固有値の和 = トレース1329.3164 + 5.5725 = 1334.88891334.8889一致
固有値の積 = 行列式1329.3164 × 5.5725 = 7407.59267407.5926一致

固有ベクトルは (Σλ1I)u=0(\Sigma - \lambda_1 I)\mathbf{u} = 0 の1行目を書くだけです。

(1006.6667 − 1329.3164)·u_x + 568.3333·u_y = 0
→ u_y / u_x = −(1006.6667 − 1329.3164) / 568.3333 = 0.567712  (=傾き)
→ 角度 = arctan(0.567712) = 29.5841°   ← 総当たりで見つけた 29.6° と一致
→ 長さ1に正規化: [0.869632, 0.493701]

eigh の出力: [−0.869632, −0.493701]   ← 符号が逆だが同じ直線

符号は決まりません。 uu が固有ベクトルなら u-u も固有ベクトルです(Σ(u)=λ(u)\Sigma(-u) = \lambda(-u))。だから主成分の「向き」は決まりますが「正の側がどちらか」は決まりません。ソフトによって主成分得点の符号が反転することがあるのはこのためで、解釈上の意味はありません。

主成分分析は「非対角成分を 0 にする座標変換」

ここで最初の伏線を回収します。主成分の座標に移ってから分散共分散行列を計算し直すと、こうなります。

元の座標での Σ = [[1006.667, 568.333], [568.333, 328.222]]

主成分得点 Z = X_中心化 · V を計算して、その共分散行列:
[[1329.316406, −0.000000], [−0.000000, 5.572483]]
  非対角成分の実測値 = −8.095 × 10⁻¹⁴(数値誤差。実質 0)

主成分分析の正体は「非対角成分が 0 になる座標系に移ること」でした。 楕円が傾いていた座標から、楕円の軸に沿った座標へ乗り換える。

非対角成分が 0 ということは主成分どうしは無相関です。これが「多重共線性の回避」に使える理由です(相関がある変数を、相関のない変数に組み替えたわけなので)。

なお無相関は独立とは違います。共分散が 0 でも独立とは限りません(元のデータが多変量正規分布に従うなら無相関から独立が導けますが、一般には導けません)。主成分分析が保証するのは無相関までです。

そして分散の総量は保存されます。

元の座標: V[滞在] + V[スクロール] = 1006.666667 + 328.222222 = 1334.888889
主成分の座標: λ₁ + λ₂ = 1329.316406 + 5.572483 = 1334.888889   完全一致

座標を回してもばらつきの総量は変わりません(対角成分の和=トレースが保存される)。変わるのはその総量をどう配分するかだけです。元の座標では 1006.7 と 328.2 に分かれていたものが、主成分の座標では 1329.3 と 5.6 という極端な配分になりました。

寄与率はなぜ「説明できた割合」になるのか

ここから変数を増やします。記事12本について6つの指標を並べたデータを使います(実際のアクセス解析の構造に寄せた架空データ)。

記事PVセッション平均滞在秒スクロール率%直帰率%被リンク数
ふるさと納税202542003100185723814
信用取引リスク1850142021078329
Jamstack入門98076016565456
Obsidian運用120091024082287
統計検定準1級①62048032088224
統計検定準1級②54041029585253
Serafina3102609542681
Ventuno2802308838711
AWS移行記録75058027580305
ふるさと納税計算24001800155684111
KaTeX導入43034023076342
GA4設定89068019874364

前節で確認した通り、分散の総量は座標を回しても保存されます。ここが割合の分母になります。

3枚のパネル。①標準化後の6指標の分散がすべて1.00で合計6。②主成分の座標での分散(固有値)が3.349, 2.560, 0.066, 0.025, 0.0002, 0.0000で合計は同じ6.0、λ=1のカイザー基準の破線つき。③棒が各主成分の寄与率、赤い折れ線が累積寄与率で第1が55.81%、第2までで98.47%

①→②が要点です。標準化すると各指標の分散はどれも 1 になり、合計 6。主成分の座標に移ると 3.349, 2.560, 0.066, 0.025, 0.0002, 0.0000 になりますが、合計は 6.000 のままです。

寄与率=λkλ=3.3488576.000000=0.558143\text{寄与率} = \frac{\lambda_k}{\sum \lambda} = \frac{3.348857}{6.000000} = 0.558143

総量が変わらず配分だけが変わるので、「第1主成分が総量の何割を取ったか」が意味のある割合になります。

決定係数との関係は「類比」ではなく「同じもの」だった

私が確かめたかったのはここです。「第16回の決定係数と似た話なのか」。似ているどころではありませんでした。

k 個の主成分だけで元データを復元して、残差を測りました。

全分散 = 6.000000
k個で復元した予測値 X̂ = Z_1..k · V_1..k^⊤
説明率 = 1 − (残差の分散 ÷ 全分散)   ← 決定係数と同じ形
k(使う主成分の数)復元から計算した説明率累積寄与率
10.5581428870.558142887
20.9847265990.984726599
30.9957642960.995764296
40.9999602740.999960274
50.9999933180.999993318
61.0000000001.000000000

小数第9位まで一致しました。 決定係数が R2=1SSres/SStotR^2 = 1 - SS_{res}/SS_{tot} だったのと同じ構造で、累積寄与率は「主成分で近似したときの決定係数」です。

違いは1点だけです。回帰では yy という目的変数への当てはまりを測り、主成分分析ではデータ自身への当てはまりを測る。測り方の構造は完全に同じでした。

ただしこの一致には条件が2つあります(自分で試して気づきました)。

(1) 主成分分析と同じ計量で残差を測ること。 「相関行列で主成分分析したのに、残差は生の単位で測る」という取り違えをすると、k=1 で 0.5553 になり累積寄与率 0.5581 とずれます。

(2) 全変数を合計した分散に対する割合であること。 変数ごとの R2R^2 は一致しません。

指標k=1 での変数別 R2R^2
PV0.5561
セッション0.5554
平均滞在秒0.3329
スクロール率%0.6088
直帰率%0.6130
被リンク数0.6826
平均0.558143 ← 累積寄与率と一致

一致するのは平均だけです。 平均滞在秒は 0.333 しか復元できていません。だから「第1主成分で各指標が56%説明できる」と読むのは誤りで、正しくは「全体を平均すると56%」です。この性質はフロベニウスノルムでの最良近似(Eckart-Young の定理)から来ています。

主成分をいくつ残すか

2枚のパネル。左はスクリープロットで固有値3.349, 2.560, 0.066以降ほぼ0の折れ線、λ=1のカイザー基準の破線、第2で折れる肘の注記。右は同じものを対数目盛で描き、第5第6がほぼ0であることが見える

スクリープロットは固有値を大きい順に並べた図です。「急に落ちて平らになる場所(肘)」の手前までを採用します。この例では第2主成分の後で崖のように落ちているので2個。

右の対数目盛版を見ると、第5・第6主成分の固有値が 0.0002 と 0.00004 でほぼ 0 です。これは指標の間にほぼ完全な線形関係があることを意味します。

ほぼ 0 の固有値が2つあるので、ほぼ完全な線形関係が2本あるはずです(必ずしも2変数のペアとは限りません)。固有ベクトルを見ると、この例では2組のペアでした。

主成分固有値主に担っている変数その相関
第6(最小)0.00004PV(−0.671)とセッション(+0.700)0.9999
第50.0002スクロール率(−0.680)と直帰率(−0.691)−0.9998

最小固有値の固有ベクトルは「ほぼ一定になってしまう線形結合」を表します。 PV とセッション(相関 +0.9999)では符号が逆になってを取り、スクロール率と直帰率(相関 −0.9998)では同符号になってを取っています。負の相関なら和がほぼ一定になるので、符号の付き方が逆になります。

どちらもその線形結合がほぼ一定=その方向にばらつきがないという同じ関係です。

基準考え方この例での答え
カイザー基準相関行列の固有値が 1 を超えるものを残す。「1つの指標分(=標準化後の分散1)より多くを説明していなければ、まとめる意味がない」という理屈2 個
スクリープロット固有値の折れ線の「肘」を目で探す2 個
累積寄与率 80%目的に応じた閾値で切る2 個
累積寄与率 90%同上2 個

カイザー基準には注意点があります。「固有値 > 1」は相関行列を使ったときだけ意味を持ちます。分散共分散行列の固有値は単位に依存するので(この例では 1989946 など)、1 と比べても無意味です。

またスクリープロットの「肘」の判断は主観的です。この例は差が極端なので明快ですが、なだらかに減る場合は人によって答えが変わります。複数の基準を併用し、最後は解釈可能性で決めるのが実務です。

主成分得点と主成分負荷量

混同しやすい2つなので先に分離します。どちらも「主成分と何かの関係」を表す数字ですが、対象が違います。

対象個数意味
主成分得点個体(この例では記事)n 個「この記事は第1主成分の値がいくつか」
主成分負荷量変数(この例では指標)p 個「この指標は第1主成分とどれくらい相関しているか」

見分け方は簡単です。得点は記事12本ぶん、負荷量は指標6個ぶんあります。

主成分得点(記事ごと・12個)

記事第1主成分第2主成分
ふるさと納税2025+3.0595+2.9347
信用取引リスク+1.2761+0.3730
ふるさと納税計算+1.1264+1.7696
Obsidian運用+0.9193−0.6822
統計検定準1級①+0.8404−2.1958
AWS移行記録+0.4170−1.3147
統計検定準1級②+0.3948−2.0233
GA4設定−0.2550−0.4749
KaTeX導入−0.5611−1.2924
Jamstack入門−0.5937+0.4317
Serafina−3.1888+1.1400
Ventuno−3.4348+1.3344
第1主成分得点の分散 = 3.348857   ← 固有値 λ₁ と一致
第1と第2の相関 = 9.89×10⁻¹⁷      ← ほぼ0(無相関)

主成分負荷量(指標ごと・6個)

負荷量は「主成分と元の変数の相関係数」です。だから必ず −1 〜 +1 に収まります。

指標固有ベクトルの成分第1主成分の負荷量第2主成分の負荷量
PV+0.407515+0.745748+0.658667
セッション+0.407257+0.745276+0.660777
平均滞在秒+0.315297+0.576990−0.798022
スクロール率%+0.426384+0.780278−0.619912
直帰率%−0.427829−0.782922+0.616545
被リンク数+0.451464+0.826173+0.536449

負荷量には計算式があります。ただし適用条件があるので一般形から書きます

負荷量jk=ujkλksj\text{負荷量}_{jk} = \frac{u_{jk}\sqrt{\lambda_k}}{s_j}

sjs_j は変数 jj の標準偏差です。相関行列で主成分分析した場合は sj=1s_j = 1(標準化済みなので)なので、分母が消えて次の形に簡約されます。

負荷量=固有ベクトルの成分×固有値\text{負荷量} = \text{固有ベクトルの成分} \times \sqrt{\text{固有値}}
例(相関行列版): PV → 0.407515 × √3.348857 = 0.745748
                   実測の相関係数も 0.745748   全6変数で一致

検算1:第1主成分の負荷量の2乗和 = 3.348857 = λ₁
検算2:各変数について全主成分の負荷量2乗の和 = すべて 1.000000

簡約形を共分散行列版に使うと壊れます。 同じデータを共分散行列で主成分分析して確かめました。

共分散行列版で u_j × √λ₁ を計算すると:
  [1136.67, 835.37, −6.26, 2.67, −2.69, 3.87]   ← ±1 を大きく超える

s_j で割った正しい形なら:
  [0.99999, 0.99995, −0.0859, 0.1692, −0.1725, 0.9536]
  実際の相関係数と一致

上の検算1は標準化した場合限定です(共分散行列版では負荷量2乗和が 2.975 で λ₁=1989946 とまったく合いません)。検算2は一般形を使えばどちらでも成立します(共分散版でも6変数すべて 1.000000 を確認)。

この記事では以降すべて相関行列を使うので簡約形で通しますが、式を持ち出すときは前提を確認する必要があります

係数と負荷量の使い分けを押さえておきます。固有ベクトルの成分は「主成分を作るときの重み」、負荷量は「主成分と変数の相関」です。解釈には負荷量を使うのが普通です。相関係数なので大きさの比較がしやすく、絶対値が 0.7 を超えれば「その主成分はその変数を強く反映している」と言えます。

バイプロット:得点と負荷量を1枚に重ねる

バイプロット。横軸が第1主成分(寄与率55.8%)、縦軸が第2主成分(寄与率42.7%)。青い点が12記事の主成分得点で、右上にふるさと納税2025、左にSerafinaとVentuno、下部に統計検定準1級①②。赤い矢印が6指標の負荷量で、PVとセッションがほぼ完全に重なって右上、平均滞在秒とスクロール率が右下、直帰率が左上

読み方は「矢印の向きに位置する記事は、その指標が高い」です。

PV とセッションの矢印がほぼ完全に重なっていることに注目してください。相関 0.9999 なので当然ですが、この2つは実質的に同じ情報だと図から一目で分かります。「6指標のうち実質何個分の情報があるか」という問いの答えでもあります。

直帰率だけが逆向きなのは、他の指標と負の相関があるからです(直帰率が高い記事は PV も滞在時間も低い)。

主成分に意味付けをしていいのか

ここは私が最も疑っていた点です。「第1主成分は総合力を表す」という説明をよく見かけますが、それは恣意的ではないのか。

結論から言うと恣意的になり得ます。 ただし「だから解釈してはいけない」わけでもないので、線を引きます。

この例で解釈を試みると

負荷量のパターン解釈の候補
第1主成分被リンク数 +0.826/スクロール率 +0.780/直帰率 −0.783/PV +0.746/セッション +0.745/滞在秒 +0.577直帰率以外が全部同じ符号で大きさも近い → 「記事の総合的な良さ」のような軸
第2主成分セッション +0.661/PV +0.659 が正、滞在秒 −0.798/スクロール率 −0.620 が負「集客力」と「読まれ方」が逆を向いている「広く浅く読まれる ↔ 狭く深く読まれる」の軸

第2主成分の解釈はバイプロットで裏が取れます。ふるさと納税系の記事(PV が多く滞在時間が短い)が上、統計検定の記事(PV は少なく滞在時間が長い)が下に来ています。得点表を見ると統計検定準1級① が −2.1958、② が −2.0233 で最も下です。

恣意性の核心(3点)

(1) 主成分は「分散が最大」という数学的基準だけで決まっています。 「総合力」という意味を先に決めて探したのではなく、出てきた軸に後から名前を付けています。名前は解釈者の産物であって、データが主張したものではありません。

(2) 符号に意味はありません。 固有ベクトルの符号は任意なので、ソフトによって第1主成分の正負が反転します。「高いほど良い」は保証されず、負荷量の符号を見て自分で決める必要があります。

(3) 第1主成分が「総合力」に見えるのは、たまたま全変数が同符号だったからです。 指標をすべて「大きいほど良い」向きに揃えて集めれば、相関が全部正になり、第1主成分は自動的に「全体的な大きさ」を拾います。これは発見ではなく、指標の選び方の帰結です。

だから解釈は仮説を立てる道具として有用ですが、検証された事実ではありません。「第1主成分は総合力を表すと解釈できる」までが誠実な言い方で、「総合力である」は踏み越えています。名前を付けたら、その名前が妥当かを別のデータで確認すべきです。

相関行列か分散共分散行列か

3枚のパネル。①分散共分散行列を使った場合の第1主成分の係数で、PVが0.8058、セッションが0.5922、他の4指標はほぼ0、寄与率99.71%。②相関行列を使った場合で6指標の係数が0.32から0.45の範囲に分散、寄与率55.81%。③元の分散を対数目盛で表示、PVが1292063、被リンク数が16で約8万倍の差

①と②で第1主成分の中身がまったく違います。 ①(分散共分散行列)では PV とセッションだけで決まっており、他の4指標の係数はほぼ 0(平均滞在秒は −0.0044)。②(相関行列)では6指標が 0.32〜0.45 に分散しています。

③が理由です。PV の分散は 1,292,063、被リンク数は 16。約8万倍の差があります。分散を最大にする方向を探しているので、分散が桁違いに大きい変数の方向が自動的に選ばれるわけです。

決定的な違い:単位を変えると結果が変わるか

PV の単位を「PV」から「千PV」に変えただけで再計算:

  Σ版の第1寄与率: 99.7066% → 99.1828%   変わる
  R版の第1寄与率: 55.8143% → 55.8143%   変わらない(固有値が全て一致)

原則として相関行列(=標準化する)を使います。 理由は上の通りで、Σ\Sigma 版の結果は単位の選び方という恣意的なものに左右されるからです。「結果が変わるのはなぜか」の答えは、Σ\Sigma 版が「分散の絶対的な大きさ」を、RR 版が「相関の構造」を見ているからです。

分散共分散行列を使うのは、全変数が同じ単位で、かつ分散の差そのものに意味があるときです。たとえば同一試験の各科目の点数(すべて100点満点)で「ばらつきの大きい科目こそ重要」と考える場合。逆に言えば、単位が混在していたら選択の余地はなく相関行列です。この例の PV(回)と直帰率(%)のように。

分散共分散行列 Σ\Sigma相関行列 RR
固有値の合計元の分散の合計(この例 1,995,802)必ず変数の数 p(この例 6)
単位を変えると結果が変わる変わらない
大きい分散の変数支配してしまう対等に扱われる
カイザー基準使えない使える(λ>1\lambda > 1
使う場面同一単位+分散差に意味があるとき通常はこちら

マハラノビス距離:ばらつきの形をものさしに組み込む

等確率楕円の話をここで回収します。「この記事は異常だ」と判定したいとき、素朴には中心から遠い点を探せばよさそうです。それがユークリッド距離です。

dE=(x1μ1)2+(x2μ2)2d_E = \sqrt{(x_1-\mu_1)^2 + (x_2-\mu_2)^2}

ところがこれだと困ります。滞在時間とスクロール率のデータ(n=62、相関 0.928)に2点を仕込みました。

滞在秒スクロール率%どういう記事か
A320100滞在時間が長くスクロールもされている。相関の傾向に沿ってとても優秀な記事
B30055滞在時間は長いのにスクロールされていない。傾向から外れている

異常として検出したいのは B です。 A はただ優秀なだけで異常ではありません。

実測:順位が逆転する

中心(平均)= (175.790, 65.955)   相関係数 = 0.928300

ユークリッド距離:  点A = 148.17   点B = 124.69   → A の方が遠い
マハラノビス距離:  点A =   2.30   点B =   7.05   → B の方が遠い(逆転)

外れ値トップ5を並べると、順位そのものが入れ替わります。

順位ユークリッド距離で選ぶとマハラノビス距離で選ぶと
1(320, 100.0) d=148.17 ←点A(300, 55.0) d=7.05 ←点B
2(33, 33.6) d=146.41(320, 100.0) d=2.30 ←点A
3(41, 37.1) d=137.84(33, 33.6) d=2.23
4(300, 55.0) d=124.69 ←点B(41, 37.1) d=2.09
5(61, 40.0) d=117.69(246, 90.2) d=1.96

ユークリッド距離では B が4位まで落ちます。 本当に見つけたい異常が埋もれてしまう。5%基準で判定すると、マハラノビス距離では点B ただ1点だけが外れ値と判定されました(意図通りです)。

3枚のパネル。①ユークリッド距離の等距離線が真円で、点Aが円の外側、点Bが内側。相関の強い細長いデータ雲に対して円は形が合っていない。②マハラノビス距離の等距離線が細長い傾いた楕円で、点Aは楕円の内側、点Bは楕円の外側。③主成分の座標で各軸を√λで割ると楕円が円に戻り、点Bが第2主成分方向に6.81σ離れていることが見える

①が問題の可視化です。データは相関 0.928 なので細長い雲になっています。ところがユークリッド距離の等距離線は真円。雲の形と円の形が合っていないので、「雲に沿って遠い点」と「雲から外れた点」を区別できません。

②ではものさしが雲と同じ形の楕円になっています。だから A は楕円の内側(正常)、B は外側(異常)と正しく判定されます。

③が正体です。 主成分の座標に移して各軸を λ\sqrt{\lambda} で割ると、楕円が円に戻ります

マハラノビス距離は「主成分の座標で、各方向を σ\sigma で割ってから測ったユークリッド距離」でした。 実測で確認すると、主成分座標を λ\sqrt{\lambda} で割ってからユークリッド距離を計算した値と、マハラノビス距離の最大の差は 2.66×10⁻¹⁵(完全一致)。

これは1変数の z=(xμ)/σz=(x-\mu)/\sigma の多次元版です。記事の最初で「1変数の正規分布で本質的なのは z2z^2 だけ」と確認しましたが、その z2z^2 がまさにマハラノビス距離の2乗でした。多次元正規分布の指数部に名前が付いただけです。

数字で見る「なぜ B が異常か」

第1主成分の標準偏差 = √4344.57 = 65.91(雲の長い方向)
第2主成分の標準偏差 = √29.62   =  5.44(雲の細い方向)

点A: 第1主成分方向に −2.25σ、第2主成分方向に −0.48σ → どちらも常識的な範囲
点B: 第1主成分方向に −1.81σ、第2主成分方向に +6.81σ → 異常

ここが核心です。点B は生の単位で見ると、第2主成分方向に 37.09 しかズレていません。点A のズレ(148.15)よりずっと小さい。ところが第2主成分方向の標準偏差は 5.44 しかないので、37.09 ÷ 5.44 = 6.81σ という異常な値になります。

「ばらつきが小さい方向でのズレは、生の単位が小さくても異常度が高い」 ── これがマハラノビス距離が測っているものです。

χ²分布との接続(第7回の回収)

「距離 7.05 は大きいのか」に答えるには基準が必要です。データが多次元正規分布に従うなら、マハラノビス距離の2乗は χ²分布に従います(自由度=変数の数)。

3枚のパネル。①ユークリッド距離とマハラノビス距離の散布図で、点Aが右下(遠いが正常)、点Bが左上(近いが異常)に位置し単調な関係にならないことを示す。②マハラノビス距離の2乗のヒストグラムにχ²(2)の理論密度を重ねた図で、実測の平均は1.967(χ²(2)の平均2ではない)。③マスキング効果の棒グラフで点Bが汚染されたΣでは7.05、きれいなΣでは17.05と2.4倍に増える

①は2つの距離が単調な関係にならないことの証拠です。右下(ユークリッドでは遠いがマハラノビスでは近い=点A)と左上(逆=点B)が同時に存在するので、片方を計算すればもう片方が分かるという関係ではありません。

②で χ²(2) の密度とヒストグラムを重ねました。おおむね形は合っていますが、62点全体で計算した dM2d_M^2 の平均は 1.9677 で、χ²(2) の平均 2 とは一致しません((n1)/n(n-1)/n 倍だけずれます。理由は後述します)。2変数の場合は自由度2で、χ²(2) は手計算できます(上側確率がちょうど ex/2e^{-x/2})。

上側確率χ²(2) の点マハラノビス距離の基準
50%1.3862941.177410
10%4.6051702.145966
5%5.9914652.447747
1%9.2103403.034854
検算: exp(−5.991465/2) = 0.050000  (自由度2なので −2ln(0.05) = 5.9915 と手で出せる)

点A の d_M² = 2.30² = 5.29 → 上側確率 ≈ 0.071(χ²(2) 近似)
                              厳密なベータ分布では 0.066
                              いずれにせよ5%基準では外れ値ではない
点B の d_M² = 7.05² = 49.70 → 基準を大きく超えており異常

χ² 近似には条件がある(査読で判明)

ここは私が雑に扱っていた箇所です。「dM2d_M^2 が χ²(p) に従う」が成り立つのはμ\muΣ\Sigma が既知のときです。ところが今回は同じ標本から μ\muΣ\Sigma を推定しているので、厳密には χ² ではありません。

正確には次のベータ分布に従います。

n(n1)2dM2Beta(p2,np12)\frac{n}{(n-1)^2} d_M^2 \sim \mathrm{Beta}\left(\frac{p}{2}, \frac{n-p-1}{2}\right)

この違いは細かい話では済みません。ベータ分布は有界なので、dM2d_M^2 に上限が生まれます。

dM2(n1)2nd_M^2 \le \frac{(n-1)^2}{n}

n=62n=62 なら dM260.02d_M^2 \le 60.02、つまり dM7.747d_M \le 7.747。シミュレーション(正規データで3000回)でも上限を超えないことを確認しました。

点B の dM=7.0496d_M = 7.0496 は、この上限の 91% に張り付いた値です。 だから最初に書こうとした「上側確率 1.6×10111.6\times10^{-11}」のような p 値は原理的に出せません。χ²(2) は 60.02 より大きい値にも確率を置いているので、この領域では近似そのものが破綻しています。点B が異常だという結論は変わりませんが、p 値を書くのは誤りでした。

5%基準の方も厳密に計算すると差が出ます。

5%基準の dM2d_M^2dMd_M
χ²(2) 近似5.99152.4477
ベータ分布(厳密)5.79542.4074

χ² 近似の方がわずかに甘く、外れ値を見逃す側にずれています。 この例では点A(2.2992)の判定は変わりませんが、境界付近では結論が変わり得ます。

nn が大きければ χ² 近似で問題ありません(上限 (n1)2/n(n-1)^2/n が十分大きくなるため)。nn が小さいときと、dMd_M が上限に近いときに注意が必要でした。

もう1点。62点それぞれを5%で判定すると多重性の問題が出ます。 正常なデータでも期待 3.1 点が引っかかる計算です(今回は結果的に1点でしたが、それは偶然です)。外れ値検出として使うならボンフェローニ補正などで閾値を調整すべきでした。

χ²になる理由は③の図で見えています。 主成分の座標で各方向を σ\sigma で割ると、互いに無相関で分散1の変数が p 個できます。それを2乗して足したものがマハラノビス距離の2乗 ── これは第7回でやった χ² の定義そのもの(標準正規の2乗和)です。だから自由度が変数の数になります。2乗して足した項の数が自由度なので。

なぜ共分散行列でよいのか(相関行列ではなく)

主成分分析では相関行列を推奨したのに、マハラノビス距離の定義は共分散行列を使う。矛盾しているように見えますが、していません。マハラノビス距離では、どちらを使っても答えが同じになるからです。

(1) 共分散行列 Σ で計算(生データのまま)
    点A = 2.2992282507   点B = 7.0496091167

(2) 標準化してから相関行列 R で計算
    点A = 2.2992282507   点B = 7.0496091167

差 = 4.44×10⁻¹⁶ と 0.00(倍精度の丸め誤差のみ)

単位を変えても不変です。

変換点A の dMd_M点B の dMd_M
元(秒, %)2.299228257.04960912
滞在を「分」に(÷60)2.299228257.04960912
スクロールを小数に(÷100)2.299228257.04960912
両方変える2.299228257.04960912

上の表は単位の変更(各軸を定数で割る)だけですが、マハラノビス距離は可逆な線形変換すべてに対して不変です。回転やせん断でも変わりません。xAxx \mapsto Ax と変換すると Σ\SigmaAΣAA\Sigma A^\top に変わり、Σ1\Sigma^{-1} の側で打ち消し合うためです。

3枚のパネル。①元のデータで等確率楕円が傾いており軸ごとに幅も違う。②主成分の座標に回転しただけの状態で、傾きは消えたが横の幅が65.9、縦の幅が5.4でまだ揃っていない。③さらに各軸を√λで割った状態で楕円が真円になる

理由はΣ1\Sigma^{-1} に標準化が内蔵されているからです。3段階に分けると見えます。

①→②:主成分の座標に移る(回転)。傾きが消えますが、横の幅 65.9・縦の幅 5.4 でまだ揃っていません

②→③:各軸を λ\sqrt{\lambda} で割る(全方向の標準化)。ここで真円になります。

Σ1\Sigma^{-1} を挟むという操作が、この①→③を一気にやっています。 事前に標準化してもしなくても同じ場所に着くので、選択問題が発生しません。この操作を白色化(whitening)と呼びます。どの方向にも同じばらつきになった状態を、あらゆる周波数が均等な白色光にたとえた名前です。

いっぽう主成分分析では、同じ単位変換で結果が変わります。

変換第1主成分の角度第1主成分の寄与率
元(秒, %)12.2640°99.3227%
滞在を「分」に86.1901°99.9296%
スクロールを小数に0.1237°99.9999%
両方変える7.3978°99.7405%

第1主成分の向きが 12.3 度から 86.2 度まで動きます。 ほぼ直角に変わってしまう。

違いはこうです。マハラノビス距離は「全方向を割る」ので方向を選びません。だから最初のスケールが何であれ行き先は同じ。主成分分析は「1つの方向を選ぶ」ので、選ぶ前の時点でどの変数の分散が大きいかが結果を決めてしまいます。

「捨てる(方向を選ぶ)操作が入ると、その前のスケールが効いてくる」と覚えるとよさそうです。

2つの式の関係を整理する

uΣuu^\top \Sigma u(xμ)Σ1(xμ)(x-\mu)^\top \Sigma^{-1}(x-\mu) はよく似ています。並べます。

主成分分析の分散マハラノビス距離の2乗
uΣuu^\top \Sigma u(xμ)Σ1(xμ)(x-\mu)^\top \Sigma^{-1} (x-\mu)
Σ\SigmaΣ1\Sigma^{-1}Σ\Sigma(そのまま)Σ1\Sigma^{-1}(逆行列)
挟まれるもの方向 uu(長さ1)点の位置 xμx-\mu
答えの意味その方向のばらつきの大きさその点の異常度(何σ分か)
単位元の単位の2乗(単位ありなし(無次元)
スケール変更で変わる変わらない

Σ\Sigma をかけると単位が付いたままなので影響を受けます(だから標準化するかを選ぶ必要がある)。Σ1\Sigma^{-1} で割ると単位が消えるので受けません(だから選ぶ必要がない)。

ただし無関係な2つの式ではありません。同じ固有値分解でつながっています。

dM2=k=1pzk2λkd_M^2 = \sum_{k=1}^{p} \frac{z_k^2}{\lambda_k}

各項が「その主成分の得点を、その主成分の分散で割ったもの」です。主成分分析で求めた λ\lambda がそのまま分母に入っています。

点B の場合(実測):
  第1主成分の項: (−119.048)² / 4344.57 =  3.2621
  第2主成分の項: (37.089)²   /   29.62 = 46.4349  ← こちらが支配的
  合計 = 49.6970 → √49.6970 = 7.0496

分母が小さい(λ2\lambda_2=29.62)ほど、その方向のズレが大きく評価されるのが式から見えます。

主成分回帰:第16回の多重共線性はここで解決する

第16回で多重共線性を扱いました。「相関の高い変数を入れると結果が悪くなる」現象で、当時の私は「なぜと言われると説明できない」状態でした。主成分分析の言葉を使うと、原因が固有値として見えます。

記事40本について、文字数・見出し数・内部リンク数から PV を予測するモデルを作りました。

x1 = 文字数(千字)
x2 = 見出し数   ← 文字数とほぼ比例するように作った
x3 = 内部リンク数 ← 独立

x1 と x2 の相関 = 0.989834  (x1 と x3 の相関 = 0.0687)
真の係数: 切片 2.0、x1 = 0.9、x2 = 0.5、x3 = 0.7

通常の最小二乗法の結果

変数推定値標準誤差t値真の値
切片1.62810.43313.7602.00
x1 文字数1.02920.41372.4880.90
x2 見出し数0.44300.24621.8000.50
x3 内部リンク数0.74760.07829.5590.70

R2R^2 = 0.966616 で当てはまりは良好です。ところがx2 の t値が 1.800 で有意になりません(自由度36の5%基準 2.0281 に届かない。p値 = 0.0803)。真の係数は 0.5 で確実に効いているのに「効いていない」と判定されてしまいます。標準誤差が膨らんでいるのが原因です。膨張の度合いは VIF\sqrt{\mathrm{VIF}} で測れて、x1 と x2 は共線性がなければ達成できたはずの標準誤差の 7.0 倍になっています(x3 は 1.01\sqrt{1.01} = 1.005 倍)。

VIF(Variance Inflation Factor=分散拡大要因)
  x1 文字数:      VIF = 49.61
  x2 見出し数:    VIF = 49.67
  x3 内部リンク数: VIF =  1.01
※ 一般に VIF > 10 で多重共線性が疑われる

原因を固有値で見る

3枚のパネル。①x1文字数とx2見出し数の散布図がほぼ一直線で相関0.9898。②相関行列の固有値の棒グラフで2.0006、0.9893、0.0101。第3主成分の固有値がほぼ0で不安定の原因という注記。③1点抜いて再推定を40回したときの係数の振れ幅をOLSとPCRで比較した縦棒。x1とx2ではPCRが0.08倍に縮み、x3は1.02倍で変わらない

②が原因の正体です。相関行列の固有値は 2.0006、0.9893、0.0101。第3主成分の固有値がほぼ 0 ── つまりその方向にデータのばらつきが実質ないということです。

なぜそれが困るのか。 回帰係数を求めるには (XX)1(X^\top X)^{-1} という逆行列が必要です(第16回)。ところが逆行列を取ると固有値が逆数になります ── λ=0.0101\lambda = 0.01011/λ=991/\lambda = 99 に化けます。小さい固有値が、逆数になって係数の分散を爆発させるのがメカニズムでした。

「0 で割れない」の一歩手前が「ほぼ 0 で割る」であり、それが標準誤差の膨張として現れます。ここが第16回で分からなかった部分です。

条件数 = √(λ_max / λ_min) = √(2.0006 / 0.010123) = 14.06
※ 10 を超えると多重共線性が疑われ、30 を超えると深刻とされる
   (定義に √ を取らない流儀もあるので注意)

症状:データを少し変えると係数が動く

「不安定」を実測しました。40点から1点だけ抜いて再推定する操作を40回繰り返します(Leave-One-Out)。

変数最小最大振れ幅真の値
x1 文字数0.84401.15210.30810.90
x2 見出し数0.37490.55210.17730.50
x3 内部リンク数0.69720.78320.08600.70

たった1点抜くだけで x1 の係数が 0.844 〜 1.152 まで動きます。 係数の値そのものを解釈したいのに、これでは「文字数が1千字増えると PV がどれだけ増えるか」を語れません。共線性のない x3 は 0.086 しか動いていないので、これは共線性ペア特有の現象です。

主成分回帰のやり方と結果

手順は単純です。

  1. 説明変数を標準化する
  2. 主成分分析して主成分得点を出す(主成分同士は無相関
  3. 上位 k 個の主成分得点を説明変数として回帰する
  4. 必要なら元の変数の係数に戻す

効いているのはステップ3(捨てること)です。 ステップ2で主成分同士は無相関になりますが、それだけでは何も改善しません(後で見るように、全部の主成分を使うと OLS と完全に一致してしまいます)。問題の元凶である λ0\lambda \approx 0 の方向を捨てることで、はじめて逆数の爆発が止まります。

kR2R^2元の変数に戻した係数コメント
10.917208x1=0.9183, x2=0.5464, x3=0.1783x3 が 0.7 → 0.18 に潰れた。捨てすぎ
20.966503x1=0.8849, x2=0.5289, x3=0.74583つとも真の値に近い
30.966616x1=1.0292, x2=0.4430, x3=0.7476OLS(0.966616)と完全一致

k=3(全部使う)が OLS と完全に一致するのは重要な確認です。主成分回帰は「座標を回してから回帰する」だけなので、全部の主成分を使えば何も変わりません(回帰は座標の回転で不変)。意味があるのは捨てたときだけです。

そしてk=1 は捨てすぎでした。第2主成分は主に x3 を担っている(固有ベクトルの成分 −0.9946)ので、これを捨てると x3 の情報が失われ、係数が 0.7 → 0.18 に潰れます。累積寄与率も 66.69% しかありません。k=2 で累積 99.66% です。

k=2 での安定性

変数PCR の振れ幅OLS の振れ幅真の値
x1 文字数0.02570.30810.083 倍0.90
x2 見出し数0.01430.17730.081 倍0.50
x3 内部リンク数0.08740.08601.016 倍0.70

共線性のある x1・x2 の振れ幅が約8%(12分の1)に縮みました。 いっぽう共線性のない x3 は 1.02 倍でほぼ変化なし

これは主成分回帰が「全体をぼかして安定させた」のではなく、問題のある方向だけを狙って直したことの証拠です。副作用が最小限だと確認できました。

代償:バイアスとの引き換え

ただし無料ではありません。主成分を捨てると推定量が「残した主成分の張る空間」に押し込められるので、一般には不偏性を失います(バイアスが入る)。

厳密に言うと、真の β\beta が残した主成分の空間に入っていれば PCR も不偏です。この例で k=2 の係数が真の値にほぼ一致したのは偶然ではなく、真の β\beta が捨てた第3主成分の方向の成分をほとんど持っていなかったからでした。逆に k=1 で x3 の係数が潰れたのは、真の β\beta が捨てた第2主成分の方向に大きな成分を持っていたからです。「捨てた方向に真の係数の成分があるか」が分かれ目です。第16回のガウス・マルコフ定理で「OLS は線形不偏推定量の中で最小分散(BLUE)」と扱いましたが、主成分回帰は不偏性を諦めて分散を下げるという取引をしています。

これは第19回のリッジ回帰・Lasso と同じ発想です。バイアスを少し受け入れて分散を大きく下げ、合計の誤差を小さくする。

手法やり方不偏性
OLS(通常の最小二乗法)そのまま推定不偏
主成分回帰(PCR)固有値の小さい主成分を完全に捨てる一般に偏りあり
リッジ回帰(第19回)係数を連続的に縮める(捨てない)偏りあり
Lasso(第19回)変数を 0 にする(選択する)偏りあり

PCR とリッジの違いを一言で言うと、PCR は 0 か 1(捨てるか残すか)、リッジは連続的に縮めます。リッジの方が滑らかなので実務ではリッジや Lasso が使われることが多いです。

PCR の弱点はもう1点あります。主成分は yy を見ずに xx だけで決めているので、「捨てた主成分が実は yy をよく説明していた」という事故が起こり得ます。それを避けるために yy も見て成分を作る手法がPLS 回帰(Partial Least Squares=部分最小二乗回帰)です。

見落としやすい点

多重共線性は予測を壊しません。 この例でも R2R^2 = 0.966616 で、k=3 の PCR と同じです。壊れるのは個々の係数の解釈だけです。

ただし限定が付きます。予測が安定なのは、予測したい点がデータの雲の内側にある場合(内挿)だけです。共線性の方向(λ0\lambda \approx 0 の方向)に外挿すると、予測も不安定になります。「文字数は多いが見出しは少ない」という現実のデータには無い組み合わせを予測させると、誤差が増幅されます。

だから「多重共線性があるから対処が必要」ではなく、「個々の係数を解釈したいのに不安定だから対処が必要」が正確な言い方です。目的次第で、何もしないのが正解の場合もあります。

ブログのアクセス解析に使えるか

先ほどの6指標の例が答えになっています。6指標が実質2軸に圧縮できました(累積寄与率 98.47%)。

得られたこと中身
指標の重複が見えるPV とセッションの相関 0.9999。両方を見る必要はない。第5・第6固有値がほぼ0なのも同じことの表れ
記事を2次元にプロットできるバイプロットで12記事の位置関係が一目で分かる。6指標の表を睨むより速い
記事のタイプが分かれる「広く浅く」(ふるさと納税系)と「狭く深く」(統計検定系)が第2主成分で分離。6指標を個別に見ていては気づきにくい
外れ値が目立つSerafina・Ventuno が左端に離れている(グルメ記事=直帰率が7割)

ただし実務上の注意があります。この例は n = 12(記事12本)で p = 6。標本サイズが小さすぎます。 主成分分析は目安として n ≥ 5p 〜 10p 程度が望ましいとされます(この例なら30〜60本)。

また解釈が安定するかは確認が必要です。記事を数本入れ替えたら第2主成分の向きが変わるようなら、その解釈は信用できません。これも「解釈は仮説」という前の節の話に戻ります。

自分が間違えていたこと・詰まっていたこと

① 多次元正規分布を「1変数の拡張」だと思っていた

過去問で手が止まった原因がこれでした。新しい分布を新しく覚える気になっていたのですが、1/σ21/\sigma^2Σ1\Sigma^{-1} になっただけの書き換えでした。1次元では Σ1=1/σ2\Sigma^{-1} = 1/\sigma^2 なので元の式に戻ることを確認したら、急に見通しが良くなりました。

ρ\rho と共分散を区別していなかった

記事を書く途中で気づきました。「非対角成分 0.8」と「ρ\rho = 0.8」を同じものとして扱っていたのですが、それが一致するのは対角成分が両方 1 のとき(=相関行列のとき)だけです。n=10 の例では非対角成分 568.333 と ρ\rho = 0.9887 でまったく違う数字でした。

uΣuu^\top \Sigma u を定義だと思っていた

これは定義ではなく、導ける事実です。射影後の分散を定義通り(偏差の2乗の平均)計算すると、結果的にこの形にまとまる。展開すると第3回の V[aX+bY]V[aX+bY] の公式そのものでした。定義なのは内積だけ(成分ごとに掛けて足す)です。

④ 「主成分が直交する」を条件だと思っていた

直交するように選んでいるのだと思っていました。実際には制約として課されていますが、Σ\Sigma が対称行列なので固有ベクトルは自動的に直交し、制約が実質的に効きません。 総当たりのスキャンで最大 29.6 度と最小 119.6 度の差がちょうど 90.0000 度になったのは、この帰結でした。

⑤ 「ズレ0なら分散が最大」と書いていた(査読で判明)

これが今回いちばん大きな誤りでした。Σu\Sigma uuu のズレを測る図を作り、「ズレが小さいほど分散が大きい」と説明したのですが、測った範囲が 0〜90 度しかなかったので単調に見えていただけでした。

範囲を広げたら、最小固有値の方向でもズレはちょうど 0 です。115 度(ズレ 82 度)で分散 14.03、119.58 度(ズレ 0 度)で分散 5.57。ズレが減る方向に分散も減っていました。

Σu=λu\Sigma u = \lambda u停留点の条件であって、最大の条件ではありません。最大・最小の両方が該当します(変数が3個以上なら鞍点も)。自分で「最小固有値 5.57」という数字を記事に書いていたのに、それが反例になっていることに気づいていませんでした。

⑥ 寄与率と決定係数は「似ている」程度だと思っていた

実測したら小数第9位まで一致しました。累積寄与率は「k個の主成分で復元したときの決定係数」そのものです。類比ではありませんでした。

ただし一致するのは全変数の平均に対してだけです。変数ごとに見ると平均滞在秒は 0.333 しか復元できていません(k=1 のとき)。「第1主成分で各指標が56%説明できる」と読むのは誤りでした。

⑦ 負荷量の式を無条件に使っていた(査読で判明)

「負荷量 = 固有ベクトル × √固有値」という式を条件なしに書いていました。これは相関行列で主成分分析した場合限定です。共分散行列版で同じ式を使うと 1136.67 のような値が出て、相関係数のはずなのに ±1 を超えます。正しい一般形は sjs_j で割る形でした。

⑧ χ² 近似の条件を無視していた(査読で判明)

マハラノビス距離の2乗が χ²(p) に従うのは母数が既知のときです。今回は同じ標本から μ\muΣ\Sigma を推定しているので、厳密にはベータ分布に関係する量になります。

これは細かい話ではありませんでした。dM2d_M^2 には (n1)2/n(n-1)^2/n という上限があるnn=62 なら 60.02)ので、点B の dM2d_M^2 = 49.70 は上限の 82.8% に達しています。当初この点に「上側確率 1.6×10111.6\times10^{-11}」と書こうとしていましたが、χ²(2) は 60.02 より大きい値にも確率を置いているので、この領域では近似が破綻していて p 値を出せません

⑨ マスキング効果(検証中に発見)

これが今回いちばん実務的な発見でした。外れ値2点を除いた60点について、汚染された Σ\Sigma(=外れ値を含めて計算した Σ\Sigma)でマハラノビス距離を測ったら、dM2d_M^2 の平均が 1.117 しかなく、(n1)/n×p=1.9667(n-1)/n \times p = 1.9667 に届きません。バグを疑って調べたら、バグではありませんでした。

外れ値自身が Σ\Sigma の計算に入っているので、Σ\Sigma が膨らんで、自分の異常度が薄まっていたのです。

外れ値2点を含む Σ\Sigma外れ値2点を除いた Σ\Sigma
分散(滞在秒, スクロール率)4149.87, 224.323656.22, 210.09
相関係数0.92830.9859
60点の dM2d_M^2 の平均1.11691.9667
理論値 (n1)/n×p(n-1)/n \times p―(恒等式が成り立つのは62点全体で、その平均は 1.9677)1.9667(nn=60) 恒等式なので必ず一致
点A の dMd_M2.29922.4763
点B の dMd_M7.049617.0492

点B の異常度が 7.05 → 17.05 と約2.4倍になりました。 点B を Σ\Sigma の計算から外すと、データ本来の相関(0.9283 → 0.9859)が見えるようになり、「相関の線から外れている」という点B の異常さが正しく評価されます。

これがマスキング効果(masking effect=覆い隠し効果)です。外れ値が自分の存在によって自分を隠します。 外れ値が複数あるとさらに深刻になります。

対策は、頑健な推定(Minimum Covariance Determinant など、データの一部だけを使って Σ\Sigma を推定する方法)を使う、または疑わしい点を除いて Σ\Sigma を再計算することです。試験範囲外ですが、実務では必須の注意点でした。

なお理論値が p=2p = 2 ではなく (n1)/n×p=1.9667(n-1)/n \times p = 1.9667 になるのは、同じデータから平均と Σ\Sigma を推定しているためです。idM2=(n1)p\sum_i d_M^2 = (n-1)p はトレースの代数的な恒等式なので、正規分布かどうかとは無関係に必ず成り立ちますnn=40, pp=3 でも 2.925 と厳密に一致することを確認しました)。

⑩ 主成分回帰の「捨てすぎ」を軽く見ていた

「固有値が小さいものを捨てればよい」と単純に考えていたのですが、k=1 にすると x3 の係数が 0.7 から 0.18 に潰れました。第2主成分が x3 の情報をほぼ全部担っていたためです。寄与率だけでなく、捨てる主成分がどの変数を担っているかを負荷量で確認する必要がありました。

要点まとめ

問い答え
多次元正規分布は1変数の何を拡張したものか拡張ではなく書き換え1/σ21/\sigma^2Σ1\Sigma^{-1}σ\sigmaΣ1/2\lvert\Sigma\rvert^{1/2} になっただけ
Σ\Sigma の対角成分・非対角成分の役割対角は各軸方向の伸縮傾きを生むのは非対角だけ(ただし非対角は細長さも変え、傾きの角度は対角にも依存する)
等確率楕円とはz2z^2(マハラノビス距離の2乗)が一定の点の集合。z2z^2 の値は 1σ・2σ・3σ に対応するが内側の確率は違うz2z^2=4 で 95.4% でなく 86.5%)
共分散と相関係数の違い共分散は単位つき(秒·%)で比較不能、ρ\rhoσ\sigma で割って無次元。秒→分で共分散は1/60、ρ\rho は不変
相関行列 RR とは標準化してから作った Σ\Sigma。別の道具ではない。固有値の和は必ず p
なぜ分散を最大にするのか落とした後に点どうしが離れて残る=元の違いが保たれるから
uΣuu^\top \Sigma u は定義かいいえ。射影後の分散を定義通り計算するとこの形になる。第3回の V[aX+bY]V[aX+bY] そのもの
なぜ固有値問題になるのかΣu\Sigma uuu とズレていれば分散を動かせる。動かせない条件(停留)=平行=Σu=λu\Sigma u=\lambda u
ズレ0なら最大かいいえ。停留の条件にすぎない。最小固有値の方向(119.58°)でもズレは0で分散5.57
総当たりと固有値の一致3601通りのスキャンの最大 1329.316304 vs 最大固有値 1329.316406
固有値 λ\lambda は何かその主成分の分散そのものuΣuu^\top \Sigma uΣu=λu\Sigma u=\lambda u を代入すれば λ\lambda
第22回と同じ道具か同じ。ただし PP は非対称で λ=1\lambda=1 に意味があり、Σ\Sigma は対称で λ\lambda の大小に意味がある
なぜ主成分が直交するのか制約としては課すが、Σ\Sigma が対称行列なので自動的に成り立ち実質的に効かない(29.6°と119.6°の差が90.0000°)
2×2 の固有値の求め方tr と det を出して λ2trλ+det=0\lambda^2-\mathrm{tr}\lambda+\det=0検算は和=tr、積=det
固有ベクトルの符号決まらない。uuu-u も固有ベクトル。ソフトで反転する
主成分分析を一言でΣ\Sigma の非対角成分が 0 になる座標に乗り換えること(実測 −8.095×10⁻¹⁴)
分散の総量は保存される(1334.889 のまま)。配分だけが 1006.7/328.2 → 1329.3/5.6 に変わる
寄与率が割合になる理由分散の総量が保存されるので、分母が固定されている
決定係数との関係同じもの。累積寄与率=k個で復元したときの R2R^2(小数第9位まで一致)。ただし一致するのは全変数の平均だけ(平均滞在秒は k=1 で 0.333)
主成分得点と負荷量得点は個体に付く(n個)/負荷量は変数に付く(p個・相関係数)
負荷量の計算一般形は ujkλk/sju_{jk}\sqrt{\lambda_k}/s_j相関行列版なら sjs_j=1 なので固有ベクトル×√固有値に簡約される
いくつ残すかカイザー基準(相関行列で λ>1\lambda>1)・スクリープロットの肘・累積寄与率。併用する
意味付けは恣意的か恣意的になり得る。名前は解釈者の産物。「解釈できる」までが誠実
第1主成分が総合力に見える理由全変数を同符号に揃えて集めたから。発見ではなく指標の選び方の帰結
相関行列か共分散行列か通常は相関行列。Σ\Sigma版は単位を変えると寄与率が 99.71%→99.18% に変わる
マハラノビス距離は何を測るかそのデータのばらつきを基準に、何σ分離れているか
その正体主成分の座標で各軸を √λ で割ってからのユークリッド距離(差 2.66×10⁻¹⁵)
ユークリッドとの違い等距離線が円か楕円か。順位が逆転する(A:148→2.30、B:125→7.05)
なぜ χ² になるか無相関で分散1の変数を p 個作って2乗和するから。第7回の χ² の定義そのもの
χ² 近似の条件母数が既知のときだけ。標本から推定すると dM2(n1)2/nd_M^2 \le (n-1)^2/nnn=62 で 60.02)という上限が付く
2変数の5%基準dM2>5.9915d_M^2 > 5.9915dM>2.4477d_M>2.4477)。自由度2は 2lnp-2\ln p で手計算できる。ただし標本から推定した場合の厳密値は 5.7954(dM>2.4074d_M>2.4074 で χ² は甘い側
マハラノビス距離はなぜ Σ\Sigma でよいかΣ\Sigma でも RR でも同じ(差 4.44×10⁻¹⁶)。Σ1\Sigma^{-1} が白色化を内蔵している
なぜ主成分分析では変わるのか方向を選ぶから。単位を変えると第1主成分の角度が 12.3°→86.2° に動く
多重共線性の正体固有値がほぼ0の方向があることλ3\lambda_3=0.0101)
なぜ係数が不安定になるか(XX)1(X^\top X)^{-1}固有値が逆数になる。0.0101 → 99 に化けて分散が爆発
主成分回帰の効果共線性ペアの振れ幅が0.08倍に。共線性のない変数は1.02倍で無影響
k を全部使うとOLS と完全一致。捨てて初めて意味が出る
主成分回帰の代償一般に不偏性を失う。ただし真の β\beta が残した空間に入っていれば不偏。第19回のリッジ・Lasso と同じ取引
多重共線性で予測は内挿では落ちない。壊れるのは係数の解釈だけ(ただし共線性の方向に外挿すると予測も不安定)
マスキング効果外れ値込みの Σ\Sigma で測ると点Bが 7.05、除くと 17.05(2.4倍)

次回

次回は第23章 判別分析です。今回のマハラノビス距離がそのまま主役として再登場します。「どちらのグループの中心に近いか」を測って分類する ── その距離としてマハラノビス距離を使うのがマハラノビス距離判別で、今回確認した「ばらつきの形をものさしに組み込む」性質がそこで効いてきます。

そして今回の等確率楕円も再登場します。2つのグループの Σ\Sigma が等しいと仮定すると境界が直線になり(線形判別)、異なると曲線になる(2次判別)── この分かれ目が楕円の形の違いから来ます。

今回「Σ1\Sigma^{-1} を挟むと単位が消える」ことを確認しましたが、判別分析ではこれが「変数のスケールに依存しない分類ができる」という利点として現れます。

この連載の全体像とこれまでの回は統計検定準1級・独学連載のまとめにあります。