Slide 1

Slide 1 text

第12回フクオカRuby ⼤賞 Charty - Visualizing your data in Ruby Red Data Tools @284km (Kazuma Furuhashi) Speee Inc.

Slide 2

Slide 2 text

Charty とは、 https://github.com/red-data-tools/charty

Slide 3

Slide 3 text

Charty は、Ruby ⽤データ可視化ライブラリ 少しのコードを書くだけで簡単にデータを可視化できることが特徴 ユーザは本来の⽬的であるデータ分析⾃体に時間を使いましょうという考えで作られまし た。 このような出⼒を簡単に⾏うことができます

Slide 4

Slide 4 text

Charty を開発した⽬的

Slide 5

Slide 5 text

想定ユーザー 「データ分析者かどうかにかかわらず、データを可視化したい全ての Rubyists」

Slide 6

Slide 6 text

Charty を開発した⽬的 ⼤きくは、Ruby でデータ分析の作業が⾏える状態を⽬指している R - もともと統計解析のために作られたプログラミング⾔語 Python - 機械学習に強い。データサイエンスの分野で広く使われている データサイエンスの領域で Ruby が⼗分に使える状態になるためには 必要な道具が揃うこと ユーザが増えること 開発者が増えること この 3 つを揃えて、良い循環を⽣み出して⾏く必要がある

Slide 7

Slide 7 text

必要な道具・ユーザ・開発者 1 つでも⽋けると難しい。全部そろうと希望がある

Slide 8

Slide 8 text

さて、データサイエンスの領域で Ruby が使えるようにしよ う (なぜ Ruby で?) 普段から使う機会が多く慣れた⾔語である Ruby でそのままデータ分析 ができたら嬉しい。 Ruby は ⼈(プログラマ) の幸せにフォーカス それを実現するためにはまず、データ分析作業に必要なツールが存在しなければならない データ分析に Ruby が使われることが普通になるためには、少なくないユーザ数も必要 その為にもまず、普通に使える機能を備えたツールが今必要 そこで Ruby の可視化ツールである Charty を作りました

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

Charty の 3 つのポリシー . Ruby ⽤のライブラリとして⾃然なつくりになっている事 . Rubyists が違和感なく使える事 . Python などで既にデータ可視化をしている⼈でもスムーズに使い始められる事 それぞれ、以下を実現するためのものです。 . は、Rubyists が Charty の開発に参加しやすくなるため => 開発者を増やす . は、多くのユーザーに使ってもらうため => ユーザーを増やす . は、使い分けのコストを最⼩限にすることで可視化の労⼒を減らすため => 必要な機能を持ち、今使える道具であること

Slide 11

Slide 11 text

必要な道具が揃うということ 課題 Ruby でデータ分析をしたいと考えた場合、定番と⾔える可視化ツールが存在しない 分析者各々が可視化のために多くの時間を要するという問題がある 可視化ツールは Ruby でデータ分析作業を⾏うには⾜りない機能 Charty の良い点 動くものをすぐに作り提供したこと 今後の拡張の余地を持たせて提供できたこと

Slide 12

Slide 12 text

優位性 データ分析をする時に Ruby に⾜りない機能を作ったため、Charty と同じ位置づけでは 他に⽐べる Ruby のツールがありません 似た取り組みとしては rubyplot (https://github.com/SciRuby/rubyplot) が存在します が、こちらは現時点で動かして使える状態には達しておらず、Charty が先に実際に使え る機能を提供するに⾄りました

Slide 13

Slide 13 text

2019 年の内にこれらを備えて使える状態で公開したことに まず意味がある 動くものをすぐに作り提供した ⾔語問わず良いライブラリは⾃由な組み合わせで使えるようにする

Slide 14

Slide 14 text

動くものをすぐに作り提供した 他⾔語でも優れたツールならば Ruby から使えるようにする Python や R に⽐べると、データ分析に使うツールが揃っていない現状 最初からそれらを上回る可視化ツールを作ることを選択していた場合、多くの時間を要す る (素晴らしい世界感かもしれないがまだ公開できていなかったかもしれない状況より良 い) まず今、Ruby で実際に使える可視化ツールが必要であった そのために Charty は、Ruby 以外の⾔語であっても優れたツールならば Ruby(Charty) か ら使えるようにするという態度で作られた

Slide 15

Slide 15 text

実現する仕組み・Charty の抽象レイヤ 他⾔語でも優れたツールならば使えるようにする Data Abstraction Layer Plotting Abstraction Layer

Slide 16

Slide 16 text

Data Abstraction Layer Data Abstraction Layer により、 Charty では統⼀的にさまざまなデータ構造を扱い、可視化 することができます。 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) rbbcc (https://github.com/udzura/rbbcc) 連携進⾏中!!

Slide 17

Slide 17 text

Plotting Abstraction Layer

Slide 18

Slide 18 text

Plotting Abstraction Laye Plotting Abstraction Layer により、 Charty のバックエンドライブラリとして、様々な⾔語の 優れた可視化ライブラリを使い、切り替えることもできます。 pyplot (https://github.com/matplotlib/matplotlib) Python gruff (https://github.com/topfunky/gruff) Ruby Rubyplot (https://github.com/SciRuby/rubyplot) Ruby google-charts (https://developers.google.com/chart) JavaScript(API) bokeh (https://github.com/bokeh/bokeh) Python plotly (https://github.com/plotly/plotly.js) JavaScript JFreeChart (https://github.com/jfree/jfreechart) Java (Support JRuby)

Slide 19

Slide 19 text

切り替えの簡単さ Pyplot backend charty = Charty::Plotter.new(:pyplot) scatter = charty.scatter do iris.group_by(:label).groups.each do |label, index| records = iris.row[*index] series records[:petal_length].to_a, records[:petal_width].to_a, label: label[0] end xlabel "Petal Length" ylabel "Petal Width" end scatter.render('pyplot.png')

Slide 20

Slide 20 text

切り替えの簡単さ Gruff backend example 書き換えるのは最初の⼀⾏だけ! charty = Charty::Plotter.new(:gruff) scatter = charty.scatter do iris.group_by(:label).groups.each do |label, index| records = iris.row[*index] series records[:petal_length].to_a, records[:petal_width].to_a, label: label[0] end xlabel "Petal Length" ylabel "Petal Width" end scatter.render('gruff.png')

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

⾔語問わず良いライブラリは⾃由な組み合わせで使えるよう にする 短期間で⼀般的な機能を提供したこと さまざまなデータ構造、バックエンドライブラリをサポートしており、ユーザが使いたい 組み合わせで、少しのコード記述量でそれを実現できる点が Charty の強み Ruby で同じことができるツールは他にありません 可能にしたのは 2 つの抽象レイヤを持つ仕組み 今後の拡張性・少しずつ追加開発/改善するやり⽅にも適する

Slide 23

Slide 23 text

社会的効果、インパクト Charty により可視化の道具がある状態になった 今後はより良くするという発想で開発をするための基準が出来た データ分析したい⼈、道具の開発に加わりたい⼈にとって敷居が下がり、以前より始めや すくなった

Slide 24

Slide 24 text

2019 年 Charty を国内外問わず認知してもらうための活動 Charty の開発者を増やすための活動 の成果

Slide 25

Slide 25 text

RubyKaigi 2019 福岡 (4⽉) 開発者を増やす活動が本格的に始まる RubyData Workshop - RubyKaigi 2019 RubyKaigi 2019 コード懇親会 - connpass RubyKaigi 2019 After Hack by Fukuoka.rb!! (#132) - connpass 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

Slide 26

Slide 26 text

名古屋Ruby会議04 (6⽉) 名古屋Ruby会議04 では発表後に開発に興味があると声をかけて頂き、R ⾔語のライブラリを Charty のバックエンドに加えることに興味を持つ⽅が加わりました。 名古屋Ruby会議04

Slide 27

Slide 27 text

RubyConf Taiwan 2019 (7⽉) RubyConf Taiwan 2019 After Hack Add examples for bokeh charts by execat · Pull Request #26 · red-data-tools/charty RubyConf Taiwan で、JRuby の作者である Charles ⽒ が声をかけてくれたことがきっかけと なり(https://twitter.com/headius/status/1155023767212417024)、Charty の JRuby 向け plugin である charty-backends-jfreechart (https://github.com/red-data-tools/charty- backends-jfreechart) がその後作られました。

Slide 28

Slide 28 text

RubyConfTH 2019 タイ (9⽉) 発表資料を⾒た 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) が公式のものとなりました。

Slide 29

Slide 29 text

フクオカRuby⼤賞 2019 福岡(2020/1) Fukuoka.rb #164 (https://fukuokarb.connpass.com/event/160099/) に参加 udzura さんと Charty のこと、rbbcc のことをお互いに話す 連携したらメリットがありそう!おもしろそう!ということで連携する⽅向で開始

Slide 30

Slide 30 text

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 が使われています。

Slide 31

Slide 31 text

benchmark-driver outputs as below by default. $ gem install $ benchmark-driver examples/parse.yaml Calculating ------------------------------------- csv 3.1.1 csv 3.0.1 unquoted 61.332 38.149 i/s - 100.000 times in 1.630461s 2.621311s quoted 30.558 17.023 i/s - 100.000 times in 3.272469s 5.874313s mixed 40.932 23.047 i/s - 100.000 times in 2.443082s 4.339030s include_col_sep 11.167 10.657 i/s - 100.000 times in 8.955275s 9.383878s include_row_sep 11.180 4.339 i/s - 100.000 times in 8.944608s 23.044523s encode_utf-8 39.129 31.525 i/s - 100.000 times in 2.555671s 3.172112s encode_sjis 49.982 31.289 i/s - 100.000 times in 2.000736s 3.196026s Comparison: unquoted csv 3.1.1: 61.3 i/s csv 3.0.1: 38.1 i/s - 1.61x slower quoted csv 3.1.1: 30.6 i/s csv 3.0.1: 17.0 i/s - 1.80x slower mixed csv 3.1.1: 40.9 i/s csv 3.0.1: 23.0 i/s - 1.78x slower include_col_sep csv 3.1.1: 11.2 i/s csv 3.0.1: 10.7 i/s - 1.05x slower include_row_sep csv 3.1.1: 11.2 i/s csv 3.0.1: 4.3 i/s - 2.58x slower encode_utf-8 csv 3.1.1: 39.1 i/s csv 3.0.1: 31.5 i/s - 1.24x slower encode_sjis csv 3.1.1: 50.0 i/s csv 3.0.1: 31.3 i/s - 1.60x slower

Slide 32

Slide 32 text

benchmark_driver-output-charty outputs as below. $ benchmark-driver examples/parse.yaml -o charty

Slide 33

Slide 33 text

$ benchmark-driver --output=charty --output-chart=box \ --rbenv '2.5.6;2.6.4' --repeat-count=4 examples/single.yml

Slide 34

Slide 34 text

おかげさまでこのように、Charty は開発者が少しずつ増えながら、開発と発表を繋げつつ継 続する流れができつつあります。

Slide 35

Slide 35 text

今後の展開 他⾔語で既にデータ分析作業を⾏っている⼈達が⼤きな違和感を感じずに Ruby でも引き 続き作業ができること インターフェイスの改善 GR framework (https://github.com/red-data-tools/GR.rb) のサポート サポートするデータ形式の充実 時系列データを簡単に扱えるようにする rbbcc のサポートから⼊り、インフラ⽅⾯で使われるための実装 より広く認知される 2019 年は開発者を増やすことに注⼒。2020 年はユーザーを増やすための開発も増 やします! Ruby で使われることの多い Rails と組み合わせて可視化を提供する charty-rails の ようなライブラリの開発

Slide 36

Slide 36 text

red-data-tools/charty (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