電子書籍の厳選無料作品が豊富!

今回の質問の意図を端的に申せば、「画像のようなデータセットにおいて、"x1", "x2", "x3"の三変数を用いて"Team"をクラスタリングしたい」というものです。

データをインポートし、三つの変数を選択し、クラスター解析を行うと、"Team"を因子の名前として表示することができず、行の数字が名前として表示されてしまいます。

平たく申しますと、樹形図の枝先にくっつく名前が、チーム名(011, 012, ...)になるようにしたいのです。

R コマンダー入門
http://www.ec.kansai-u.ac.jp/user/arakit/Getting …
のpp.12-13において、『たいていの場合,R コマンダーは,数値変数と因子とを区別し,因子の平均を計算するといった間違いを行うことを防ぐ』との記述がありますが、私のデータセットにおいて"Team"は数値であり、数値変数として扱われてしまっているのが問題であると考えました。

そこで、以下の手順で"Team"の因子への変換を試みました。
データ→アクティブデータセット内の変数の管理→数値変数を因子に変換→変数("Team"を選択)→OK
※因子水準は「水準名を指定」「数値で」の両方試しました。

しかし残念ながら、この設定を行い三変数によるクラスタリングを行っても、"Team"を因子の名前として表示することができず、行の数字が表示されてしまいます。

煩雑な文章になってしまい、かつ初歩的な質問ばかりで恐縮ですが、なにとぞよろしくお願いいたします。

(本題から外れますが、三変数はそれぞれスケールが違うので標準化する予定です)

「R commanderによるクラスター解」の質問画像

質問者からの補足コメント

  • 恥ずかしながらその通りです。
    ただ、安閑としていたわけではなく、console上でスクリプトによりチーム名を行の名前とする方法は把握しました。

    > data_file <- "cluster_eclipse.csv"
    > data <- read.csv(data_file)
    > row.names(data) <- data$Team
    > head(data)
    Team x1 x2 x3
    11 11 3.17 5 31
    12 12 3.18 9 45
    13 13 2.71 3 61
    14 14 3.28 6 47
    15 15 1.94 8 22
    16 16 4.16 6 48

    本来、スクリプトにじっくり取り組んでいくべきだと思いますが、Rコマンダーのメニューでうまくいく方法があるか、適切なスクリプトを併用するで解決できるかを知りたいです。

    「R commanderによるクラスター解」の補足画像1
    No.2の回答に寄せられた補足コメントです。 補足日時:2018/10/07 20:36
  • ご回答いただきながらレスポンスが遅くなり失礼しました。
    Console上で、ご指摘の方法を試したところエラーが発生してしまいました。
    > data_file <- "cluster_eclipse.csv"
    > data <- read.csv(data_file)
    > row.names(data) <- data$Team
    > data <- data[,-c("Team")]
    -c("Team") でエラー: 単項演算子に対する引数が不正です

    以上はConsoleのみで操作した結果です。
    R commanderを使用して試したことは、
    R commander上でデータをインポートしたのちに、Console上で
    > row.names(data) <- data$Team
    > data <- data[,-c("Team")]
    とやってみましたが、同様のエラーが発生しています。

    No.3の回答に寄せられた補足コメントです。 補足日時:2018/10/15 20:55

A 回答 (3件)

row.names(data) <- data$Team



で、チーム名を行名称にしたら、その後、データから取り除いておかないと
解析に使われてしまいますよ。

data <- data[,-c("Team")]

とすれば良いと思います。

head(data)

で、Team列が消えていればOKです。
この回答への補足あり
    • good
    • 0

#3です。

すみません。

Rコマンダーと、Rスタジオを混同していました。Rコマンダーは初心者用のツールですね。

って、ことは、ご質問者さんは、Rのスクリプトを書くのって、難しい人ですか。
この回答への補足あり
    • good
    • 0

私は、コマンダーのようなツールは使わずエディタを使っていますので、スクリプトで回答します。

コマンダーの操作ではなく、スクリプト窓を見て比較して下さい。

ご質問者は、なにしろ、行名を変更しようという操作を何もしていませんよね。
コマンダーではできないのかな。
rownames(x) <- x[,1]
x <- x[,-1]
でできます。

xがない、と言われるなら、xは、読み込んだ時の配列名に変えて実行してみてください。

それから、エクセルの画面を見て、すぐにおかしいと分かります。なぜ、チーム名なのに"011"というようにダブルコーテーションを付けないのですか。今、このデータをRにもってくると数値として扱われています。東京西Aとか文字が入っていれば、distをとる時点でエラーが出るはずです。

また、ご質問者がコマンダー上で行われた操作は、その列を因子として扱うということで、1,2,3,・・・という順序尺度に変更しているだけです。つまり、100,105,100であっても数字1,2,1に置き換わるということです。

さて、表示データでクラスター分析(通常のユークリッド距離で、ウォード法は使わず階層的に)をやってみました。つぎのようなスクリプトでできます。

途中途中で、xをダンプして表示していますので、それぞれの段階でどういうように変換(列が行名称にかわったり)しているのか確認して下さい。

コマンダーは開発ツールなので、初心者は使わない方が良いと思います。まずはスクリプトを書くことに習熟することが肝要だと思います。


rm(list=ls())

x <- data.frame(matrix(c(
3.17, 5, 31,
3.18, 9, 45,
2.71, 3, 61,
3.28, 6, 47,
1.94, 8, 22,
4.16, 6, 48,
3.62,11, 47,
2.22, 6, 48,
2.42, 5, 47,
2.95, 5, 50),
ncol=3,byrow=T))

name <- c(
"011",
"012",
"013",
"014",
"015",
"016",
"017",
"018",
"019",
"020")

x <- cbind(name,x)
x # 通常はこれを読み込んでいる

colnames(x) <- c("Team","x1","x2","x3")
rownames(x) <- x[,1]
x <- x[,-1]
x

x <- scale(x)
x

d <- dist(x)
result <- hclust(d)
plot(result)
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!