LabVIEWを使ってペンギンデータセットを主成分分析してみた

#はじめに
本記事は、LabVIEWを使った主成分分析について解説しています。
パルマーペンギンデータに対して、主成分分析をおこない、約90%の情報量を保持したまま2次元データへ次元圧縮可能なことを確認できました。
LabVIEWによる統計処理作成の際に参考になれば幸いです。
# パルマーペンギンデータセット
有名なアイリスデータセットに取って代わることを目標としたデータセットのようです。パルマー諸島に生息するアデリーペンギン、ジェンツーペンギン、ヒゲペンギンの3種のペンギンについて、生息する島、くちばしの長さ、くちばしの高さ、羽の長さ、体重、性別、西暦のデータが格納されています。アデリーペンギンはスイカペンギンのモデルのようです。

palmerpenguins
https://allisonhorst.github.io/palmerpenguins/


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/11b7dda7-1cae-8ecd-4f44-93ca15a42365.png)


くちばしの長さ、高さ、ひれの長さ、体重をペアプロットした結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/8769b71a-2b6a-b8f7-a5c9-22734b42c5cb.png)

# 処理の流れ
データセットから抽出した、オスのくちばしの長さ、くちばしの高さ、ひれの長さ、体重のデータに対して主成分分析をおこない、第1、第2主成で散布図を作成しました。
処理の流れは以下のとおりです。

1. データセットをcsv形式で保存する。(*Pythonで実行)
1. LabVIEWでcsvファイルを読み込む。
1. 標準化する。
1. 共分散行列を求める。
1. 共分散行列の固有値と固有ベクトルを求める。
1. 第1,第2,第3,第4主成分がなす空間へ標準データを射影する。
1. 第1,第2主成分を抽出し散布図を作成する。

viのフロントパネル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/c8d1a07a-5cc0-3a80-f128-af3731374031.png)

viのダイアグラム
![PCA_Penguin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/8fa1396e-eca9-6467-289c-8c050d68bcda.png)


# 処理の説明
順番に処理を説明します。

1.データセットをcsv形式で保存する。(*Pythonで実行)
オスのデータを抽出した後、データをcsvファイルへ書き出します。

```Python

from palmerpenguins import load_penguins
penguins = load_penguins()

male = penguins.query("sex == 'male'")
male.to_csv("./penguins_male.csv",
     columns=["bill_length_mm", "bill_depth_mm","flipper_length_mm", "body_mass_g","species"],index=False)

```

2.LabVIEWでcsvファイルを読み込む。
左下の処理で散布図が正方形となるようサイズを調整しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/8dfd8a9b-018e-0774-a943-a50d6272e06a.png)
3.標準化する。
読み込んだデータを、平均値=0、分散=1に標準化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/1cff9236-2eb4-8dc8-82f0-ceff299bdd48.png)
下図は元のデータと標準化したデータを散布図にプロットした結果です。
くちばしの長さ、くちばしの高さ、ひれの長さ、体重、すべてのデータを標準化していますが、ここでは2次元で表現するため、くちばしの長さと高さのデータを抽出し散布図を作成しています。
赤の標準化データの中心が0付近へ移動していることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/74fe367c-9d4b-12c3-12bf-7047c6d30afe.png)
4.共分散行列を求める。
元データと標準化後のデータに対して、Covariance Matrix.viを使い共分散行列を求めました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/d099a5a7-4465-16d0-9c0f-6a11df467203.png)
標準化データの対角成分が1付近となっていることが確認できます。
Covariance Matrix.viは不偏分散を返します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/218800b9-b147-95d8-7cb8-935467a90003.png)
5.共分散行列の固有値と固有ベクトルを求める。
Eigenvalues and Vectors.viを使い算出しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/294d6c33-a8d6-a00a-1534-5459377e9fb7.png)
下図が結果です。
固有ベクトルは、元データの分散が大きい方向をあらわすベクトルです。第1主成分がもっとも分散が大きい方向となります。
固有値は、各主成分方向における分散をあらわします。
寄与率は、各主成分がもつ分散の比率になり、ペンギンデータの場合、第1、第2主成分でおおよそ90%の情報を持っていることになります。
つまり、4次元のデータから第1,第2主成分の2次元のデータへ圧縮した場合においても、全体の90%の情報を保持していることになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/1ff9bb33-bd3d-f392-4185-c9407cff5e99.png)
6.主成分がなす空間へ標準データを射影する。
固有ベクトルを列の要素とする行列と標準化データを掛け算し、第1,第2,第3,第4主成分がなす空間へ標準データを射影します。
ここでもLabVIEWの標準関数を使って行列積を計算しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/84c829f1-6f5c-ba70-f59c-1862662ad89b.png)
7.第1,第2主成分を抽出し散布図を作成する。
第1,第2主成分を抽出しXYグラフを使って散布図を作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/4845ade0-2861-e0b1-25a7-bcc02f542ef2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674241/31830a61-cde4-344c-96d7-ec1ff03c2739.png)
#まとめ
LabVIEWでも問題なく主成分分析処理の実装が実現できました。
LabVIEWはマウス操作でGUIを自由自在に編集できるので、結果のビジュアライズを楽に実現できました。