Rubyによるデータ解析

63
-1

Published on

Rubyは、Webアプリケーションの領域を中心に利用が広がっているが、データ解析の分野ではライバルであるPythonに大きく遅れを取っている。本発表では、Rubyによるデータ解析の現状と今後の発展についての展望を述べた。
DCワークショップ2016(http://dcworkshop.github.io/201602/0_about.html)での発表。

Published in: Software
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
63
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Rubyによるデータ解析

  1. 1. Rubyによるデータ解析 Data Analysis in Ruby 2016年2月19日 株式会社ネットワーク応用通信研究所 前田 修吾
  2. 2. 自己紹介  名前 • 前田 修吾  所属 • 株式会社ネットワーク応用通信研究所(1999年~) • 一般財団法人Rubyアソシエーション(2007年~)  オープンソース活動 • Ruby開発者(1997年~) 1
  3. 3. 本日のテーマ  Rubyによるデータ解析 2
  4. 4. データ解析の例 3
  5. 5. 株式市場のブラウン運動  M. F. M. Osborne, Brownian Motion in the Stock Market, Operations Research, 1959  『ウォール街の物理学者』という書籍で紹介  株価の対数とブラウン運動における微粒子の座標との類似性  統計力学的手法を株価に適用 4
  6. 6. ブラウン運動 5 https://commons.wikimedia.org/wiki/File:Brownian_motion_large.gif CC-BY-SA 3.0 by Lookang  液体のような溶媒中に浮遊する微粒子が不規則に運動する現象
  7. 7. 1. 株価の変化  株価の変化は離散的(1/8ドル単位)  株価の対数も同じ 6
  8. 8. 2. 取引数  単位時間あたりに有限の取引(あるいは決定)が行われる • 一つの株に対して0~1000あるいはそれ以上 7
  9. 9. 3. Weber-Fechnerの法則  精神物理学の基本法則  感覚量Eは刺激量の強度Rの対数に比例する • E = C log R • 強度100の刺激が200に増加した場合の感覚量と、 強度200の刺激が400に増加した場合の感覚量は同じ  株価という刺激とそれに対するトレーダー・投資家の主観的感覚は この法則に従うと仮定する 8
  10. 10. 統計学的アプローチ  金融の知識のない統計学者がNY市場の取引データを解析したら? • 集団が均質かどうか • 各属性・変数の関連性 9
  11. 11. 株価の分布  株価の終値を主要な変数と推測  1000要素のサンプルの分布をプロット  株価は正規分布に従わない  株価の対数は正規分布に従うかもしれない 10
  12. 12. 正規分布  以下の確率密度関数を持つ • 𝑓 𝑥 = 1 2𝜋𝜎2 exp − 𝑥−𝜇 2 2𝜎2  確率密度関数 • xがある範囲の値となる確率 = 当該範囲の積分値  サンプルサイズを大きくすると 標本平均が真の平均に近づく (大数の法則) 11
  13. 13. 平均・分散・標準偏差  平均 • 𝜇 = 1 𝑛 𝑖=1 𝑛 𝑥𝑖  分散 • 平均からのばらつきの指標(正の値にするため自乗誤差を使う) • 𝜎2 = 1 𝑛 𝑖=1 𝑛 𝑥𝑖 − 𝜇 2  標準偏差 • 分散の平方根(𝑥𝑖や𝜇の値と比較しやすくするため平方根を取る) • 𝜎 = 1 𝑛 𝑖=1 𝑛 𝑥𝑖 − 𝜇 2 12
  14. 14. 株価の対数の分布 13  正規分布ではない  𝐥𝐨𝐠 𝒆 𝑷 ≈ 𝟒𝟓周辺の副極大 • この集団は均質でない • 少なくとも二つの下位集団  生データの確認 • 𝐥𝐨𝐠 𝒆 𝑷 ≈ 𝟒𝟓周辺のデータに pfd (preferred) 属性
  15. 15. 対数収益率を使う根拠  価格の変化による利益・損失に対する主観的感覚を表す  $10から$11の価格変化と、$100から$110の価格変化に対する主 観的感覚は同じ  なぜ収益率 𝑃 𝑡+𝜏 −𝑃 𝑡 𝑃 𝑡 ではなく対数収益率 log 𝑒 𝑃 𝑡+𝜏 𝑃 𝑡 を使うか • 対数収益率を使うことで、上昇率と下降率の対称性が得られる • 価格が 50%下降した後に 50%上昇しても元の価格に戻らない • log 𝑒 1 2 = −log 𝑒2 14 × 1 2 × 2
  16. 16. 4. 論理的決定  収益の期待値 • 𝐴という一連の行動が𝑌𝐴1, 𝑌𝐴2という収益を確率𝜑 𝑌𝐴1 , 𝜑 𝑌𝐴2 で生む • 収益の期待値 𝜀 𝑌𝐴 = 𝑖 𝑌𝐴𝑖 𝜑 𝑌𝐴𝑖  収益の期待値が高い行動を選択 • 𝜀 𝑌𝐴 と𝜀 𝑌𝐵 のどちらが大きいか?  価格𝑷 𝟎 𝒕 の株を100株買うかどうか? • 𝐴 = 将来 𝑡 + 𝜏 に株を売るために買う • B = 買わない • 𝑌𝐴 𝜏 = ∆log 𝑒 100 𝑃 𝑡 = log 𝑒 𝑃 𝑡 + 𝜏 𝑃0 𝑡 • 𝑌𝐵 = 0 • 𝑌𝐴 𝜏 の期待値の見積が正か負かによって論理決定を行う 15
  17. 17. 5. 市場の平等性  ∆log 𝑒 𝑃 を買い手は正、売り手は負と判断する • E𝜀 ∆log 𝑒 𝑃 S + E𝜀 ∆log 𝑒 𝑃 B = 0 • ここで 𝑃 は1株当たりの価格、E𝜀 は期待値の見積  市場全体では以下の式のような状況 • E𝜀 ∆log 𝑒 𝑃 M=S+B = 0 • 上記の式では見積を表す E はなくてもよいかもしれない 16
  18. 18. 6. 株価の収益率の分布  以下の 𝑌 𝜏 は、平均 𝟎、標準偏差 𝝈 𝑌 𝜏 の正規分布に従うと予測 される • 𝑌 𝜏 = log 𝑒 𝑃 𝑡 + 𝜏 𝑃0 𝑡  𝝈 𝑌 𝜏 は取引数の平方根に比例する  取引数が時間上均一に分布すると考えると • 𝝈 𝑌 𝜏 は時間間隔の平方根に比例する • すなわち、𝝈 𝑌 𝜏 は 𝜎 𝜏 という形式となる 17
  19. 19. 7. 数学的表現  𝒌 個のランダムな独立変数 𝒚 𝒊 = 𝒊, ⋯ , 𝒌 を仮定する • 𝑦 𝑖 = ∆𝑖𝛿log 𝑒 𝑃 = log 𝑒 𝑃 𝑡 + 𝑖𝛿 𝑃 𝑡 + 𝑖 − 1 𝛿 • ここで、 𝑃 𝑡 はある銘柄の時間 𝑡 における価格、𝛿 は取引間の 小さな時間間隔 • 𝑦 𝑖 は同じ標準偏差𝜎 𝑖 = 𝜎′ を持つと仮定  𝒌 回の取引、 𝜏 = 𝑘𝛿 時間後の 𝑌 𝜏 を以下のように定義 • 𝑌 𝜏 = 𝑌 𝑘𝛿 = 𝑖=1 𝑖=𝑘 𝑦 𝑖 = log 𝑒 𝑃 𝑡 + 𝜏 𝑃 𝑡 = ∆ 𝜏log 𝑒 𝑃 𝑡  𝑌の標準偏差 • 𝝈 𝑌 𝜏 = 𝜀 𝑌2 − 𝜀 𝑌 2 = 𝑖=1 𝑖=𝑘 𝜎2 𝑖 = 𝑘𝜎′ = 𝜏 ∕ 𝛿𝜎′  中心極限定理により、𝑦 𝑖 の分布によらず 𝒌 が大きくなると 𝑌 𝜏 は正規分布に近づく 18
  20. 20. 観測データとの比較  後でRubyで確認 19
  21. 21. 収益率の分布の非正規性  Benoit Mandelbrot, The Variation of Certain Speculative Prices, Jounal of Business, 1963  Benoit Mandelbrot, The Variation of Other Speculative Prices, Jounal of Business, 1967  収益率の分布は、安定分布だが正規分布ではない  安定分布は 𝜶 というパラメータで分布の裾の広さが決まる • 小さいほど裾が広い(正規分布は𝜶 = 𝟐 ) • 𝜶 ≤ 𝟏 の場合、大数の法則に従わない • 𝜶 < 𝟐 の場合、中心極限定理は成り立たない  Mandelbrotは収益率は 1 < 𝜶 < 𝟐 の安定分布に従うと考えた 20
  22. 22. 安定分布のPDFとCDF 左: 安定分布の確率密度関数 https://commons.wikimedia.org/wiki/File:Levy_distributionPDF.png public domain by PAR 右: 安定分布の累積分布関数 https://commons.wikimedia.org/wiki/File:Levy_distributionCDF.png CC-BY-SA 3.0 by PAR 21
  23. 23. Rubyによるデータ解析 の現状 22
  24. 24. Why Ruby?  Pythonと同じ理由(『Pythonによるデータ分析入門』) • 「糊(グルー)」としてのRuby • C/C++/FORTRANなどで書かれたコードをつなぎ合わせる • 「2つの言語を利用する」ことの問題を解決する • アプリケーション開発とデータ解析で同じ言語を使う  多様性は善 23
  25. 25. ライブラリ・ツール群 分類 Python Ruby ベクトル・行列 NumPy NArray, NMatrix データフレーム pandas daru 可視化 matplotlib Nyaplot 対話環境 Jupyter/IPython Jupyter/IRuby 科学計算全般 SciPy SciRuby 24
  26. 26. NArray  多次元配列ライブラリ  連続したメモリ領域に要素を配置し、次元毎の要素数を固定するこ とでインデックスアクセスを行う • 4×3の多次元配列aのとき、a[i, j] は i + 4 * j 番目 • 次元順序は次期開発版で変更?  多次元配列同士の演算、多次元配列とスカラー値の演算が高速  最新リリースは2013年2月27日 • 別リポジトリで次期開発版が開発中 25 a[0, 0] a[1, 0] a[2, 0] a[3, 0] a[0, 1] a[1, 1] a[2, 1]
  27. 27. NMatrix  SciRubyプロジェクトの行列計算ライブラリ  NArrayより後発の競合ライブラリ • 同時に使えないという意味でも競合… • ドキュメントには require "nmatrix/nmatrix" で回避せ よとあるが、その後で require "narray" しているライブラリ があるとエラー…  最新リリースは2016年1月18日 26
  28. 28. daru  Data Analysis in RUby  以下のデータ型を提供 • Daru::Vector • Daru::DataFrame 27
  29. 29. Daru::Vector  1次元ベクトル 28 v1 = Daru::Vector.new([40, 20, 30]) v2 = Daru::Vector.new([10, 60, 30]) v1 + v2 #=> Vector[50, 80, 60] v1 * 10 #=> Vector[400, 200, 300] v1.mean #=> 30.0
  30. 30. Daru::DataFrame  2次元のスプレッドシート風データ構造  各列がDaru::Vectorによって表現される  列単位の処理は速いが、行単位の処理は遅い • とくに遅い例 • 高速化例 29 df = Daru::DataFrame.new(x: [1,2,3], y: [4,5,6]) df.filter_rows {|row| row[:x] > 1} df.where(df[:x].gt(1))
  31. 31. Nyaplot  プロットライブラリ  Jupyter notebook上で動作  WebGLを利用した3Dプロットも可能  散布図のプロット例 30 plot = Nyaplot::Plot.new sc = plot.add(:scatter, [0,1,2,3,4], [-1,2,-3,4,-5]) plot.show
  32. 32. Jupyter/IRuby  Jupyter • Webアプリケーションによる対話環境 • Mathematica風のノートブック • プログラムの対話的実行 • グラフの描画 • プログラミング言語非依存 • 各言語の実行環境をカーネルとして提供 • プロセス間通信  IRuby • Jupyter用のRubyカーネル 31
  33. 33. SciRuby  Ruby用の科学計算ライブラリの開発プロジェクト  NMatrix, daru, IRuby, NyaplotもSciRubyの一部  Statsample • 統計用ライブラリ  Distribution • 確率分布用ライブラリ 32
  34. 34. デモ  株価データの解析 • https://github.com/shugo/DCW2016/blob/master/Stock.ipynb  PSDSから取得したデータの解析 • https://github.com/shugo/DCW2016/blob/master/PSDS.ipynb • 相関行列 • 回帰分析 • マハラノビス距離による外れ値の検出  3Dプロットの例 • https://github.com/shugo/DCW2016/blob/master/PSDS.ipynb 33
  35. 35. 今後の課題 34
  36. 36. 利用促進  現状は利用者が少ない  今後の方策 • ドキュメントの充実 • 利用事例の発信 35
  37. 37. 機能追加・機能改善  Python/R等に比べ機能的に見劣りする • 欠損値のチェック・穴埋め • 時系列データの再サンプリング • 変化率の計算 • 金融関係の機能 • 経験累積分布 • Q-Qプロット • マハラノビス距離 • … 36
  38. 38. 性能改善  NMatrixは遅い  ベンチマークプログラム 37 m = NMatrix.dindgen([100000]) a = 0.0.step(99999.0, 1.0).to_a Benchmark.bmbm do |x| x.report("NMatrix") do m.mean end x.report("Array") do a.sum.quo(a.size) end end
  39. 39. ベンチマーク結果 38 x80 slower
  40. 40. 他言語との差別化  内部DSLの活用 • ブロックの効果的利用  Rubyの動的性質の活用 • スキーマレスなデータとの親和性 39
  41. 41. 内部DSLの活用提案  Daru::DataFrame#where • 現在の記法 • 拡張案 40 df.where(df[:x].gt(1)) df.where(df[:x].gt(1) & df[:y].lteg(10)) df.where { :x > 1 } df.where { (:x > 1) & (:y <= 10) }
  42. 42. Rubyの言語拡張案  ブロック内でのみRefinementsを有効にする • https://github.com/shugo/ruby/tree/eval_using 41 module FixnumDivExt refine Fixnum do def /(other) quo(other) end end end p 1 / 2 instance_eval(using: FixnumDivExt) do p 1 / 2 end p 1 / 2
  43. 43. 拡張の仕組み 42 df.where { (:x > 1) & (:y <= 10) } 抽象構文木 df.where(df[:x].gt(1) & df[:y].lteq(10)) Symbol#>などの置き換え 旧形式に変換
  44. 44. デモ2  Daru::DataFrame#whereの拡張 • https://github.com/shugo/DCW2016/blob/master/DaruRefinements.ipynb 43
  45. 45. References  ジェイムズ・オーウェン・ウェザーオール, ウォール街の物理学者, 早川書房, 2015  M. F. M. Osborne, Brownian Motion in the Stock Market, Operations Research, 1959  Benoit Mandelbrot, The Variation of Certain Speculative Prices, Jounal of Business, 1963  Benoit Mandelbrot, The Variation of Other Speculative Prices, Jounal of Business, 1967  平岡和幸・堀玄, プログラミングのための確率統計, オーム社, 2009  Wes McKinnery, Pythonによるデータ分析入門, オライリー・ジャ パン, 2013 44

×