開発部 R&D ユニットで OSS を開発している村田です。GitHub のアカウントは @mrkn です。
半月ほど前に RubyKaigi Takeout 2021 で Charty について話をしました。その動画はこちらになります。
この記事では、この動画でも説明している Charty の特徴について文章で簡単にまとめ、さいごに動画で使用した Jupyter Notebook へのリンクを示します。
Charty の特徴
Ruby 用のデータ可視化ライブラリは既ににいくつか存在します。動画でも紹介したように、gnuplot を操作できるライブラリ、RMagick (ImageMagick のバインディング) をバックエンドとしている Gruff、daru のデータを Google Chart で可視化できる daru-view などがあります。
Charty はこれら既存のライブラリと異なる次のような特徴を持っています。
- 複数の可視化バックエンドを切り替えて使用できる
- 様々な構造の入力データを表データとして解釈できる
- 可視化バックエンドと入力データ構造の違いに依存せず、常に共通の API で図を作成できる
Charty は自ら図を描くのではなく、matplotlib や plotly などの可視化ライブラリを利用して図を作成します。これらの可視化ライブラリを目的に応じて切り替えることで、PNG 画像を出力したりウェブサイトに埋め込めるインタラクティブな図を作成したりできます。
Charty は表データに対して可視化を行います。Chartyが表データとして解釈できるデータ構造には次の種類があり、少し大変ですがアダプタを書くことで増やすこともできます。
- 同じ長さの配列データを値として持つ Hash
- データフレームオブジェクト (daru と pandas に対応)
- 2次元数値配列 (numo-narray、nmatrix、numpy に対応)
- 同じ長さの配列データを値として持つ Array
- red-datasets のデータセットオブジェクト
- red-arrow のテーブルデータ
ここで、配列データといわれているものは次のデータ構造です。
- Array
- 1次元数値配列
- データフレームの列オブジェクト
このような多様なデータ構造を共通の API で可視化できるのが Charty の大きな特徴です。
Charty の統計的可視化 API
今回の RubyKaigi で初めて紹介した Charty の機能が統計的可視化 API です。これは、Python 用の seaborn というライブラリの機能を参考に設計したもので、与えられた入力データと可視化のパラメータに基づいて、可視化のための統計的な前処理を Charty が自動的に行い、その結果を利用して図を作成します。
Charty が現時点で対応している統計的可視化機能は次の5種類です。
- 数値変数間の関係の可視化
- 散布図
- 折れ線グラフ
- カテゴリ変数と数値変数の関係の可視化
- 棒グラフ
- 箱ひげ図
- 数値変数の分布の可視化
- ヒストグラム
Charty の設計思想と存在意義
Charty は、Python、R、Julia で広く使われている可視化ライブラリの機能や設計に強く影響されています。このようなデータサイエンティストや研究者の仕事での使用に耐える既存ライブラリの良い点を Ruby に持ってくることで Ruby でデータ可視化をやりやすくすることを目指しています。
Ruby の弱点は、numpy や pandas のような標準的なデータ構造が存在しないことと、matplotlib のような標準的な可視化ライブラリが存在しないことだと思っています。そのため、複数の可視化バックエンドの切り替えや、多様なデータ構造への対応が必要だと考えました。また、Ruby は統計解析のためのライブラリも充実していないため、Charty が勝手にやってくれる統計的な前処理を自前でやろうとするとけっこう大変です。
このように、Charty はいまの Ruby の状況にうまくハマるように作れているんじゃないかと思っています。
まとめ
この記事では RubyKaigi Takeout 2021 での動画で説明した内容を簡単にふりかえりました。Charty が Rubyist のみなさんのお役に立てるように今後も開発を続けていきます。
動画で使用した Jupyter Notebook は次のリンクからアクセスできます。