データサイエンスはここ数年で突如現れ世間の注目を集めている,最も人気があり利益を上げている技術分野である.しかし,この技術分野で用いられている2大プログラミング言語はRとPythonであり,Rubyは後塵を拝している.
この原因は,Rubyの機械学習や数値計算・可視化のライブラリが,これらの言語に比べて未熟かつライブラリ間での連携が難しいという点にある.それに加え,インストール時のHow-Toや各ライブラリの詳細なドキュメント,「使ってみた」系のブログ記事などがあまり出回っていないという現状があり,Rubyでデータサイエンスを行うことのハードルを押し上げている.
我々は「データ入力から解析,そして可視化までのワークフローのブラッシュアップ」を実現することにより前述の課題解決を狙っている.具体的にはRubyのライブラリを組み合わせ,どのようにデータの入力・解析・可視化を行えばよいかを示したマニュアルの作成を行う.またこれに伴い,不足機能の追加・不足ライブラリの作成・既存ライブラリのバグフィックスも適宜行いライブラリ間の連携もより簡単なものにする.これらが我々のプロジェクトの主たる目標である (Figure1). また大前提の環境構築が入門者にとっての鬼門となっている現状から,Windows・Macで各種ライブラリをインストールするためのgem改善・マニュアル作成も行う.
Rubyの科学技術計算系のライブラリ(SciRuby)は,総じて他の言語のそれに比べて未熟であるとはいえ,データフレームとその可視化・基礎的な統計解析のライブラリに限って言えば,実用可能なレベルには達している.本プロジェクト成功の暁には,これらのライブラリの使用方法を広め・データサイエンスにおけるRuby人口を増やし・開発へのフィードバックが増加する,といった好循環が期待できる.
本プロジェクトにおいて,具体的に行うのは,オライリー社書籍「Foundations for Analytics with Python」の第7節までの内容を,Rubyで実行することである.すなわち,
- csvやexcel,データベースなどから,Rubyにデータを読み込む
- Ruby上で、データの整形を行う
- データからグラフを作成する
- データに対して基礎的な統計処理を試みる
という一連の流れを始めから終わりまで,Rubyで行うということである. これを実現するにあたって使用するRubyのライブラリは,以下の4つである.
- IRuby
- Github: https://github.com/SciRuby/iruby
- Jupyter notebookのRuby用カーネル
- daru
- Github: https://github.com/v0dro/daru
- データ操作ライブラリ
- rbplotly
- Github: https://github.com/ash1day/rbplotly
- グラフライブラリ
- statsample
- Github: https://github.com/clbustos/statsample
- 統計処理ライブラリ
以下の役割分担は便宜上のものであり,必要に応じて課題の振り直しや共通の課題に対して協力することはありうる。
- ワークフローの整備・構築
- 統計解析ライブラリStatsampleの機能検証
- Ruby用Jupyter Notebook環境のWindows, Macサポート
- グラフライブラリ rbplotlyの開発
- データ操作ライブラリdaruとrbplotlyの連携機能の開発
- ワークフローを記述したJupyter Notebook (オライリー社書籍「Foundations for Analytics with Python」を模した物)
- rbplotlyの改善版
- daruとrbplotlyの連携機能
- ワークフローに関わるgemのドキュメントや改善物,インストール方法の改善
本プロジェクトは根本的に「無い」gemを作るものではなく,基本的には「ある」gemを整備,統合して「ワークフロー」として構築するものである.そのため新たなgemの創出といったような華々しさはなく(rbplotlyはこの限りではない),地味な作業(バグ取り,細かな機能追加,パッケージング,ワークフロー構築のための連携配慮,実例志向のドキュメント)がほとんどである.しかしこの地味な作業の徹底がSciRubyのgem群には不足しており,またデータサイエンス分野でのRuby活用の普及に最も重要である.
我々は村田賢太氏が本助成プロジェクトの別提案として pycall.gem, matplotlib.gem の開発を掲げていることを把握している.これらは競合するものではなく,相乗効果が期待できるものである.
表形式のデータを読み込み,必要な部分を抽出するためのデータフレームと呼ばれる概念とそのイディオムがPythonやRといったプログラミング言語のコミュニティでは広く知れ渡っている.Rubyにおいてもデータフレームを実装したものがdaruである. しかし、daruはPythonのデータフレーム実装パッケージpandasと比較することまだ未熟な点がある (https://github.com/sciruby-jp/survey) .
ワークフローの実行はJupyter Notebookと呼ばれるソフトウェアを用い,ウェブブラウザ上でインタラクティブに実行することがPythonでは一般化している.Jupyter Notebookは文芸的プログラミング環境の一つと捉えることが可能であり,ワークフローの情報共有,再現性,改変性に大きく貢献しているだけでなく,計算結果の可視化もNotebook内にパックすることが可能である. Jupyter Notebook はカーネルと呼ばれるプログラミング言語実行部が任意の言語に置き換え可能となっており,RubyにおいてもIRubyと呼ばれるカーネルが存在する.しかしながら,RubyにおいてはPythonほどJupyter Notebookの活用が進んでいない.特にWindowsサポートの未整備が大きく起因している.
初等統計解析ワークフローに必要な統計解析機能は statsample (https://github.com/sciruby/statsample) に実装されているものの,ここでもIRuby同様インストールの困難さが入門者の利用を阻んでおり,またドッグフーディングも不足している.pycall.gemによりPythonの統計解析パッケージstatmodelsの利用が期待できる.statsampleの機能の妥当性検査はstatmodelsと計算結果の比較により容易に実現可能となる.statmodelsがあればstatsampleが不要になるわけではない. Rubyの資産を破棄するのではなく,改善するための「補完」用途にstatmodelsを活用する.
nyaplotは西田直樹氏が開発したデータ可視化用gemである.nyaplotにおいてRubyが行っていることは少なく,実質可視化を担当しているのはJavaScriptで書かれたnyaplotjsである.そのためnyaplotのメンテナンスにはRubyよりもJSの力が要求される問題がある.
rbplotly (https://github.com/ash1day/rbplotly) はplotly.py (https://github.com/plotly/plotly.py) のRuby版として芦田が作成したgemであり,このプロジェクトのワークフローの可視化部でnyaplotに代わるものとして我々が普及を図るものである. plotly.js はオープンソースのチャート生成ライブラリであり,https://plot.ly/ は plotly.jsをホストし付加価値を付けたウェブサービスである.そのサービスは科学技術系出版ウェブサービスとも連携し活用されている (https://www.overleaf.com/blog/201-reproducible-and-collaborative-data-science-overleaf-links-with-plotly) .plotly.jsは活発に開発されており,rbplotlyではnyaplotのようにJS部を自前開発することによる負担がない.またplotly.jsは我々のワークフローに必要十分な機能を備えている. RubyGems.orgにplotly用のgemはあるものの,plotlyのAPIではなくローカルのplotly.jsをオフラインモードで利用可能としたのは芦田のrbplotlyのみである.チャートの質の点からもnyaplotの代替としてrbplotlyの開発を進めることには意義がある. matplotlib.gemは可視化機能を持つがmatplotlibは静的イメージを生成するものであり,芦田が開発するrbplotlyはインタラクティブなイメージを生成するものである.
daruのデータフレームはデータ操作部だけでなく統計解析部でも入出力のクラスとして利用される.しかし可視化部のrbplotlyはまだデータフレームとの連携ができるようにはなっていない.daruにはプロット用バックエンドを変更するための仕組みが用意されており (https://github.com/v0dro/daru/tree/master/lib/daru/plotting),この仕組みを活用することでより円滑なワークフローの実行が可能となる. daruのデータフレームクラスのplotメソッド実行時にrbplotlyを活用することを実現したものとして,三軒家が作成した https://github.com/genya0407/daru_plotting_plotly があり,これを基に我々はDaruのプロット部の拡張を行う.