トップページ | ひとつ上のページ | 目次ページ | このサイトについて | ENGLISH

主成分分析

多変量解析 で使われるデータには、 一見すると、たくさん変数があっても、様子の似ているものがある事があります。 主成分分析(Principal Component Analysis:PCA)は、似ている変数でまとめると、数種類になってしまう時に役に立つ方法です。

主成分分析では、たくさんの変数を、特徴の順にまとめ、新しい変数を作ります。 主成分分析の「主成分」とは、このまとめられた変数の事です。 主成分は、データの特徴を表す尺度になります。
PCA

質的データ の場合に主成分分析に近い方法として、 コレスポンデンス分析数量化V類 があります。

主成分分析の使い道

主成分分析は、大きく分けると、 「低次元でデータを見る」、「変数の仲間分け」の2つの使い道があります。

「総合的にサンプルを見る」

「低次元でデータを見る」の代表的なものが、「総合的にサンプルを見る」になります。 「主成分得点」を総合評価の点数のようにして使います。 本やネットにある主成分分析の解説では、この使い道を紹介しているものが多いようです。

「他の多変量解析で、データの前処理に使う(次元削減)」

「低次元でデータを見る」」のもうひとつ種類としては、 「他の多変量解析で、データの前処理に使う(次元削減)」という使い道もあります。 これは、主成分得点を、前処理された変数として使う使い方です。

実務で 多変量解析 をする時は、 多重共線性 があったり、「変数の数 > サンプルの数」になっていて、困ることがありますが、 こういった状況でも、とりあえずデータ解析を進めたい時の対策として使えます。 ( 中間層を使った解析

主成分分析と組み合わせる手法は、いろいろ考えられます。 このサイトでは、 重回帰分析 と合体させた 主成分回帰分析 や、 MT法 と合体させた 主成分MT法 のページがあります。

「サンプルの仲間分け」

「低次元でデータを見る」のもうひとつ種類としては、 「サンプルの仲間分け」があります。 たくさんの変数があって、サンプルの分類が難しくても、変数が1、2個になるまで要約されていると、 散布図を見るだけで、仲間分けができるようになります。

この使い道は、 高次元を2次元に圧縮して可視化クラスター分析 と同じです。

上記の方法では、仲間分けはできるのですが、 「この仲間の特徴は何か?」という事を調べやすくはできていません。 主成分分析の仲間分けは、主成分で考察する事ができるので、それぞれの主成分の特徴を把握して置く事で、仲間の特徴を考えやすいです。

「変数の仲間分け」と因子負荷量

因子負荷量というのは、 元のそれぞれの変数と、それぞれの主成分の相関係数です。

この相関係数を見ると、それぞれの主成分が元の変数のどれの影響を受けているのかが、わかります。 また、第1主成分との相関係数をX軸、第2主成分との相関係数をY軸というようにして、散布図にすると、 近くにプロットされている変数は、似ている変数、といった事もわかります。

この使い道は、 多変量データの相関分析 と同じです。

主成分とは

主成分とは、元の変数に係数をかけて、それらを足し合わせて作られた、合成変数のことです。 主成分ごとに、係数の値が違います。

実際の計算では、係数は、元の変数から作られた分散共分散行列や相関行列の固有ベクトルから作られます。 文献では、固有ベクトルをそのまま使うものがあったり、作られた主成分が 標準化 されたものになるように修正が加わっているものもあります。

主成分分析の弱点

主成分分析は、様々な使い道があって、万能選手のような感じもしますが、弱点もあります。

正規分布と線形和を使うことによる弱点

まず、主成分分析は、 正規分布 を前提にした理論でできています。 また、 主成分は、元の変数の 線形和 として求めます。 そのため、これらがうまく当てはまらないデータに対しては、うまく使えない事があります。

散布図で分析することによる弱点

サンプルの仲間分けや、変数の仲間分けでうまく使えるのは、 検討した方が良い主成分が1、2個になっている場合です。 主成分分析を使う場合は、散布図で仲間分けすることが一般的なので、 3個以上になって来ると、主成分の様々な組み合わせを散布図で見て、総合的に考える必要があり、 とても使い勝手が悪いです。

各主成分の寄与率は、その主成分の固有値を分子にして、全部の固有値の合計を分母にすると求まります。 例えば、第1主成分の寄与率が60%、第2主成分の寄与率が20%でしたら、 第1主成分と第2主成分で80%の寄与率があることになります。 このくらいの寄与率があれば、主成分分析でも困らないです。

サンプルの仲間分けなら、 高次元を2次元に圧縮して可視化クラスター分析 、 変数の仲間分けなら、 多変量データの相関分析 には、こういう弱点で悩むことはありません。

また、主成分分析をすると、サンプルと主成分の行列データや、変数と主成分の行列データができますので、これに対して、 高次元を2次元に圧縮して可視化 の方法を使う方法もあります。

Rで、主成分分析

モデルを作る

Rの実施例は下記になります。 下記は、コピーペーストでそのまま使えます。

サンプルのデータは下記を使っています。「Name」の列はなくても動きます。
PCA

setwd("C:/Rtest") # 作業用ディレクトリを変更
Data <- read.csv("Data.csv", header=T) # データを読み込み
DataName <- Data$Name
# Nameの列を別名で保管する
Data$Name <- NULL
# データからNameの列を消して、Xの列だけにする
pc <- prcomp(Data, scale=TRUE)
# 主成分分析
summary(pc)
# 「Cumulative Proportion」が累積寄与率。

「次元削減」のデータを作る

上記のコードの続きです。 「他の多変量解析で、データの前処理に使う」をするために必要な主成分得点を得る方法です。

行番号でグラフを作ります。
pc1 <- pc$x # 主成分得点を得る

例えば、累積寄与率を見て2つ目の主成分までを使うことにするのなら、「pc1」の左の2列が次元削減後のデータということになります。

「サンプルの仲間分け」

上記のコードの続きです。 「総合的にサンプルを見る」や「サンプルの仲間分け」の方法です。 これを進めるには、ggplot2のインストールが事前に必要になります。

行番号でグラフを作ります。
pc1 <- transform(pc1 ,name1 = DataName,name2 = "A")# サンプル名を追加
library(ggplot2)
# ライブラリを追加
ggplot(pc1, aes(x=PC1, y=PC2,label=rownames(pc1))) + geom_text()
# 第1主成分と第2主成分で言葉の散布図
PCA

「Name」の列があるデータを使う場合、「Name」でグラフを作ることもできます。
ggplot(pc1, aes(x=PC1, y=PC2,label=name1)) + geom_text()# 第1主成分と第2主成分で言葉の散布図
PCA

「変数の仲間分け」1

pc2 <- sweep(pc$rotation, MARGIN=2, pc$sdev, FUN="*") # 因子負荷量を計算
pc2 <- transform(pc2,name1=rownames(pc2),name2="B")
# 言葉の散布図
ggplot(pc2, aes(x=PC1, y=PC2,label=name1)) + geom_text()
# 言葉の散布図
PCA
3つの変数で似ているものがないことがわかりました。

「変数の仲間分け」2

「変数の仲間分け」1の続きです。
変数が多いと、上から2つの主成分で作った散布図上では重なって見える点が、別の主成分で見ると離れているということがおきます。 どの主成分と関係しているかではなく、変数の類似度を調べたい場合は、多数の主成分を2つに凝縮すると良いです。

MaxN = 5# 使用する固有値の数を指定
library(MASS)
# ライブラリを読み込み
Data11 <- pc2[,1:MaxN]
# 主成分の列を指定
Data11_dist <- dist(Data11)
# サンプル間の距離を計算
sn <- sammon(Data11_dist)
# 多次元尺度構成法
output <- sn$points
# 得られた2次元データの抽出
Data2 <- cbind(output, pc2)  # 元データと多次元尺度構成法の結果を合わせる。
ggplot(Data2, aes(x=Data2[,1], y=Data2[,2],label=name1)) + geom_text()
# 言葉の散布図
PCA PCA
左が、第1、第2の主成分で作った散布図で、右が、5番目までの主成分を2個の変数に凝縮して作った散布図です。 このデータは、「X1とX2」、「X3とX4」、「X5とX6」、「X7とX8」の組が高い相関になるように作ったものなので、変数の仲間分けとしては、 右側の散布図が欲しかったものになります。

元の変数と主成分の関係は、 2部グラフ にするとわかるようになります。 library(igraph) # パッケージを読み込み
library(sigmoid)
# パッケージを読み込み
Data1p = Data11
# 分析対象のデータを抽出
names(Data1p) = paste(names(Data1p),"+",sep="")
# 列名を変更
DM.matp = apply(Data1p,c(1,2),relu)
# 0以下の値は0に変換
Data1m = -Data11
# 分析対象のデータを抽出。符号を反転
names(Data1m) = paste(names(Data1m),"-",sep="")
# 列名を変更
DM.matm = apply(Data1m,c(1,2),relu)
# 0以下の値は0に変換
DM.mat =cbind(DM.matp,DM.matm)
# プラス側とマイナス側を合体
DM.mat <- DM.mat / max(DM.mat) * 10
# 値が0から10になるように変換
DM.mat[DM.mat < 4] <- 0
# 絶対値が4未満の場合は0にする(非表示にする)
DM.g<-graph_from_incidence_matrix(DM.mat,weighted=T)
# グラフ用のデータを作る
V(DM.g)$color <- c("steel blue", "orange")[V(DM.g)$type+1]
# 色を変える
V(DM.g)$shape <- c("square", "circle")[V(DM.g)$type+1]
# マークの形を変える
plot(DM.g, edge.width=E(DM.g)$weight)
# グラフを作る
QM

「サンプルと変数の関係を見る(同時付置図)」

biplotを使うと、サンプルと変数を同時に描いた図が作れます。
biplot(pc) # グラフを作る
PCA

このグラフを作るためのデータは、下記で作れます。
Data1 <- rbind(pc1,pc2)# データを結合



A-A型

独立成分分析

ロバストな解析

中間層を使った解析

異常値の判定

参考文献

図解でわかる多変量解析」 涌井良幸・涌井貞美 著 日本実業出版社 2001
主成分は、合成変数の分散を最大にするものであることや、それを求めるための数学的な手続きが、丁寧に解説されています。


グラフィカルモデリング」 宮川雅巳 著 朝倉書店 1997
「主成分分析は、 相関係数 を「距離」とする、 多次元尺度構成法 の一種。相関行列を図にして、視覚的に解析できるようにする。」、として、主成分分析の価値を説明しています。


多変量解析法入門」 永田靖・棟近雅彦 共著 サイエンス社 2001
因子分析の結果の多くは、主成分分析の結果と一致するそうです。


統計思考入門」 水越孝 著 プレジデント社 2014
この本は、統計的に、また、数字を使って物事を見るための入門書です。 統計学そのものだけではなく、統計学でわかる事や、実際の考えの進め方が中心です。
大きくとらえる --> 違いを見る --> 同じ仲間の中を見る、と言った感じです。 この本の例では、渋谷の109を分析するのに、ファッション業界の中での109の位置を確認し、それから109の中を見ています。 この分析で主に使うのが主成分分析で、 クラスター分析 も使います。
また、分析手法では、判断に迷う時に簡単に白黒つける方法として 判別分析 、予測の方法として、 回帰分析 が登場します。
また、データにはどのような偏りがあるかや、 CVM と言った、データの取り方の話も重視されています。


非線形な場合

Python機械学習クックブック」 Chris Albon 著 オライリー・ジャパン 2018
7割がデータの扱い方の話、残りが機械学習モデルの話。
特徴量削減で、非線形な時はカーネル主成分分析。 負値がないと時は、。 非負行列因子分解(NMF) 疎データの時は、TSVD(Truncated Sigular Value Decomposition:打ち切り特異値分解)。


Pythonデータサイエンスハンドブック Jupyter、NumPy、pandas、Matplotlib、scikit-learnを使ったデータ分析、機械学習」 Jake VanderPlas 著 オライリー・ジャパン 2018
NumPy、pandas、Matplotlibで約300ページ。機械学習が180ページ。
主成分分析では、次元削減がうまくできないときの方法として、多様体学習を紹介。 多様体学習の方法は、多次元尺度構成法(MDS)、局所線形埋め込み(Locally Linear Embedding:LLE)、等尺性マッピング(Isometric mapping:Isomap)。
この章のサンプルデータは、「Hello」という文字に見えるように点描された2次元データになっている。 Helloという文字をPNGファイルで保存し、そのPNGからランダムに点を抽出して作っている。




順路 次は 正準相関分析

Tweet データサイエンス教室