提供:Japanese Scratch-Wiki
このきじは ひらがなでよめません。ごめんなさい。編集者向け:作成する
このチュートリアルでは、Scratchで数値データの最頻値 を求める方法を説明する。
最頻値 (モード) とは、データ集合のなかでもっとも頻繁に登場するデータを指す。登場回数が同じデータが複数存在する場合は、それらをすべて最頻値とみなす。ほかより登場回数が同じ値が1つもない場合は (言い換えれば、すべての値が1回しか登場しない場合は)、最頻値は存在しない。 ぱっと考える分には、シンプルなルールなのだが、プログラムで求めるときは結構複雑になる。
スクリプト例
ここで紹介するスクリプトでは、新たなデータが登場するたびにデータリストのすべてのデータを調べて、登場回数が最大のものを記録していく。そして、ひととおり処理が終わった後、調べた最頻値を表示する。
- 変数
- 現時点での最大回数 — (その時点で) もっとも多く登場した値の登場回数
- カウンター — 回数を数えるのに使う変数
- 項目 — 現在、カウント中のデータを入れる & 最頻値が複数あるときに、1つずつ取り出すために使う
- 比較用項目 — データをカウントするためときの比較用に使う変数
- 最頻値 — 最頻値が複数存在する場合、この変数に全部くっつけて保存する。スプライトが最頻値を表示するとき、この変数を使う。
- リスト
- 現時点での最頻値リスト — 記録された (その時点での) 最頻値
- データリスト — 調べる対象のデータのリスト
- 調べ終わったデータ — カウントが終わったデータのリスト (このスクリプトでは、すでに数え終わったデータを記録しておくことで、処理の効率を上げている)
(すべて v) 番目を [調べ終わったデータ v] から削除する::list (すべて v) 番目を [現時点での最頻値リスト v] から削除する::list [現時点での最大回数 v] を [0] にする [項目 v] を [0] にする ([データリスト v] の長さ::list) 回繰り返す [カウンター v] を [0] にする [比較用項目 v] を [0] にする [項目 v] を (1) ずつ変える もし <<[調べ終わったデータ v] に ((項目) 番目([データリスト v])) が含まれる> ではない> なら ((項目) 番目([データリスト v])) を [調べ終わったデータ v] に追加する ([データリスト v] の長さ::list) 回繰り返す [比較用項目 v] を (1) ずつ変える もし <((比較用項目)番目([データリスト v])) = ((項目) 番目([データリスト v]))> なら [カウンター v] を (1) ずつ変える end end もし <(カウンター) = (現時点での最大回数)> なら ((項目) 番目([データリスト v])) を [現時点での最頻値リスト v] に追加する end もし <(カウンター) > (現時点での最大回数)> なら [現時点での最大回数 v] を (カウンター) にする (すべて v) 番目を [現時点での最頻値リスト v] から削除する ((項目) 番目([データリスト v])) を [現時点での最頻値リスト v] に追加する end end end もし <([現時点での最頻値リスト v] の長さ::list) > [1]> なら もし <(([データリスト v]) / (現時点での最大回数)) = ([現時点での最頻値リスト v] の長さ::list)> なら [最頻値が存在しなかった。] と言う でなければ [最頻値 v] を [] にする [項目 v] を [0] にする (([現時点での最頻値リスト v] の長さ::list) - (2)) 回繰り返す [項目 v] を (1) ずつ変える [最頻値 v] を ((最頻値) と (((項目) 番目([現時点での最頻値リスト v])) と [, ])) にする end [項目 v] を (1) ずつ変える [最頻値 v] を ((最頻値) と (((項目) 番目([現時点での最頻値リスト v])) と ([, ] と (((項目) + (1))番目([現時点での最頻値リスト v]))))) にする ([最頻値は] と ((最頻値) と [。])) と言う end でなければ ([最頻値は] と((現時点での最頻値リスト) と [。])) と言う end