Rによる主成分分析

このQ&Aのポイント
  • Rを使用して主成分分析を行う方法
  • 主成分分析、主成分負荷量、バイプロットまでのプログラムを教えてください
  • データの数が21個、変数が13個あります
回答を見る
  • ベストアンサー

Rによる主成分分析

統計解析用ソフトRを用いて主成分分析を行いたいと考えております。 しかし中々うまくいきません。 そこで、詳しい方がいたっしゃいましたら、主成分分析、主成分負荷量、バイプロットまでのプログラムを教えていただけないでしょうか。 解析対象のデータは以下の様なものです。データ数が21個、変数が13個です。   F G H ・・・  R 1  6 6  5 ・・・  2 2  5 6  1 ・・・  6 3  6 4  6 ・・・  5 : : :  : ・・・  : 21 3 6  4 ・・・  6 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

データをスクリプト中に入れましたが、 csvファイルから読み込むことも可能です。 それくらいは、ご存知ですよね。 Rのバイ・プロットは、記号表示となり、 私は好きではありませんが、 下記のようにすれば、できます。 コピペして動作を確認してみて下さい。 # テストデータによる主成分分析 dat <- data.frame( matrix(c( 3,4,1,4,1,4,1,1,2,2,4,2,2, 3,3,3,3,3,3,3,1,3,3,3,3,3, 1,4,5,3,1,1,1,1,1,1,1,1,1, 3,1,3,1,1,2,2,2,4,4,3,4,2, 3,3,3,4,3,3,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3,3,3,3,3,3, 4,4,4,4,4,4,3,3,2,2,2,2,2, 4,3,4,3,2,2,2,2,3,3,2,2,2, 3,4,4,4,1,3,3,2,2,2,2,3,3, 3,3,3,3,3,3,4,3,2,2,2,3,3, 3,3,2,4,4,3,2,2,3,2,2,2,2, 3,2,3,3,3,2,3,3,4,3,3,2,3, 4,4,4,4,4,3,3,3,2,2,2,2,2, 3,4,4,4,2,3,3,3,3,3,2,2,3, 3,3,3,3,3,3,3,3,3,3,3,3,3, 3,4,4,3,3,3,3,3,3,3,3,3,3, 3,4,4,4,4,4,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3, 3,3,4,3,3,3,2,1,2,2,2,2,2, 3,5,1,5,1,5,1,1,1,1,1,1,1, 3,3,2,2,2,2,2,2,2,2,4,2,4) ,ncol=13,nrow=21,byrow=T) ) names(dat)=c("F","G","H","I","J","K","L","M","N","O","P","Q","R") dat result1 <- prcomp(dat,scale=TRUE) biplot(result1)

sonicmanic
質問者

お礼

ご回答いただきありがとうございます。 動作確認いたしましたところ、無事にバイプロットを出力することができました。 大変図々しいこととは承知しておりますが2点質問させてください。 1.このプログラムは相関行列を用いた主成分分析なのでしょうか。私の説明が不十分だったのですが、用いるデータファイルは最小値が1、最大値が6であり、単位の揃ったものです。(正確には単位はありません。)なので今回は分散共分散行列を用いるのが好ましいのではないかと考えております。 2.バイプロットと一緒に、各主成分に対する主成分負荷量の図も出力したいのですが、コードを教えていただませんでしょうか。 専攻は建築系なもので、勉強不足な点が多々ございますが、 何卒よろしくお願いいたします。

その他の回答 (3)

回答No.4

#1です。 データが1~6の非負の離散値ということが少し気になったので、 おせっかいですがコメントさせて下さい。 もしかして、アンケート結果を解析しようとしてみえますか。 すると、結果が思わしくないと思います。 なぜなら、人による採点の「甘・辛」(バイアス)や 同内容の設問間の「自己相関」が出て、 主成分分析には適さないデータになっているからです。 バイアスを取るには、行が「被験者」なら、行間を中心化します。 自己相関を取るには、列が「設問」なら、列間を中心化します。 これを「二重中心化」といいます。 スクリプトをのせておきます。 走らせてみると、因子負荷量の矢印が四方八方に広がるのが分かると思います。 第1、第2主成分を取り除いた感じです。 第1主成分のサイズファクター(甘いか辛いか)と 第2主成分のシェイプファクター(設問に対する反応の凹凸)を 取り除き偏りが取れて広がるのです。 「コレスポンデンス分析」の結果に近いと思って下さい。 ただ、相対評価(主観的回答)以外のデータには適用しないで下さい。 # テストデータによる主成分分析 par(mfrow=c(1,1)) dat <- data.frame( matrix(c( 3,4,1,4,1,4,1,1,2,2,4,2,2, 3,3,3,3,3,3,3,1,3,3,3,3,3, 1,4,5,3,1,1,1,1,1,1,1,1,1, 3,1,3,1,1,2,2,2,4,4,3,4,2, 3,3,3,4,3,3,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3,3,3,3,3,3, 4,4,4,4,4,4,3,3,2,2,2,2,2, 4,3,4,3,2,2,2,2,3,3,2,2,2, 3,4,4,4,1,3,3,2,2,2,2,3,3, 3,3,3,3,3,3,4,3,2,2,2,3,3, 3,3,2,4,4,3,2,2,3,2,2,2,2, 3,2,3,3,3,2,3,3,4,3,3,2,3, 4,4,4,4,4,3,3,3,2,2,2,2,2, 3,4,4,4,2,3,3,3,3,3,2,2,3, 3,3,3,3,3,3,3,3,3,3,3,3,3, 3,4,4,3,3,3,3,3,3,3,3,3,3, 3,4,4,4,4,4,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3, 3,3,4,3,3,3,2,1,2,2,2,2,2, 3,5,1,5,1,5,1,1,1,1,1,1,1, 3,3,2,2,2,2,2,2,2,2,4,2,4) ,ncol=13,nrow=21,byrow=T) ) names(dat)=c("F","G","H","I","J","K","L","M","N","O","P","Q","R") dat xs <- dat dat <- sweep(dat,2,apply(xs,2,mean)) # 列平均を引く dat <- sweep(dat,1,apply(xs,1,mean)) # 行平均を引く dat <- sweep(dat,c(1,2),mean(colMeans(xs)),FUN="+") # 全平均を足す # result1 <- prcomp(dat) biplot(result1) par(ask=TRUE) # result1$rotation p <- result1$rotation[,1:2] p1 <- p[order(-abs(p[,1])),1] p2 <- p[order(-abs(p[,2])),2] par(mfrow=c(1,2)) barplot(p1,horiz=T,names.arg=rownames(p1),las=1,cex.names=0.8) barplot(p2,horiz=T,names.arg=rownames(p2),las=1,cex.names=0.8) #

sonicmanic
質問者

お礼

ご丁寧にありがとうございます。 分析に用いるデータは、アンケート結果ではなく健康診断の結果の様なものです。 F~Rのアルファベットは、例えば血圧ですとか血糖値といった項目(6が最も状態の良い評価、1が最も状態の悪い評価)であり、1~21は検体数といった感じです。 主成分分析を行うことで、多くの診断結果の中から最も体の状態を把握することのできる因子を読み取ることができるのではないか、と考えました。 頂いたプログラムを回してみました。 確かに中心から放射状に矢印が伸びていることが分かりました。 私の勉強不足にお付き合いいただき本当にありがとうございます。

回答No.3

#1です。 グラフを昇順にしたいときは、データを降順にする必要があります。 p1 <- p[order(abs(p[,1])),1] のorderで並べ替えをしていますので、 p1 <- p[order(-abs(p[,1])),1] と「-」を入れてやれば、絶対値の符号が逆転しますので降順になります。 horiz=T は、棒グラフを縦棒グラフから横棒グラフに変える指示です。 ここまで来ると表示上の趣味の問題で、本来のご質問の趣旨から外れますね。

回答No.2

#1です。 1.出発行列を相関係数行列にするか、分散共分散行列にするかは、 result1 <- prcomp(dat,scale=TRUE) の、scaleで指定します。scale=TRUEだと相関係数行列を使います。 デフォルトはscale=FALSEなので、分散共分散から出発したければ、 result1 <- prcomp(dat) として下さい。 2.主成分負荷量(一般的には因子負荷量と言いますが)は、 バイ・プロットでは、赤い矢印で示されています。 これを、棒グラフにでもしたいのですか?ならば、 result1$rotation に値が入っていますので、 それをソートしてグラフにすればいいです。 スクリプトを追加しました。 グラフに一時停止を入れてありますので、次に進むには、 プロット窓のどこかをクリックして下さい。 # テストデータによる主成分分析 par(mfrow=c(1,1)) dat <- data.frame( matrix(c( 3,4,1,4,1,4,1,1,2,2,4,2,2, 3,3,3,3,3,3,3,1,3,3,3,3,3, 1,4,5,3,1,1,1,1,1,1,1,1,1, 3,1,3,1,1,2,2,2,4,4,3,4,2, 3,3,3,4,3,3,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3,3,3,3,3,3, 4,4,4,4,4,4,3,3,2,2,2,2,2, 4,3,4,3,2,2,2,2,3,3,2,2,2, 3,4,4,4,1,3,3,2,2,2,2,3,3, 3,3,3,3,3,3,4,3,2,2,2,3,3, 3,3,2,4,4,3,2,2,3,2,2,2,2, 3,2,3,3,3,2,3,3,4,3,3,2,3, 4,4,4,4,4,3,3,3,2,2,2,2,2, 3,4,4,4,2,3,3,3,3,3,2,2,3, 3,3,3,3,3,3,3,3,3,3,3,3,3, 3,4,4,3,3,3,3,3,3,3,3,3,3, 3,4,4,4,4,4,3,3,3,3,3,3,4, 3,3,3,3,3,3,3,3,3,3,3,3,3, 3,3,4,3,3,3,2,1,2,2,2,2,2, 3,5,1,5,1,5,1,1,1,1,1,1,1, 3,3,2,2,2,2,2,2,2,2,4,2,4) ,ncol=13,nrow=21,byrow=T) ) names(dat)=c("F","G","H","I","J","K","L","M","N","O","P","Q","R") dat result1 <- prcomp(dat) biplot(result1) par(ask=TRUE) # result1$rotation p <- result1$rotation[,1:2] p1 <- p[order(abs(p[,1])),1] p2 <- p[order(abs(p[,2])),2] par(mfrow=c(1,2)) barplot(p1,horiz=T,names.arg=rownames(p1),las=1,cex.names=0.8) barplot(p2,horiz=T,names.arg=rownames(p2),las=1,cex.names=0.8) #

sonicmanic
質問者

お礼

ご対応いただきありがとうございます。 1.そういうことだったのですね。 分散共分散行列なのか相関行列なのか、解決しました。 2.早速プログラムを回したところ、因子負荷量のグラフを出力することができました。 細かいお心遣いもありがとうございます。 まさに棒グラフで示したかったのです。 試しに第5主成分の因子負荷量まで求めてみましたが、問題なく出力することができました。 少し気になる点が1つあります。 「horiz=T」の部分が図中の軸を決めるものだと思うのですが、負荷量の少ないものから表記することは可能なのでしょうか。

関連するQ&A

  • 主成分分析

    こんにちは、統計学初心者の大学生です。 統計学の授業で「体力テスト(テスト項目8つ、15人)の総合成績順位をつけなさい」という課題が出され、行き詰っています・・・。 主成分分析をして、因子負荷量やら主成分得点やらは計算済みです。 第4主成分まで(累積寄与率79%)で分析する、という所まで進んだは良いのですが、そこから何をどうすればよいのか分かりません。 テストの総合成績順位をつけるには、総合力を示している主成分を見つければ良いのでしょうか?(でもそれなら第4主成分までを選択する必要はないですよね) どなたかアドバイスよろしくお願いします!

  • 主成分分析も因子分析のように繰り返せるの?

     研修課題で、商品イメージと商品魅力の関係を調べています。SD法で商品イメージを測り、主成分分析を行いました。  そこで、学生時代に因子分析では因子負荷量の絶対値が0.4未満の項目は削除して因子分析を繰り返すようになど習いました。【質問(1)】「主成分分析」でも同じように項目削除→繰り返しを行うものなのでしょうか? また、二重負荷項目の扱いはどうしたらよいのでしょう? 【質問(2)】項目削除して因子分析を繰り返す理由って何ですか? 因子の妥当性だか信頼性だかが上がるから、と習った記憶がありますが、“日常会話”で表現するとどういうことですか? 【質問(3)】この調査の目的は、魅力ある商品開発のために人気商品のイメージを探ることです。この動機だと、そもそも主成分分析と因子分析のどちらが適していたのでしょう・・・?  この後、各主成分得点を説明変数、商品評価(良い―悪い)を目的変数にして重回帰分析を行います。  ちなみに、Excelで解析しています。  ドシロートなのにビジネス文書の中で統計プロセスを説明して行かなければならず、四苦八苦しています。親切な回答をどうかよろしくお願い申し上げます。

  • 主成分分析について

    主成分分析であるデータを解析したいのですが、主成分分析の手順や意味を詳しく記してあるページなど、ないでしょうか? 調べてみたんですが、実際にデータをどう計算して主成分をだすのかよくわかりません。 よろしくお願いします。

  • 主成分分析と、共分散行列について

    現在、取得したデータから主成分分析を行うプログラムを実装しています。 扱うデータは、 [変数] x1 x2 x3 ・・・ xn [No. 1] 1 2 5 ・・・ 11 [No. 2] 3 5 10 ・・・ 8   ・   ・ [No. N] 4 6 35 ・・・ 9 のように次元となる変数x1~xnに対してそれぞれ値を取得し、x1~xnを一まとまりとした データ件数がNo.1~No. Nまでデータを取得するとします。 これらのデータを用いて共分散行列を生成し、固有値問題を解くことで主成分分析を行う のですが、ここで質問です。統計的に考えて、より精密に主成分分析を行うには、変数の 個数(n)に対して、データの個数(N)はどのくらい取るのが良いのでしょうか。因みに変数の数は 200程必要とします。

  • 主成分分析の対象データについて

    初めて質問いたします. 現在大学の卒論で主成分分析について学んでいる者です. 主成分分析のアルゴリズム等は把握したのですが、 主成分対象となるデータについての知識がありません。 主成分の参考書等を読んでも取り扱うデータは具体例を挙げているばかりで 統計学的にどんなデータという記述をしている本はほとんどありませんした。 私が調べたりないせいもあるかと思いますが。。。 過去の質問も見たのですが 私が知りたい部分は詳しく書いてありませんでした。 統計学的にデータ間に相関関係があるという感じで書こうと思っています。 どなたか教えてください。

  • 主成分分析の使い方について

    主成分分析などの統計的手法を勉強中の学生(環境学分野)です。 ある論文で、下記の内容を目にしました。 私には、どうして、このデータによって、この目的が達せられるのかがどうしても理解できません。 どうかご教授のほどお願いいたします。 目的 農地が持つ29種類の機能を集約化すること。 方法 1.602人に対してアンケートを行い、29機能を「高くもつ」から「まったくもたない」の5段階評価尺度で評価してもらう。 2.アンケートの結果を中間順位法により順位統計量に変換する。 3.主成分分析を行う。 4.VARIMAX回転を行う。 5.第10因子までの因子負荷量の算出を行う。 6.因子負荷量によるクラスター分析を行う。 結果 29種類の機能は8種類に集約された。 人がその機能を「高くもつ」、「まったくもたない」と感じる“感じ方の傾向”と、“機能の性質”は別のことなので、機能の集約化にこのようなアンケート調査の結果を用いることはできないのではないかと、私には思えました。 けれど、結果として示されたクラスター分析のデンドログラムを確認してみると、植物保護機能、動物保護機能、土壌微生物保護機能などが「生物・生態系保全」のクラスターに含まれ、情操教育と精神安定化などが「保健休養」のクラスターに含まれるなど、機能の性質に関する一般的な感覚を反映したものになっていました。 主成分分析を駆使すれば、そういったことも可能なのでしょうか。 ご助言よろしくお願いします。

  • 主成分分析について

    街頭アンケートを行い統計学的に分析しようと思い、主成分分析を利用しようと考えています。しかし、少々難しいく、困っています。「主成分の決め方」みたいなコツを教えてくれると幸いです。

  • 主成分分析について

    主成分分析について 現在、主成分分析の計算方法を勉強をしているのですが、主成分得点の求め方がわかりません。 例をあげて説明させていただくと、 x1 x2 x3 8 9 4 2 5 7 8  5  6 3  5  4 7  4  9 4  3  4 3  6  8 6  8  2 5  4  5 6  7  6 このようなデータを分析するとして、各変数の相関係数(X1X2 X2X3 X1X3)の値はわかりますし、計算方法もわかります。 またここから固有値もわかります。 しかしここからどうやって、主成分得点を求めればよいかわかりません。 どのように計算するのですか?よろしければご回答下さい。

  • 統計、主成分分析について

     すいません。  勉強中の身なのですが、まだあまり理解度は低いと思われます。  統計学の主成分分析なのですが、  分析内容は  「グループ毎のデータを用意し、そのデータからグループ毎の違いを導き出すことができるか。つまりデータ→グループ分けをして元のグループのようになるか。」  で正しいでしょうか?    例えば、プロ野球選手を  身長、体重、握力、50m走タイム、遠投  などのデータを入れ、  を統計ソフトにかけ、  球団別にうまく分かれるか。  というのは主成分分析ですよね…?  また、上のような主成分分析を試行するのに  考えられる例はどのようなものがあるでしょうか?  データもあれば嬉しいのですが…。

  • 主成分分析とは

    主成分分析といわれる統計処理があります。これは確率・統計の勉強を進めていったら出てくるのだろうかと思うのですが、ずっと勉強していたら必ず出てくるということでも無さそうです。確率統計という学問はいろんなものに応用されていく(文理関係なく)ので基礎と応用というペアも幅広く、どのような勉強の仕方があるのだろうと思うわけですが。 名前から想像すると、ある種のデータの変動を説明する主要な要因を抽出し、その寄与を調べるという風に見えます。例えば、世界各地の気温データの時系列データを集めて、それに関係しそうなデータ(CO2排出量とか)を突き合わせてその因果関係の度合いを調べるというようなものです。そういうことなのでしょうか。分散共分散行列の固有値を調べ、その値の大小を調べるということのようですが。 少し話が飛びますが、Rという統計ソフトを使えば、それに応じた形式のデータをRに処理させれば、自然と値(寄与率とか)が出てくるというブラックボックス的な使い方もできるのかなと思いますが、どうでしょうか。 よろしくお願いします。