WeeklyAlteryxTips#26 Alteryxで主成分分析の結果を別のデータに適用する

Alteryx

主成分分析は次元削減に役に立つ分析手法ですが、PythonやRなどのプログラミング言語では、あるデータセットに対して適用した主成分分析の結果を新たに入手した結果に対しても適用することができます。つまり、実施した結果を学習し再利用できるということになります。

例えば、Pythonでscikit-learnを使った場合、主成分分析は、

pca.fit(data)

という形で実行することができますが、この結果を、新しいdata2に適用する場合は、

pca.transform(data2)

とするだけです。このpcaの結果をファイルに保存することも可能です。

しかしながら、Alteryxでは新しく入手したデータに対して過去に行った主成分分析の結果を適用することは出来ません。しかし、そもそも主成分分析を他のデータに適用するのは簡単です。改めて主成分分析のレポートを見てみましょう。

この「コンポーネントの読み込み」を見てみましょう。これによると、PC1の軸については、Alcoholが-0.12、Malic.acidが-0.99、Ashが-0.04と記載されています(小数点3位以下切り捨て)。これの意味は、Alcoholに-0.12をかけて、Malic.acidに-0.99をかけて、Ashに-0.04をかけて足す、ということを意味しています。つまりここに表示されているのは単なる係数(これを主成分負荷量と言います)です。ここではPC1~PC3の軸まであるので、3つの軸に対してそれぞれ係数をかけて足し算を行えば他のデータに適用することができます。

なお、新しいデータに対して主成分分析を行うと、新しいデータについての新たな分析が行われるため、結果が異なってしまいます。同じデータソースに対して検証用として用意したデータに対して主成分分析をかけた結果は以下のとおりです。

傾向は似ていますが、結果は異なります。ただ、これ、新規のデータが1件、2件など極端にすくなかったりすると、そもそも主成分分析が成り立ちません。

しかしながら、主成分分析は次元削減用なので、そもそも項目数が多いはずです。このパラメータ(係数)を手書きで写していると非常に面倒です。ということで、ワークフロー内で自動的に出来ないかを探ってみましょう。

Alteryxのレポートとは?

主成分分析ツールの結果は、O出力とR出力がありますが、O出力にはこの係数(主成分負荷量)は出力されていません。R出力を見てみると、閲覧ツールで見ると上のようなテーブルでのレポートを見ることが出来ますが、実際のレコードとしては、以下のようになっています。

欲しいデータは、この5レコード目のComponentLoadingsのReportフィールドの中に入っています。

これをダブルクリックして見てみましょう。

このように、HTML形式でどうやら書かれているようです。つまり、これをがんばってパースすればほしいデータが得られそうです。

主成分分析のレポートから係数を取り出す

がんばってパースしていくと、以下のようにパース可能です。

今回は詳細説明を省きます(サンプルワークフローでご確認ください)が、以下のような結果が得られます。

これが得られれば、以下のようなワークフローで簡単に計算が可能です。

データを縦持ちにしておくことがポイントです。

もちろん、R言語であればこの係数(主成分負荷量)を取り出すことは簡単なのですが、起動に時間がかかるためレポートから取り出す方が速度面は有利かと思います。

なお、「単位分散を調整する」オプションを使った場合、主成分分析ツール内で標準化が行われるため、新規データについても標準化を行ってから適用する必要があります。この場合、新規データに対してのスケーリングも学習時に適用したスケーリングの値を使う必要があることに注意してください(標準偏差や平均値など)。

サンプルワークフロー

コメント

タイトルとURLをコピーしました