これからの可視化は動画の時代
  ~Rでanimationパッケージ
   で動画を作成する方法~
      @sleipnir002
      Tokyo.R#20
自己紹介



        @sleipnir002
        •Tokyo.Rでパターン認識の発表をシリーズで
        やっています。
        •職業:ITコンサル
自主規制    •データマイニングのIT業界への普及と促進の
        ために活動しています。
        •ガイア好きです。
        •好きなAKB48のメンバーはこじはるです。
animation
パッケージのご紹介
パッケージ概要
  Rのプロットを結合して、アニメーション形式で出力するパッケージ


1. Rから複数のアニメーションフォーマットへの
   エクスポートをサポート
   →自分の望む形式に変換して、ホームページやレポート
 に埋め込みができる!
2. 統計教育用のサンプルアニメーションを含む
   →統計の勉強になる!


  これからは動画で可視化の時代!!
animationを使って動画を作成してみよう!

library(animation)                       Package animation
ani.options(outdir="/var/XXX/")          オプションの設定
s<-function(x, k){x^3+k*x^2-5*x+4}
ani.start()                              録画開始
for(i in -30:30){
 plot(s(-30:30, i), type="l", ylim=c(-   3次関数の係数を変更し
   10000, 10000))                        てプロット
}
ani.stop()                               録画停止


         HTML形式のファイルが作成されていることを確認する。
インストール
• install.packages(“animation”)だけでOK!
• 以下のコマンドのインストールが必要
• ImageMagick・・・画像処理用のコマンドラインツール
   $ sudo apt-get install imagemagick
• SWF Tools・・・SWF生成用のコマンドラインツール
   $ sudo apt-get install libfreetype6-dev libgif-dev xpdf
   libjpeg8 libjpeg8-dev ←r-base-devを削除した。
   $ wget http://www.swftools.org/swftools-0.9.1.tar.gz
   $ tar -zxvf swftools-0.9.1.tar.gz
   $cd swftools-0.9.1
   $./configure
   $make
   $sudo make install
                                  OS:Ubuntu 10.10 64bitの場合
出力形式
• HTML形式・・・ブラウザ上で再
  生するページを作成
• GIF形式・・・GIFに出力
• SWF形式・・・FLASHに出力
• PDF形式・・・Texで埋め込み
• 動画形式・・・mpeg4等に出力
• 動画をRのグラフィックデバイ
  ス上に作成することも可能。
動画を作成してみる
animationを使って動画を作成する3つの方法

A) savehoge()形式で特定フォーマットで保存
B) ani.start()形式でHTML形式で保存
C) ani.record()で録画、ani.replayで再生を行う。
*ソース1を参照



                       A)saveHTML
             動画を閲覧できるHMTLページを作成する。

    >saveHTML(expr={bisection.method()}, img.name="bi")
    >saveHTML(expr={newton.method()}, img.name="newton")

•   JSを使用してHTMLから動画を閲覧可能にする。
•   exprで指定した手順でplotした画像を動画にする。
•   img.nameの引数を保存する画像の拡張子に使用する。
•   saveHTMLを複数回実行すると、ページ上にはHTMLが複数
    表示される。


        方程式の根を求めるアルゴリズムのデモ
*ソース1を参照



                            A)saveGIF
                       GIF形式の動画を作成する。

    >saveGIF(expr={boot.iid()}, clean=TRUE, img.name="boot",
    movie.name="boot.gif")

•   ImageMagickのコマンドを使用して、動画を作成する。
•   exprで指定した手順でplotした画像を動画にする。
•   img.nameで指定した接頭辞で保存する。
•   ファイルはオプションoutdirで指定したディレクトリに
    movie.nameの名前で保存される。


        ブートストラップのデモ
*ソース1を参照



                          A)saveSWF
               FLASH形式の動画を画像から作成する。

    > saveSWF({expr=kmeans.ani(centers=4)},swftools=NULL,
         img.name="kmeans", swf.name="kmeans.swf")

•   SWF Toolsのpng2swfコマンドなどを使用して、画像をFLASH
    に変換する。
•   exprで指定した手順でplotした画像を動画にする。
•   img.nameで指定した接頭辞で保存する。
•   ファイルはオプションoutdirで指定したディレクトリに
    swf.nameの名前で保存される。

        K-means法の動きを表すアルゴリズムのデモ
B)ani.start(), ani.stop()
                 HTMLによるアニメーションページを作成

  >ani.start()
  >・・・
  >ani.stop()
                                         デモは省略

• 自動的にoutdirにJSファイルをコピーして、start開始後、stop
  までに作成されたplotで動画を作成する。
• saveHTMLとは出力画面の形式が異なる。
• 指定したフォルダに必要なjavascriptファイルを出力するので
  注意。
*ソース2を参照



       C)ani.record (), ani.replay()
  recordでカレントのデバイスを録画して、replayで再生する。

  >for(i in 0:9){
  + rbfsvm <- ksvm(x,y,kernel=rbfdot(sigma=1), C=1+i*20)
  + ani.record()
  + plot(rbfsvm,data=x,key.axes=axis(4, seq(-7, 7, by=1)), zlim=c(-7, 7))
  +}
  >ani.replay()


• ani.recordでカレントのデバイスの画像を保存して、記録する。
• ani.replayで記録した動画の再生を行う。


      SVMの正則化のコストを大きくした時の挙動のデモ
オプション
ani.option(1)
    >ani.option() or ani.option(“interval”) #オプション内容の確認
    >ani.option(oopt) #デフォルトに戻す。
    >ani.options(interval=0.5)#インターバルを0.5に設定


•   interval・・・フレームの間隔(秒)
•   nmax・・・フレームの最大数
•   ani.width,ani.height・・・画像の幅と高さ
•   ani.dev,ani.type・・・デバイス、画像の種類
ani.option(2)
              [hmtlfile]   ・・・デフォルトのHTML出力ファイル
   [OUTDIR]
              [IMAGES]     ・・・デフォルトの画像出力先フォルダ


デフォルトの出力先フォルダ。特に指定
しなければ、tmpフォルダが使用される。


• outdir・・・デフォルトの出力先フォルダ
• htmlfile・・・HTML出力(index.html)
• images・・・作成した画像を含むフォルダ
まとめ
• animationパッケージでRで簡単に動画が作成
  できるからみんな動画で可視化してみよう。
• animationパッケージで動画を作成する際の
  フォーマットはGIF,HTML,SWF,MPEGなど
• 統計教育用アニメーションがいっぱいあるの
  で、暇な人は見てみよう。
ソース1
#A)saveHoge関数のデモ
#SaveHTML
#2分割法で方程式を解く動画サンプル
saveHTML(expr={bisection.method()}, img.name="bi")
#ニュートン法で方程式を解く動画サンプル
saveHTML(expr={newton.method()}, img.name="newton")
#SaveGIF ブートストラップのデモ動画サンプル
saveGIF(expr={boot.lowess(cars, f=1, pch = 20, iter=20, xlab = "speed", ylab =
   "dist")}, clean=TRUE, img.name="boot", movie.name="boot.gif")
#SaveSWF k-means法による動画の可視化
saveSWF({kmeans.ani(centers=3)},swftools=NULL,img.name="kmeans",
   swf.name="kmeans.swf")
ソース2
#C)ani,record,ani.replay方式のデモ~SVMの正則化項を大きくしていった際の挙動の可視化
#ライブラリの読み込みとデータの生成
library(kernlab);library(mlbench)
dat <- mlbench.2dnormals(400, cl=2, r=sqrt(20), sd=2);x <- dat$x; y <- dat$classes
#これまでの画像のクリアー
ani.record(reset=TRUE)
for(i in 0:9){
 #SVMの正則化項のコストを大きくしながらモデルを作成
 rbfsvm <- ksvm(x,y,kernel=rbfdot(sigma=1), C=1+i*20)
 plot(rbfsvm,data=x,key.axes=axis(1, seq(-i, 7, by=1)), zlim=c(-7, 7), sub=paste("C=", 1+i*20))
#直前のプロットを記録する。
ani.record()
}
#記録した画像を再生
ani.replay()


                                    *パターン認識 (Rで学ぶデータサイエンス 5) 共立出版(金森ほか, 2009)を参考に作成
ソース3
#ハートの方程式
love<-"僕とお付き合いしてください"                                                                          x   0.01 (t 2  40t  1200)  sin(  t / 180)
                                                                                                   
                                                                                               y   0.01 (t 2  40t  1200)  cos(  t / 180)
retx<-function(t, d){d * 0.01 * (-(t^2)+40*t+1200)*sin(pi * t /180)}
rety<-function(t){0.01 * (-(t^2)+40*t+1200)*cos(pi * t /180)}                                      
ani.options(outdir="/var/www/html/rtmp", interval = 0.05, nmax = 150)                          (0  t  60)
saveGIF(
expr={
   #ハートの方程式を徐々に記述していく。
  plot(retx(1, 1), rety(1), xlim=c(-15, 15), ylim=c(-10, 20), xlab="", ylab="")
  for(t in 2:60){
    plot(c(retx(1:t, -1), retx(1:t, 1)), c(rety(1:t), rety(1:t)), xlim=c(-15, 15), ylim=c(-10, 20), main=, xlab="", ylab="")
  }
  #告白のを付け加えた状態で画像を固定する。
  for(t in 1:30){
    plot(c(retx(1:60, -1), retx(1:60, 1)), c(rety(1:60), rety(1:60)), xlim=c(-15, 15), ylim=c(-10, 20), main="", xlab="", ylab="")
    mtext(love, side = 3, line = -16, cex= 2, col="red")
  }
 }, movie.name="heart.gif"
)




                                                                *ハートはhttp://www.mathematische-basteleien.de/heart.htmを参考に作成
最後に
こんな使い方はいかがでしょうか?
Tokyo.R 第20回記念作品
「Rを巡る素敵な恋の物語」
♪




DREAMS COMES TRUE 『LOVE LOVE LOVE』
今からお話しするのは
Rを巡る素敵な恋の物語
この物語の主人公は
Tokyo.Rに参加しているR君
理系大学院生の彼は勉強熱心で
    まじめな青年
そしてRが大好き
強いて挙げるとすると
彼の欠点はまじめすぎて奥手なところ
そんな彼は毎回
Tokyo.Rに参加しています
その理由はRの勉強をするため
でも、彼にはTokyo.Rに参加する
 もう一つの理由がありました
それはよくTokyo.Rに参加しているSちゃん
彼はひそかに彼女に想いを
 よせいていたのでした
奥手な彼は彼女のアドレスを
 教えてもらったのですが、
Rの話しかできずにいたのです
そんなある日、
彼は素敵なイケメンITコンサルさんの紹介で
  animationパッケージに出会いました
「よし、これだ!」
意を決したS君
ある日、Sちゃんを
誘ってこう話しかけました
「ねぇSちゃん、Rのプロットにサブタイトルを付け
   たいんだけど、付け方がわからないから
       教えてくれないかな」
Sちゃんは答えました
『あら、そんなの簡単だわ。』
「ほんとに、じゃあこのソースコードに
  付け加えてもらえるかな?」
R君は自分のPCをSちゃんの前に
     置きました
『えーと、plotは・・・あっ・・・』
Sちゃんはソースコード読み、
   一瞬はっとします
そして、彼女はそのソースコードに
   sub=“yes”と書き加え、
 二人はめでたく結ばれました。
そのコードはanimation
パッケージを使用していました
そしてそのコードを実行すると・・・
*ソース3を参照




ソース3を実行してみてね!!
Fin
animationで素敵なRライフを




   Be happyWith animation




   ※今日の資料はコードも含めてblogにアップします。

How to use animation packages in R(Japanese)