質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

Q&A

解決済

1回答

1177閲覧

Rによるk-means(クラスターの歪みを表す図)について

may_eg

総合スコア3

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

0グッド

0クリップ

投稿2021/06/10 05:22

以下の3つの組み合わせにより、下図のようなクラスターの歪みを示すスクリプトを完成させなさい(ここでは、クラスターの数は3個に固定):

Sepal.Length,Sepal.Width
Sepal.Length,Sepal.Width,Petal.Length
Sepal.Length,Sepal.Width,Petal.Length,Petal.Width

library("ggplot2")
data(iris)
set.seed(20)
results<-data.frame(variables=2:4,wss=rep(0, 3 ))
for(i in 2:???){
df<-iris[, 1:???]
km <- kmeans(df, 3, nstart = 20)
results$wss[???]<-km$tot.withinss

ggplot(results, aes(x = variables, y = wss))
+geom_point()+geom_line()+theme_bw()

イメージ説明

という問題(???の部分を埋める)です.データセットはirisを用いています.
図の見方やクラスターの歪みについては理解しているつもりなのですが,自分で出した答えを入力しても違うグラフが出力されます.どこが間違っているのでしょうか……(そもそも,for構文の中で何をしようとしているのかわかりません……)

library("ggplot2")
data(iris)
set.seed(20)
results<-data.frame(variables=2:4,wss=rep(0, 3 ))
for(i in 2:150){
df<-iris[, 1:ncol(iris)]
km <- kmeans(df, 3, nstart = 20)
results$wss[i]<-km$tot.withinss

ggplot(results, aes(x = variables, y = wss))
+geom_point()+geom_line()+theme_bw()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

読んでみた限りでは、変数の数を変化させながらクラスタの平方和の合計(tot.withinss)をプロットしたい……ということのようです。

forループで変数の数を変化させているので、それを考慮してiの区間を考えてみてください。

(なお、forの閉じカッコが全角になっているのと、ggplotの行と次の+の行の間に改行が挟まっているのがエラー原因になると思うので、そこは直さないと駄目でしょう……)

投稿2021/06/10 11:51

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

may_eg

2021/06/10 13:15

そもそも,問題文の「以下の3つの組み合わせにより」の意味がよくわからなくて…… Sepal.Length,Sepal.Width Sepal.Length,Sepal.Width,Petal.Length Sepal.Length,Sepal.Width,Petal.Length,Petal.Width のそれぞれの値を基準にして,それぞれクラスター数3でクラスター分析をしたときの歪みを示している,ということですか……? wssのベクトルにrep(0.3)=0,0,0が指定されている意味もわからないです. 指定した区間内で変数iが動き,それぞれのiに対して計算した結果 iris[, 1:???] をdfにしまい,それを用いてkmeanを行っている.results$wss[i]<-km$tot.withinssということはkmeanの結果がそれぞれの変数に対する平方根の和……?? と考えていくと,for内は下記のスクリプトかなとも思いましたが,違う図が表示されてしまいました. for(i in 2:4) { df<-iris[, 1:i] km <- kmeans(df, 3, nstart = 20) results$wss[i] <- km$tot.withinss} 全く説明なしの,例題スクリプト(+図)だけ渡され,その後この図を見せられたので,スクリプトがどのような構造になっているのかあまり理解できていません……せっかくのご助言ですが意図を察せず申し訳ないです…… 様々なサイトや,図書館で本も見てみたのですが,k-meansでfor loopのスクリプトを扱っているものが見つけられずどんどん混乱が深まっています…… (半角括弧と改行の件ご指摘ありがとうございます)
hayataka2049

2021/06/10 14:42 編集

「変数2つの場合、変数3つの場合、変数4つの場合でクラスタリングして、平方根の和をresultsの初期値0で格納したwss列に代入…… という処理をやればいいと思われるので、考え方としてはコメントのコードで合っているはずです。 ただしresults$wssのインデックスはiから1を引いて1つずらさないといけないのですが。
may_eg

2021/06/10 14:58

results$wss[i-1]にしたところ,目的の結果が出力されました……!ありがとうございます. ですが,なぜ1つずらさないといけないのでしょうか……?
hayataka2049

2021/06/10 14:59

iが2:4でRのベクトルのインデックスは長さ3なら1:3ですから。
KojiDoi

2021/06/11 02:56

余計なお世話かも知れませんが、この教材を提供しているのが誰か知りませんが、スクリプトの作りは微妙だし、題材の選び方も微妙。Rの入門コースならもっと基本的なことから学んでいくべきだし、統計の入門コースだとしたらあまりに順番がでたらめに見えます。初心者に適切な教育がなされているようには見えませんね。別の教材、学習コースなど探してみたほうがいいかも。
may_eg

2021/06/12 10:21

一応,Rの入門コースの途中なのですが,この問題以前も分かりにくい教材と問題が多くて…………私の理解力不足もありますが,違う教材を探してみます.お二方,知恵をお貸しくださりありがとうございました……!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問