ガジェット通信 GetNews

見たことのないものを見に行こう

Rubyでデータサイエンスができるのか?ワークショップ「DataScience.rb」に参加した

DATE:
  • ガジェット通信 GetNewsを≫

なぜRubyでデータサイエンスは行われないのか?

最初に登壇したのは、Rubyのコミッターであり、Speeeのエンジニアでもある村田賢太さん。「Rubyでデータサイエンスやろう!」と言い出した張本人です。

株式会社Speee 村田賢太さん
CRubyコミッタ。bigdecimalメンテナ。pycall開発者。

なぜRubyでデータサイエンスは行われないのか。

それはRubyが言語として劣っているからというわけではありません。村田さんが指摘したのは、ツールやユーザー、開発者が足りないこと。

Pythonでやりたいことができるなか、わざわざRubyでのデータサイエンスを目指す取り組みに投資する企業も少ないという原因もありそうです。

Rubyでデータサイエンスをするためにはどんな手段が存在するか

Rubyでデータサイエンスするために、村田さんが考える主な手段は3つ。「巨人の肩に乗る、つまりPythonに乗っかること」「既存のgemをなんとかすること」「Rubyのための仕組みをつくっていくこと」。

このワークショップでは、この手段それぞれに対する試みについてのプレゼンテーションとデモが行われました。

会場となった『Speee Lounge』。淹れたての美味しいコーヒーをいただきました。

Rubyライブラリ「PyCall」を使ってデータサイエンス!

イントロダクションからの続投で、村田さんによるプレゼンテーション。村田さんの取り組みは「巨人の肩に乗る、つまりPythonに乗っかること」。

簡単に言えば、「Pythonで使う機能をRubyから使っちゃおう!」というものです。

村田さんが今も絶賛開発している「PyCall」は、Rubyからlibpython.soを使うための拡張ライブラリ、つまり、Rubyの文法でPythonの機械学習で使う機能が使えるようにしたgemです。

ワークショップでは、現在開発中のもののデモを行いました。

PyCallはデータサイエンスでよく使用される「Jupyter Notebook」上でも動作します。Jupyter Notebookはブラウザ上で使える、Rubyでいうとirbのようなものです。

irbとの違いは、実行結果の出力において、画像オブジェクトは画像として表示できたり、データを表やグラフとして表示することができたりする点です。多くのデータサイエンティストはこのアプリケーションを使ってデータ解析をしています。

PyCallを使えば、例えば、機械学習でよく使われる、行列のような複雑な計算を効率よくできるPythonライブラリ「NumPy」もRubyから使えるようになります。

また、データ操作のためのPythonライブラリ「pandas」もRubyから。

もちろん、機械学習用のライブラリscikit-learnも使うことができます。

デモでは、これらのPythonライブラリをRubyから使い、タイタニック号の乗客データを用いた乗客の生存予測を行いました。

どの要素がどのくらい生死に寄与しているかをseaborn の barplot を使ってグラフ化している。

PyCallおよび今回のデモプログラムは、GitHubから落として自分の環境で試すことができます。
今回使われたデモはこちらのexamples/datasicence_rb_20170519.ipynbです。
村田さんのプレゼンテーション資料はこちらから。

PyCallは、ラッパー未実装による不自然な記法が残っていたりと、まだ実現したいことすべてを実装できているわけではないのだそう。

そのあたりは村田さんによると「9月に行われるRubyKaigiまでには使えるようにする」「今年中には深層学習まで行えるようにしたい」そうです。楽しみですね!

現在のPyCallの位置づけとしては、PythonでできるものならPythonを使ったほうがよいけれど、Rubyのプロジェクト上でデータ分析処理をしたい場合は選択肢になりうるはずとのこと。

また、CPythonよりCRubyの方が速いので、ツールが揃ってくれば、将来的にはRubyでデータサイエンスした方が速くなるかもという期待もあります。

Rubyの既存のgemはデータサイエンスに耐えうるか?

続いては、「既存のgemをどうにかする」ことを目標にしたプロジェクトを進めていた、西田孝三さんと三軒家佑將さんによるプレゼンテーションです。

左:西田孝三さん Ruby Association Grant 2016、PyData Osakaオーガナイザー / 右:三軒家佑將さん Ruby Association Grant 2016

このプロジェクトは、Ruby Association開発助成により進められたものなのだそう。

データサイエンスを3つのステージに分割すると、「前処理」「分析」「可視化」の3ステージに分けることができます。

Pythonでは、前処理をpandasが、分析をscikit-learnやSciPy、StatsModelsが、可視化をMatplotlibが担っています。

これをRubyで代替すると、前処理をdaruが、分析をStatsampleが、可視化はrbplotlyが担うということになりそうですが、書き出してみてもPythonに比べるとツールの少なさが際立ちます。

このプロジェクトでは、既存のgemを使ったワークフローのテストやドキュメントの作成、それに伴うリファクタリングや改善を行う予定でした。

しかし、西田さんと三軒家さんによると、daruがpandasに比べて思った以上に機能が足りておらず、サンプルデータの簡単な分析程度はできるものの、さまざまなケースの前処理を想定した実用は少し難しいかもしれないとのこと。

赤ワインと白ワインどちらのほうが美味しいかを既存のデータセットを用いて分析。Rubyでも、基本的なデータの前処理から仮説検定までならできるということが分かりました。

車輪の再発明に苦しむよりも、「Pythonで提供されてるものがRubyからも使えるなら、それでいいじゃん」というPyCallのような解決法の方が、旨みが大きいのかもしれません。Pure-Rubyなアプローチを試みるなら、カスタマイズ性に富んでおり、記述が簡単であるというRubyの強みを生かしたり、Ruby on Railsとの連携の方を第一目標に据えるべきです。
当日使われたデモはこちらから。
プレゼンテーションスライドはこちらから。

RubyもApache Arrowでデータ処理言語の仲間入り!

「Rubyのための仕組みをつくっていく」という方向のアプローチを行ったのは、須藤功平さん。

須藤さんは、カラム型のインメモリデータベースを扱うための共通フォーマットプロジェクト「Apache Arrow」の公式リポジトリーでRubyサポート関連部分を開発しています。

Apache Arrowは、pandasやHadoopなどのデータ分析システムがそれぞれ独自フォーマットを持つのではなく、共通化することで、各システム間でデータ交換しやすくすることを目的としています。

このプロジェクトをRubyに対応させることで、PythonやRで処理したデータも簡単にRuby上で読み込みや書き込みができるようになりました。

Pythonでデータを生成し、Arrow形式で保存。

先程Pythonで生成したArrow形式のデータをRubyで読み込み。

Rubyでデータ処理まで行いたい場合は、全文検索エンジン「Groonga」などの既存のC言語のライブラリを使うと処理も高速でよいのだそう。

Apache Arrowが普及すると、Rubyでももっと気軽に大量のデータを扱ったり、分析したりすることができるようになりそうです。
当日の発表スライドはこちら
発表内容を解説した記事はこちら

Rubyでデータサイエンスができるのか?

Rubyはさまざまな用途に対応できる言語でありながら、Webアプリケーションがより便利に開発できることに注力していたために、データ処理系の環境整備が遅れてしまい、昨今のデータサイエンスの流行に乗り遅れてしまいました。

しかし、今回発表してくださったような取り組みにより、急速に改善されているように感じました。

Rubyでも、趣味に留まらず、仕事でデータサイエンスができるようになる日も近いかもしれません。

村田さん、西田さん、三軒家さん、須藤さん、発表ありがとうございました!

左から、西田さん、三軒家さん、池澤、村田さん、須藤さん。

(撮影:刑部友康)

カテゴリー : デジタル・IT タグ :
CodeIQ MAGAZINEの記事一覧をみる ▶
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。