Speee DEVELOPER BLOG

Speee開発陣による技術情報発信ブログです。 メディア開発・運用、スマートフォンアプリ開発、Webマーケティング、アドテクなどで培った技術ノウハウを発信していきます!

RubyKaigi Takeout 2021 Day 3: Charty: Statistical data visualization in Ruby

開発部 R&D ユニットの村田 (mrkn) です。OSSの開発をしております。

RubyKaig Takeout 2021 が始まりましたね。みなさん楽しんでますか?

私は3日目の10:30から #rubykaigiB で、"Charty: Statistical data visualization in Ruby" というタイトルでデータ可視化ライブラリ Charty について喋ります。

Charty は、Red Data Tools プロジェクトで開発している可視化ライブラリです。このライブラリの特徴は次の2点に集約されます。

  1. テーブル形式のデータ構造を表す複数のデータ型を統一的に扱える
  2. 様々な可視化バックエンドライブラリに対応している

今回 RubyKaigi Takeout 2021 では、私が開発した Charty の統計的可視化 API について説明しています。統計的可視化 API は、入力されたテーブルデータに対して集計処理や統計処理などの前処理を自動的に行ない、前処理で得られた値を用いて図を作成してくれます。例えば、棒グラフでは自動的に平均値とその信頼区間が表示されます。現在、Charty の統計的可視化APIは、次の種類の可視化に対応しています。

  • 散布図
  • 折れ線グラフ
  • 棒グラフ
  • 箱ひげ図
  • ヒストグラム

RubyKaigi Takeout 2021 の発表では、これらすべての可視化手法について Charty でのやり方を説明しています。

Chartyの統計的可視化APIは、テーブル形式として捉えられる次のようなデータ構造を入力データとして扱えます。

  • Array の Hash
  • Array の Array
  • Daru::DataFrame
  • Pandas::DataFrame
  • Arrow::Table
  • 2次元の Numo::NArray
  • etc.

この中で Arrow::Table への対応は、一緒に Red Data Tools をやっている須藤さんが作ってくださいました。今日リリースした Charty 0.2.11 から対応しています。

可視化バックエンドとしては次の3種類をサポートしています。

  • matplotlib (pyplot)
  • plotly
  • unicode_plot (棒グラフと箱ひげ図のみ対応)

これらの入力データと可視化バックエンドのどのような組み合わせであっても、可視化の際に呼び出すメソッドの形式は変化しません。たとえば、箱ひげ図であれば、入力データ tableHashArray であっても、Pandas::DataFrame であっても、バックエンドがどれであっても、次のようなメソッド呼び出しで可視化できます。

Charty.box_plot(data: table, x: "species", y: "sepal_length")

Chartyの統計的可視化APIが現在対応しているバックエンドで上記のメソッドで箱ひげ図を描くと次のようになります。

f:id:mrkn:20210909183115p:plain
pyplot バックエンドによる可視化
f:id:mrkn:20210909182945p:plain
plotly バックエンドによる可視化
f:id:mrkn:20210909185027p:plain
unicode_plot バックエンドによる可視化

このように、可視化のための統計処理を自動で行ったり、データ構造や可視化バックエンドの違いを吸収するような可視化ライブラリは、Ruby用としては初めて登場したのではないかと思います。このような Charty に興味がありましたら、9月11日10:30からの私の発表をぜひご視聴ください。


ちなみに、Chartyは他に低レベル可視化APIも持っています。こちらは主に秒速さんが開発されました。低レベル可視化 API は、次に示す幅広い可視化バックエンドに対応していることが大きな特徴です。

  • matplotlib (pyplot)
  • gruff
  • rubyplot
  • google-charts
  • bokeh
  • plotly
  • chart.js
  • JFreeChart

低レベル可視化 API については RubyConf TH 2019 で秒速さんが発表された資料がありますので、そちらも参照してください → 資料