Bokehではじめるデータビジュアライゼーション

YukiyoshiSato氏(以下、Sato):こんばんは、Satoと申します。よろしくお願いします。本日は「Bokeh」というデータビジュアライゼーションライブラリをご紹介したいと思います。

最初に簡単に自己紹介させていただきますと、私は今Liquidという仮想通貨取引所を運営しているQUOINE(コイン)という会社で、「データサイエンティスト」という肩書でやらせていただいております。一応、仮想通貨のマーケットとかトレーディングに関する分析なんかをやっております。

ただ、私はキャリアのスタートは金融系のSEをやっておりまして、そのあと証券会社に転職して、証券会社の中でもAIだなんだみたいな話が聞こえてきて、「私も勉強してみようかな」と思って、一昨年の冬からAIジョブカレというところで機械学習の勉強を始めて、去年の6月から今の仕事をやっております。まだまだ勉強中ですがよろしくお願いします。

Bokehとは?

さっそく本題に入りたいと思うんですけれども「Bokehとは?」ということで。

まず私がこの題を選んだ理由としては、日本語のブログとかQiitaの記事とか少ないなと思って、私もこれは外国人のデータサイエンティストの同僚から教えてもらって初めて知ったんですけれども、使ってみると「けっこうおもしろいな」と思ったので、今日ご紹介したいと思います。

Pythonで書けるインタラクティブビジュアライゼーションライブラリということで、Matplotlibとかだと1回静的なものが出力されるだけだと思うんですが、BokehはWebブラウザで動的にグリグリ動かせます。描画結果はJavaScriptとかHTMLで出てくるんですけれども、そういった知識は不要です。私もJavaScriptとかHTMLの知識はぜんぜんないです。

この絵なんですけれども、Pythonのビジュアライゼーションライブラリがいろいろ紹介されていて、私もこんなにたくさんあるってぜんぜん知らなかったんですけど、このへん(スライドの中段あたり)がMatplotlibです。seabornとかはこのへん(スライド中央)にいて。JavaScriptベースのやつがこのへん(スライド左側の上段)の青いやつで、Bokehはここ(スライド左側の上段)にいます。よく比較されるplotlyとかはこのへん(スライド左側の上段)にいますね。ほかにもd3jsとかがいろいろありますと。

これ(スライド)が何かと言うと、Matplotlibを初めて触ってみて、グラフを描画したら、なんかいい感じのグラフが出てちょっと気分が良くなります。seaborn見つけてさらにきれいなグラフが描けてもっと良い気分になるんですけど、だんだん飽きてきて、なんかつまんなくなってくるんですけど。plotlyが例で挙がってますが、インタラクティブビジュアライゼーションライブラリを使うとこう、テンションが上がってきて、最後には「plotly is incredible!」ということでめっちゃテンション上がる、みたいな感じになります。

私は今Bokehでまさにこういう状況になっていて、私の仕事の中でもこういうデータビジュアライゼーションとかよくやったりするんですけど、今までMatplotlibで出してたものをただ単にBokehに置き換えただけで、私の上司も外国人で寡黙な人なんですけど、急に「It's so cool!」みたいな感じになって(笑)。

(会場笑)

めっちゃテンション上がるみたいなことが起こったりしています。

ソースコードなんですけど、Matplotlibとほとんど変わりません。メソッドの名前がちょっと違うくらいで、Matplotlibを普通に使える方だったら、ぜんぜん誰でも使えるかなと思います。

それで、実行結果ですね。

デモで見るBokeh

今日はデモをお見せしたいと思います。機械学習Webアプリ、こういったものを作ってみましたということでご紹介します。

これがぜんぶBokehで作ったもので、このタブとかボタンとかテーブルとか、このセレクトボックスとかテキストインプットも、こういうのもぜんぶBokehに標準でくっついてるものになります。

カラムからおわかりのように、今日はKaggleのタイタニックのデータセットを使ってます。Read CSVってボタンを押すと、ただ単にpandas.read_csvをやってるだけなんですけれども、要はこのボタンの中にJavaScriptのコールバックを実装できるんですね。JavaScriptが得意な方であれば、個別に自分でJavaScriptを書いて実装する、みたいなこともできたりします。

分析の中身は適当ですが、とりあえずカテゴリー変数をちょっと変換しまして、あと欠損値がAgeとEmbarkedにあるので、これは適当に埋めます。28歳、中央値でとりあえず埋めて。Embarkedのほうはとりあえず0で埋めます。このへんの詳細はあまり気にしないでください。

さっそくデータビジュアライゼーションに入りますが、これが散布図ですね。Bokehの特徴なんですけど、ここ(図上)でドラッグして、グリグリ動かせます。あとここ(右上)にツールがあって、このツールはぜんぶデフォルトで提供されてるもので、ほかにもツールを追加したければくっつけることができます。

例えばこの密集しているところが見づらいんで、こうやって拡大したり、ホイールズームと言ってマウスで拡大したりとかすることもできます。今ちらちら見えてましたけど、こうやって(マウスをデータに合わせて)データの情報を見せるみたいなこともできたりします。

それで、こんな感じで拡大した状態でpngファイルで保存するみたいなこともできます。あとこれがリセットボタンですね。

あとこのレジェンド(凡例)もインタラクティブになっていまして、こうやってポチポチと消しながら、比較的女性が生き残って男性はけっこう死んじゃってるのかな?みたいなこともわかったりします。

で、下にいくとヒストグラムがあって、これさっき適当に補完したやつがピョーンっとなっちゃってますけど、こんな感じで表示ができて、binsとかもこうやってインタラクティブに動かしたりすることができます。

この下にボックスプロットがあるんですけど、ボックスプロットは実はBokehは標準でメソッドを提供していなくて、四角とか線とか散布図を個別に実装しています。

(会場笑)

一応Bokehのコミュニティの中にブライアンってやつがいて、そいつがだいたいなんでも質問に答えていて、ソースコード付きで全部答えてくれてるので。大抵のことはできるかなと思います(笑)。

参加者:なぜボックスプロットが提供されていないんですか?

Sato:私もあんまり事情を詳しく知らないですけど、昔古いパッケージにはあったらしいんですが、それが廃止になっちゃったみたいで……(笑)。

(会場笑)

大人の事情があったのかはわからないです。

(会場笑)

(登壇者注:どうやらBokehの中でボックスプロットやヒートマップなどの高レベルAPIと呼ばれる部分がリソース不足でサポートされなくなったようで、その代わりにHoloViewsにてBokehのextentionという形で高レベルAPIが利用できるようです)

モデルの学習と未知のデータの予測

続いてモデルの学習をしていきたいと思うんですが、今日はnameとticketとcabinは使いにくいので使いません。とりあえずチェックボックスのチェック外しちゃいますね。feature importanceがこんな感じで出て、下はlearning curveですね。縦がaccuracyで、横が訓練データの数です。上の青いところがトレーニングスコアで、下の緑のところがテストスコアになってます。こんな感じで「学習してますね」みたいなことがわかります。

なのでこれ見ながら、例えばfeature importanceで低めのやつを外してみたらどうなるかしら、みたいなことも、「そんなに変わんないですね」とわかります。

他にも、実際必要かどうかはわかりませんが、何かいろいろデータを試行錯誤するうえで、例えばSurvivedじゃなくて性別を予測しようみたいなこともできます。これでSurvivedを外すと、ちょっと悪くなりましたね。やっぱりXはだいたいお互いに独立な感じで用意されてるのかなというのが、こんな感じでわかります。

最後に未知のデータを予測します。とりあえず未知のデータを読み込んで、カテゴリー変数を変換して、Ageはさっきと同じように28で埋めて。あとこれ確かfareも欠損があったので、ヒストグラムで確認すると、このへんが1番多そうです。ヒストグラムのbarにleftとrightってあると思うんですけど、これが幅なので、適当にその間の7.5くらいで埋めときましょうかね。分析の中身は適当なので、マネしないでください。

(会場笑)

埋めたら予測します。最後にダウンロードみたいな感じでSubmission用のcsvまで吐き出すことができます。ここのDownload CSVのところは個別にJavaScriptで書いてあるんですけど、ほとんどBokehの標準の機能でできます。コールバックの中でいろんなものを実装できるので、例えばAPIを叩いてリアルタイムでデータを反映させるとか、あるいはクエリを書いてデータベースに問い合わせするとか、そういったことでいろいろ使えると思います。

なので、ぜひ皆さんにも使ってみていただいて、例えばデータ分析のダッシュボードを作ってみたとか、良い事例みたいなものがあったらSNSとかに投稿していただけると、たいへんうれしいです。私もぜひ一緒にお勉強させていただきたいと思います。私の発表は以上で終わりにしたいと思います。どうもありがとうございました。

(会場拍手)