Python、機械学習

多変量解析の意味、PCA(主成分分析)とPLS(部分的最小二乗法)の違いをわかりやすく説明する

品質管理やデータ分析に関わっていると、「多変量解析」という言葉に遭遇します。

そもそも多変量解析とは何なのでしょうか?そして、多変量解析の具体的な手法であるPCA(主成分分析)やPLSとはどんなものなのでしょうか?

ここでは定性的なイメージをつかめるように説明します。

要約

・多変量解析とは説明変数の多いデータを扱う手法。

・説明変数がめっちゃ多くてデータ解析しにくい…、じゃあ各説明変数のエキスをいい感じに濃縮した少数の説明変数を新たに作り出して、これでデータ分析をしようという方法がよく用いられる。

・説明変数の情報だけ使うのがPCA

・目的変数の情報も使うのがPLS

・PCAやPLSで作り出した説明変数を主成分という。これを使ってデータの可視化、分類、回帰ができる。さらに、主成分にどんなエキスがどのくらい含まれているか(ローディング)を調べることもできる。これにより、どの変数が重要なのかを考察することができる。

以下、詳しく説明します。

多変量解析とは?

簡単に言うと、多変量解析とは説明変数の多いデータを扱うことを言います。

例えば、毎日製造している製品があって、時々不良が出ていて困っているとします。不良が出る原因を調べるために、各製造ロットのデータを分析することになりました。

製造ロットのデータには、
・原料の純度
・製造日
・成形機の種類
・設定温度
・圧力
・トルク
・成形機内の実温
・冷却速度
・冷却時間
・気温
・湿度
・日時
・担当者名 …etc.
と実に多くのパラメータ(変数)を含みます。

変数が多すぎて、1つ1つを見ても良品/不良品を決めている要因はわかりません。

このような場面で役に立つのが多変量解析です。

y = f(X) とし、製造ロットのデータの各変数を「説明変数X=[x1, x2, …, x10]」、知りたい変数(良品か不良品か)を「目的変数y」とします。説明変数がx1, x2, …とたくさんあるときに多変量解析を用います。

説明変数を加工し、分析に使える少数の説明変数を新たに作る

多変量解析でよく検討されるのは、多数の説明変数をうまく加工して、新たな説明変数を作ることです。

例えば、

新しい説明変数=
原料の純度×0.3 + 成形機の設定温度×0.2 + トルク×0.2 + 冷却速度×0.1 +
成形室の気温×0.1 + 担当者名×0.1

で定義される新しい説明変数を作り、この説明変数と目的変数(良品か不良品か)の関係を調べるというものです。

このようにして、良品/不良品の違いをうまく説明できそうな説明変数をいくつか作ります。

これにより、もともとあった多数の説明変数ではなく、新たに作った数個の説明変数だけを使って不良品が出た原因を探ることができます。

説明変数が大幅に減ると分析がしやすくなります。説明変数が少ないとグラフが描けるようになり、直感的にデータを眺められるようになります。人への説明も容易になります。

変数が2個だけですと2次元のグラフが描けます。変数が3個ですと3次元のグラフが描けます。変数が4以上になると、可視化がしんどくなります。3次元の世界に住んでいる以上、軸は3つ以上増やせませんので、プロットの色や形を変えて4つ目以降の変数を表現することになります。そうなるとグラフが複雑になりすぎて、パッと見わかりにくいです。

また、説明変数の数がデータの数よりも多いと、そもそも重回帰分析ができなくなります。

繰り返しになりますが、今ある多数の説明変数を加工して、分析に使えそうな少数の説明変数に変換し、データ分析をシンプルにするのが多変量解析です。

少数の説明変数を新たに作る方法が、PCAとPLS

少数の説明変数を新たに作る方法が、PCA(主成分分析)とPLS(部分的最小二乗法)です。

PCA(主成分分析)

PCAは、データの違いをはっきり表せる説明変数を生み出します。

例えば、もともとの説明変数(X=[x1, x2, …, x10])ではよく分からなかったけど、x1, x2, …, x10を使って新たに作った説明変数(X=xnew)で見てやると、データが0.7〜0.9と0.2〜0.4付近に偏在し、なんとなく2グループに分かれていることが分かった!

そんなxnewは、「データ間の違いをはっきり表せる」説明変数だと言えます。

このような、データ間の違いをはっきり表せる説明変数を「主成分」と言います。

ポイントは、新たに説明変数を作るときに目的変数(良品か不良品か)の情報を一切使わないことです。

説明変数の情報だけを使って、データ間の違いを際立たせています。

結果的に、その2グループがそれぞれ目的変数の違いに対応する場合もあります。つまり、片方のグループが良品、もう片方のグループが不良品となるケースです。もちろん、目的変数と関係がないケースもあります。

さまざまな加工の仕方を試してみて、最も「データの違いをはっきり表せる」説明変数を作り出します。これを第一主成分といいます。

次に、第一主成分と相関係数がゼロで、かつ第一主成分の次に「データの違いをはっきり表せる」説明変数を作り出します。これを第二主成分といいます。

これを繰り返して第n主成分まで作り出します。実際は第一主成分、第二主成分、第三主成分あたりまでを使うことが多いです。

実際には、試行錯誤して各主成分を作るのではなく、固有値問題を解くことで数学的に求めることができます。

PLS(部分的最小二乗法)

PLSは、データの目的変数の違いをはっきり表す説明変数を生み出します。

PCAは各データのXの違いを使いましたが、PLSではyの情報も使います。

例えば、もともとの説明変数(X=[x1, x2, …, x10])ではよく分からなかったけど、x1, x2, …, x10を使って新たに作った説明変数(X=xnew)で見てやると、xnewが小さいデータはy=不良品になり、xnewが大きいデータはy=良品になる傾向が見えた!

そんなxnewは、「データの目的変数の違いをはっきり表せる」説明変数だと言えます。

最も「データの目的変数の違いをはっきり表せる」説明変数を第一主成分といいます。

次に、第一主成分と相関係数がゼロで、かつ第一主成分の次に「良品/不良品の違いをはっきり表せる」説明変数を作り出します。これを第二主成分といいます。

厳密には、もともとのデータのうち第一主成分で説明できた分を取り除いた残差データに対して同じこと、つまり、最も「良品/不良品の違いをはっきり表せる」説明変数を作り出します。これを第二主成分とします。この繰り返しで第n主成分まで作り出します。

このあたりは数式を追って確認した方がイメージがわくかと思います。

PLSにおいても、試行錯誤ではなく数学的に解くことで主成分を算出できます。

PCA、PLSを使ってできること1:可視化

PCAやPLSで新たに作り出した主成分を使うことで、データの分布を可視化できます。

例えば、横軸を第一主成分、縦軸を第二主成分にして全データをプロットして、データがどんな感じにプロットしているかがわかります。

PCA、PLSを使ってできること2:どの変数が効いているか考察できる

もしPCAの第一主成分が

第一主成分=
原料の純度×0.3 + 成形機の設定温度×0.2 + トルク×0.2 + 冷却速度×0.1 +
成形室の気温×0.1 + 担当者名×0.1

という比率で構成されていることがわかったら、「原料の純度、成形機の設定温度、トルクあたりに着目すると、データ間の違いがはっきり見えてくるな。」と考察できます。

もしPLSの第一主成分が

第一主成分=
原料の純度×0.3 + 成形機の設定温度×0.2 + トルク×0.2 + 冷却速度×0.1 +
成形室の気温×0.1 + 担当者名×0.1

という比率で構成されていることがわかったら、「原料の純度、成形機の設定温度、トルクあたりが不良率に強く影響してそうだ」と考察できます。

このように、主成分の構成に各説明変数がどのくらい盛り込まれているかを表すのがローディング(因子負荷量)です。

上の例ですと、第一主成分を構成する説明変数のうち、原料の純度のローディングが大きいことが分かります(0.3)。

ただし、PLSの場合、第二主成分以降のローディングは上述のような解釈ができないので要注意です。(前述の通り、PLSでは説明変数の情報のうち、第一主成分で説明できなかった分を元に第二主成分を決めるため。第三成分以降も同様で、第n主成分は、第n-1主成分までで説明できなかった情報を元に決めていく)

注意:ローディングの意味

ローディングの定義は学術分野、ローディングを計算する分析ソフトウェアによってまちまちのようですが、一般的には変数と主成分の相関係数(R)のことを指すようです。

また、ローディングを2乗したものを全て足し合わせると、1になります。ローディングベクトルの長さが1で、ローディングベクトルの向きは主成分軸の方向です。つまり、ローディングベクトル=主成分軸の単位ベクトルです。

PCA、PLSを使ってできること3:分類

データの分布を可視化して、いくつかのグループに分類されそうだというのが見えてきたら、グループの境界を引くことができます。

そして、新たな製造ロットのデータが得られたとき、どのグループに分類されるかを判定できるようになります。

何を基準に分類するかがわかっていれば、PCAよりもPLSの方が分類精度が良いはずです。今回のように、「良品/不良品」で分類したいと分かっていれば、PLSがよいです。

PLSという言葉はPLS回帰のことを指すことが多いため、分類問題でPLSを使う場合はPLS-DAと表現します。DAは判別分析(Discriminant Analysis)の略です。

PCA、PLSを使ってできること4:回帰

主成分を使って重回帰分析ができます。

これまでの話は、目的変数が「良品か不良品か」という離散値でした。

ここでは、目的変数を「製品の長さ」という連続値にします。

第n主成分をtn、そのおもみ(回帰係数)をwn、切片をb、目的変数をyとすると、次のような重回帰分析をすることになります。

y = w1x1 + w2x2 + w3x3 + ・・・ + wnxn + b

第何主成分までを使うかは、重回帰モデルの汎化性能を見て決めます。バリデーションデータに対する精度が最も高くなるところにします。

主成分が少なすぎると当てはまりが悪く、逆に主成分が多すぎると過学習を起こします。よって、いい感じのところを探ります。実際には、クロスバリデーションをして最適なnを決めます。

バイアスとバリアンスの違い、正則化の意味【機械学習, Python, スパースモデリング】機械学習をやっていると、バイアスとバリアンスのバランスが重要だという話がよく出てきます。 バイアスとバリアンスとは何なのか?バランスを...

なお、重回帰分析では、使う主成分の数はデータの数より少なくする必要があります。主成分がデータの数より多いと、各重みwを求めることができなくなります。そこだけ要注意です。

ちなみに、PCAの主成分を使った回帰をPCR、PLSの主成分を使った回帰を単にPLSと呼びます。

メリット①:データの数が少なく、変数がたくさんある系でも使える

重回帰分析では、説明変数の数がデータの数より多いものには対応できません。PCRやPLSですと、使う主成分の数を調整できます(=減らせます)。つまり、データの数が少なくても、回帰に使う主成分の数を減らすことで回帰問題が解けるようになります。

メリット②:安定した回帰モデルが作れる

重回帰分析では、説明変数間の相関係数が大きいとモデルが安定しづらくなります。つまり、モデルの作成に使うデータが変わるとおもみが大きくバラついてしまいます。これを多重共線性といいます。

PCAやPLSだと、それぞれの主成分同士の相関係数がゼロになるように作られるため、この問題が起こりません。

PLS回帰の方が精度がよくなる

PLSとは、説明変数たちを加工して、最も「目的変数の違いをはっきり表せる」変数を作り出す方法でした。

よって、PLSで作った主成分を使って回帰分析をするとPCRの場合よりもモデルの精度が上がります。