ケイエルブイは、ハイパースペクトルカメラ・光学部品・光源など世界中の光学機器を取り扱う専門商社です。

03-3258-1238

お問い合わせ
KLV大学 ハイパースペクトルカメラコース
spectral-analysis-python-top.jpg

[2.2] Pythonで主成分分析(PCA)を行う ①基礎知識編

スペクトル解析は、撮影した数十〜数百波長のスペクトルデータを解析して、分類や定量化を行う必要があります。
ただし、スペクトルデータを単純に1波長ずつ解析して、データ全体の特徴を把握することは容易ではありません。

一方で、波長データは互いに強く相関しているため、その特徴をうまくつかむことができれば、解析を楽にすることが可能です。
この「特徴をうまくつかむ」を実現するために用いられる代表的な手法が、主成分分析(PCA:Principal Component Analysis)です。

PCAは、スペクトルデータ全体の「ばらつき」を整理し、膨大なデータを少数の主成分へ圧縮する手法で、 それにより「試料の類似性・違い」などをわかりやすくすることが可能です。
本記事では、PCAの基本概念の理解と、シンプルなサンプルデータを用いたPythonによるPCAの基本を紹介します。

1. 主成分分析(PCA)とは

1-1. PCAの概要

PCAでは、データが「どの方向に最も大きく広がっているか」を調べます。

例えば、試料の「水分量」と「吸光度」の関係を考えてみます。

PCA_基礎

近赤外分光を用いた場合、水分量が多い試料ほど吸光度も大きくなります。そのため、散布図を作成すると、点は左下から右上方向へ並ぶ傾向を持ちます。

このような特定の方向へ強く分布しているデータに対して、 「データのばらつきが最も大きい方向」=「分散が最も大きい軸」を探し、新しい軸として定義します。

新しい軸を設定するというのは、データの並び方に合わせて座標軸を回転させるようなイメージで、新しい軸を作ることを意味します。

PCAで新たに設定した最も大きな分散を持つ軸を「第一主成分(PC1)」PC1と直交する方向へ「第二主成分(PC2)」を作ります。

今回の例のように、データがほぼ一直線上に並んでいる場合、実際には2つの変数を使わなくても、 PC1という1本の軸だけでデータの特徴をかなり表現できます。

このように、元の多変量データを少数の主成分へ圧縮することを「次元削減」と呼び、「データの情報をできるだけ失わずに、より少ない変数で表現すること」がPCAの本質になります。

特にスペクトル解析では、数十〜数百波長という非常に多くの変数を持つデータですが、隣接する波長同士は強い相関を持つことが多いため、「次元削減」の効果が大きいためPCAが非常に有効な手段となります。

関連記事

PCAは、多数の波長から構成されるスペクトルデータを、できるだけ情報を保持したまま少数の主成分へ圧縮する手法です。
「なぜPCAで次元を圧縮できるのか」「次元圧縮によってどのような情報が失われるのか」といった基本的な考え方については、以下の記事を参照ください。

→【スペクトルの多変量解析】主成分分析(PCA)を使った物質の分類編

2. 主成分分析(PCA)の基本式とパラメータ

2.1 PCAの基本式

PCAは、元データの行列を以下の2つに分解します。

  • データの特徴を表す行列(「スコア行列」と「ローディング行列」)
  • 説明できなかった残差

これを数式では、以下のように表すことができます。

X = TP+ E

記号 意味
X 元のデータ行列
T スコア行列
P ローディング行列
E 誤差(残差)

スペクトルデータにおける「データの特徴を表す行列」を構成するのが、”スコア行列”と”ローディング行列”であり、この2つの内容を理解しておくことが、PCAでは重要となります。

スコア行列(T)は、各サンプルを主成分軸上に表した新しい座標値です。 スコアプロットの値が離れているかどうかで、サンプル同士のスペクトルの特徴が異なるかどうかがわかります。

一方、ローディング行列(P)は、各主成分を構成する元の変数の係数です。 どの変数・波長が主成分に関係しているかがわかります。

ここからは、それぞれの行列について、もう少し詳細に説明します。

2.2 スコア行列とは

スコアは、「各サンプルを、主成分空間へ変換した後の座標」です。
例えば、先程のPCAのサンプルでは、以下のような値になります。

試料 PC1 PC2
A -2.1 0.3
B -1.0 0.1
C 1.2 -0.2
D 2.0 -0.4
… … …

そして、このスコアをPC1-PC2平面の散布図として表示したものを「スコアプロット」と呼びます。

PCA_基礎

このスコアを見ることで、以下のようなことが確認できます。

サンプル同士の類似性

スコアプロット上で近い位置にあるサンプルは、スペクトルの特徴が似ていることを示します。 分類であれば「同じ物質である」、定量化であれば「含有量が同程度である」といった可能性を考察できます。

孤立点

他のサンプルから離れて孤立しているサンプルは、スペクトルの特徴が他と大きく異なることを示します。
そのため、外れ値や異常なサンプルである可能性があると解釈できます。

PCA_基礎

スペクトル解析におけるスコアプロットの活用

前述したように、スコアプロットは、サンプルの「位置」「まとまり」「離れ」「移動」から、 スペクトルの特徴や変化を視覚的に捉えることができます。

例えば、品種や物質ごとに異なるグループを形成すれば「品種・物質の分類」、 正常なサンプル群から大きく離れた点があれば「異常検知」に利用できます。

また、保存期間が長くなるにつれてサンプルの位置が一定方向へ移動する「劣化評価」、 乾燥・加熱・発酵などの処理時間に応じて連続的に位置が変化する「状態変化の解析」などもわかりやすいです。

このように、スコアプロット上の分布や動きを観察することで、 スペクトルに含まれるさまざまな情報を直感的に理解できます。

2.3 ローディングとは

ローディングは、「各変数が主成分を構成する際の重み」を表す値です。 スペクトルデータの場合、それぞれの波長が主成分(PC1やPC2)にどの程度関係しているかを示します。

例えば、PC1のローディングが以下のような値だったとします。

波長 PC1ローディング
970 nm 0.82
1200 nm 0.15
1450 nm -0.76

この例では、970 nmのローディングの値が「0.82」、1450 nmが「-0.76」となっており、1200 nmの「0.15」と比べて絶対値が大きくなっています。 ローディングは、絶対値が大きいほど、その波長が主成分の形成に強く関係していることを示すので、PC1は主に970 nmや1450 nm付近のスペクトル変化を反映した主成分であるということがわかります。

また、ローディングの値の符号が、970 nmでは正(+)、1450 nmでは負(-)のなっています。 ここから、PC1に対して両者が反対方向に関係していることもわかります。

このように、ローディングの値からスペクトル解析では、「PC1でどの波長が大きく変化しているのか」、「サンプルの違いにどの波長が関係しているのか」を考察できます。

スペクトル解析におけるローディングの活用

例えば、大きなローディングが現れた波長に吸収を持つ成分を調べることで、サンプルの分布に関係している成分を特定することができます。
また、広い波長範囲にわたる変化から、散乱やベースライン変動の影響を考察することもできます。

3. 主成分分析(PCA)のまとめ

PCAは、「データ全体のばらつきを、少数の特徴的なパターンへ整理すること」であり、数学的には、以下のように元のデータ行列 X を、スコア(T)、ローディング(P)、残差(E)へ分解します。

X = TP+ E

ここで重要となるのが、スコア(T)とローディング(P)です。2つの違いを表に整理してみます。

項目 表しているもの 確認できること
スコア サンプル側の情報 どのサンプルが類似しているか、異なっているか
ローディング 変数・波長側の情報 どの波長がサンプルの違いに関係しているか

例えば、乾燥した試料と水分を含む試料がスコアプロット上で分離できていれば、これらを分類することが可能ということがわかります。
また、このとき、対応するローディングを確認して水に関連する波長に大きな値が見られれば、「サンプルを分離できる要因として、水分に関連するスペクトル変化が関係している可能性がある」と考察できます。

つまり、スペクトル解析では、スコアから「どの試料が、どのように違うのか」を捉え、ローディングから「その違いに、どの波長が関係しているのか」を組み合わせて見ることが重要です。

4. Pythonで主成分分析(PCA)を実現

ここまで、PCAの基本的な考え方と、スコア・ローディングの意味について説明してきました。
実際のデータにPCAを適用するためには、データを行列として扱い、主成分を求めるための計算を行う必要があります。

こうした計算を行うプログラムを1から実装するのは大変ですが、Pythonの機械学習ライブラリ「scikit-learn」に用意されている機能を使用すれば、簡単なコードでPCAが実行できます。

次の記事では、scikit-learnでPCAを実行し、スコア、ローディング、寄与率を確認するコマンドについて解説します。

次の記事

scikit-learnを使用してPCAを実行する際に使用する基本的なコマンドや、寄与率・スコア・ローディングを確認する方法について解説。

→[2.2] Pythonで主成分分析(PCA)を行う ②Pythonコマンド編

ハイパースペクトルカメラコース

ご質問・ご相談お気軽にお問い合せください

お電話でのお問合せ 03-3258-1238 受付時間 平日9:00-18:00(土日祝日除く)
Webでのお問い合わせ