2015/02/03

incanterでhistgramをプロットする

 Clojureのincanterについては, ずいぶん前から知っていたのですが, 使う機会があまりなかった為, 特に触っていませんでした. 最近, Clojureで生成したデータからグラフをプロットするという作業が必要になったこともあって, incanterを弄っているので, メモです.


 とりあえず, histgramを使うところまで.

 以下のコマンドは, REPLに
user> (use '(incanter core stats charts pdf))
を叩き込んだ前提で. (2015/02/05, pdf追加)
 名前的に他のライブラリ等の関数名と名前が重複する可能性がある(特にnumeric-towerなど, な)ので, prefixなしで直にロードするというのはあまりよくありませんが, 弄ってみるだけなら, これでも問題ない筈です.

 公式のチュートリアル(Github)にも載っていますが, ヒストグラムの表示は,
user> (view (histogram (sample-normal 10000)))
でいけます.

 ヒストグラムは, n個のデータサンプルをカテゴリ別に分類し, そのデータの分布を可視化するものなので, カテゴリ数を調整したくなります. カテゴリ数は, :nbinsオプションで指定できます. カテゴリ数を1000にする場合, 以下のように書きます.
user> (view (histogram (sample-normal 10000) :nbins 1000))
これを実行すると, 次のようになります.

 (sample-normal 10000)は, 意味的には,
user> (import 'java.util.Random)
user> (def r (Random .))
user> (map (fn [x] (.nextGaussian r)) (range 10000))
と一緒のようです. 平均0, 標準偏差1の正規分布に従い乱数を生成するものです.

 sample-normalが生成するのは, 単なる数値型(double)のリストです.
user> (sample-normal 3)
(1.2821074070154617 1.638783357428357 -0.2801943679292413)
 サンプルのリストをconcatでつなげれば, 別々のサンプルを合成できます. :sdは標準偏差(Standard Deviation), :meanは平均のオプション.
user> (view (histogram (concat (sample-normal 10000 :mean -5 :sd 4)
                               (sample-normal 10000 :mean 4)) :nbins 1000))

 ヒストグラムが, 正規分布に従っているかどうかを調べるために, 正規分布の曲線を重ねるのは, histgramで生成したオブジェクトに, add-line関数で重ねます. pdf-normalは, 正規分布の関数. histgramの:densityオプションは, 密度(Density)か頻度(Frequency)のオプション.
user> (view (doto (histogram (sample-normal 10000) :nbins 100 :density true)
                  (add-lines (range -4 4 0.01) (pdf-normal (range -4 4 0.01)))))
で, これが次のようにプロットされます.

0 件のコメント :