Firebase × BigQuery × Redash で快適アプリ分析

f:id:atsushi-ohta:20180822035041p:plain

f:id:atsushi-ohta:20180822042307p:plain

こんにちは。 プロダクトアプリグループの太田です。 今回はアプリの各種分析に使用している Mixpanel というツールから、 Firebase × BigQuery × Redash での分析に移行真最中のお話をしたいと思います。

Mixpanelとは?

https://mixpanel.com

サービスをデータ解析するグロースハックツールです。イベント計測、ユーザ解析、ファネルやコホート分析等でかなり細かいところまで詳細に見ることができます。ココナラアプリでは、各イベントに細かいプロパティを設定しそれらを起点にしたファネルやセグメント分析に主に利用しています。

移行するきっかけ

ココナラは世界中の人々に利用されるサービスを目指し、社員一丸となって日々取り組んでいます。

Mixpanelは送信イベントの量に応じて課金されていく従量課金、にもかかわらず現段階で料金が…高い!このままスケールしていったら… どうなっちゃうの…?

ということで代替ツールの模索をし始めました。

代替ツール案

  • Repro (プッシュ通知やお知らせダイアログ表示等に絶賛利用中)
  • Firebase
  • Adobe Analytics
  • Facebook Analytics

満たすべきポイントはイベント×プロパティで追えることです。

例えば…

会員登録完了イベントをユーザプロパティのアプリバージョンごとに表示 f:id:atsushi-ohta:20180822061711p:plain

サービス詳細表示イベントを流入元 (via) ごとに表示 f:id:atsushi-ohta:20180822041744p:plain

お気に入り経由のサービス詳細表示からの購入コンバージョンファネル f:id:atsushi-ohta:20180822041746p:plain

これらを満たすには各ツール単体では各イベントを余計に発火したりする必要がありソースコードも汚れます。

また、イベントプロパティを設定してもツールの管理画面では扱えないものもあります。 機能落ちになるか別の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 をリンクしデータを送信します。

support.google.com

BigQuery

Firebaseから送信されBigQueryに格納されるデータにはクセがあります。 それは階層構造のデータで格納されること。

f:id:atsushi-ohta:20180822044032p:plain

初見は、これどうやって扱うんじゃい! ですしそれっぽく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' 

f:id:atsushi-ohta:20180822045353p:plain

これらを踏まえて「サービス詳細表示イベント (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 を生かして可読性を上げています。

  1. With を使用してサブクエリを減らす
  2. SELECTの中にSELECTかけちゃう

f:id:atsushi-ohta:20180822045917p:plain

これでデータ抽出できました!

Redash

最後にRedashを利用してデータの可視化を行います。

BigQueryのサービス アカウント キー (JSON) を取得 https://cloud.google.com/iam/docs/creating-managing-service-account-keyscloud.google.com

Redash設定画面

  1. Srttings の Data Source から BigQueryを選択
  2. 各内容を入力して保存する
    • JSON Key File には前述で取得したJSONを設定

f:id:atsushi-ohta:20180822052859p:plain

データ抽出

  1. ヘッダの Create から Query を選択
  2. Select Data Souce に接続した BigQuery を選択
  3. BigQuery でごにょごにょしてたQueryを書く

f:id:atsushi-ohta:20180822100348p:plain

データを可視化

  1. 取得したデータTableタブ横の + New Visualization を選択
  2. 各グラフ設定を行う

f:id:atsushi-ohta:20180822055525p:plain

ダッシュボードに貼り付ける

  1. アプリ分析用のダッシュボードを作成
  2. 可視化したデータを貼り付ける

f:id:atsushi-ohta:20180822060636p:plain

できた!素敵!

となりの特定の流入元のアプリバージョン別データは以下で取得できます。

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であればデータを送信するだけならかなりの低コストで済むので今の運用にどマッチのツールでした。

より良いユーザ体験を届けるために日々分析! 次回はファネル分析に挑みます!

ちなみに一緒にアプリ開発してくれる仲間も募集しておりますー。

www.wantedly.com

www.wantedly.com



お知らせメール登録
よもやまブログの更新時にメールでお知らせします。