Lispstat、R vs. incanter

最近はおいらの所にやって来るspamの内容が変わってきている。若奥様友の会とか 奥様サークルとか、ロシアのナターシャから愛を込めて(勿論、想像だけどね)な んてのは相変わらず健在。

増えたのは、このCDを1日3分聞くだけであなたも英語がペラペラにとか、即ご融資 とか、1日3万円のアルバイトとか、これで必勝競馬ソフト(期間限定)等、世の中の 不景気具合が切実に分かるようなものだ。

そう言えば、この間の大井で 2500万円近い穴 が有ったようで、大穴だった人は必勝競馬ソフトのユーザーだったんでしょうかね? 昔々、rubyで競馬 予想なんて記事をちらっと書いたら、数名の方から問い合わせを受けてびっくらこいた 覚えがあります。競艇と言う名前のイメージが悪いと言って、ボートレースに名前を 改めますコマーシャルもやってるし、千葉の森田さんは、カジノ構想をぶち上げて ますし、みんな楽して儲けようと虎視眈々。

日本最大の博打運営会社。生命保険。あんたが死んだらお金あげるから、賭けに乗りません か。この間は某生命保険会社から電話がかかって来て、保険証の点検したいので訪問 したいとの事。数日して、アイリスの花だかを一輪持っておねーさんが来ましたよ。

質問事項は、家族にお変わりありませんか? だけ。そんな質問はどうでもよくて、 そろそろ満期になりますから、また新たな博打を始めませんかの、勧誘ですよ。 病気になったら補償がたっぷりで安心ですよ、とか、やんわりした脅しが混じって ます。

生命保険ぐらい、掛けた人に損な博打はありません。世の中で一番公正で良心的な 博打は、博徒がこっそり開く賭場だそうです。競馬とかボートレースは、売り上げの うち何パーセントぐらいの還元率なのだろう?

この辺の話は、あの人が詳しいのかな? そして、大穴が出た件のレースで、幾ら ぐらいの売り上げがあったか推定出来るのだろうか?

競馬しかり生命保険しかり、spam分類はあの人が書いたベイズ統計の応用という 具合に、統計とは切っても切れない世界だなあ。

世の中の不景気を反映してか、統計ソフトRによる... という本もごっそりと 出版されてる。よって久しぶりに統計だ。随分と前置きが長いーーー。

Lisp-stat

もの心ついた頃から、統計ソフトと言えば lispstat でしたねぇ。まあ、何と言うか、単にLispしたかっただけかも知れませんので、深く 詮索しないでね。昔、Lispと言えば、XLISPぐらいしか無かったんよ。Xlispstatは、XLISP に統計関係を追加したものね。統計無視すりゃ、ただのLISP。

FreeBSDだと /usr/ports/math/xlispsatに有ります。

[sakae@cdr ~]$ xlispstat
XLISP-PLUS version 3.04
Portions Copyright (c) 1988, by David Betz.
Modified by Thomas Almy and others.
XLISP-STAT Release 3.52.20 (Beta).
Copyright (c) 1989-1999, by Luke Tierney.

> (car '(a b c))
A
> (exit)

このバナーを見ると、もう開発は止まってしまったんでしょうかねぇ。こやつに代わって だれでも使えそうな R が出てきましたからね。まあ、R本のラッシュが、この推定を 如実に裏付けているな。

R

Sの前はRだという事で単純に名前が付けられたみたい。検索に難があってみんなブーブー 言ってます。(笑)よって、今までに集めたリンクを晒しておきます。

RjpWiki

R-Tips(お勧め)

統計処理ソフト R 入門 講習会資料

R Language Definition

「R による統計解析」 オーム社 刊

アイスクリーム統計学にようこそ!

統計学入門

アイスクリームの別バージョンで、ハンバーグ編があったように記憶してるんだが、 見つからんかった。どちらもそのまま食べると脳は多少は太るだろうけど、それ以上に 体が太りそうな。。。 統計学の方は、脳から油が出てくるぐらい搾られます。

統計学と言うと、ある人は、こういう事をのたまわっていましたよ。

From: [595] 132人目の素数さん <sage>
Date: 2010/04/08(木) 20:06:11

統計学は文系の使うものだという感じがするので嫌い。
コンサルやMBA(笑)みたいな胡散臭い奴らが学んでるし。

理工系のエンジニアとしては彼らと一緒にされたくないので
統計学を学ぶのには嫌悪感がある。

そんな事はねぇだべ。統計と一緒にJavaやclojureも勉強出来るよ。

incanterをemacsから使う

incanterって、どんな意味? 英次郎で調べてみたら、incantがHitし、呪文を唱えるって 出てた。呪文を唱える人でいいのかな?

やっぱり統計は呪文ですか、そうですか。呪文に従って、馬券を買えば、大当たり間違い 無しだな。データの保存はOracle神託にお任せくださいって、あのプレーボーイが のたまうに違いない。

ほんじゃ、incanterしましょなんだけど、どうせ使うなら emacs上から使いたいよね。 ちと調べてみたら、手軽に使える方法が見つかった。

incanterのプロジェクトに移動しといて、lein swank するか、

[sakae@cdr ~/incanter]$ script/swank
Clojure 1.2.0-master-SNAPSHOT
Starting swank...
user=> Connection opened on local port  4005
#<ServerSocket ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=4005]>
user=>

こうしておいて、emacsから、M-x slime-connet を実行する。すると、Hostとportが 提示されるので、リターンで応答。最後に、

Versions differ: 2009-08-08 (slime) vs. nil (swank). Continue? (y or n)

が、出てくるので、y と答える。これで、incanterの環境を含んだREPLが回り始める。 サーバー経由でemacsとclojureを接続するなんて、大掛かりな事するなあ。

この方法は、Windowsに入れておいた、clojure-boxでも使えたよ。但し、script/swank.bat が無いとだめだけど、どんなバッチかと言うと

@echo off
setlocal
set LABREPL_SWANK="(require 'swank.swank) (swank.swank/start-repl 4005)"
call %~dp0repl.bat

ここに出てくる、%~dp0 って、どういう意味なんだろう? MS語だと思うんだが、おいら には理解不能だ。まてまて、ただのswank(shellスクリプト)の該当部分を見ると、script/repl になってたぞ。後はこれをどう解釈するかだな。

incanterは、習うより慣れろ、ですかね

一応、 An Overview of the Incanter API があるが、いきなりのベイズじゃ、ビビル多き! 間違い無し。 デモに則り、そろそろとやって行く。

データはここらあたりから拾ってきた電波の飛び具合でもいいんだけど 、ちょっと加工が面倒そうなので諦める。昔採取してた血圧データとかもあるんだけど、 EXCELの中だから引っ張ってくるの面倒くさいし。。

user> (use '(incanter core stats charts))
nil
user> (use 'incanter.datasets)
nil
user> (def data (get-dataset :cars))
#'user/data
user> (first data)
[:column-names ["speed" "dist"]]
user> (rest data)
([:rows ({"dist" 2, "speed" 4} {"dist" 10, "speed" 4} {"dist" 4, "speed" 7} {"d\
ist" 22, "speed" 7} {"dist" 16, "speed" 8} {"dist" 10, "speed" 9} {"dist" 18, "\
speed" 10} {"dist" 26, "speed" 10} {"dist" 34, "speed" 10} {"dist" 17, "speed" \
11} {"dist" 28, "speed" 11} {"dist" 14, "speed" 12} {"dist" 20, "speed" 12} {"d\
ist" 24, "speed" 12} {"dist" 28, "speed" 12} {"dist" 26, "speed" 13} {"dist" 34\
, "speed" 13} {"dist" 34, "speed" 13} {"dist" 46, "speed" 13} {"dist" 26, "spee\
d" 14} {"dist" 36, "speed" 14} {"dist" 60, "speed" 14} {"dist" 80, "speed" 14} \
{"dist" 20, "speed" 15} {"dist" 26, "speed" 15} {"dist" 54, "speed" 15} {"dist"\
 32, "speed" 16} {"dist" 40, "speed" 16} {"dist" 32, "speed" 17} {"dist" 40, "s\
peed" 17} {"dist" 50, "speed" 17} {"dist" 42, "speed" 18} {"dist" 56, "speed" 1\
8} {"dist" 76, "speed" 18} {"dist" 84, "speed" 18} {"dist" 36, "speed" 19} {"di\
st" 46, "speed" 19} {"dist" 68, "speed" 19} {"dist" 32, "speed" 20} {"dist" 48,\
 "speed" 20} {"dist" 52, "speed" 20} {"dist" 56, "speed" 20} {"dist" 64, "speed\
" 20} {"dist" 66, "speed" 22} {"dist" 54, "speed" 23} {"dist" 70, "speed" 24} {\
"dist" 92, "speed" 24} {"dist" 93, "speed" 24} {"dist" 120, "speed" 24} {"dist"\
 85, "speed" 25})])
user> (view data)
user=> (view (scatter-plot :speed :dist :data data))

CSVで提供されてるデータを読み込んでみた。このデータの説明は (doc get-dataset) すると得られる。Rからの輸入なんですってさ。

  :cars -- The data give the speed of cars and the distances taken
            to stop. Note that the data were recorded in the 1920s.

車があるスピードで走っていて、急ブレーキをかけた時の制動距離データみたい。1920代の データって、いくらRのそっくりさんを目指すとも古すぎないかい?

某T社にお願いしてプリ薄の生々しいデータを提供してもらいましょう。某T社も 公表したくてたまらんでしょうから、きっと提供してくれるでしょう。そればかりか、 incanterの佳きスポンサーになってくれたりして。。。。。

後はどんなグラフを書けるかなんだけど、想像してたのの50%ぐらいかな(当社比)。 まあ、見栄え大切ですから頑張ってください。こういうのばかりだと某コンサルと間違え られそうなので、最後はマウスでグリグリしましょ。

(use '(incanter core processing))

;; simple interactive Processing example taken from processingjs.org website:
;; http://processingjs.org/source/basic-example/processingjs_basic-example.html

;; set up variable references to use in the sketch object
(let [radius (ref 50.0)
      X (ref nil)
      Y (ref nil)
      nX (ref nil)
      nY (ref nil)
      delay 16

      ;; define a sketch object (i.e. PApplet)
      sktch (sketch

              ;; define the setup function
              (setup []
                     (doto this
                       ;no-loop
                       (size 200 200)
                       (stroke-weight 10)
                       (framerate 15)
                       smooth)
                     (dosync
                       (ref-set X (/ (width this) 2))
                       (ref-set Y (/ (width this) 2))
                       (ref-set nX @X)
                       (ref-set nY @Y)))

              ;; define the draw function
              (draw []
                    (dosync
                      (ref-set radius (+ @radius (sin (/ (frame-count this) 4))))
                      (ref-set X (+ @X (/ (- @nX @X) delay)))
                      (ref-set Y (+ @Y (/ (- @nY @Y) delay))))
                    (doto this
                      (background 125) ;; gray
                      (fill 0 121 184)
                      (stroke 255)
                      (ellipse @X @Y @radius @radius)
                      ;(save "proc_example1.png")
                      ))

              ;; define mouseMoved function (mouseMoved and mouseDraw
              ;; require a 'mouse-event' argument unlike the standard Processing
              ;; methods)
              (mouseMoved [mouse-event]
                (dosync
                  ;; mouse-x and mouse-y take the mouse-event as an argument
                  (ref-set nX (mouse-x mouse-event))
                  (ref-set nY (mouse-y mouse-event)))))]

  ;; use the view function to display the sketch
  (view sktch :size [200 200]))

おまけで、ABCL

ABC languageかと思ったら Armed Bear Common Lisp (ABCL) - Common Lisp on the JVM だそうです。clojureと兄弟なんですかね。先輩と言うか長男と言うかには、私の知る限り Kawaさんてのが居たような。先月に新版が出たそうですので、ソースから入れてみます。

READMEには3つの作り方が示されていました。

If you want to build ABCL, you have 3 options. The first option
applies when you come from a lisp background. The second and thirds
options are more appropriate when you come from Java development:

 I)  Bootstrap ABCL using a Common Lisp implementation
     Supported implementations for this process: SBCL, CMUCL, OpenMCL,
     Allegro CL, LispWorks or CLISP.
II)  Use the Ant make-like build tool for Java environments
     The tested lowest working version is Ant 1.7.0.
III) Use the Netbeans 6.x IDE to open ABCL as a project.

NetbeansってSunを買収したOracleが、開発を中止したんじゃなかったっけ。Solarisを 使うにもサポート契約しなくちゃならんようになるみたいだし、こういう荒療治が 済んだ後、一番やりたかったMySQLを何とかするぞ、手術が実施されるに違いない。 逝ってよしだな。

そう言えば、Javaの父、James Gosling が Oracle(元Sun)を退社したそうです。 メモリアル までも作られてました。一つの時代が終わったんですね。Solarisも倉庫を作るための 土台でしかなくなっちゃたんですかね。今後、神託は、土台までも含めて売るんだな。 ああ、あ、ですよ。

一番簡単な、II)の方法で、jarファイルを作ってみた。作成時間3分30秒。

[sakae@cdr ~/abcl-src-0.19.1]$ ./abcl
Armed Bear Common Lisp 0.19.1
Java 1.6.0_07 The FreeBSD Foundation
Diablo Java HotSpot(TM) Client VM
Low-level initialization completed in 1.288 seconds.
Startup completed in 2.743 seconds.
Type ":help" for a list of available commands.
CL-USER(1): (room)
Total memory 5177344 bytes
4051072 bytes used
1126272 bytes free
4051072
5177344
66650112
CL-USER(2): (gc)
3587584
CL-USER(3): :ex

abclは例のごとくラッパーでした。

exec /usr/local/diablo-jdk1.6.0/jre/bin/java  \
  -cp  /usr/home/sakae/abcl-src-0.19.1/dist/abcl.jar \
  org.armedbear.lisp.Main \
  "$@"

Lispのご本尊様は、cons ですってのは、tak本に出てくるくだりだけど、この場合の ご本尊様であらせらる abcl.jarは、6.6Mというこじんまりしたサイズでした。何かの時のために、Windows7側 にも置いておこうかな。また、clojure と abclを切り替えて使うには、下記のようにする。

;; launch Slime with M-- M-x slime $LISP instead of just M-x slime.
(add-to-list 'slime-lisp-implementations '(abcl ("abcl")))

そうそう、ソースの規模は、こんな感じでしたよ。

[sakae@cdr ~/abcl-src-0.19.1]$ cd src/org/armedbear/lisp/
[sakae@cdr ~/abcl-src-0.19.1/src/org/armedbear/lisp]$ ls *lisp | wc
     174     174    2770
[sakae@cdr ~/abcl-src-0.19.1/src/org/armedbear/lisp]$ ls *java | wc
     264     263    4893
[sakae@cdr ~/abcl-src-0.19.1/src/org/armedbear/lisp]$ wc *lisp | tail -1
   44473  187058 1834890 total
[sakae@cdr ~/abcl-src-0.19.1/src/org/armedbear/lisp]$ wc *java | tail -1
   69993  237081 2335468 total

これに統計用の関数を追加して行けば、現代版のabclstatが出来るな。でも、abclstat じゃ、あんまりな名前かな。matzさんの教え、名前じゅーよー に従って、名前でも 考えてみるか。呪文を唱える人 ってのは既にあるので、祈る人ってのはどうだ。

davener とか wisher かな。日本人からすれば、wisherの方が通りが良い。 ウィッシャー、よっしゃー、あの馬に、1万円張るぞ。なんとなく勝ち馬に乗れそうで、 いいんでないかい!

前回の訂正

前回、ArchLinuxでwiresharkやtcpdumpが動かないって書いた。原因は、 ライブラリーが入っていなかったからだ。

所が、先日システムを更新したら動いたよ。システム更新は大掛かりで、カーネルまでもが 上がった。勿論、それに付随するものも大量に。

[sakae@arch ~]$ uname -a
Linux arch 2.6.33-ARCH #1 SMP PREEMPT Mon Apr 5 05:57:38 UTC 2010 i686 Intel(R) Celeron(R) CPU 900 @ 2.20GHz GenuineIntel GNU/Linux

確かwiresharkを入れた日は、4/13あたりだったと思うんだけど、これらは新しいライブラリー を要求されるようにコンパイルされてて、その新しいライブラリーは、まだ日本には 届いていなかったに違いない。次回からは、DHLなりFeDXを使って配達していただくように、お願い します。