こんにちは。 プロダクトアプリグループの太田です。 今回はアプリの各種分析に使用している Mixpanel というツールから、 Firebase × BigQuery × Redash での分析に移行真最中のお話をしたいと思います。
Mixpanelとは?
サービスをデータ解析するグロースハックツールです。イベント計測、ユーザ解析、ファネルやコホート分析等でかなり細かいところまで詳細に見ることができます。ココナラアプリでは、各イベントに細かいプロパティを設定しそれらを起点にしたファネルやセグメント分析に主に利用しています。
移行するきっかけ
ココナラは世界中の人々に利用されるサービスを目指し、社員一丸となって日々取り組んでいます。
Mixpanelは送信イベントの量に応じて課金されていく従量課金、にもかかわらず現段階で料金が…高い!このままスケールしていったら… どうなっちゃうの…?
ということで代替ツールの模索をし始めました。
代替ツール案
- Repro (プッシュ通知やお知らせダイアログ表示等に絶賛利用中)
- Firebase
- Adobe Analytics
- Facebook Analytics
満たすべきポイントはイベント×プロパティで追えることです。
例えば…
会員登録完了イベントをユーザプロパティのアプリバージョンごとに表示
サービス詳細表示イベントを流入元 (via) ごとに表示
お気に入り経由のサービス詳細表示からの購入コンバージョンファネル
これらを満たすには各ツール単体では各イベントを余計に発火したりする必要がありソースコードも汚れます。
また、イベントプロパティを設定してもツールの管理画面では扱えないものもあります。 機能落ちになるか別のBIツール利用するしか無いの…
頭をよぎりましたが、我々にはすでにあったのです。 BigQuery と Redash が。
すでにサーバアクセスのログをすべて BigQuery に送信し、お問い合わせ時の分析やマーケチームの施策評価に使用していました。 (マーケチームが全員SQL書いちゃう話)
さらにその情報をRedashで可視化し毎日Slackにレポート送信しています。 これらをそのまま利用するには…
そう、みんな大好き Firebase で BigQuery にデータまるごと送信すればいいのです。 問題のコストについては、Firebaseは無料、BIgQueryは保存は無料データ抽出利用データ1Tにつき$5、Redashは僅かな固定費のみで見事クリア。 これでやってやりましょう。
各種ツールについて、詳しい説明はここでは割愛します。
firebase.google.com モバイルアプリ開発/運用のための各種サービスを提供
cloud.google.com 低コストでスケーラビリティに優れたデータウェアハウス
redash.io 各種データを可視化
Firebase
まずは、Mixpanelに送信しているイベント/イベントプロパティ/ユーザプロフィールを丸っと全く同じ内容を Firebase に送信します。 送信しただけでは Firebase の管理画面でイベントプロパティを細々利用できません。 (単体では利用できるが残念ながら複合的に利用できない) Firebase と BigQuery をリンクしデータを送信します。
BigQuery
Firebaseから送信されBigQueryに格納されるデータにはクセがあります。 それは階層構造のデータで格納されること。
初見は、これどうやって扱うんじゃい! ですしそれっぽくSQL書くと怒られます。
event_params.key に via (流入元) があるデータ抽出試みる
SELECT * FROM `coconala-*******` WHERE event_params.key = "via"
怒られた
Query Failed Error: Cannot access field key on a value with type ARRAY<STRUCT<key STRING, value STRUCT<string_value STRING, int_value INT64, float_value FLOAT64, ...>>> at [6:18]
そこは当然扱う方法がありました。
階層化されたデータを扱うには UNNEST関数を使う developers-jp.googleblog.com
UNNEST関数は、配列を受け取ってそれを個々の要素に分解します。 つまり各情報が1行づつ扱えるようになります。
再度 event_params.key に via (流入元) があるデータ抽出試みる
※SELECT * だとテーブルの見た目が変わらなく分かりづらいので各項目取得してます
SELECT event_date , event_name , params.key FROM `coconala-*******` , UNNEST(event_params) as params WHERE params.key = 'via'
これらを踏まえて「サービス詳細表示イベント (view_service) を流入元 (via) ごとに日付別に表示」してみます。
WITH event AS ( SELECT event_date , event_name , (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'via') AS via , app_info.version AS version FROM `coconala-*******` WHERE event_name = 'view_service' ) SELECT event_date , via , COUNT(*) AS cnt FROM event GROUP BY event_date , via ORDER BY event_date ASC
ここでのポイントは以下の StandardSQL を生かして可読性を上げています。
- With を使用してサブクエリを減らす
- SELECTの中にSELECTかけちゃう
これでデータ抽出できました!
Redash
最後にRedashを利用してデータの可視化を行います。
BigQueryのサービス アカウント キー (JSON) を取得 https://cloud.google.com/iam/docs/creating-managing-service-account-keyscloud.google.com
Redash設定画面
- Srttings の Data Source から BigQueryを選択
- 各内容を入力して保存する
- JSON Key File には前述で取得したJSONを設定
データ抽出
- ヘッダの
Create
からQuery
を選択 Select Data Souce
に接続した BigQuery を選択- BigQuery でごにょごにょしてたQueryを書く
データを可視化
- 取得したデータTableタブ横の
+ New Visualization
を選択 - 各グラフ設定を行う
ダッシュボードに貼り付ける
- アプリ分析用のダッシュボードを作成
- 可視化したデータを貼り付ける
できた!素敵!
となりの特定の流入元のアプリバージョン別データは以下で取得できます。
WITH event AS ( SELECT event_date , event_name , (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'via') AS via , app_info.version AS version FROM `coconala-*******` WHERE event_name = 'view_service' ) SELECT event_date , version , COUNT(*) AS cnt FROM event WHERE via = 'category_related_services' GROUP BY event_date , version ORDER BY event_date ASC
その他にもFirebaseで取得しているデータすべてを利用することが出来ます。 かなり詳細な分析が可能になります。
まとめ
アプリはWebと違い通信の発生しない行動が多く、サーバのログでの分析が非常に困難です。なので各所に行動イベントを埋め込んでの分析が必須になります。また、アプリリリース後は修正できないのでリリースしたバージョンの監視が非常に重要です。調べたいときに分析できるということも重要なので今は使わないが今後のために送信しているイベントも多くあります。Firebase×BigQueryであればデータを送信するだけならかなりの低コストで済むので今の運用にどマッチのツールでした。
より良いユーザ体験を届けるために日々分析! 次回はファネル分析に挑みます!
ちなみに一緒にアプリ開発してくれる仲間も募集しておりますー。
お知らせメール登録
よもやまブログの更新時にメールでお知らせします。