for Startups Tech blog

このブログのデザインを刷新しました。(2023/12/26)

ブラウザで本番データの分析をするためにRedashとGoogleColabを組み合わせてみた話

f:id:forStartups:20211020185235j:plain

こんにちは。エンジニアの藤井(@yutafujii)です。

社内向けのプロダクト「タレントエージェンシー支援システム(SFA/CRM)」のエンジニアをしています。

当社ではデータ分析を専門に行う人がまだいないので、私たちエンジニアがごく簡単なデータ分析を行う場面があるのですが、それを行うためにPythonでの分析環境を手軽に構築しました。

具体的には、複数のRDBやログデータを対象に、RedashでSQLを書いてデータレイク的状態(あるいはデータウェアハウス的状態)を形成し、Google Colaboratory(以下Colab)を用いてその出力をPythonで分析するという流れを説明します。

データ分析を本格化する前のサービス運用をしているPdM・エンジニア・マーケターや、片手間にPythonで分析したいという人を想定読者とさせていただきます。

モチベーション

一言でいえば「データ分析基盤もないし分析者もいないけどちょっとデータ分析したい」というのがこれを思いついたきっかけです。

私は本業がプロダクト開発でデータ分析をする稼働もあまり割けないという事情もあり、いきなりがっつり構築して運用コストがかかるのは避けたいところでした。というわけでざっと満たすべき制約や要件を挙げると次のようなものになりました。

要件

  • Pythonで分析できる
  • 分析が属人化しないこと
  • 当たり前ですがセキュリティリスクが低いこと
  • 運用コスト(労働コスト・費用)が低いこと

なお私が入社したときには既にBIツールとしてRedashを利用している状態でした。

Pythonで分析するだけであればBIツールのSQL結果を自分のPCにダウンロードして、ローカルで立ち上げたJupyter Notebook上で分析するということで良いのですが(もちろんこれもやりました)、分析方法や結果の共有をするために

  • GitHubを通して分析コードを共有する
  • 共有者のローカルでjupyterを立ち上げる
  • データをローカルにダウンロードしてもらい分析する

という複雑なステップを踏む必要があります。また、本番データがローカルPCに蓄積することのセキュリティリスクも気になります。

共有のしやすさという観点からブラウザ上で分析したいなと思いつつ、Jupyter NotebookコンテナをAWSのサーバーで起動させることも考えましたが、そこまで使わないのにメンテナンスも認証もセキュリティ対策も全部自分でやるのは面倒だなと思い、Colabを思いつきました。

初めて知る方のためにも、RedashとColabについて簡単に説明しておきます。

Redashとは

f:id:forStartups:20211019215332p:plain
f:id:forStartups:20211019215401p:plain
出所)LP

RedashはオープンソースのBIツールです。弊社ではEC2に載せてRedashサーバーを起動することでブラウザから利用しています(これらの構築手順もHPに載っています:https://redash.io/help/open-source/setup)。

Redashにはざっと以下のような機能があります。

1.認証・認可

Google OAuthの設定が容易にできる。また権限設定も簡単

2.複数のデータソースと接続

RDBMS、各種NoSQL、Google Analyticsスプレッドシートなど

3.クエリ結果の保存

→Redashが保有する固有のデータベース(SQLite3)に格納される

4.クエリ結果へアクセスするAPIの発行

CSVJSON形式でそれぞれ固有のURLが発行される

5.複数ソースからデータの結合

→クエリ結果を保存するRedashのデータベースに対してSQLを発行することで実現

これらの機能を活用することで、データレイクや、データウェアハウスを形成することができます。クエリを書かずに集計ができないため非エンジニアが使いにくいとか、クエリの説明を付ける場所が小さすぎて出力数字の定義を把握しづらいとか、承認フローなどがないのでSQLが一方的に増えがちなどの課題もありますが、それでもクエリを一元的に発行出来る場所があることは非常に助かっています。

Colabとは

f:id:forStartups:20211019215446p:plain

Colabの愛称で利用されているColaboratoryはGoogleが提供しているサービスで、ブラウザでのPython実行環境を提供しています。その特徴は

  • 構築作業がゼロ
  • GPUへのフリーアクセス
  • シェアの容易さ

というもので、今回の要件にどストライクなサービスです。pipにもanacondaにも触れることなくいきなり

import numpy as np
import pandas as pd
import seaborn as sns

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

といったコードを書き始めることができます。

Google Driveと同様のアクセス権限・共有設定が可能なので、認証と認可も実装することなく使えます。ソースコードや演算はGoogleクラウド上で行われますが、利用規約を読む限りそれらがGoogleに利用されるということはなさそうです。もちろんGoogle側の脆弱性があった場合に自分たちのデータもリスクに晒されるわけですが、一旦このリスクは許容しています。

f:id:forStartups:20211019221815p:plain
Colabの利用イメージ

構成

というわけでRedashとColabを組み合わせてできる分析構成は以下の通りになります。

f:id:forStartups:20211019221914p:plain
全体の構成

まず、Colabで分析したいデータをRedashで構築しておきます。

Colab側で利用するSQLを作成し

f:id:forStartups:20211019221959p:plain

右上の3点リーダーから「Show API Key」を選択

f:id:forStartups:20211019222023p:plain

クエリ結果へのアクセスリンクが表示されるのでJSONフォーマットのURLをコピー

f:id:forStartups:20211019222047p:plain

Colabを開いて、あとはコピーしたURLにアクセスするだけです

f:id:forStartups:20211019222104p:plain

Colabサンプルコード

import numpy as np
import pandas as pd
import requests
import json

# Redash query resultにリクエスト
URL = 'https://YOUR_REDASH_DOMAIN/api/queries/QUERY_ID/results.json?api_key=XXXXXXXXXXXXXXXXX'
raw_html = requests.get(URL).content
x = json.loads(raw_html)

# Create Dataframe
d = x['query_result']['data']['rows']
df = pd.DataFrame(d)
df

以上です、構築は非常に簡単ですし、エンジニアでなくてもできるのではと思います。

実際に作られたColab上での分析です。快適ですね。SQLでは面倒な集計、細かい設定の可視化や線形回帰などを実際に書いています。

f:id:forStartups:20211019222130p:plain
実際に分析したグラフ

おわりに

冒頭の「モチベーション」で記載した「データ分析基盤もないし分析者もいないけどちょっとデータ分析したい」という目的と制約要件は、Redash + Colabで問題なく充足することができました。

要件

Pythonで分析できる

 →ColabでPythonを利用できる

分析が属人化しないこと

 →ColabはURLシェアだけで他の人とシェア可能

当たり前ですがセキュリティリスクが低いこと

 →認証、サーバー構築を自作せずGoogleにリスクを転嫁

運用コスト(労働コスト・費用)が低いこと

 →Colabはフリーで利用可能

構築の手間を考えると非常に便利だと思いつつ、今後はしっかりデータパイプラインを構築してデータレイク・データウェアハウスをきちんと整えていきたいところです。現状ではまだ乱立したローデータと、データレイクとデータウェアハウスが混在したようなRedashクエリ結果しかないため、このあたりを改善してくれる人がいたらぜひお話しさせてください。