見出し画像

カスタマーサクセス向けデータアプリをStreamlit in Snowflakeで構築した話

こんにちは。
kubell(旧Chatwork)のプロダクトマネジメント部でデータアナリストをしているタダケン(@tadaken3)です。

弊社プロダクトの「Chatwork」を中心に、PM(プロダクトマネージャー)の皆さんと一緒に、日々、データ分析をしたり、PMの皆さんが分析しやすい環境を整えるデータマネジメント業務をおこなっています。

PM以外にも、いろいろな方と協業しながら、データの利活用を進めています。

今回は

  • カスタマーサクセス向けに、Streamlit in Snowflakeで、データアプリを構築した話

を紹介させていただきます。

カスタマーサクセス、プロダクトデータアナリスト、データエンジニアがそれぞれ、垣根を越えて、お互いに協力しあって、達成できたプロジェクトです。

技術的な内容も含まれますが、ぜひお付き合いくださいな。

こちらは

12月23日の記事です。

データアプリの構築の背景

弊社では、お客様の「Chatwork」利用状況データをまとめた「活用レポート」を作成しています。このレポートを元に、カスタマーサクセスが、お客様に合った活用方法の支援を行っています。

ただ、活用レポートの運用には課題がありました。

BIツールからCSVでデータを出力し、それをスプレッドシートで加工してPDFに変換するというプロセスで運用されており、レポート作成にかなりの工数がかかっていたのです。

これが活用レポートのデータアプリ化を進めようと思ったのが背景です。

画像
活用レポート(旧)

Streamlit in Snowflakeとは

Streamlitとは?

Streamlitは、Pythonで書かれたコードを簡単にウェブアプリケーションとして公開できるオープンソースのフレームワークです。データアナリストや機械学習エンジニアが、複雑なウェブ開発の知識がなくても、シンプルなPythonコードを書くことで、データの可視化や機械学習モデルのデモをインタラクティブなデータアプリとして迅速に作成・提供できます。

ただ、実際にStreamlitで、データアプリを提供しようとすると

  • Streamlitを動かすサーバーを構築して運用する

  • 上記のサーバーとデータベースをセキュアに接続して、データを取得する

などの運用業務などが発生します。

Streamlit in Snowflakeとは?

Streamlit in Snowflake(略称、SiS)は、Snowflakeが提供するデータウェアハウス環境内で、Streamlitを直接利用できる機能で、以下の特徴があります。ちなみに、Snowflakeとは、データクラウドの1つで、弊社のメイン分析基盤です。

  • 統合された開発環境:データの取得から分析、可視化、アプリケーションのデプロイまでを、すべてSnowflake内で完結できます。

  • セキュリティとパフォーマンスの向上:データがSnowflake内に留まるため、データ転送の必要がなくなり、セキュリティリスクを低減します。また、Snowflakeのロールを利用して権限の管理ができるので、追加の認証認可の仕組みを構築する必要はありません。

  • 迅速なダッシュボード作成:Pythonを用いて、インタラクティブなダッシュボードやデータアプリケーションを素早く構築できます。

つまり、Snowflake上でフルマネージドで、Streamlitを活用することができるのです。

Lookerや他のBIツールも選択肢にあったのですが、活用レポートのデータアプリ化にあたっては、SiSを採用しました。

Streamlit in Snowflakeを採用するメリット

1つめのメリットとして、BIなどのライセンス費用が不要である点です。

SiSは、データウェアハウスの起動時間に対して料金が発生する仕組みになっています。

カスタマーサクセス全員分のBIのライセンスを発行しようとすると、結構いいお値段になってきてしまいます。その点、SiSであれば、データウェアハウスの起動時間に対して、チャージですので、比較的リーズナブルにデータアプリを提供することができます。(ただしセッションが続いている限り一定時間ウェアハウスがアイドル状態で起動し続けるので注意が必要です。)

2つめのメリットは高い柔軟性です。

BIツールだとどうしても、ツールの制約を受けてしまうのですが、Pythonでコーディングできるので、かなり自由にUIを作ることができます。

例えば、以下のような主要な可視化ライブラリはバッチリ、サポートされています。

  • Matplotlib

  • Altair

  • Vega-Light

  • Plotly

活用レポートの場合、お客様の目にも触れるので、どこまで柔軟にできるかが、懸念だったのですが、モックを作ってみて、懸念がすぐに解消されました。

ちなみにモックからアルファ版、リリース版までで大幅なレイアウト変更を3回を実施したのですが、難なく実装できました。とても柔軟です。

また、Anacondaが標準でサポートされているので、データアプリ内で機械学習をしたり、ネットワーク図を可視化したりすることも可能です。


3つめのメリットは、データガバナンスがシステマチックに制御できる点です。

弊社では、情報資産をいくつかのレベルに分けて管理しています。

例えば、お客様の氏名やメールアドレスなどの個人情報は、一部のユーザーしか閲覧できないように暗号化し、Snowflake上で管理しています。

だいぶ簡略化していますが、以下のようなロール設計です。

  • basicロール:個人情報が見れない

  • privateロール:個人情報が見れる

privateロールは限られたユーザーにのみ付与しています。

しかし、活用レポートでは一部個人情報を取り扱う必要があります。ただ、活用レポートのためだけに、privateロールなどの強い権限をカスタマーサクセスに発行してしまうとそれはそれで、情報資産の管理上問題が出てきます。

でもご安心ください!

SiSではアプリの所有者の権限でSnowflakeにクエリを実行できます。つまり、活用レポートのアプリを通じてのみ個人情報にアクセスでき、それ以外ではアクセスできないように制御可能です。

画像
個人情報へのアクセスをstreamlitに限定

この点もSiSがよく考えられていると感じます。

全体の設計

SiSでPythonやSQLを扱えると言ってもすべての集計ロジックをアプリ側で持ってしまうと冗長になってしまいます。

そこで、基本方針としては、

  • dbtで活用レポート用のmodelを分析基盤に作成

  • それらをSiS上から参照し、SiSではあくまでのグラフの生成や表の整形などをメインで行う

という形で設計しています。

画像
設計時のドキュメント

データ定義のロジックを分析基盤側に寄せることで、他のアプリからデータを参照することになったとしても、同じ定義でデータが見れる状態を作っています。

もともとのレポートは旧分析基盤からデータを参照していたのですが、そのSQLも全面的に見直しをしています。データ定義の統一、メンテナンス性向上のためのリファクタリングも同時に実施しました。

Streamlit in Snowflakeの開発環境

SiSの開発はSnowflakeのブラウザ上でもおこなうことができます。弊社では別途、DockerとVSCodeを組み合わせたdevcontainerでの開発環境を用意して、そこで開発しています。

理由は開発したコードをきちんとバージョン管理し、レビューを経て、デプロイするというプロセスを通したいからです。手軽にできるのはいいことなのですが、ヘタをすると野良データアプリの量産に繋がってしまいます。

そのため、正式に運用するSiS上のデータアプリについては上記のプロセスを必ず通しています。

画像
githubでSiSのコードをバージョン管理

上記のロール設計や開発環境の構築は、弊社のデータエンジニア部のじまさん、trapiさんが担当してくれました。

こういったロール設計、開発環境の整備を行ってくれるデータエンジニアが在籍しているため、非常に心強いですね。

データエンジニアのみなさんと一緒にプロジェクトしていて、「この体制ならきっとやり切れる」という組織効力感があります。

導入の効果

カスタマーサクセスや活用レポートの作成を担当していた部門から、以下のようなコメントがありました。

  • クエリ回してからの待ち時間も含めると月間120時間くらい削減されて最高

  • 活用レポートの作成、非常に楽になりました

  • お客様からも「見やすくなった」などの声をいただいた

活用レポートをデータアプリ化することで、カスタマーサクセスのメンバーが、今までよりもお客様と向き合うことに時間を使えるようになって良かったです。

画像
Streamlit in Snowflake版 活用レポート

今後の展望

Streamlit in Snowflakeは非常に可能性があるなと感じています。一定開発工数がかかるものの、BIなどのライセンス費用が不要でデータアプリを提供のできるのは非常に魅力的です。

また、Snowflakeに内包されているため、SnowflakeのCortexなどのジェネレーティブAIと組み合わせて、対話型のデータアプリを構築することも可能です。

Snowflake社でブートキャンプを一緒に実施させていただいたので、このあたりも検証などを進め、導入を検討していきたいです。

ほかにも、全社的に広く公開するダッシュボードの提供などもユースケースとしてはあるのかも知れません。このあたりは、試行錯誤しながら、ほかのBIなどと組み合わせて、適切にデータを公開していければなと考えています。

もちろん、活用レポートのアプリ自体も、カスタマーサクセスのメンバーと一緒に改善をしていき、より良いものにしていきたいと思っています。

こういうデータが見えれば、お客様の活用促進につながるのにといったアイデアもカスタマーサクセスの皆様と話していたりもして、企画・実装も進めていきたいと考えています。

現状のSiSはまだ試行錯誤の面があり、見たあと明示的にプロセスを終了しないとウェアハウスがサスペンドされずにセッションが切れるまで動き続けてしまう問題があり、引き続き改善が必要です。

開発に、Pythonの知識が必要になってくるので、組織として、開発・運用のケイパビリティをどう確保していくのかなどの課題もあります。

最後に

今回は

  • カスタマーサクセス向けに、Streamlit in Snowflakeで、データアプリを構築した話

を紹介させていただきました!

弊社のバリューの1つに「Beyond Boundaries - 越境し共に高めあうがあります。今回は、まさに、カスタマーサクセス、プロダクトデータアナリスト、データエンジニアがそれぞれ、垣根を越えて、お互いに協力しあって、達成できたプロジェクトかなと思っています。

この記事を読んで「Chatwork」のPM・プロダクトデータアナリストに興味を持っていただけた方は、ぜひ採用情報をご確認くださいな。

僕が所属するプロダクトマネジメント部の採用情報はこちらです。
PMも絶賛採用中です!

さらには、データエンジニアも絶賛採用中です!

参考資料


いいなと思ったら応援しよう!

この記事が参加している募集

コメント

コメントするには、 ログイン または 会員登録 をお願いします。
「働くをもっと楽しく、創造的に」をコーポレートミッションに掲げる、株式会社kubell(旧Chatwork株式会社)が提供するビジネスチャット「Chatwork」のプロダクトマネジメントの取り組みについて紹介するブログです!
カスタマーサクセス向けデータアプリをStreamlit in Snowflakeで構築した話|Chatwork Product Management
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1