AI(人工知能)の機械学習において、主成分分析という言葉を聞いたことは無いでしょうか?
主成分分析は、データ分析手法の1つです。機械学習においてもよく利用される分析手法であるため、AI技術者が理解しておくべき手法です。
また、AIによってビジネスを拡大したい、新たなビジネスを創出したいと考える多くの人にとっても、その概要や使い道くらいは知っておくのが好ましいでしょう。
ここでは、主成分分析をわかりやすく説明し、実際に分析を行う手順をご紹介します。
コンサルティング業界に20年以上在籍。IT戦略・構想策定など上流系が得意。
主成分分析(PCA)とは?

主成分分析(Principal Component Analysis; PCA)は、一言でいうと「情報を絞って分析しやすくする」分析手法です。データ分析を行う際、相関のある変数が多いと分析が難しいことがあります。そのため、変数を絞り込むことで分析を容易にしようという手法です。
専門用語を使うと、主成分分析は多変量解析の一手法です。データを要約し、特徴を単純化することで分析を容易にします。多変量解析の手法として知られているものには他に、重回帰分析や因子分析などがあります。
主成分分析は、次元削減手法として用いられます。次元削減とは、変数を削減することを指します。データ分析においては、変数が多ければ演算量が多くなり分析に時間を要します。
一方で、変数を削減するということは、大事な要素を見落とし、正しい解につながらないリスクも生じます。
主成分分析は、次元削減による分析の容易化と、重要な変数を残すことをできるだけ両立するために考案された分析手法です。
AIにおいては、教師なし学習に用いられており、最新のAI技術にも多く活用される手法です。
主成分分析の仕組み

主成分分析は、AIでよく利用されるデータ分析手法ですが、元々は統計学で利用される手法を用いています。そのため、統計学の用語もここでは登場します。
主成分分析の仕組みは以下の通りです。
固有値、寄与率、累積寄与率
主成分分析は、要するに全体を説明できる要素(主成分)に絞り込みをしていく手法ですが、その中で理解しておくべきパラメータがあります。
固有値とは、主成分として設定したデータセットにおける分散の大きさを示しています。「分散」とは、データのばらつきの度合いを表します。固有値が大きい主成分は、データ全体の特徴をよく表しているとされます。このため、固有値が大きいデータセットから優先的に主成分を決めていくのが好ましいです。
寄与率とは、その主成分がデータ全体の説明をどれだけカバーできているかを表します。
これを見ていく指標が累積寄与率です。第1主成分が60%、第2主成分が20%の場合、累積寄与率は80%です。これにより、2つの主成分によって、データ全体の80%を説明できると考えます。一般的にはこの80%以上であることが望ましいとされます。
分散の最大化
主成分を設定し、変数を削減したことで、元々のデータの傾向を表せなくなっては意味がありません。固有値、寄与率そして累積寄与率は、データの分散を維持しながら主成分を定めていくことに寄与しています。
前項で示した手順の通り、固有値が大きいものから主成分を設定し、累積寄与率が80%を上回るまで第2、第3・・・と主成分を設定していくことで、分散が最大化されたデータセットを作っていくことが出来ます。
次元削減
次元を削減するというのは、分析に利用する変数の数を削減することを指します。
また、変数を絞り込むことで、データの可視化が容易になります。10個の変数があるグラフより、5個の変数のグラフの方が視覚的にもわかりやすく、情報が単純化されます。これにより、パッと見での情報把握ができるようになります。
主成分の直交性
直交とは、2つのベクトルが90度で交差する関係を指します。主成分分析においては、主成分同士が直交することが重要です。
直交しているということは、互いの主成分が独立しており、一方の変数が他方に影響を与えない状態であることを指しています。相関が無いとも言えます。
直交している情報を主成分に選ぶことで、それぞれの主成分が別々の情報をカバーしてくれていることになり、情報の冗長性を排除することが出来ます。
主成分分析と因子分析の違い

因子分析も、よく利用される分析手法の1つです。主成分分析と共に、データの関連性を明らかにする多変量解析という統計手法にカテゴライズされます。
ここでは、主成分分析と因子分析の違いについて説明します。
| 因子分析 | 主成分分析 | |
| 目的 | 真の要因を特定する | 少ない変数で全体を俯瞰する | 
| パラメータ | 因子 | 主成分 | 
| 評価方法 | 因子負荷量 | 累積寄与率 | 
因子分析と主成分分析の目的の違い
因子分析は、表面的なデータとして測定できる情報の中に隠れている、真の要因を見つけ出すために利用します。
一方、主成分分析は真の要因を特定するのではなく、全体を俯瞰するにあたって、情報をわかりやすく要約することに向いています。
因子負荷量と主成分の解釈
因子負荷量とは、因子分析で用いられるパラメータの1つです。分析に利用する変数(=観測変数)と、真の要因(=因子)の関係を表し、大きければその変数が因子に影響を受けているという意味です。
主成分は、固有値や寄与率を用いて、その主成分がデータの分散にどれくらい貢献しているかを示します。いわば「木を見て森がわかる」ために最も適した変数を選んでいきます。
モデルの仮定と使用場面の違い
因子分析では、因子を特定するために、まず仮定の変数を設定します。つまり、仮説検証のサイクルを用いています。
主成分分析も因子分析も、次元削減を行うこと自体は同じですが、目的が違うため使用場面も異なってきます。
真の要因を特定するのか、それとも全体像をつかむのか。この目的の違いによって使い分けましょう。
因子分析以外の分析方法

因子分析以外にも、様々な分析方法が存在します。それぞれの目的と活用方法を理解しましょう。
回帰分析
回帰分析は、現状の傾向を把握することで、未来の予測を行うための手法です。主に「単回帰分析」「重回帰分析」「ロジスティック回帰分析」があります。
回帰分析では、変数の関係性を明らかにすることで、同様の傾向が未来も起こるであろうという仮説を立てます。
判別分析
判別分析とは、グループ分けに利用する分析です。既にグループ分けされているデータを解析し、新たに登場した未分類のデータセットをどのグループに帰属させるかを予測します。
カーネル主成分分析
カーネル主成分分析は、主成分分析と同様に次元削減を行うための分析手法です。
主成分分析は、データが直線的な構造を持っている場合は有効なのですが、非線形データ(たとえば円形など)については対応できないことがあります。これに対応するのが、カーネル関数という特殊な関数を用いて解析を行う、カーネル主成分分析です。
カーネル主成分分析により、非線形データを効率的に分析できるようになります。
主成分分析のメリット

主成分分析は、AIにおいても教師なし学習の代表的な手法として知られています。そのメリットについて、こちらで説明します。
主成分に圧縮しデータの次元を削減できる

サンプルとして、メジャーリーグ(野球)でよく用いられている統計指標であるセイバーメトリクスを例にしました。
セイバーメトリクスは、打者や投手の成績を実践的に解析するために、独自の指標を設けています。
このように、主成分を設定して次元削減を行うことで、情報がスッキリして求める情報にたどり着きやすくなります。
データの変動を表す主成分を抽出できる

引き続き、セイバーメトリクスで分析を行います。先発投手として優秀であることを示すQS(Quality Start; 6イニング3失点以内)が多い投手の傾向を調べると、WHIPやK/BB(奪三振÷与四球)には特段大きな傾向はみられません。
一方、BB/9(9イニングでいくつ四球を与えるか)を見ると、数字が大きい投手のQSが少ないことがわかります。そうすると、与四球が多い投手はQSになりにくい傾向が見えてきます。
この例のように、主成分を設定して解析することは、データを変動させる要因を発見することに役立ちます。以後はその主成分をベンチマークすればよいということになります。
過学習を防ぐことが出来る

主成分分析のメリットの1つに、過学習を防ぐというものがあります。AIにおいて、学習に使う変数が多いことは時に弊害を及ぼします。
上の例では、左側に防御率という指標があります。よく知られた指標ではありますが、投球回と自責点で算出される指標なので、情報としては冗長性があります。良い投手かどうかを分析するにあたり、これら3つの指標は同じ傾向を示すため、冗長性のある変数の貢献度が過剰に高く評価されてしまいます。
冗長性のある情報を次元削減によって整理することで、こうした問題を防止できます。
また、与四球と与死球は、K/BBやBB/9の算出においては分ける必要が無く統合できます。与四死球としてまとめることで変数を減らすことが出来、これも過学習を防ぐことにつながります。
主成分分析のデメリット

主成分分析にもデメリットがあります。メリット共に正しく理解することで、適切に使いこなしましょう。
解釈が難しい

主成分は、計算で自動的に抽出することが出来ますが、その主成分の意味は人が考える必要があります。
ここには主観が入るため、人によってさまざまな解釈にばらけることもあります。
データを概観できるようになり、分析を行いやすくなったからといって、分析結果自体が簡単に見出せるわけではない点に注意が必要です。
上のグラフの例では、分かりやすくなるようにデータを単純化しています。しかし実際には、もっと傾向が分かりにくいデータが出てくることが多いのが現実です。
データの構造を正確に捉えられない

主成分分析は、データを要約する分析手法です。そのため、元の情報が何だったかが分かりにくくなります。分かりやすさとのトレードオフで失ったものであり、これは仕方ないことです。
ただ、分析においては異常値を分析するためにローデータに立ち返る場合も多くあります。主成分分析で表されたデータでは、このような分析作業が出来なくなります。
スケーリングの影響がある

上のデータではあえて問題を残したままにしていたのですが、このままのグラフだとQSやBB/9の数値が大きく目立っており、WHIPやK/BBはみんな大差ないように見えてしまっています。
指標によっては、0.1違えば大きな違いになるもの、1違えば違いになるものなどがあり、これらが混在すると、小さな数字の差で大きな意味を持つものが埋もれてしまいます。
こうしたケースでは、スケーリングという手法を使い、WHIPやK/BBを10倍するなどして、それぞれの値の差の価値をそろえる必要があります。
しかしここにも人の恣意的な調整が入るので、スケーリングしたことによって分析結果に影響を与える場合もあることに注意が必要です。
Excel(エクセル)で主成分分析する手順と方法

主成分分析はExcelでも行うことが出来ます。ここでは、実際に主成分分析をExcelで行ってみた例をご紹介します。
Excel統計アドインがインストールされているか確認する

Excelの分析ツールを使って主成分分析を行うためには、アドインを利用可能にする必要があります。
ファイル→オプションから、上の画面の例の通りアドイン→設定と選択し、分析ツール・ソルバーアドインにチェックを入れてください。

すると、データタブの中に「データ分析」「ソルバー」というメニューが増えます。まず、ここまで行って分析できる環境を整備しましょう。
分析したいデータをシートに準備する

分析したいデータを、Excelのシートに準備します。
各オプションを設定する
データの標準化
主成分分析を行う際には、データを標準化する必要があります。標準化とは、各変数の平均を0にし、分散を1にすることを指します。
前掲のスケーリングにあたる作業です。標準化の式は以下で表すことが出来ます。
Xは元の値、μは列の平均、σは列の標準偏差です。

「列B-平均点」の部分が(X-μ)、「列C/標準偏差」の部分が(X-μ)をσで除算している部分です。平均は「=AVERAGE(x2:x9)」関数で、標準偏差は「=STDEV.P(x2:x9)」で求めています。
固有値と固有ベクトル
主成分分析では、固有値と固有ベクトルを計算します。固有値は前掲の通り、値が大きいものが主成分として選ばれます。
固有ベクトルとは、主成分の方向を表します。すなわち、どの方向にどの大きさで分散しているかを、2つのパラメータで表すことが出来ます。
主成分得点
主成分分析の結果として得られるものは、次元削減した新たな主成分ベースでのデータセットです。そのデータセットを投影した座標系における、各データの点の位置を主成分得点と呼びます。
主成分得点を使うことで、データのパターンの把握が容易になり、以降の分析や機械学習が効果的になります。
相関係数行列と共分共分散行列
主成分分析を行うには、相関係数行列を使う方法と、共分共分散行列を使う方法があります。いずれも、Excelに追加したデータ分析メニューを使って簡単に行列を作ることが出来ます。
データ範囲を選択し、分析を実行する
相関係数行列
実は相関係数行列を使う場合については、標準化を行わなくても計算が可能です。

追加された「データ分析」から相関を選び、入力したデータを選択すると、相関係数が出力されます。値は半分しか出力されていないので、行列を入れ替えながら貼り付けていきます。
共分共分散行列
同じ要領で、データ分析から共分散を選択します。ただし、ここで選択するデータセットは標準化を行ったものです。

第一主成分の算出
主成分得点の算出
まずは仮の主成分を設定します。値は仮で問題ありません。この主成分について、平方和を計算します。

この仮の主成分と、各データの主成分得点を計算します。この値を合計することで主成分得点が算出できます。

固有値の算出
主成分得点の分散が固有値です。VAR関数で求めることが出来ます。

これで、Excelの式の組み立てが出来ました。今回行いたいことは、主成分の平方和が1で、かつ固有値が最大になる主成分を探す作業です。
ここからはソルバーを用いていきます。ソルバーは、追加されたメニュー「データ分析」と同じ場所にあります。

ダイアログが出てくるので、「目的セルの設定」を固有値を計算したセル(VAR関数のあるセル)、「目標値」を最大値、「変数セルの変更」には仮の主成分を置いたセルを置きます。
「制約条件の変更」で条件を追加し、主成分を合計したセル(1になっている)を選択し、制約を1にします。これで「解決」を押すと、主成分の値が更新されます。

これが第一主成分です。
第二主成分以降の算出
第二主成分の算出では、第一主成分と直交するという条件が必要になります。その中で固有値が最大になる軸を探す作業です。
ソルバーの主成分の条件に、第一主成分と直交する条件を追加します。先ほど算出した第一主成分と直交させるため、N~R列に設定した関数をコピーしています。

ここで得られた主成分得点は、第一主成分との内積になり、値が0になると「第一主成分に直交する」という条件を満たしたことになります。
そこで、ソルバーの条件に、このセルが0になるように設定します。これを繰り返し、第二主成分以降の主成分を算出していきます。
分析結果の解釈
ここでA~Hそれぞれの第一~第四主成分を作っていきます。元々の各教科の点数と、第一~第四主成分の内積を取ったのがこちらです。

次元削減を行ってグラフ化すると、全体の傾向がよりシンプルに表示されています。オレンジの方が全般的に高い数値を出していることが伺えます。

今回は簡略化した手順で実施しているので次元数が元々少ないのですが、機械学習の分野では変数が数万に及ぶことも当たり前です。
これを数百の次元に削減していくことで、分析が可能な次元数に落とし込んでいくことが主成分分析の目的です。
Pythonで主成分分析をする手順と方法

ここでは、Pythonで主成分分析をする手順と方法について説明します。なお、ここでは以下のURLを参考にしています。
主成分分析をPython で理解する ~ Qiita @maskot1977氏執筆 ~
必要なライブラリのインストールと準備
まずは、必要なライブラリのインストールと準備を進めます。
# 数値計算やデータフレーム操作に関するライブラリをインポートする
import numpy as np
import pandas as pd
# URLによるリソースへのアクセスを提供するライブラリをインポートする
import urllib.request
# 図やグラフを図示するためのライブラリをインポートする
import matplotlib.pyplot as plt
%matplotlib inline
import sklearn #機械学習のライブラリ
from sklearn.decomposition import PCA #主成分分析器
分析データの読み込み
データを用意したら、読み込みを実行します。
df.head()
PCAクラスから分析の実行
標準化を行う場合は、各列に対して平均値を引いた値を標準偏差で割ります。
dfs = df.iloc[:, 1:].apply(lambda x: (x-x.mean())/x.std(), axis=0)
dfs.head()
主成分分析は、PCAクラスを利用します。PCAは主成分分析(Principal Component Analysis)の略です。
pca = PCA()
pca.fit(dfs)
# データを主成分空間に写像
feature = pca.transform(dfs)
# 主成分得点
pd.DataFrame(feature, columns=[“PC{}”.format(x + 1) for x in range(len(dfs.columns))]).head()
実行結果の解釈と可視化
結果を散布図に可視化します。
plt.figure(figsize=(6, 6)))
plt.scatter(feature[:, 0], feature[:, 1], alpha=0.8, c=list(df.iloc[:, 0]))
plt.grid()
plt.xlabel(“PC1”)
plt.ylabel(“PC2”)
plt.show()

主成分分析の具体例

主成分分析は、次元削減によりデータを扱いやすくすることが出来ます。
これは、テキスト内の単語の出現頻度をカウントし、出現数をベクトルとして表現する方法です。この時、単語の数だけ次元の数になるので、長いテキストであれば次元数も大きくなります。
以下は、Jiteraのホームページにある会社概要とサービス紹介のページのテキストをBoWで変換してみたものです。

BoWでは、最小単位に分割された単語ごとの出現回数をカウントし、あれば1、無ければ0で表します。
テキスト分析においては、次元数が数万を超えることもあり、このままでは分析において使いにくく非効率です。そのため、主成分分析を用いて次元削減を行うことで、扱いやすい情報にしています。
このように、主成分分析はAIによる分析や学習において欠かせない技術となっており、高速化やリソース効率化に多大な貢献をしています。
主成分分析のまとめ

主成分分析は、データセットを簡略化し、可視化することが出来ます。しかし現代ではそれにとどまらず、AIが処理する莫大な情報量を削減し、処理効率を高めることにも活用されています。
いまや、ヒトだけでなくAIにとっても欠かせない手法であると言えるでしょう。
使いこなすには、ある程度の高等数学の理論に対する知識も必要ですが、考え方が理解できれば現在ではさまざまなツールもあるので、ここでご紹介した方法よりも簡単に主成分分析を使いこなすこともできるようになるでしょう。
Jiteraでは、AIを簡単に使いこなせるような、ソフトウェア自動開発のソリューションを提供しています。要件定義の内容を読み込んで解析し、自動でコード生成が行えます。
開発や分析を効率化するツールにご興味をお持ちでしたら、ぜひ一度お問い合わせください。

  
                
                

