第05回: PCA による次元削減と可視化
資料のダウンロード
| ファイル | 内容 |
|---|---|
| exercise.py | ハンズオン演習スクリプト |
ヒントの使い方
python exercise.py --hint 1 # 方向性ヒント
python exercise.py --hint 1 --level 2 # より具体的なヒント
python exercise.py --hint 1 --level 3 # コード例
python exercise.py --check # 提出前の自己チェック
演習問題への取り組み方
- 下の講義ノートを読む(事前学習・2時間目安)
exercise.pyを実行してグラフを確認する- 演習問題(5問)に取り組む
python exercise.py --checkで確認するexercise.pyを提出する(締切は授業後1週間)
詰まったとき
解決しない場合は Q&A ページの投稿フォームを使ってください。
講義ノート
1. なぜ「次元削減」が必要か
本講義で扱うデータには、気温・騒音・緑化率・混雑度・PM2.5・幸福感・ストレスの7変数があります。7変数を同時に人間の目で眺めることは難しく、変数が増えるほど「どの変数がどう関係しているか」が見えにくくなります。この問題を次元の呪い(curse of dimensionality)と呼びます。
主成分分析(PCA: Principal Component Analysis)は、元の変数の持つ情報をできるだけ保ちながら、少ない次元(主に2〜3次元)に圧縮する手法です。圧縮後の座標軸を主成分(Principal Component)と呼び、PC1・PC2・…と番号をつけます。
2. PCAの直感的なイメージ
散布図の点群に「最も広がりが大きい方向」の軸を引くことを想像してください。その軸が PC1 です。次に、PC1 と直交する方向のうち最も広がりが大きいものが PC2、以降同様です。
数学的には「データの分散を最大化する線形変換を見つける」操作に相当します。データ行列を \(X\)(行: 観測、列: 変数)とすると、共分散行列 \(\Sigma = \frac{1}{n-1} X^\top X\) を固有値分解し、
を解きます。固有ベクトル \(\mathbf{v}_k\) が第 \(k\) 主成分の方向(ローディングベクトル)、固有値 \(\lambda_k\) がその方向に投影したときの分散の大きさを表します。
直感まとめ: - 固有値が大きい主成分 → データの「違い」をよく捉えている - 固有値が小さい主成分 → ほぼノイズ、捨てても影響が少ない
3. 標準化が必要な理由
PCAは「分散の大きさ」を基準に軸を決めます。そのため、単位が異なる変数をそのまま入力すると、単位が大きい変数が PC1 を独占してしまいます。
今回のデータで例えると:
- noise_level は 40〜80 dB の範囲で変動幅が大きい
- green_ratio は 0〜1 の範囲しかない
StandardScalerを使って各変数を「平均0・標準偏差1」に変換することで、変数ごとのスケールの違いを取り除き、純粋に「どの変数がデータの構造を説明するか」を評価できるようになります。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_df)
4. 寄与率と累積寄与率の読み方
寄与率(explained variance ratio)は、その主成分が元データ全体の分散の何%を説明するかを示します。
累積寄与率は PC1 から PC\(k\) までの寄与率を積み上げたものです。一般的な目安として、累積寄与率が 70〜80% を超える次元数で打ち切ることが多いですが、これは探索的な分析では柔軟に判断します。
演習データの例では、PC1 と PC2 の2次元だけで累積寄与率が 60% 前後になる場合、「元の情報の約6割を保持した散布図を見ている」と解釈します。残り40%の情報は可視化の外に捨てられていることに注意が必要です。
5. 固有ベクトル(ローディング行列)から主成分を解釈する
固有ベクトル(ローディング)は各元変数が主成分にどれだけ・どの方向に寄与するかを示します。
| 主成分 | 正の寄与が大きい変数 | 負の寄与が大きい変数 | 解釈の例 |
|---|---|---|---|
| PC1 | noise_level, crowd_density, stress_score | green_ratio, happiness_score | 「都市圧力 vs 快適性」軸 |
| PC2 | temperature, pm25 | — | 「季節・大気汚染」軸 |
(上表はデータに応じて実際の結果を確認して更新してください)
ローディングの絶対値が大きいほど、その変数は主成分の方向を強く決めています。正負は「向き」を示し、例えば PC1 で noise_level が正・green_ratio が負であれば、PC1 のスコアが大きい地点は「騒音が大きく緑が少ない」地点だと解釈できます。
6. PC1/PC2 散布図の読み方
散布図の各点は1地点に対応し、座標は PC1 スコア(横軸)・PC2 スコア(縦軸)です。
読む手順: 1. 場所種別ごとのクラスターが見えるか確認する(色分けで把握) 2. 大きく分離しているクラスター間の軸方向を読む(PC1 方向か PC2 方向か) 3. その軸方向に対応するローディングを確認し、「なぜ分離しているか」を説明する
例えば「公園」が PC1 の左端、「駅前」が右端に位置する場合、PC1 の解釈(騒音・混雑が右、緑・幸福が左)と整合しています。これがデータ分析における「可視化で仮説を立てる → 統計で確認する」の第一歩です。
7. 本日のまとめ
| 概念 | 一言まとめ |
|---|---|
| PCA の目的 | 分散を最大化しながら次元を削減する |
| 固有値 | 各主成分が捉えるデータの広がり(分散)の大きさ |
| 固有ベクトル | 各主成分の「方向」=元変数の重みつき組み合わせ |
| 標準化 | スケールを揃えて変数間の公平な比較を可能にする |
| 寄与率 | 情報の「何%を保持しているか」の指標 |
| スコアプロット | 次元削減後の地点の配置(PC1/PC2 空間) |
次回予告
第6回ではバイプロットを取り上げます。スコアプロット(地点の分布)とローディング(変数の矢印)を1枚のグラフに重ねることで、「どの変数がどの地点の特徴を作っているか」を直接読み解く方法を学びます。