「主成分分析(PCA)」

九州大学 大学院システム情報科学研究院
情報知能工学部門
データサイエンス実践特別講座
備瀬竜馬, Diego Thomas, 正井克俊

分析とは？

ベクトルの分解と合成
2

分析の例：
カレーにジャガイモは何グラム入ってる？
ニンジン 0g

玉ねぎ 80g

ジャガイモ50g

肉150g

分析
カレー粉 10g
色々なものが混ざっているのでパッと見ただけではどんなカレーかわからない

何がどれぐらい混ざっているかわかったら，どんなカレーかクリアになる！

参考：「温泉の成分表」
これがあるからどんな温泉かがわかる！

環境省「鉱泉分析法指針」より

4

分析の際にケアすべきポイント(1/4)
基本的に見落としはNG
ニンジン 0g

玉ねぎ 80g

ジャガイモ50g

混ぜ合わせ

水無しカレー！

肉150g

カレー粉 10g

見落とし
水 2000g

後述の「完備性」と関係

分析の際にケアすべきポイント(2/4)
分析項目に重複がないほうが良いだろう
ニンジン 0g

玉ねぎ 80g

ジャガイモ50g

混ぜ合わせ

肉150g

やたらスパイシーなカレー！

水 2000g
実はカレー粉の中に入っている成分

唐辛子 2g

カレー粉 10g

クミン 1g

後述の「直交性」と関係

分析の際にケアすべきポイント(3/4)
分析する単位は統一したほうがよいだろう
ニンジン 0本

玉ねぎ 80g
ジャガイモ
30 ㎤

元のカレーには完全に戻るのだが...

肉0.15 kg

水 3カップ比べにくい！

カレー粉 10000 mg

混ぜ合わせ

後述の「正規性」と関係

分析の際にケアすべきポイント(4/4)
解釈容易な成分に分解したほうがよい
ホゲホゲ 50g
モゴモゴ 100g
元のカレーには完全に戻るのだが...

マニョマニョ
400g

ちりとてちん 35g

混ぜ合わせ

後述の「基底の任意性」と関係

これからの話:カレーからベクトルへ
8

10

分析

色々なものが混ざっているのでパッと見ただけではどんな高次元ベクトルかわからない

6

何がどれぐらい混ざっているかわかったら，どんな高次元ベクトルかクリアになる！

主成分分析

早速ですが，具体例
 アイリスデータ

 3クラス
 Iris-setosa Iris-versicolor
 Iris-virginica

 指標（4次元）
 sepal length sepal width petal length petal width
https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data

11

早速ですが，具体例
 アイリスデータ

 3クラス
 Iris-setosa Iris-versicolor
 Iris-virginica

 指標（4次元）→2次元にできるか？
 sepal length sepal width petal length petal width
https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data

12

好きな2次元を「選ぶ」ことも可能だが・・・
例：アイリスデータの二次元プロット

データを的確に表現できる2次元を「作る」→ PCAの出番※2次元でなくても，好きなd次元でよいですPython で PCA←データの読み込み & 4次元をXに←データの正規化（後述）←PCAのパラメータをセット：（2次元）←PCAで2次元にするルール作り←2次元にしたXをゲット←重複したクラスを削除（クラスのリストを取得）←プロット

プロットしてみると．．．
クラスの情報は全く使っていないのに，スゴイ

横軸：第一主成分，縦軸：第二主成分

データを「的確に」表現できているか？
●各主成分の「寄与率」→ 第一主成分で 72.7%, 第二主成分と合わせて 95.8% を表現できている！（データの広がり具合＝分散を95.8%説明できている）●各主成分の「中身」→ 第一主成分は0.522…×(sepal length) – 0.263…×(sepal width)+ 0.581…×(petal length) + 0.565…×(petal width)で構成されている．各係数を主成分負荷量とよぶ

PCA の特徴̃
●𝑑𝑑(<元の次元数 𝑑𝑑)個の主成分で，𝑑𝑑 次元ベクトル分布全体をコンパクトに表現●この意味で，クラスタリングの代表ベクトルにも似ている●時には𝑑𝑑̃ ≪ 𝑑𝑑̃
●やろうと思えばいくらでも𝑑𝑑は小さくできる●ただし，やりすぎると分布の構造をうまく捉えられないことに●主成分方向＝平均からの主要な変動と捉えることも可能

正規化：

PCA だけでなく，多くのデータ分析でまずやること

第2次元(体重 kg)

狭い●平均をゼロ，分散を1に「正規化」する！

第1次元(身長 mm)

非常に広がっている

分散1

各軸を伸び縮みさせ同程度の「広がり」に正規化
された体重

正規化
された身長

分散1

「平均ゼロ，分散を１」にするには？
●まず平均をゼロに●全部の値から現在の平均値を引けば，平均はゼロになる

−𝑥𝑥�

0𝑥𝑥�

●次に分散を１に！

●前に，「値を 𝑥𝑥𝑖𝑖 から𝛼𝛼𝑥𝑥𝑖𝑖 にすると，分散は𝛼𝛼 2 𝜎𝜎 2 になる」と言いました●𝛼𝛼 2 𝜎𝜎 2 = 1にしたいということは，𝑥𝑥𝑖𝑖 を𝛼𝛼 =分散𝜎𝜎 20× 1⁄𝜎𝜎 21⁄𝜎𝜎 2 倍すればOK!
分散10

練習1：
●Irisデータセットの “petal width” を正規化せよ●正規化したデータと、正規化前のデータをプロットせよ

主成分分析でわかること

各主成分の重要度(「累積寄与率」とか「固有値」がそれです)●大きく広がっている→重要度高い●第1, 第2, 第3...と，重要度は下がる●ただし，下がり方は様々．そしてそれが非常に重要！
●慣れてくると，この「下がり方カーブ」で分布の形状が想像できる重要度

̃ 第𝑑𝑑̃ + 1,…,第𝑑𝑑
第1, 第2, 第3,…, 第𝑑𝑑,

さらに慣れてくるとわかること：
2要素間の相関(詳しくは後述)
𝑥𝑥2

𝑥𝑥2

非常に広がっている方向があり(=偏りがあり)，それが正の相関を示している

𝑥𝑥1

非常に広がっている方向があり(=偏りがあり)，それが負の相関を示している

𝑥𝑥1

𝑥𝑥2𝑥𝑥2

非常に広がっている方向はあるが，それは無相関を示している

𝑥𝑥1

広がり一様→球状分布→無相関

𝑥𝑥1

さらに慣れてくるとわかること：
2要素間の相関(詳しくは後述)
非常に広がっている方向があり(=偏りがあり)，
𝑥𝑥1 →大，𝑥𝑥2 →大，𝑥𝑥3 →小(𝑥𝑥1 →小，𝑥𝑥2 →小，𝑥𝑥3 →大，と等価)

𝑥𝑥3

𝑥𝑥3

𝑥𝑥2
𝑥𝑥1

広がり一様→球状分布→無相関

𝑥𝑥2
𝑥𝑥1

練習２：
●Irisデータに対してPCA（n=4）を行え●各次元の重要度を大きい順にプロットせよ

重要度

̃ 第𝑑𝑑̃ + 1,…,第𝑑𝑑
第1, 第2, 第3,…, 第𝑑𝑑,

主成分を求める実際の方法

詳細略広がった方向を求めるための2つの基準(1):
分散最大基準●なるべく分散の大きくなる方向に主成分を求めたい
第2次元(身長)

分散小分散大good

第1次元(体重)bad広がった方向を求めるための2つの基準(2):最小二乗誤差基準●「なるべく誤差が小さくなる方向に主成分を求めたい」
第2次元(身長)

誤差小good

第1次元(体重)誤差大bad参考：主成分分析の解法●分散・最小誤差，どちらの基準でも，次のように解ける●まったく同じ主成分が求まる●以下の3ステップで終了
1.

データ集合(各々𝑑𝑑次元ベクトル)から共分散行列 Cov を求める

Cov の固有値と固有ベクトルを求める̃̃
3. 固有値の大きなものから𝑑𝑑個の固有ベクトルを主成分とする（𝑑𝑑は適当に決定)2.

主成分分析の解法（詳細）完全に覚える必要はないです
必要なときの参考資料として．．．

解法の雰囲気を図解する
共分散行列
∑を求める
（データの広がりを表現）

固有値
固有ベクトル̃ 個だけ残す
上位𝑑𝑑

第1固有ベクトル（方向）第1固有値(広がり=重要度)
第2固有ベクトル

共分散●式（ベクトルXとベクトルYの共分散）●共分散の意味●符号がもっとも重要：•正（>0）のとき…𝑋𝑋𝑖𝑖 が大きいとき𝑌𝑌𝑖𝑖 も大きい傾向あり•負（<0）のとき…𝑋𝑋𝑖𝑖 が大きいとき𝑌𝑌𝑖𝑖 は小さい傾向あり•０（=0）のとき…𝑋𝑋𝑖𝑖 が大きいとき𝑌𝑌𝑖𝑖 に傾向なし•実は，各変数を標準偏差で割ったものが前回習った相関係数になる！

共分散の具体例●iris データで，sepal_length と petal_length の共分散行列を求めてみると…

cov(sepal_length, petal_length)>0:
sepal_length が大きいとき，petal_lengthも大きい傾向にある

固有値と固有ベクトル●𝐴𝐴𝒙𝒙 = 𝜆𝜆𝒙𝒙 が成り立つとき，𝒙𝒙 は 行列 𝐴𝐴 の固有ベクトル●𝜆𝜆 は 𝐴𝐴 の固有値
●例：行列 A =ちなみに・・・
行列はベクトルの組

Aはベクトル(2,3)とベクトル(2,1)の組固有ベクトルでない固有ベクトル𝐴𝐴𝒙𝒙

𝜆𝜆𝒙𝒙34固有値と固有ベクトルの求め方●以下の要領で計算できます

固有値

行列 A:

固有ベクトル

固有ベクトルは１個とは限らない固有値が大きい順に並べたとき，１番大きいのが第一主成分35固有値と固有ベクトル（確認）●本当に合ってるか見てみると…

第一固有ベクトル
第一固有値
行列とベクトルの内積固有ベクトルの条件を満たしている

𝐴𝐴 × 𝑒𝑒1 = 𝜆𝜆 × 𝑒𝑒136

解法の雰囲気を図解する（再掲）
共分散行列
∑を求める
（データの広がりを表現）

固有値
固有ベクトル̃ 個だけ残す
上位𝑑𝑑

第1固有ベクトル（方向）第1固有値(広がり=重要度)
第2固有ベクトルIris data で試してみよう（正規化なし）●Sepal lengtと Petal length の分布と第一主成分を可視化してみよう。(分かりやすいように平均値だけ正規化)

Iris data で試してみよう（正規化なし）●PCA関数と比べてみよう

順序は大きい順に並べ替えれば同じIris data で試してみよう（正規化なし）●可視化してみよう

第二主成分
第二主成分

第一主成分

Iris data で試してみよう（正規化あり）
傾き：１

主成分の寄与率を分析

練習3：●Irisデータセットを np.array() に変換●np.cov を使って共分散行列を求める●np.linalg.eig を使って固有値と固有ベクトルを求める

演習

演習1
●次のデータを正規化しなさい（平均0，分散1）●ais.csvの（'Ht', 'Wt', 'LBM‘,’BMI’)(X = ais[['Ht', 'Wt', 'LBM‘,’BMI’]])●各データを主成分分析し，第二主成分まででデータをプロットしなさい•発展：性別ごとに色を変えてみよう（P14を参考）●主成分の寄与率をプロットし、第何主成分までとれば、計90%の寄与率になるか調べよ演習2●次のデータを正規化しなさい（平均0，分散1）●winequality-red.csv（qualityは除く）•注）「;」区切りになっている●各データを主成分分析し，第二主成分まででデータをプロットしなさい●主成分の寄与率をプロットし、第何主成分までとれば、計90%の寄与率になるか調べよ演習3●次のデータを正規化しなさい（平均0，分散1）●boston_house.csv（MVは除く）●各データを主成分分析し，第二主成分まででデータをプロットしなさい●主成分の寄与率をプロットし、第何主成分までとれば、計80%の寄与率になるか調べよAdvance
早く終わった人はやってみよう

演習4●次のデータをpca 関数を使わずに、共分散、固有値分解を行うことで主成分分析を行え●wine_data.csv（qualityは除く）•注）「;」区切りになっている●各データを主成分分析し，第二主成分まででデータをプロットしなさい