Charty は Ruby 用データ可視化ライブラリです。少しのコードを書くだけで簡単にデータを可視化できることが特徴です。ユーザは本来の目的であるデータ分析自体に時間を使いましょうという考えで作られました。
(Charty 本体)
https://github.com/red-data-tools/charty
(Charty の JRuby 用 plugin)
https://github.com/red-data-tools/charty-backends-jfreechart
(benchmark-driver でのベンチマーク結果を Charty で可視化する plugin)
https://github.com/benchmark-driver/benchmark_driver-output-charty
大きな目的としては、Ruby でデータ分析の作業が行える状態になること。があります。
現状、Ruby でデータ分析をしたいと考えた場合、定番と言える可視化ツールが存在せず、分析者各々が可視化のために多くの時間を要するという問題があります。 可視化ツールは Ruby でデータ分析作業を行うには足りない機能と認識していたので、必要な機能を持つ Charty を作りました。 Charty は、分析者が可視化に要する時間を減らし、本来の目的であるデータ分析に時間を使うことを可能にするための機能を持ちます。
Charty の想定ユーザーは「データ分析者かどうかにかかわらず、データを可視化したい全ての Rubyists」です。
そして、Charty のポリシーは 3 つあります。
- Ruby 用のライブラリとして自然なつくりになっている事
- Rubyists が違和感なく使える事
- Python などでデータ可視化をしている人でもスムーズに使い始められる事
それぞれ、以下を実現するためのものです。
- は、Rubyists が Charty の開発に参加しやすくなるため
- は、多くのユーザーに使ってもらうため
- は、使い分けのコストを最小限にすることで可視化の労力を減らすため
普段から使う機会が多く慣れた言語である Ruby でそのままデータ分析ができたら嬉しいです。
それを実現するためにはまず、データ分析作業に必要なツールが存在しなければならないでしょう。
また、データ分析に Ruby が使われることが普通になるためには、少なくないユーザ数も必要になると考えます。その為にもまず、普通に使える機能を備えたツールが必要になるでしょう。
そこで Ruby の可視化ツールである Charty を作りました。
Charty は、データサイエンスの分野での現在の Ruby の位置づけを考えると必須であった、動くものをすぐに作り提供したこと、今後の拡張の余地を持たせて提供できたことが良い点です。
優位性に関しては、データ分析をする時に Ruby に足りない機能を作ったため、Charty と同じ位置づけでは他に比べる Ruby のツールがありません。 (似た取り組みとしては rubyplot(https://github.com/SciRuby/rubyplot) が存在しますが、こちらは現時点で動かして使える状態には達しておらず、Charty が先に実際に使える機能を提供するに至りました)
Ruby はたとえば他言語の Python や R に比べると、データ分析に使うツールが揃っていません。また、そのような現状で最初からそれらを上回る可視化ツールを作ることを選択していた場合、多くの時間を要しますから、動作し、実際に使うことのできる可視化ツールが現時点で存在することは無かったでしょう。それではいつまで経っても Ruby でデータ分析が出来ないままなので、まず今、Ruby で実際に使える可視化ツールが必要でした。そのために Charty は、Ruby 以外の言語であっても優れたツールならば Ruby(Charty) から使えるようにするという態度で作られました。
他言語でも優れたツールならば使えるようにするために、Charty は 2 つの抽象レイヤを持ちます。 Data Abstraction Layer と、 Plotting Abstraction Layer です。 Data Abstraction Layer により、 Charty では統一的にさまざまなデータ構造を扱い、可視化することができます。 2019/12/10 時点では以下のデータ構造をサポートしています。
- Daru (https://github.com/SciRuby/daru)
- numo/narray (https://github.com/ruby-numo/numo-narray)
- nmatrix (https://github.com/SciRuby/nmatrix)
- ActiveRecord (https://github.com/rails/rails/tree/master/activerecord)
- Array
- Hash
- Red Datasets (https://github.com/red-data-tools/red-datasets/)
- benchmark_driver(plugin) (https://github.com/benchmark-driver/benchmark-driver)
Plotting Abstraction Layer により、 Charty のバックエンドライブラリとして、様々な言語の優れた可視化ライブラリを使い、切り替えることもできます。2019/12/10 時点では以下のライブラリをバックエンドとしてサポートしています。
- pyplot (https://github.com/matplotlib/matplotlib)
- gruff (https://github.com/topfunky/gruff)
- Rubyplot (https://github.com/SciRuby/rubyplot)
- google-charts (https://developers.google.com/chart)
- bokeh (https://github.com/bokeh/bokeh)
- plotly (https://github.com/plotly/plotly.js)
- JFreeChart (https://github.com/jfree/jfreechart)
このように Charty は、言語を問わず良いライブラリは自由な組み合わせで使えるようにすることで、短期間で一般的な機能を提供するところまで開発を進めることができました。
Ruby の可視化ツールが用意できたとなると、この先重要になるのは、他の言語でデータ分析作業を既にしている方が Ruby に移行した場合に、受け入れやすく使いやすいインターフェイスを Charty が備えていることや、他言語の可視化ツールと比べた時に劣らない機能を示せることだと思います。具体的には Python の seaborn(https://github.com/mwaskom/seaborn) や、Plotly を意識していますが、最初から一気にそこまで実装することは現実的ではありませんでした。そのため、後にそのような拡張の余地を持たせつつ最初の基本機能を提供するためにも、上述した抽象レイヤが役立っています。拡張は今後行う予定の作業です。
Ruby で同じことが出来るツールが他にありません。
具体的な内容は "1)優位性、セールスポイントについて、具体的に記載してください。" の欄に記載したように、さまざまなデータ構造、バックエンドライブラリをサポートしており、ユーザが使いたい組み合わせで、少しのコード記述量でそれを実現できる点が Charty の強みであり、 Ruby で同じことができるツールは他にありません。
これまで Ruby に足りていなかった可視化ツールが既にある状態になったことで、今後はより良くするという発想で開発をするための基準が出来ました。
道具が無いところに参入したいと思う人は少ないかもしれませんが、Charty により道具がある状態になったので、データ分析したい人にとっても、道具の開発に加わりたい人にとっても敷居が下がり、以前より始めやすくなっています。
現在、どこで Charty が使われているかは "5.ソフトウェア、取組等の実績について (具体的な実績、市場等からの評価があれば記載してください。)" に記載します。
また、より社会的効果・インパクトを高めるために、2019 年には "7.添付資料について(添付資料は返却しません。) (概要説明図やこれまでの発表資料、新聞・雑誌の記事等)" に記載した発表を通じて Charty を国内外問わず認知してもらうための活動、Charty の開発者を増やすための活動を行いました。その成果を以下に記載します。
開発者を増やすことを目的に、 RubyKaigi での発表後に Charty に興味のある方を集めてすぐに Hack space に移動して一緒にコードを書き始めたり、 RubyKaigi のコード懇親会や、After Hack イベントで Charty に興味を持った方を集めてコードを書くということをしました。
- RubyData Workshop - RubyKaigi 2019
- RubyKaigi 2019 コード懇親会 - connpass
- RubyKaigi 2019 After Hack by Fukuoka.rb!! (#132) - connpass
その結果、開発に参加した内 5 人の方が Pull Request を作るところまでの成果が得られました。
- Unstrict dependency version for bundler by tomog105 · Pull Request #4 · red-data-tools/charty
- Adds MacOS installation to README by Chinats · Pull Request #5 · red-data-tools/charty
- Fix typo in examples/daru.rb by kantarow · Pull Request #6 · red-data-tools/charty
- add an instruction for Ubuntu + pyenv by hasumikin · Pull Request #8 · red-data-tools/charty
- Add label option to series at README by yaboojp · Pull Request #9 · red-data-tools/charty
名古屋Ruby会議04 では発表後に開発に興味があると声をかけて頂き、R 言語のライブラリを Charty のバックエンドに加えることに興味を持つ方が加わりました。
RubyConf Taiwan 2019 の After Hack イベントでは、海外でも開発者を増やすアプローチはうまく行くのだろうか。という挑戦でもありましたが、ありがたいことに Charty に興味があると声をかけてくれた方が現れ、協力してくれました。以下が Pull Request です。
また、RubyConf Taiwan で、JRuby の作者である Charles 氏(https://github.com/headius) が声をかけてくれたことがきっかけとなり(https://twitter.com/headius/status/1155023767212417024)、Charty の JRuby 向け plugin である charty-backends-jfreechart (https://github.com/red-data-tools/charty-backends-jfreechart) がその後作られました。
RubyConfTH では After Hack のようなイベントはありませんでしたが、発表資料を見てくれた Ruby コミッタであり Ruby のベンチマークツール benchmark-driver(https://github.com/benchmark-driver/benchmark-driver) の作者である Kokubun 氏(https://github.com/k0kubun) との会話が生まれ、benchmark-driver の可視化 plugin である benchmark_driver-output-charty(https://github.com/benchmark-driver/benchmark_driver-output-charty) が公式のものとなりました。
Charty は現在、以下の用途で使われていることが確認できています。
- benchmark_driver-output-charty (https://github.com/benchmark-driver/benchmark_driver-output-charty)
- benchmark_driver は Ruby のベンチマークツールです。benchmark_driver-output-charty により、測定結果を可視化します。
- rubydown (https://github.com/RubyData/rubydown)
- 集計、分析結果を Markdown 形式で扱うことができる Ruby のツールです。Charty による可視化をサポートしています。
- 所属企業である Speee のあるサービスでは本番環境で Charty が使われています。
- このようなイメージで可視化に用いられています (https://speakerdeck.com/284km/rubyasosiesiyonkai-fa-zhu-cheng-cheng-guo-bao-gao-hui?slide=42)
他言語で既にデータ分析作業を行っている人達が大きな違和感を感じずに Ruby でも引き続き作業ができることを重要視しており、その為に必要なインターフェイスの改善を現在行っています。インターフェイスが固まった時点で、バージョン 1.0 としてリリースを予定しています。
サポートするデータ形式を充実させる予定があります。たとえば、時系列データを簡単に扱えるようにするなどです。
より広く認知してもらい、使われる状態にすることも引き続き考えています。やはり Ruby で使われることの多い Rails と組み合わせて可視化を提供する charty-rails のようなライブラリの開発を、現時点では案として考えています。順次着手する予定です。
これらは 2019 年に行った Charty に関する発表資料です。
(OS、ソフトウェア、ハードウェア構成等について記載してください。)
Linux, macOS, Windows 環境をサポートしています。