2018-07-24

R で主成分分析 (4)

PCA, Principal Component Analysis(主成分分析)の解析例として、前回まで iris のデータセットを使ってきました [1][2][3]。今回もひきつづき iris のデータセットを使って主成分分析をしますが、クラスター分析を利用して解析する集団を定義してみます。

R スクリプト

まず、本記事で使用したスクリプトを以下に示しました。

library(ggplot2)
library(randomForest)
library(factoextra)
library(plyr)
library(reshape2)

# -----------------------------------------------------------------------------
#  MAIN
# -----------------------------------------------------------------------------

# data preparation for PCA
df <- as.data.frame(iris)
row.names(df) <- paste(df$Species, row.names(df), sep="_") 
df$Species <- NULL

# -----------------------------------------------------------------------------
# PCA
df_pca <- prcomp(df)
df_out <- as.data.frame(df_pca$x)
df_out$Species <- sapply(strsplit(as.character(row.names(df_out)), "_"), "[[", 1)

# scatter by Species
p <- ggplot(df_out, aes(x = PC1, y = PC2, color = Species))
p <- p + geom_point()
plot(p)

# -----------------------------------------------------------------------------
# Hierarchical clustering
d <- dist(df_out[, 1:4], method = "euclidean")
res.hc <- hclust(d, method = "ward.D2" )
plot(res.hc, cex = 0.5, hang = -1)

grp <- cutree(res.hc, k = 3)
table(grp)
fviz_cluster(list(data = df_out[, 1:4], cluster = grp))

# apply cluster to PCA field
df_clust <- df_out[, 1:4]
df_clust$Cluster <- grp[row.names(df_clust)]
df_clust$Cluster <- as.factor(df_clust$Cluster)
p <- ggplot(df_clust, aes(x = PC1, y = PC2, color = Cluster))
p <- p + scale_color_manual(values=c("#ff0000", "#00a000", "#0000ff"))
p <- p + geom_point()
plot(p)

# apply cluster to raw data
df2 <- df
df2$Cluster <- grp[row.names(df_clust)]
head(df2)
# choose cluster 1 and 3
df2_1_3 <- df2[df2$Cluster != 2, ]
df2_1_3$Cluster <- as.factor(df2_1_3$Cluster)

# Random Forest
set.seed(71)
df_rf <- randomForest(Cluster ~ ., data = df2_1_3,
                      importance = TRUE, proximity = TRUE)
round(importance(df_rf), 2)

# variable importance
df_bar <- as.data.frame(importance(df_rf))
sortlist <- order(df_bar$MeanDecreaseAccuracy)
df_bar <- df_bar[sortlist,]
df_bar$parameter <- row.names(df_bar)
p <- ggplot(data = df_bar, aes(x = parameter, y = MeanDecreaseAccuracy))
p <- p + geom_bar(stat = "identity", fill="steelblue")
p <- p + scale_x_discrete(limits = row.names(df_bar))
p <- p + coord_flip()
plot(p)

# boxplot
dfmelt <- melt(df2_1_3, measure.vars = 1:4)
p <- ggplot(dfmelt, aes(Cluster, value, fill = variable))
p <- p + geom_jitter(aes(color = variable)) + geom_boxplot()
p <- p + facet_wrap(~variable, ncol = 4)
plot(p)

視覚的なクラス分けの問題点

前回は、単純に setosa と versicolor + virginica のグループに分けて、クラス A と B としました。はたしてこれは妥当だったのでしょうか。

データセット iris の主成分 PC1 と PC2 の散布図(「種 (Species)」別に色分け)

「妥当か」というファジィな問いに対して、満足できる答えを出すことは難しいでしょう。

しかし PC1 から PC4 まである四次元の空間のうち、主要なばらつき軸である PC1 と PC2 の空間で明らかに異なる集団である二集団をみているのだから、そこそこ妥当であろうという人がいるかもしれません。あるいは「種」の情報を前提にして setosa と versicolor + virginica という二つの集団に分けることはあまりに意図的すぎるため、当たり前の結果しか生まないという意見が出るかもしれません。

なんにせよ、あまり人に依存せず、できることなら再現性があるクラス分けをしたいものです。

階層型クラスタリングの利用

データセット iris を主成分分析して得た主成分の空間(PCA 空間と呼ぶことにします)にあるデータに対して、hclust で階層型クラスター分析をおこなって、得られたデンドログラムから、クラスター数を決めます。そこから2つのデータ集団を定義して違いを調べることにします。

以下が hclust によるクラスタリングの結果です。この樹形図状のプロットをみると、大きくは赤の破線で示した三つの集団に分けられます。今回の解析例では大きな集団を見るだけで十分ですのでこの結果からクラスター数を 3 として解析を進めます。

hclust による PCA 空間のクラスタリング

3 つのクラスターをプロットしました。赤 (1) の集団は setosa、緑 (2) は versicolor と virginica が混ざった集団、最後の青 (3) は virginica だけの集団になっています。

クラスタープロット

Species の代わりに、クラスター分析で得た 3 つのクラスターでデータを色分けした、PC1 と PC2 の散布図のプロットを示しました。

ここではクラスター 1(赤)とクラスター 3(青)の違いを調べてみます。クラスターの情報を元のデータに対応させます。

> head(df2)
         Sepal.Length Sepal.Width Petal.Length Petal.Width Cluster
setosa_1          5.1         3.5          1.4         0.2       1
setosa_2          4.9         3.0          1.4         0.2       1
setosa_3          4.7         3.2          1.3         0.2       1
setosa_4          4.6         3.1          1.5         0.2       1
setosa_5          5.0         3.6          1.4         0.2       1
setosa_6          5.4         3.9          1.7         0.4       1

Random Forest で特徴量を算出

クラスター 2 を除いたデータフレームで、クラスター 1 と 3 の違いに対する、パラメータ(「がく」と「花弁」の長さと幅)の重要度(寄与度)を Random Forest で計算すると、以下のようになります。

> round(importance(df_rf), 2)
                 1     3 MeanDecreaseAccuracy MeanDecreaseGini
Sepal.Length 15.84 16.01                16.12            14.70
Sepal.Width   0.00  0.00                 0.00             0.00
Petal.Length 14.39 14.51                14.65            12.87
Petal.Width  15.17 15.39                15.51            13.93

以下に、各パラメータの MeanDecreaseAccuracy の値をパラメータの重要度とみなして棒グラフで表しました。主成分 PC1 におけるクラスター 1 と 3 の差は、sepal(がく)の幅を除いた他のパラメータ、すなわち、がくの長さ、花弁の長さと幅の違いによるものであると結論できるでしょう。

クラスタ 1 と 3 におけるパラメータの重要度

前回の結果と異なる

クラスター 1 は全ての setosa のデータに対応しているので、前回の解析で定義した Class A と同じ集団です。一方、クラスター 3 は、前回の Class B に対して、部分集合になります。そのため、特徴量については同じような傾向を持った結果が出るだろうと予想していたのですが、そうではありませんでした。

ボックスプロットにして、クラスター 1 と 3 における各パラメータの値(分布)を比較すると、Random Forest の導き出した結果が(ファジィですが)妥当であることを確認できます。パラメータの数が多い時には全部を確認できませんので、重要度の大きなパラメータに絞って確認することになります。

クラスタ 1 と 3 におけるパラメータの値の比較

まとめ

大量のパラメータを持った大きなデータが、ある一定条件では同じ分布になる、というのが理想状態ですが、現実はそうではありません。差が生じる原因を探索するため、日々データと格闘しています。解析手順が同じであれば、同じデータセットに対し、誰がやっても同じ結果が出て欲しいと常々願っているのですが、確固たる解析手順や方法があるほどに枯れた分野ではないので、それが解析に主観を加えることにつながり、結果として人が違えば結論が異なるという事態になります。

今回は、少しでも解析者の主観を排除できそうな工夫を加えてみました。

本ブログは、自分の考え方を整理するため、簡単な例に置き換え書き留めておくためのメモのようなものです。あとになって自分が読み直すことを想定していますので、内容に誤りがあれば随時修正するようにしています。

参考サイト

  1. bitWalk's: R で主成分分析 (1) [2018-07-10]
  2. bitWalk's: R で主成分分析 (2) [2018-07-21]
  3. bitWalk's: R で主成分分析 (3) [2018-07-23]

 

ブログランキング・にほんブログ村へ
にほんブログ村

2018-07-23

R で主成分分析 (3)

PCA, Principal Component Analysis(主成分分析)は、線形独立であるか自明でない多数の変数を、ばらつきが大きい順から線形独立な主成分 (PC, Principal Component ) と呼ばれる変数に変換(合成)します。これは本記事のシリーズの最初で説明したことです [1]

主成分で表す空間は直交空間であるため、主成分は互いに独立しています。また変動(ばらつき)が大きい順に PC1, PC2, PC3 のように主成分の番号が割り当てられています。データ集団の差を調べる際に、PC1 から順に調べていくことは、変動の大きな、すなわち差が大きな要因から調べていくことになるので合理的です。

ある主成分におけるデータ集団の差を調べるということは、結局のところ元データでどのパラメータ(変数)がその差に影響を及ぼしているかを調べることになります。データセット iris ではパラメータが「がく」と「花弁」の長さと幅、計4種類しかありません。このような小規模な解析では大げさですが、主成分のプロットから二種類の差異がある集団を選び、その差が生じる内訳を、主成分分析する前のパラメータ(この例では「がく」と「花弁」の長さと幅)の重要度(寄与度)で表してみます(特徴選択)。

R スクリプト

まず、本記事で使用したスクリプトを以下に示しました。今回はパラメータの重要度を計算するために Random Forest のアルゴリズムを使用しています。

library(ggplot2)
library(randomForest)

# classification function
classify <- function(x) {
    if (x[1] == "setosa")
        "A"
    else
        "B"
}

# -----------------------------------------------------------------------------
#  MAIN
# -----------------------------------------------------------------------------

# data preparation for PCA
df <- as.data.frame(iris)
row.names(df) <- paste(df$Species, row.names(df), sep="_") 
df$Species <- NULL

# PCA
df_pca <- prcomp(df)
df_out <- as.data.frame(df_pca$x)
df_out$Species <- sapply(strsplit(as.character(row.names(df_out)), "_"), "[[", 1)
df_out$Class <- sapply(df_out$Species, function(x) classify(x))

# scatter by Species
p <- ggplot(df_out, aes(x = PC1, y = PC2, color = Species))
p <- p + geom_point()
plot(p)

# scatter by Class
p <- ggplot(df_out, aes(x = PC1, y = PC2, color = Class))
p <- p + scale_color_manual(values=c("#ff0000", "#0000ff"))
p <- p + geom_point()
plot(p)

# data preparation for classification with Random Forest method
df_class <- iris
df_class$Class <- sapply(df_class$Species, function(x) classify(x))
df_class$Class <- as.factor(df_class$Class)
df_class$Species <- NULL
head(df_class)

# Random Forest
set.seed(71)
df_rf <- randomForest(Class ~ ., data = df_class,
                      importance = TRUE, proximity = TRUE)
round(importance(df_rf), 2)

# variable importance
df_bar <- as.data.frame(importance(df_rf))
sortlist <- order(df_bar$MeanDecreaseAccuracy)
df_bar <- df_bar[sortlist,]
df_bar$parameter <- row.names(df_bar)
p <- ggplot(data = df_bar, aes(x = parameter, y = MeanDecreaseAccuracy))
p <- p + geom_bar(stat = "identity", fill="steelblue")
p <- p + scale_x_discrete(limits = row.names(df_bar))
p <- p + coord_flip()
plot(p)

集団のクラス分け

主成分 PC1 と PC2 の散布図(「種 (Species)」別に色分け)

以下は主成分分析した結果から主成分 PC1 と PC2 で相関図を描き、「種 (Species)」別に色分けしたものです。PC1 の軸からデータの集団を眺めると、大雑把に、赤の setosa の集団と、緑の versicolor、青の virginica を合わせた集団の、2つのグループを形成していると見て取れます。

iris 主成分 PC1 と PC2 の散布図(「種 (Species)」別に色分け)

主成分 PC1 と PC2 の散布図(「クラス (Class)」別に色分け)

そこで、いったん、「種」別の色分けを外し、上記二つの集団をあらためて、赤 (A) と、青 (B) で分類し直します。データセット iris は 150 行ほどの小さなデータ量ですので、以下のように全てのデータを使ってクラス分けをしました。

  • 赤を全ての setosa
  • 青を versicolor と virginica を合わせた全て
> head(df_class)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Class
1          5.1         3.5          1.4         0.2     A
2          4.9         3.0          1.4         0.2     A
3          4.7         3.2          1.3         0.2     A
4          4.6         3.1          1.5         0.2     A
5          5.0         3.6          1.4         0.2     A
6          5.4         3.9          1.7         0.4     A

あらためて、主成分 PC1 と PC2 で相関図を描き、赤(A)と青(B)で色付けし直しました。

iris 主成分 PC1 と PC2 の散布図(「クラス (Class)」別に色分け)

Random Forest で特徴量を算出

A と B の違いに対する、パラメータ(「がく」と「花弁」の長さと幅)の重要度(寄与度)を Random Forest で計算すると、以下のようになります。

> round(importance(df_rf), 2)
                 A     B MeanDecreaseAccuracy MeanDecreaseGini
Sepal.Length  2.96  2.63                 3.95             7.12
Sepal.Width   3.33  2.49                 3.62             0.39
Petal.Length 21.23 20.82                21.58            28.85
Petal.Width  22.22 21.78                22.72            29.83

以下に、各パラメータの MeanDecreaseAccuracy の値をパラメータの重要度とみなして棒グラフで表しました。主成分 PC1 におけるクラス A と B の差は、主に petal(花弁)の長さと幅の違いによるものであると結論できるでしょう。

クラス A と B におけるパラメータの重要度

まとめ

データセット iris の解析では、主成分分析や機械学習のアルゴリズムを用いずとも、丁寧にパラメータ間を調べるプロットを作成して注意深く眺めれば、「種」の差とパラメータ(「がく」と「花弁」の長さと幅)の関係を見つけることができるでしょう。

しかし、数百、数千、あるいはもっと多くのパラメータを持ったデータを解析する場合はどうでしょう。たくさんのプロットを描いて目視でカギとなる特徴を探し出し、その関係を理解するのは不可能に近い作業になります。データ集団のバラツキが大きい部分から軸を選び直し、主成分という名前のパラメータへ変換して主成分の直交空間を作り、その主成分間の関係を順番に解析して、差異をもたらす事象に関与する生パラメータを炙り出していく作業は、回り道をしているようですが計算の大部分をコンピュータに任せられるため、大量のデータを解析するのに向いています。

参考サイト

  1. bitWalk's: R で主成分分析 (1) [2018-07-10]
  2. bitWalk's: R で主成分分析 (2) [2018-07-21]

 

ブログランキング・にほんブログ村へ
にほんブログ村

2018-07-21

R で主成分分析 (2)

PCA, Principal Component Analysis(主成分分析)の解析例として、前回は iris のデータセットを使いました [1]

この解析では、「がく」と「花弁」の長さと幅に4種類の変数について、「種」別に描画したボックスプロットを示しました。また、4つの主成分についても同様にボックスプロットで示しました。ボックスプロットを使ったのはどちらの場合も4つの変数しかなかったからです。

しかし、よくよく考えてみると4つしか変数がないからこそ、全ての組み合わせを散布図にして眺めることができるとも言えます。ggplot2 でも pairs でやるようにいっぺんにプロットできればいいのにと思って調べたら、同等な機能を実現できるパッケージがありました。参考サイト [2] で紹介されているサンプルを参考にしてプロットを作成してみました。

R スクリプト

本記事で使用したスクリプトを以下に示しました。

require(ggplot2)
require(dplyr)
require(tidyr)

gatherpairs <- function(data, ...,
                        xkey = '.xkey', xvalue = '.xvalue', ykey = '.ykey', yvalue = '.yvalue',
                        na.rm = FALSE, convert = FALSE, factor_key = FALSE) {
  vars <- quos(...)
  xkey <- enquo(xkey)
  xvalue <- enquo(xvalue)
  ykey <- enquo(ykey)
  yvalue <- enquo(yvalue)
  
  data %>% {
    cbind(gather(., key = !!xkey,
                 value = !!xvalue, !!!vars, na.rm = na.rm,
                 convert = convert, factor_key = factor_key), select(.,!!!vars))
  } %>% gather(., key = !!ykey,
               value = !!yvalue, !!!vars, na.rm = na.rm,
               convert = convert, factor_key = factor_key)
}

# -----------------------------------------------------------------------------
#  MAIN
# -----------------------------------------------------------------------------
iris %>% gatherpairs(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) %>% {
  p <- ggplot(., aes(x = .xvalue, y = .yvalue, color = Species))
  p <- p + geom_point()
  p <- p + facet_wrap(.xkey ~ .ykey, ncol = length(unique(.$.ykey)),
                         scales = 'free', labeller = label_both)
  plot(p)
}

df <- as.data.frame(iris)
row.names(df) <- paste(df$Species, row.names(df), sep="_") 
df$Species <- NULL
head(df)
#
df_pca <- prcomp(df)
df_out <- as.data.frame(df_pca$x)
df_out$Species <- sapply(strsplit(as.character(row.names(df)), "_"), "[[", 1)
row.names(df_out) <-NULL
head(df_out)

df_out %>% gatherpairs(PC1, PC2, PC3, PC4) %>% {
  p <- ggplot(., aes(x = .xvalue, y = .yvalue, color = Species))
  p <- p + geom_point()
  p <- p + facet_wrap(.xkey ~ .ykey, ncol = length(unique(.$.ykey)),
                         scales = 'free', labeller = label_both)
  plot(p)
}

生データの散布図

setosa のその他の「種」において、「がく」と「花弁」の長さと幅にそれぞれ集団が別れているのが見て取れます。

生データのプロット

主成分の散布図

主要因 PC1 の軸から見ると setosa の集団とその他の集団とではっきり分離されていますが、他の主要因はそれほどでもありません。生データを使った「種」別における「がく」と「花弁」の長さと幅の傾向は、データを主成分分析すると、変換した主成分 PC1 だけで概ね説明できることがわかります。

主成分のプロット

参考サイト

  1. bitWalk's: R で主成分分析 (1) [2018-07-10]
  2. r - Create a matrix of scatterplots (pairs() equivalent) in ggplot2 - Stack Overflow

 

ブログランキング・にほんブログ村へ
にほんブログ村

2018-07-10

R で主成分分析 (1)

PCA, Principal Component Analysis(主成分分析)は、線形独立であるか自明でない多数の変数を、ばらつきが大きい順から線形独立な主成分 (PC, Principal Component ) と呼ばれる変数に変換(合成)します。データの次元を削減するために用いられます。

次元が削減されてなにが嬉しいかというと、それは、多数の変数=多次元の情報を、少ない次元で端的に表現できるということです。主成分はデータのばらつき=変動の大きい順に PC1, PC2, ... と変換されています。そのため、主成分のいくつかだけでデータのふるまい(特徴)を概ね説明できてしまう場合があります。

最近、PCA を駆使して何百、何千という変数を持つデータの解析をする業務が多くなりました。社内とは言え、他人が開発をしたシステムを使っているので、いざとなれば自力である程度検証できるようにしておかなければなりません。

ということで、簡単なデータを使って R で主成分分析をしてみます。

iris データの解析

R に組み込まれているデータセット iris を使って主成分分析をしてみます。sepal は花びらの「がく」、petal は「花弁」のことで、それぞれ長さと幅を測定したデータが並んでいます。また species は「種」で、アヤメ属 (iris) の花 setosa, versicolor, virginica の三種類あります。

> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
> unique(iris$Species)
[1] setosa     versicolor virginica 
Levels: setosa versicolor virginica
> 

そこで、この三種類の花がどのような特徴を持っているか調べてみることにします。「種」を除けば変数が4つしかないので「がく」と「花弁」の長さと幅をボックスプロットで比較する方法と、同じ方法で主成分分析を使うとどのようになるかを比較してみます。

R スクリプト

本記事で使用したスクリプトを以下に示しました。このスクリプトでは ggplot2 と qcc の二つのパッケージを利用しています。お使いの環境にインストールされていなければ、install.packages('ggplot2') のようにしてインストールしてください。

library(ggplot2)
library(qcc)
# GLOBAL
theme_default <- theme(panel.background = element_blank(),
                       panel.border = element_rect(fill = NA),
                       panel.grid.major = element_blank(),
                       panel.grid.minor = element_blank(),
                       strip.background = element_blank(),
                       axis.text.x = element_text(colour = "black"),
                       axis.text.y = element_text(colour = "black"),
                       axis.ticks = element_line(colour = "black"),
                       plot.margin = unit(c(1, 1, 1, 1), "line"))
# -----------------------------------------------------------------------------
#  myboxplot
# -----------------------------------------------------------------------------
myboxplot <- function(pp, ymin, ymax) {
  pp <- pp + geom_boxplot()
  pp <- pp + scale_y_continuous(limits = c(ymin, ymax))
  pp <- pp + theme_default
  return(pp)
}
# -----------------------------------------------------------------------------
#  BOXPLOT for RAW DATA
# -----------------------------------------------------------------------------
df <- as.data.frame(iris)
#
y.min <- min(df[, 1:4])
y.max <- max(df[, 1:4])
# -----------------------------------------------------------------------------
# Sepal.Length
p <- ggplot(df, aes(x = Species, y = Sepal.Length))
p <- myboxplot(p, y.min, y.max)
plot(p)
# Sepal.Width
p <- ggplot(df, aes(x = Species, y = Sepal.Width))
p <- myboxplot(p, y.min, y.max)
plot(p)
# Petal.Length
p <- ggplot(df, aes(x = Species, y = Petal.Length))
p <- myboxplot(p, y.min, y.max)
plot(p)
# Petal.Width
p <- ggplot(df, aes(x = Species, y = Petal.Width))
p <- myboxplot(p, y.min, y.max)
plot(p)
# -----------------------------------------------------------------------------
#  BOXPLOT for PCA DATA
# -----------------------------------------------------------------------------
df <- as.data.frame(iris)
row.names(df) <- paste(df$Species, row.names(df), sep="_") 
df$Species <- NULL
# PCA
df_pca <- prcomp(df)
df_out <- as.data.frame(df_pca$x)
df_out$Species <- sapply(strsplit(as.character(row.names(df)), "_"), "[[", 1)
#
y.min <- min(df_out[, 1:4])
y.max <- max(df_out[, 1:4])
# -----------------------------------------------------------------------------
# PC1
p <- ggplot(df_out, aes(x = Species, y = PC1))
p <- myboxplot(p, y.min, y.max)
plot(p)
# PC2
p <- ggplot(df_out, aes(x = Species, y = PC2))
p <- myboxplot(p, y.min, y.max)
plot(p)
# PC3
p <- ggplot(df_out, aes(x = Species, y = PC3))
p <- myboxplot(p, y.min, y.max)
plot(p)
# PC4
p <- ggplot(df_out, aes(x = Species, y = PC4))
p <- myboxplot(p, y.min, y.max)
plot(p)
# Pareto Chart
PCA <- df_pca$sdev
names(PCA) <- c("PC1", "PC2", "PC3", "PC4")
pareto <- pareto.chart(PCA, ylab = "Variation")
plot(pareto)

生データのボックスプロット

以下に、「がく」と「花弁」の長さと幅について、「種」別に描画したボックスプロットを示しました。議論が分かれるところですが、ここでは全体を比較するため縦軸のスケールを揃えてあります。

これらのボックスプロットをじ〜っと見較べて判る差異を以下にまとめました。

  • 「がく」と「花弁」の大きさは、概ね setosa, versicolor, virsinica の順に大きい。
  • 「花弁 (petal)」の長さの差異が、他の数値に比べて際立っている。
  • 「がく (sepal)」の幅の差異が、他の差異に比べて小さい。

主成分分析後のボックスプロット

「がく」と「花弁」の長さと幅について、prcomp で主成分分析をして、主成分を「種」別に描画したボックスプロットを示しました。生データのボックスプロットの時と同様に、全体を比較するため縦軸のスケールを揃えてあります。

主成分のばらつき(変動)の大きさをパレート図にしたものを下記に示しました。

パレート図の内訳をみると、主成分 PC1 と PC2 で全体の変動の 80% 以上を説明できている事がわかります。

> pareto
     
Pareto chart analysis for PCA
        Frequency   Cum.Freq.  Percentage Cum.Percent.
  PC1   2.0562689   2.0562689  68.9345126   68.9345126
  PC2   0.4926162   2.5488851  16.5145035   85.4490161
  PC3   0.2796596   2.8285447   9.3753300   94.8243460
  PC4   0.1543862   2.9829309   5.1756540  100.0000000
> 

参考サイト

  1. irisの正体 (R Advent Calendar 2012 6日目) - どんな鳥も
  2. R plot PCA using ggplot2 - Boqiang Hu

 

ブログランキング・にほんブログ村へ
にほんブログ村