提供: Japanese Scratch-Wiki

このきじは ひらがなのページがありません。ごめんなさい。
このチュートリアルでは、Scratchで数値データの最頻値 を求める方法を説明する。

最頻値 (モード) とは、データ集合のなかでもっとも頻繁に登場するデータを指す。登場回数が同じデータが複数存在する場合は、それらをすべて最頻値とみなす。ほかより登場回数が同じ値が1つもない場合は (言い換えれば、すべての値が1回しか登場しない場合は)、最頻値は存在しない。 ぱっと考える分には、シンプルなルールなのだが、プログラムで求めるときは結構複雑になる。

スクリプト例

ここで紹介するスクリプトでは、新たなデータが登場するたびにデータリストのすべてのデータを調べて、登場回数が最大のものを記録していく。そして、ひととおり処理が終わった後、調べた最頻値を表示する。

変数
  • 現時点での最大回数 — (その時点で) もっとも多く登場した値の登場回数
  • カウンター — 回数を数えるのに使う変数
  • 項目 — 現在、カウント中のデータを入れる & 最頻値が複数あるときに、1つずつ取り出すために使う
  • 比較用項目 — データをカウントするためときの比較用に使う変数
  • 最頻値 — 最頻値が複数存在する場合、この変数に全部くっつけて保存する。スプライトが最頻値を表示するとき、この変数を使う。
リスト
  • 現時点での最頻値リスト — 記録された (その時点での) 最頻値
  • データリスト — 調べる対象のデータのリスト
  • 調べ終わったデータ — カウントが終わったデータのリスト (このスクリプトでは、すでに数え終わったデータを記録しておくことで、処理の効率を上げている)
(すべて v) 番目を [調べ終わったデータ v] から削除する
(すべて v) 番目を [現時点での最頻値リスト v] から削除する
[現時点での最大回数 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

関連項目