体系 › 線形代数
·無料·論文·13分で読めます

ゼロから学ぶ主成分分析(PCA) — 固有ベクトルはデータの軸

相関したデータの雲には「木目」がある——いちばん大きくばらつく方向だ。主成分分析(PCA)はその木目を見つける仕掛けである。この記事は1枚の絵から組み立てる——データを中心化し、どの方向が最も分散を持つかを問うと、その答えが共分散行列の固有ベクトルになる。固有値は各軸に沿った分散そのもので、上位いくつかの軸が次元削減を与え、寄与率が「何を捨てたか」を教えてくれる。

要点

  • 特徴量が相関していると、データは低い次元の形の近くに寄り集まり、PCAは軸を回転させてその形を見つける。
  • データを中心化すると、分散最大の方向は共分散行列 C=1nX⊤XC = \frac{1}{n} X^\top X の固有ベクトルになる。
  • 各固有値はその軸に沿ったデータの分散そのもので、固有値の大きい順に並べると主成分が重要度順に得られる。
  • 上位 kk 個の固有ベクトルへ射影(Z=XWZ = XW)すると、kk 次元の線形射影の中で損失が最小になる。
  • PCAは単位に左右されるため異なる単位の特徴量は標準化が要り、また線形構造しか捉えられない。
対象textタスクmath

On Lines and Planes of Closest Fit to Systems of Points in Space

一次資料 — この記事の根拠

この解説の公開 2026-09-13

On Lines and Planes of Closest Fit to Systems of Points in SpacePearson 1901論文ページ
Principal Component Analysis (2nd ed.)Jolliffe 2002論文ページ

数字が多すぎて、そのほとんどが重複している

特徴量の多いデータセットは、列でいっぱいの部屋のようなもので、その列の多くは同じことを静かに二重に語っています。身長と体重は連動し、顧客の購入回数と総支出額は連動し、画像の隣り合う2ピクセルはほとんどいつも同じ色です。特徴量が相関しているとき、データは与えた次元をすべて埋めているわけではありません——その空間の中の、より低い次元の形の近くに寄り集まっていて、座標の大半は同じ変動を何度も描写するのに浪費されています。

主成分分析(PCA) は、データが実際に住んでいる形を見つける道具です。座標軸を回転させて、データが本当にばらついている方向に揃え、そのうえで意味のある少数の軸だけを残せるようにします。この記事はPCAをいつもの順序で組み立てます——絵、分散最大の方向、共分散行列とその固有ベクトル、次元削減のための射影——そして寄与率、コード、実務で足をすくわれる2つの落とし穴へと進みます。

絵: 雲には木目がある

2次元に散らばる点が、斜めに傾いた葉巻の形の雲をなしているところを思い浮かべてください。この雲は、たまたま測定に使った xx 軸・yy 軸には揃っておらず、斜めに走っています。点が大きく広がっている方向(葉巻の長軸方向)が明らかに1つあり、それに垂直で、ほとんど広がっていない方向(細い幅の方向)があります。

この2つの方向が主成分です。第1主成分は最大分散の方向、第2主成分は第1に垂直な中で残りの分散が最大の方向、以下高次元でも同様です。PCAとは、これらの軸を順に見つける手続きにすぎず、手法全体は「最大分散の方向」という1文をどこまでも文字どおりに受け取ることから出てきます。

まず、データを中心化する

雲が広がる方向を語る前に、雲を原点に移す必要があります。各特徴量の平均を計算して引き算し、どの列も平均が0になるようにします。

xi←xi−xˉ,xˉ=1n∑i=1nxix_i \leftarrow x_i - \bar{x}, \qquad \bar{x} = \frac{1}{n}\sum_{i=1}^{n} x_i

この式が言っているのは要するに、全点の平均位置 xˉ\bar{x} を求めて、各点からそれを引くということです。nn は標本数、xix_i は ii 番目の点で、引いたあとは雲の重心がちょうど原点に来ます。

これは見た目を整えるだけの手順ではありません。分散は平均のまわりの広がりなので、中心化を飛ばすと、数式が見つける最大の「変動の方向」は、点どうしがどう散らばっているかではなく、雲全体が原点からどれだけ離れているかに支配されてしまいます。中心化すると、データ行列 XX(nn 行=標本ごと、dd 列=特徴量ごと)は純粋な偏差を表すようになり、それがまさに次の手順で測るものです。

分散最大の方向

ここで目標を正確にします。射影後のデータの分散が最大になる単位ベクトル uu(方向なので ∥u∥=1\|u\| = 1)が欲しい。中心化された点 xix_i を uu に射影すると1つの数 u⊤xiu^\top x_i になり、データ全体でのその射影の分散は

Var⁡(u)=1n∑i=1n(u⊤xi)2=u⊤(1nX⊤X)u.\operatorname{Var}(u) = \frac{1}{n}\sum_{i=1}^{n} (u^\top x_i)^2 = u^\top \left(\frac{1}{n} X^\top X\right) u.

です。要するに、各点を方向 uu の上に落とした影の長さ u⊤xiu^\top x_i を2乗して平均したものが、その方向での広がりです(中心化済みなので平均は0で、2乗平均がそのまま分散になります)。式変形は uu を和の外に出しただけで、真ん中に残った 1nX⊤X\frac{1}{n} X^\top X は、もはや uu に依存しない1つの d×dd \times d 行列です。この行列こそが主役です。

共分散行列とその固有ベクトル

真ん中に残った行列が共分散行列です。

C=1nX⊤X.C = \frac{1}{n} X^\top X.

つまり、特徴量どうしの「連動の強さ」を全ペアぶん並べた表です。対角成分は各特徴量の分散、非対角成分は特徴量ペア間の共分散——特徴量が相関していたからこそ大きかった数——です。CC は対称かつ半正定値で、これがすべてを機能させます。

こうして「どの方向が最大の分散を持つか?」という問いは、きれいな最適化問題になります——∥u∥=1\|u\| = 1 のもとで u⊤Cuu^\top C u を最大化する。制約にラグランジュ乗数 λ\lambda を立てて微分すると、最大化の条件は驚くほど単純です。

Cu=λu.C u = \lambda u.
(1)

この式が言っているのは要するに、CC を掛けても向きが変わらず、長さが λ\lambda 倍されるだけの特別な方向 uu を探せということです。これは固有ベクトルの定義そのものです。最大分散の方向は、まさに共分散行列の固有ベクトルなのです。しかも固有値はおまけではありません——Cu=λuCu = \lambda u を、最大化していた分散に代入し直すと u⊤Cu=u⊤(λu)=λ∥u∥2=λu^\top C u = u^\top (\lambda u) = \lambda \|u\|^2 = \lambda。固有ベクトルは主軸に沿った方向を指し、その固有値はその軸に沿ったデータの分散そのものです。 固有ベクトルを固有値の大きい順に並べれば、重要度順の主成分が得られます。CC は対称なので、これらの軸は互いに直交することが保証されます——PCAが約束した「回転した座標系」です。

FIG 12×2行列が単位円に作用するようす。「symmetric(対称)」プリセットを選ぶと——共分散行列は必ず対称——円が固有ベクトルの方向に沿って楕円へと伸びるのが見える。長軸が第1主成分で、どれだけ伸びるかが固有値、つまりその軸に沿った分散

次元削減: 上位の軸へ射影する

軸を見つけるのは話の半分にすぎません。うまみは、その大半を捨てることにあります。固有値の大きい上位 kk 個の固有ベクトルを残し、それらを列に並べた行列 WW(サイズ d×kd \times k)を作り、すべてのデータ点をそこへ射影します。

Z=XW.Z = X W.

要するに、各点を上位 kk 本の軸それぞれに落とした影の長さを、新しい座標として読み替えるということです。ZZ は n×kn \times k の行列で、1行が1標本の新しい座標です。dd 個の座標を持っていた各点が、いまや kk 個の数——最も重要な kk 本の軸に沿った座標——だけで表されます。100特徴量のデータセットが実は5次元の形の近くに住んでいるなら、k=5k = 5 とすれば、重要だったものをほぼすべて残したまま、ほとんど重複したノイズの95列を捨てられます。これが次元削減です——標本あたりの数が減り、後段のモデルが速くなり、k=2k = 2 や 33 なら実際に目で見られる図になります。

失うのは、捨てた軸に沿った分散です——そして捨てたのは最小の固有値だったので、その損失は、任意の kk 次元の線形射影がとりうる中で最小です。この最適性こそが、1901年にピアソンが最初に書き下したPCAが、いまなお最初の一手として使われる理由です。

寄与率: どれだけ残せたか

kk はどう選び、削減が安全だったとどう分かるのか。固有値がその両方に答えます。1つ1つがその軸で捉えた分散そのものだからです。第 ii 主成分が持つ全分散の割合が、その寄与率(explained-variance ratio)です。

寄与率i=λiλ1+λ2+⋯+λd.\text{寄与率}_i = \frac{\lambda_i}{\lambda_1 + \lambda_2 + \dots + \lambda_d}.

つまり、全分散の合計のうち、この1本の軸が担っている分の割合です。分母は全固有値の和=データ全体の分散で、分子はその軸1本ぶんの分散です。2次元なら、第1主成分についてはこれはただの λ1/(λ1+λ2)\lambda_1 / (\lambda_1 + \lambda_2) です。残した成分にわたってこれを足し合わせれば、保持した分散の総割合が得られます——たとえば「上位5成分が分散の92%を説明する」。この1つのパーセンテージが kk の選択を裏づける根拠です——累積寄与率を成分数に対してプロットし(スクリープロット)、曲線が平らになって、新しい軸を足してもほとんど何も得られなくなる点を選びます。

コードで見る

PCAは、1回の線形代数の呼び出しの上に数行を重ねただけです。ここでは小さな相関した雲に対して、上の各手順が見えるように手作業でやってみます。

import numpy as np

# n個の標本、相関した2特徴量
X = np.array([[2.5, 2.4], [0.5, 0.7], [2.2, 2.9], [1.9, 2.2],
              [3.1, 3.0], [2.3, 2.7], [2.0, 1.6], [1.0, 1.1]])

X = X - X.mean(axis=0)              # 1. 中心化: どの列も平均0に
C = (X.T @ X) / len(X)             # 2. 共分散行列  C = (1/n) XᵀX

vals, vecs = np.linalg.eigh(C)     # 3. 固有値/固有ベクトル(eigh: Cは対称)
order = np.argsort(vals)[::-1]     #    固有値の大きい順に並べ替え
vals, vecs = vals[order], vecs[:, order]

print("寄与率:", vals / vals.sum())   # 例: [0.96, 0.04]

W = vecs[:, :1]                    # 4. 上位 k=1 本の軸を残す
Z = X @ W                          # 5. 射影: 2次元の点 → 各1つの数へ

走らせると、第1主成分が分散の圧倒的大部分を説明します——2つの特徴量はほぼ一直線だったので、1本の軸で雲全体をほぼ表せるのです。呼び出しが eig ではなく eigh である点に注目してください。共分散行列は対称なので、この専用ルーチンのほうが速く、実数の直交する固有ベクトルを返します。(実務のコードはたいてい代わりに XX の特異値分解(SVD)を使います。数値的により安定で、CC を作らずに同じ軸が得られます——ただし計算しているものは、上の固有値の絵そのものです。)

落とし穴: スケールと線形性

PCAは単位の言いなりです。 共分散行列は生の数から作られるので、グラム単位で測った特徴量は、同じ特徴量をキログラムで測ったときより分散が100万倍大きくなります——そしてPCAは、それが最も意味のある特徴量かどうかに関係なく、たまたま最大の数を持つ特徴量に第1主成分をほぼ丸ごと明け渡します。特徴量が異なる単位のとき(年齢は年、収入は円、身長はメートル)は、まず標準化しなければなりません——各列から平均を引き、標準偏差で割る——これは共分散行列の代わりに相関行列でPCAを走らせるのと同じです。これを忘れるのが、PCAが役に立たない答えを出す最も多い原因です。

PCAは直線しか見つけられません。 返す軸はどれも元の特徴量の線形結合なので、捉えられるのは線形構造だけです。データが曲がった形の上にある場合——渦巻き状に巻きついた点や、球面上の点——直線の軸ではうまく表せず、PCAはぐしゃぐしゃの結果を報告します。巻きついた方向に沿った分散は、その方向が面白い構造をすべて担っていても、小さく見えてしまうのです。構造が非線形のときは、曲がった形を「展開」するために作られたカーネルPCAや多様体学習の手法(t-SNE、UMAP——クラスタリングと次元削減の記事で扱います)に頼ります。PCAは、まず試す線形のベースラインで、それで既にうまくいくときにだけ採用するものです。

現場ではこう使う

PCAは標準的な前処理・圧縮の手順です。 高次元の特徴量をモデルに入れる前に上位成分へ削減すると、学習時間が短くなり、低分散のノイズ方向を取り除くことで結果が良くなることもあります。scikit-learn ではこれが PCA(n_components=0.95)——分散の95%を保持するのに必要なだけの軸を残す——で、推定器の前のパイプラインにそのまま入ります。

高次元データを見るいちばん速い方法です。 上位2〜3成分に射影してプロットするのは、新しい埋め込みやデータセットに対してほとんどの人が最初にやることです——100次元では見えなかったクラスタ・外れ値・大まかな構造が、2次元の散布図から飛び出してきます。ただし軸は特徴量の抽象的な組み合わせであって、どれか1つの測定量ではないことは忘れずに。

削減を信じる前に寄与率の曲線を見ること。 上位数成分でほぼすべてを説明できるなら、データは本当に低次元で、PCAは安全です。寄与率が何十もの成分に薄く散らばっているなら——平らなスクリープロット——データは本当にその次元数を必要としていて、思い切った削減は信号を静かに捨ててしまいます。このパーセンテージが、作業全体に対する誠実さのチェックです。

まとめ

確認問題

  1. なぜ共分散行列を計算する前にデータを中心化しなければならないのでしょうか。中心化を飛ばすと「第1主成分」は何を捉えがちになりますか。
  2. ある共分散行列の第1固有値が λ1=8.0\lambda_1 = 8.0、第2固有値が λ2=2.0\lambda_2 = 2.0 と出ました。第1主成分は分散の何割を説明し、その成分だけを残すと何を捨てることになりますか。
  3. ある特徴量がミリメートル単位の距離、別の特徴量が度単位の温度であるデータにPCAを走らせます。標準化しないと、どちらの特徴量が第1主成分を支配し、なぜそれが問題なのでしょうか。
  4. 同僚のデータはきつい渦巻きの上に乗っています。彼はPCAを走らせて上位1成分を残し、「分散の40%しか説明しない」と嘆いています。何がまずいのか、代わりにどんな種類の手法に頼るべきでしょうか。
解答
  1. 分散は平均のまわりで測られるため、雲が中心化されていないと、数式が見つける最大の「変動の方向」は、点どうしの散らばりではなく、雲全体が原点からどれだけ離れているか(オフセット)に支配されてしまいます。中心化すると共分散行列は純粋な偏差を表すようになります。
  2. 第1主成分は λ1/(λ1+λ2)=8/10=80%\lambda_1 / (\lambda_1 + \lambda_2) = 8 / 10 = 80\% を説明します。第2成分を捨てると、残りの20%の分散(垂直な軸に沿った広がり)を失います。
  3. 距離の特徴量のほうがはるかに大きな生の数を持つので、その分散が温度の分散を圧倒し、第1主成分はほぼその方向を指します——どちらが実際に意味を持つかに関係なく。対策は各特徴量を標準化すること(同じことですが相関行列を使うこと)です。
  4. 渦巻きは非線形構造で、PCAは直線の軸しか返せないため、巻きついた形を1本の線形成分ではうまく表せません。曲がった形を展開するために作られたカーネルPCAや多様体学習の手法(t-SNE、UMAP)に頼るべきです。
🎬 この内容の解説動画(Manim・字幕つき)

参考文献

  1. On Lines and Planes of Closest Fit to Systems of Points in Space. Pearson 1901論文ページ
  2. Principal Component Analysis (2nd ed.). Jolliffe 2002論文ページ

本記事は上記論文の本文にもとづいて執筆しています。数値・主張は原典を優先してください。

運営: TechAthletes · 編集方針 · 出典の付け方 · 訂正の記録

コメント

コメントにはログインが必要です