Rubyによるデータ解析

Posted by Shugo Maeda on February 19, 2016 · 1 min read

DataCenter とソフトウェア開発ワークショップというイベントで、Rubyによるデータ解析について発表しました。

発表の背景

Pythonに対してこの分野でRubyが遅れを取っているということが最近よく言われていますが、まずは使ってみないと何がRubyに何が足りないのかわからないと思い、最近色々なツールを触ってみています。
スライドの24ページあたりにもあるように、主要なツールについてはRubyでも揃いつつあるのかなという印象で、実際Jupyter notebook上で色々触ってみて、結構Rubyだけでも色々できるなと感じました。

一方で、Python/R等に比べて、機能面、性能面、ドキュメント面など、まだまだ不足しているのも事実だと思います。
今回のデモ用に書いたコードも、細かいところで色々足りなくて自分で実装したりしました。
一つ一つは大したコード量ではなく、自分で実装するのも楽しいですが、プログラミング言語をたんなるツールとして考えると、他の言語に比べて劣っているのが現状だと思います。

ただ振り返ると、今でこそWebアプリケーション開発でRubyが広く使われるようになりましたが、私が業務でWebアプリケーション開発にRubyを使い始めた頃はもっとひどい状況で、ライブラリやフレームワークが足りないのはもちろんのこと、そもそもRuby自体が頻繁に落ちたりしていましたから、それに比べれば処理系が安定している分マシかもしれません。

また、もともとこういった対話的な処理はRubyの得意とするところで、Rubyの記述性の高さや動的性質を活かせれば、今後の発展も期待できるのではないかと思います。

題材

今回の発表では主に株価データを題材に、Rubyのデータ解析用ライブラリ・ツール群を紹介しました。

取り上げたのはモーリー・オズボーンの『株式市場のブラウン運動』という1959年の論文で、株価の対数収益率とブラウン運動の類似性を示し、デリバティブの価格決定に使用されるブラック–ショールズ方程式に理論的根拠を与えているものです。

この論文を取り上げようと思ったきっかけは『ウォール街の物理学者』という文庫本を読んだことなのですが、金融の分野に飛び込んだ物理学者・数学者の群像劇が描かれており、他にもマンデルブロの話(株価の変化の分布は正規分布ではなく、より分布の裾が広い安定分布であると主張)やソネット(高圧タンクの破裂を予測する理論を株価の暴落の予測に応用)の話などが面白かったです。

Ruby自体の進化

データ解析での利用を考えてRuby自体がどういう方向に進化すべきかを考えると、性能の向上という話ももちろんありますが、「糊(グルー)」としてのRubyに求められるのは性能にも増して記述性の高さではないかと思います。

例えば、Daru::DataFrameでは

のようにデータのフィルタリングを行いますが、

のようにすっきりと書きたいところです。

というわけで、Feature #12086を提案しました。これを使うと以下のようにブロックレベルでRefinementsを有効にできます。

また、発表スライドで紹介しているように、Daru::DataFrameの拡張案もPoCレベルで実装してみました。

性能が気になるところかと思いますが、ブロックを各要素毎に繰り返し呼ぶわけではなく、最初に:x > 10という条件を表す構文木を作って、それをもとにdf[:x].gt(10)と同じデータを作るので、このケースでの性能劣化はあまりないと思います。

Ruby自体の拡張の方はrefineされたメソッドがインラインキャッシュに乗らなくなるので、コードによっては性能に影響があります。
ただ、Refinementsを使っていないコードに影響がないので実際のアプリケーションではあまり性能に影響しないのではないかという気もします。
なぜなら、Refinementsを使っている人はあまりいないので。

まあ実際にこれを使うかどうかはおくとして、こういった内部DSLでロジックを書いておくと、単一マシンのメモリ上のデータを扱うだけでなく、将来的には同じ記法で分散環境上でクエリを実行できないかな、とか妄想したりします。

最後に

Pythonは金融工学の分野でも使われているようですが、今後はRubyでも使う人が出て来ると面白いと思います。
例えば、ソネットの論文を読んで株価の急落を予測できれば、プット・オプションで一儲けできるかもしれません。

儲かったらRubyに還元してください。というか、私に還元してください。

参考文献

  • ウォール街の物理学者 (ハヤカワ・ノンフィクション文庫)
  • プログラミングのための確率統計
  • Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理