Firebase & BigQuery で
Android アプリの成⻑を⽀える
2020/05/30(⼟)
Android Bazaar and Conference 2020 Spring
Kenichi Tatsuhama
本⽇お話しすること
• リリースしたアプリが、どのように使われているか分析するた
めのツール、使い⽅を知る
• 分析結果から、アプリの成⻑のためのアプローチを取る
→ アプリやビジネスの成功につなげる
想定読者:開発者、PO/PM、経営者
About me
⾠濱健⼀(Kenichi Tatsuhama)
• @tatsuhama50
• Sansan, Inc. Android developer
• GDG Shikoku Organizer
• 徳島県神⼭町在住
Agenda
• Firebase とは
• BigQuery とは
• Firebase を BigQuery にリンクする
• Firebase が BigQuery に出⼒するデータ
• BigQuery からデータを引いてみる
• Data Portal を使う
• ユーザにアプローチする
Firebase とは
Firebase とは
• Google が提供するアプリケーションのバックエンド
• 開発⽤ツールだけでなく、品質・分析・拡⼤もサポート
https://firebase.google.com/
Firebase とは
• 【品質】クラッシュの発⽣状況や詳細を確認できる
その他の機能も活⽤していますか?
Firebase とは
• 【分析】Firebase だけでも様々な情報が確認できる
• アクティブユーザ
• 過去30分のユーザ
• 上位のコンバージョン
イベント
• 1⽇のユーザー
エンゲージメント
• アプリでの収益源
• アプリの安定性
Firebase とは
• 【分析】Firebase だけでも様々な情報が確認できる
• 最新リリースの
導⼊状況
• 新規ユーザの
獲得⽅法
• ユーザ維持率
• ユーザの
詳細データ
• プラットフォーム
の内訳
Firebase とは
• 【分析】Funnels で離脱ポイントを可視化
ここでの離脱が⼤きい
Firebase とは
• 【分析】ユーザセグメントを定義でき、変化率を確認できる
←レベル1をクリアしたユーザ
Firebase とは
• 【拡⼤】いわゆるプッシュ通知
• 前述のセグメントに絞って送ることもできる
Firebase とは
• 【拡⼤】アプリ内にポップアップを表⽰
• 前述のセグメントに絞って送ることもできる
Firebase とは
• これらの分析・拡⼤機能を有効活⽤するために、Firebase に可能な
限り様々な情報を送っておくことをオススメします。
• 例)
• User property
• サービス上の UserId (必要に応じて、組織 Id なども)
• 有償ユーザかどうか
• アプリ上の設定値(暗号化機能の on / off 値、…
• Event
• ボタンのタップ
• ゲームのクリア
• プロパティ
• テキストメッセージを送信したイベント:⽂字数
• ゲームをクリアしたときのイベント:かかった時間、スコア
BigQuery とは
BigQuery とは
• Google が提供するペタバイト規模の低料⾦フルマネージド ア
ナリティクス データ ウェアハウス
• NoOps(管理するインフラストラクチャが存在せず、データ
ベース管理者が必要ない)
• 使い慣れた SQL を使⽤してデータから有⽤な情報を⾒つけ出
す作業に集中できる
https://cloud.google.com/bigquery/docs
BigQuery とは
• 料⾦体系
• ストレージや操作により細か
く設定されている
• ⼀定の無料枠がある
• 定額プランも⽤意されている
https://cloud.google.com/bigquery/pricing - pricing_summary
Firebase を BigQuery に
リンクする
Firebase を BigQuery にリンクする
• リンクをすると以下のデータにアクセスできるようになる
• Google アナリティクス アプリとアプリ + ウェブ プロパティのデータ
• Firebase 向け Google アナリティクスのデータ
• Crashlytics の致命的なクラッシュ イベントと致命的でないクラッ
シュ イベント、およびスタック トレースからの詳細
• Predictions の⽣データ
• Cloud Messaging の詳細なデータ
• キャプチャされた各パフォーマンス モニタリング イベントの詳細
https://support.google.com/firebase/answer/6318765
※前述の通り、Firebase だけでも様々な分析は可能です。
Firebase を BigQuery にリンクする
• リンクの⼿順
• プロジェクトの設定>統合> BigQuery のカードの「リンク」
Firebase を BigQuery にリンクする
有効にしたいサービスをチェック
プロジェクトに複数の
アプリがある場合は、
絞り込みが可能
Firebase が BigQuery に
出⼒するデータ
Firebase が BigQuery に出⼒するデータ
• Firebase プロジェクトごとに分かれ
ている
• プロジェクト内は、Firebase の各
サービスごと
• Analytics
• Crashlytics
• …
にテーブルが分かれている
1つの Firebase
プロジェクト
別プロジェクト→
Firebase が BigQuery に出⼒するデータ
• テーブルをクリックするとスキーマが確認できる
Firebase が BigQuery に出⼒するデータ
• パーティション分割テーブル
• クエリの⾼速化やコスト削減につながる
• ⽇付等でテーブルが分割されている(横断検索も可能)
https://cloud.google.com/bigquery/docs/partitioned-tables
Firebase が BigQuery に出⼒するデータ
• プレビューをクリックすると実際のデータの⼀部を確認できる
Firebase が BigQuery に出⼒するデータ
• RDB のように単純な正規化されたテーブルではない
• 各⾏に配列、構造体、構造体の配列なども保持している
正規化されたテーブル
BigQuery のテーブル
https://developers-jp.googleblog.com/2017/04/bigquery-tip-unnest-function.html
Firebase が BigQuery に出⼒するデータ
• タイプ
• プリミティブな STRING, INTEGER, BOOLEAN, TIMESTAMP, … に加
え、構造体の RECORD がある
• モード
• NULLABLE:null 許容型
• REPEATED:繰り返し
https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types
Firebase が BigQuery に出⼒するデータ
• REPEATED
• いわゆる配列
• 各要素は全て同じ型である必要がある
• ⾮正規化しているが、データウェアハウジングでよく⾏われる
• テーブルの結合を⾏わない分、⾼速に検索できる
• クエリ実⾏時には UNNEST() 関数を使ってアクセスする
Firebase が BigQuery に出⼒するデータ
• UNNEST() 関数
• 繰り返しを全て展開して、別々の⾏にする
• 展開したテーブルを作成するイメージ
UNNEST
Firebase が BigQuery に出⼒するデータ
• RECORD
• いわゆる構造体
• 1つ以上のフィールドを含めることができる
• フィールドのデータ型は同じでなくてもよい
Firebase が BigQuery に出⼒するデータ
• RECORD x REPEATED で記録される例
• Firebase に記録するイベントログ
• logEvent() 関数で イベント名 と プロパティ を渡す
• プロパティは詳細な情報を key, value の集合で渡す(Android : Bundle)
※プロパティを渡さなくても、⾃動的に付与される情報があります
イベント名 プロパティ
Firebase が BigQuery に出⼒するデータ
• event_params は RECORD x REPEATED で記録されている
key string_value int_value
繰り返し
BigQuery からデータを
引いてみる
BigQuery からデータを引いてみる
• テーブルを選んで「テーブルをクエリ」をクリックすると、
SELECT ⽂が挿⼊される
BigQuery からデータを引いてみる
• フィールド名をクリックするとカーソル位置にフィールド名が
挿⼊される
←クリック
カーソル位置にフィールド名が挿⼊される
BigQuery からデータを引いてみる
• 実⾏をクリックすると結果が表⽰される
BigQuery からデータを引いてみる
• 「結果の保存」をクリックすると CSV 等で保存できる
BigQuery からデータを引いてみる
BigQuery からデータを引いてみる
• いくつかの SQL ⽂の紹介
• とあるクラッシュをユーザが⼀定期間に何度経験したか?
• 背景:⼀定回数経験したユーザには、個別対応を⾏うためユーザを抽出したい
• そのユーザはクラッシュが起きる前にどういう⾏動をしていたか?
• 背景:再現⼿順、条件の確認をしたい
• UNNEST() を使った検索
• 背景:イベントやユーザのプロパティを抽出や検索条件にする場合は
UNNEST() を使う必要がある
BigQuery からデータを引いてみる
• とあるクラッシュをユーザが⼀定期間に何度経験したか?
• クラッシュの issue_id は Firebase Crashlytics で確認する
Your firebase_crashlytics table
Firebase ダッシュ
ボードだけではわから
ない情報が得られる
BigQuery からデータを引いてみる
• とあるユーザがクラッシュ前に⾏っていた⾏動を⾒る
Your Firebase Analytics table
User Id
Firebase ダッシュ
ボードだけではわから
ない情報が得られる
BigQuery からデータを引いてみる
• UNNEST() を使った検索
UNNEST() を使って、
user_property から user_id を引いてみる
Your Firebase Analytics table
User Id
User Id
↑ UNNEST(user_properties) は FROM と⼀緒に使う
(繰り返し要素を展開したテーブルになる)
BigQuery からデータを引いてみる
• 実際にやってみて…
• Firebase ダッシュボードからでは⾒えない情報が取得できる
• → 不具合改修やユーザサポートの効率改善
• ある程度の SQL の知識が必須
• UNNEST() など、BigQuery ならではの知識も必要
• ⾮効率なクエリの実⾏で多額の費⽤が掛からないかちょっと⼼配
• WHERE や LIMIT をかけても安くならない(結果ではなく⾛査対象で課⾦)
• 必要な列だけ取得するようにする
• SELECT * しなくても、プレビューで具体的なデータはわかる
• (効率の良いクエリを考えている時間コストの⽅が⾼いかも?)
Data Portal を使う
Data Portal を使う
• Data Portal とは、Google が提供する無料の BI ツール
• BigQuery 等をデータソースにして、さまざまな⾓度でデータ
の分析、レポートを作成できる
• SQL の知識は不要
https://marketingplatform.google.com/intl/ja/about/data-studio/
Data Portal を使う
• 検索結果のテーブルをデータポータルで調べて可視化
ここでは、Event のクエリ結果で「データを探索」してみます。
Data Portal を使う
• 検索結果のテーブルをデータソースにした、Data Portal ド
キュメントが作成される
↓イベント名 ↓回数
Data Portal を使う
• ディメンションを変更すると、集計⽅法が変わる
event_date event_name
Data Portal を使う
• ディメンジョンは複数指定が可能
※event_date と event_name が同じ値でないと、同⼀⾏にならない
Data Portal を使う
• さまざまなグラフを追加可能
• 表
• スコアカード
• 期間
• 棒
• 円
• 地図
• Google マップ
• 折れ線
• ⾯
• …
Data Portal を使う
• ピボットテーブルも作成可能
Data Portal を使う
• 他にも…
• Query を定期実⾏すれば、⾃動で更新されるレポートが作成できる
• BigQuery でなくとも、様々なサービスをデータソースにできる
Data Portal を使う
• 弊社で分析した例
• 企業ごとの⽉次のアクティブユーザの推移
• アプリバージョンごとのエラー発⽣率
• 国ごとのエラー発⽣率
• など…
• 弊社の KPI ダッシュボード
• ⽇次の主要イベント実⾏数の推移
• ユーザの利⽤国分布
• など…
Data Portal を使う
• テンプレートも⽤意されています
Data Portal の学習や、
KPI ダッシュボードの雛形に使えます
Data Portal を使う
• 実際にやってみて…
• SQL の知識がなくても、アプリの傾向を容易に掴むことができる
• 開発者が環境を⽤意すれば、分析は他のメンバーに依頼できる
• 様々な⾓度から、アプリのログを分析することができる
• アプリの KPI レポートも作成できる
→ アプリの利⽤状況の変化や問題を容易に⾒つけることができる
ユーザにアプローチする
ユーザにアプローチする
• Firebase, BigQuery, Data Portal を⽤いて、特定のユーザセグ
メントがあまりコンバージョンしてないことがわかったとする
• 例)
• 古いアプリを使っているユーザ
→ アップデートのお知らせ
• 特定のキャンペーンから流⼊した Android ユーザ
→ アプリのユースケースを紹介
• ゲームのレベルが1のまま、3⽇間で10回起動しているユーザ
→ 攻略のヒントを案内
• そのセグメントに特化した内容でアプローチして、アプリの利
⽤を促進していく
ユーザにアプローチする
• セグメントの定義⽅法
• 条件が簡単であれば、Cloud Messaging 等の「ターゲット」で指定
• 複雑であれば Audiences を定義する
ユーザにアプローチする
• Cloud Messaging 等の「ターゲット」で指定
ユーザにアプローチする
• Audiences を定義
• ユーザ⾏動に基づいて定義ができる
• 定義後のユーザ⾏動からセグメントに紐付いていく
• 過去の⾏動に遡って紐付けられないので注意
Smarter Segmentation with Audiences and Predictions
https://www.youtube.com/watch?v=VPLkd_aqKwU
ユーザにアプローチする
• Cloud Messaging と In-App Messaging の違い
Cloud Messaging In-App Messaging
• アプリを起動していなくても端末に届く
• アプリが通知許可をしていないと届かない
• ⾔語ごとにメッセージを作成する必要があ
る
• アプリを起動しないと表⽰されない
• アプリ内にダイアログを表⽰させる
• Cloud Messaging より表現⼒はある
• 表⽰のタイミングの制御ができる
• 多⾔語対応
(1キャンペーンで複数⾔語を扱える)
ユーザにアプローチする
• Cloud Messaging でアプローチする
ユーザにアプローチする
• Cloud Messaging でアプローチする
• 通知の本⽂やターゲットを設定
ユーザにアプローチする
• Cloud Messaging でアプローチする
• 配信スケジュールを設定
• 海外展開しているなら「受信者のタイムゾーン」での時刻指定がオススメ
• 繰り返し設定も可能(1回だけ受け取る設定も可能)
ユーザにアプローチする
• Cloud Messaging でアプローチする
• コンバージョンイベントを設定する(任意)
• Cloud Messaging によってコンバージョンに⾄ったかが計測可能
ユーザにアプローチする
• Cloud Messaging でアプローチする
• 必要に応じて細かな設定もできる
ユーザにアプローチする
• Cloud Messaging でアプローチする
• 配信数・開封率等の確認ができる
• アプリごとのフィルタも可能
ユーザにアプローチする
• In-App Messaging を使う
ユーザにアプローチする
• In-App Messaging を使う
• スタイルと内容(カード、モーダル、画像のみ、トップバナー)
カード
モーダル 画像のみ トップバナー
ユーザにアプローチする
• In-App Messaging を使う
• 宛先選択(Audiences も選択可能)
• ローカライズ
ユーザにアプローチする
• In-App Messaging を使う
• スケジュール設定
• ⽇時だけでなく、どのイベントをトリガーに表⽰するかも設定
例:
「初めてゲームをクリアした」
ときに表⽰させる
ユーザにアプローチする
• In-App Messaging を使う
• コンバージョンイベントも設定可能
ユーザにアプローチする
• In-App Messaging を使う
• その他のオプション
ユーザにアプローチする
• In-App Messaging を使う
• インプレッション数、クリック数が確認できる
ユーザにアプローチする
• アプローチ後は数値が改善されているか確認する
• 改善できていた
•
• 改善されていない
• 新たな仮説を⽴て、検証、実施、計測を繰り返す
ユーザにアプローチする
• 実際にやってみて
• 開発⼯数が少なくて済む
• 開発作業は、Firebase SDK の導⼊&イベント埋め込みだけ
• Firebase ダッシュボードの操作だけで運⽤できるので、運⽤チームにバトンタッチ
できる
• Cloud Messaging の開封率はそこまで⾼くない…
• 通知許可を外されたら届くことはない
• 通知は⽬にはしているが、タップして開封していないケースもあるだろう
• In-App Messaging は Activity の構造によってはすぐ消える場合がある
• Android で Firebase In-App Messaging が表⽰されない問題の workaround
https://qiita.com/tatsuhama/items/d9ed9dc4622169d2e105
• Authentication を使っているなら、メール等でのアプローチも検討を
まとめ
まとめ
• Firebase を使うと、ダッシュボードでさまざまなアプリの情報
を得ることができる
• Firebase の情報は BigQuery に出⼒できる
• BigQuery でより詳細な分析ができる
• Data Portal を使うと、SQL の知識がなくても分析ができる
• Firebase にはユーザにアプローチする⽅法も⽤意されている
• アプローチしたら効果測定
→ データを活⽤して、アプリやビジネスの成功へ!
今回のお話が、みなさんの参考になれば幸いです!

Firebase & BigQuery で Android アプリの成⻑を支える