パラメータ設定
データはシード固定の LCG 乱数 + Box-Muller 法で生成しています。同じパラメータなら常に同じ点群が得られます。
散布図と主成分軸
灰色丸=データ点/黒×=平均/赤矢印=第 1 主軸(√λ₁倍)/青矢印=第 2 主軸/緑実線=1σ 共分散楕円
理論・主要公式
2次元データ X = {(x_i, y_i)} に対して、まず平均を引いて中心化し、共分散行列を作ります。
2x2 共分散行列。σ_xx, σ_yy は分散、σ_xy は共分散:
$$C = \begin{bmatrix} \sigma_{xx} & \sigma_{xy} \\ \sigma_{xy} & \sigma_{yy} \end{bmatrix}, \quad \sigma_{xy} = \frac{1}{n-1}\sum_i (x_i-\bar{x})(y_i-\bar{y})$$
2x2 固有値の閉形式解。T = トレース、D = 行列式:
$$\lambda_{1,2} = \frac{T \pm \sqrt{T^2 - 4D}}{2}, \quad T = \sigma_{xx}+\sigma_{yy}, \quad D = \sigma_{xx}\sigma_{yy} - \sigma_{xy}^2$$
第 i 主成分の寄与率(全分散に占める割合):
$$r_i = \frac{\lambda_i}{\lambda_1 + \lambda_2}$$
固有ベクトル $v_i$ は $(C - \lambda_i I) v = 0$ を満たし、データの主要な変動方向を示します。第 1 主成分は分散が最大になる方向です。
主成分分析シミュレーターとは
🙋
PCAってよく聞くんですけど、結局何をしてるんですか?散布図に矢印が2本出てるだけに見えるんですけど…
🎓
ざっくり言うと、データが「一番広がってる方向」を探しているんだ。上のシミュレーターで「相関係数 ρ」を0.8にしてみて。点群が右上がりの楕円みたいに伸びてるだろう?その伸びている方向が赤い矢印——これが第 1 主成分だよ。データの本質的な変動が一番大きい軸だ。
🎓
赤の矢印に直交する方向、第 2 主成分だ。2次元データだから主成分は2本までしか取れない。寄与率カードを見てみて——ρ=0.8 で σ_x=2, σ_y=1 のとき、第 1 主成分だけで全分散の約94%を説明できているのが分かる。これが「次元削減」の威力だ。100次元のデータでも、上位2〜3本の主成分で80%以上を説明できることが多いんだ。
🙋
「相関係数」を0にしたら、矢印がx軸とy軸に向きますね。当たり前ですか?
🎓
そう。ρ=0 で σ_x ≠ σ_y のとき、共分散行列が対角行列になるから、固有ベクトルは標準座標軸そのものになる。第 1 主成分は分散が大きい方の軸——つまり σ_x=2, σ_y=1 なら x 軸方向だ。逆に σ_x=σ_y=1 で ρ=0 にすると、行列が単位行列の定数倍になって主成分の方向が不定になる。これは「縮退」と呼ばれる状況で、本質的に向きを決められない状態なんだ。
🙋
「データ点数 N」を 10 に減らすと、楕円や矢印がブレますね。
🎓
いい観察だ。これがサンプリングノイズの影響だよ。理論上、ρ=0.8, σ_x=2, σ_y=1 なら λ₁=4.69, λ₂=0.31 になるけど、N が小さいと実測値はブレる。実務では「何点あれば信頼できるか」が問題で、変数の次元数の10倍以上のサンプル数が一つの目安と言われている。逆に N を 200 まで増やすと、実測値が理論値にぴったり近づくのが見えるはずだよ。
よくある質問
画像認識(固有顔による顔認識)、自然言語処理(潜在意味解析)、金融工学(株価データの主要因子抽出)、生物学(遺伝子発現データの可視化)、品質管理(多変量管理図)、機械学習の前処理(次元削減・ノイズ除去)など、データが多次元かつ変数間に相関がある場面ならほぼ全分野で使われます。100年以上の歴史があり、最も基本的かつ広く使われる多変量解析手法です。
数学的には等価です。中心化したデータ行列 X_c を SVD で X_c = U Σ V^T と分解すると、V の列が主成分(固有ベクトル)、Σ²/(n-1) の対角成分が固有値になります。実装上は、共分散行列を明示的に作らない SVD ベースの方が数値的に安定で、特に変数の数 p がサンプル数 n より大きい場合(p ≫ n)に有利です。scikit-learn の PCA も内部では SVD を使っています。
主成分座標 z_i を √λ_i で割って、すべての主成分の分散を 1 に揃える処理です。結果として、データは無相関かつ単位分散の「白いノイズ」のような分布になります。独立成分分析(ICA)の前処理や、ガウス過程の前処理、深層学習の入力正規化で使われます。ただし固有値が小さい主成分で割ると数値が不安定になるため、しきい値以下の主成分は捨てる、あるいは正則化項を加える(ε-whitening)のが普通です。
事前に標準化(各変数を平均0・分散1に変換)してから PCA を適用するのが鉄則です。例えば「身長(cm)」と「体重(kg)」と「年齢(年)」を混ぜると、身長の数値が大きいだけで第 1 主成分は身長軸に支配されてしまいます。標準化すると、全変数が同じ重みで PCA に寄与します。これは「相関行列に対する PCA」と呼ばれ、共分散行列に対する PCA と区別されます。物理的に同じ単位の変数だけを扱う場合は標準化不要なこともあります。
実世界での応用
画像認識(固有顔):1990年代に Turk と Pentland が提案した「固有顔(Eigenfaces)」は、PCA の最も有名な応用です。多数の顔画像を高次元ベクトルとして集めて PCA を適用すると、上位の主成分が「顔の主要な変動パターン」(明るさ、髪型、表情など)を表します。本人認識は、認証対象の顔を主成分座標に投影し、登録顔との距離で判定します。シンプルですが、深層学習以前の標準的な手法でした。
遺伝子発現データの可視化:マイクロアレイや RNA-seq で得られる数万次元の遺伝子発現データに PCA を適用すると、サンプル(患者・組織・条件)を2〜3次元の散布図で可視化できます。がんのサブタイプ分類や、薬剤応答の違いを直感的に確認する標準ツールです。bioinformatics の論文では PCA プロットが標準的な「最初の図」になっています。
金融工学の因子モデル:株価リターンの共分散行列に PCA を適用すると、第 1 主成分が「市場全体の動き」、第 2 主成分が「業種の相対的な動き」、第 3 主成分が「規模効果」などを表すことが多いです。ポートフォリオ最適化や、リスクモデリングの基礎として広く使われます。
品質管理と異常検知:製造プロセスの多変量センサーデータに PCA を適用し、上位の主成分だけを「正常状態」のモデルとして保持しておきます。新しいデータが入ってきたとき、主成分空間内の距離(T²統計量)や、捨てた主成分への投影量(Q統計量)が大きければ「異常」と判定します。半導体製造や化学プラントで実用化されています。
よくある誤解と注意点
最も多い誤解は、「主成分には物理的な意味があるはず」と考えてしまうことです。主成分は数学的に「分散が最大になる方向」として決まるもので、必ずしも解釈可能な意味を持つとは限りません。例えば顧客アンケートの第 1 主成分が「総合満足度」、第 2 主成分が「価格 vs 品質のトレードオフ」のように解釈できる場合もありますが、解釈不能なこともあります。ローディング(各元変数への係数)を確認して、何の線形結合かを常に把握する習慣をつけてください。
次に多いのが、非線形構造を PCA で扱おうとする失敗です。PCA は線形手法なので、データが曲線状(例えばスイスロール状)に分布していると、主成分軸ではその構造を捉えられません。シミュレーターで ρ を 0 に近づけて σ_x ≈ σ_y にすると、主成分の方向は不定になります。同様に、円環状や複雑なクラスタ構造を持つデータには、カーネル PCA、t-SNE、UMAP、自己符号化器などの非線形手法を検討すべきです。「PCA で次元削減してから機械学習」はベースラインとして優秀ですが、万能ではありません。
最後に、「実測値と理論値の差」を過小評価しないこと。このシミュレーターでも、N=40 の有限サンプルから計算した固有値は、母集団の理論値(λ₁=4.69, λ₂=0.31)から数%ずれます。N=10 ではブレがさらに大きくなります。実務では「主成分は何本残せば十分か」「観測された寄与率は統計的に有意か」を判断するために、ブートストラップ法や交差検証で固有値の信頼区間を評価することが推奨されます。サンプル数が少ないときの PCA は、点推定だけでなく不確実性も併せて報告することが重要です。