今年 5 月の Google I/O で、Firebase はモバイル アプリのデベロッパーを支援する新しい製品スイートを発表しました。

新しい Firebase プラットフォームの一翼を担う Firebase Analytics は、iOS と Android アプリの利用状況に関するデータを自動的にキャプチャするとともに、カスタム アプリ イベントの定義をサポートします。キャプチャされたデータは、Firebase コンソールのダッシュボードからアクセスできます。


新しい Firebase プラットフォームに備わるクラウド統合機能のうち、私が特に気に入っているのは、カスタム分析のために Firebase Analytics から Google BigQuery に生データを送れる機能です。このカスタム分析は、Firebase Analytics イベントに渡されたカスタム パラメータにもアクセスでき、iOS および Android の両バージョンのデータ集計で特に役に立ちます。


以下では、この強力な組み合わせによって何ができるのかを紹介します。


BigQuery へのエクスポートの仕組み

Firebase プロジェクトを BigQuery にリンクすると、Firebase は新しいテーブルを自動的に毎日、対応する BigQuery データセットにエクスポートするようになります。対象のアプリに iOS 版と Android 版の両方がある場合は、Firebase は各プラットフォームのデータを別々のデータセットにエクスポートします。


エクスポートされた各テーブルには、Firebase Analytics が自動的にキャプチャしたユーザーのアクティビティおよびデモグラフィック データと、アプリの中でキャプチャされたカスタム イベントが含まれています。そのため、クロスプラットフォーム アプリの 1 週間分のデータをエクスポートした場合、BigQuery プロジェクトはそれぞれ 7 個のテーブルを持つ 2 つのデータセットを持つことになります。

データの概要

Firebase Analytics がエクスポートするテーブルのスキーマはどれも同じです。私たちは以下のサンプル クエリを実行するため、サンプル ユーザー データで 2 つのデータセット(iOS 用Android 用)を作りました。このデータセットは、iOS と Android の両プラットフォームに対応したサンプル ゲーム アプリのためのものです。それぞれのデータセットには 7 個のテーブル、つまり 1 週間分のアナリティクス データが含まれています。


次のクエリは、ある 1 日を対象に、iOS 版アプリの利用状況に関する基本的なデモグラフィックとデバイス データを返します。

SELECT
  user_dim.app_info.app_instance_id,
  user_dim.device_info.device_category,
  user_dim.device_info.user_default_language,
  user_dim.device_info.platform_version,
  user_dim.device_info.device_model,
  user_dim.geo_info.country,
  user_dim.geo_info.city,
  user_dim.app_info.app_version, 
  user_dim.app_info.app_store,
  user_dim.app_info.app_platform
FROM
  [firebase-analytics-sample-data:ios_dataset.app_events_20160601]

Firebase Analytics からエクスポートされる BigQuery テーブルのスキーマはすべて同じなので、ここで挙げたクエリのデータセットやテーブル名を皆さんのプロジェクトのものに置き換えれば、皆さんの Firebase Analytics データに対して実行できます。


このスキーマにはユーザー データとイベント データが含まれています。ユーザー データはすべて Firebase Analytics が自動的にキャプチャするのに対し、イベント データはアプリに追加されたカスタム イベントによって作られます。


ユーザー データ

ユーザー レコードには、ユーザーごとに一意なアプリ インスタンス ID(このスキーマの user_dim.app_info.app_instance_id )とともに、位置、デバイス、アプリのバージョンのデータが含まれています。


Firebase コンソールには、アプリの iOS 版と Android 版のアナリティクス向けに用意された別々のダッシュボードがあります。BigQuery では、両プラットフォームのユーザーが世界中のどこからアプリにアクセスしているかを調べるためのクエリを実行できます。


次のクエリは、UNION ALL 演算子としてカンマが使える BigQuery の union 機能を使用しています。私たちのサンプル テーブルにおける行はユーザーが発生させたイベントごとに作られるため、各ユーザーがちょうど 1 回ずつ数えられるようにするために EXACT_COUNT_DISTINCT 関数を使っています。

SELECT
  user_dim.geo_info.country as country,
  EXACT_COUNT_DISTINCT( user_dim.app_info.app_instance_id ) as users
FROM
  [firebase-analytics-sample-data:android_dataset.app_events_20160601],
  [firebase-analytics-sample-data:ios_dataset.app_events_20160601]
GROUP BY
  country
ORDER BY
  users DESC

また、使用言語や地理的な位置といった、ユーザー ベースのさまざまなセグメントを表現するために定義した属性を格納する user_properties レコードも、ユーザー データに含まれています。なお、Firebase Analytics はデフォルトで数種類のユーザー プロパティをキャプチャするため、独自に定義できるプロパティは 25 個までです。


ユーザーの使用言語はデフォルト ユーザー プロパティの 1 つです。次のクエリを実行すれば、両プラットフォームを通じてユーザーがどの言語を使っているかがわかります。

SELECT
  user_dim.user_properties.value.value.string_value as language_code, 
  EXACT_COUNT_DISTINCT(user_dim.app_info.app_instance_id) as users,
FROM
  [firebase-analytics-sample-data:android_dataset.app_events_20160601],
  [firebase-analytics-sample-data:ios_dataset.app_events_20160601]
WHERE
  user_dim.user_properties.key = "language"
GROUP BY
  language_code
ORDER BY 
  users DESC

イベント データ

Firebase Analytics では、アプリ内でのアイテム購入やボタン クリックといったカスタム イベントのログを簡単に取得できます。イベントのログを出力するときは、Firebase Analytics にイベント名と 25 個までのパラメータを渡すと、Firebase Analytics が自動的にイベント発生回数をカウントします。


次のクエリは、特定の 1 日間に Android 版アプリで発生した各イベントの回数を明らかにします。

SELECT 
  event_dim.name,
  COUNT(event_dim.name) as event_count 
FROM
  [firebase-analytics-sample-data:android_dataset.app_events_20160601]
GROUP BY 
  event_dim.name
ORDER BY 
  event_count DESC


他のタイプの値(たとえばアイテムの料金)がイベントと関連づけられている場合は、それをオプションの value パラメータとして渡すと、BigQuery でその値によるフィルタリングが可能です。


私たちのサンプル テーブルには spend_virtual_currency イベントがあります。そこで、次のクエリを実行すれば、ゲームのプレーヤーが一度にどれくらいの仮想通貨を消費するのかがわかります。

SELECT 
  event_dim.params.value.int_value as virtual_currency_amt,
  COUNT(*) as num_times_spent
FROM
  [firebase-analytics-sample-data:android_dataset.app_events_20160601]
WHERE
  event_dim.name = "spend_virtual_currency"
AND
  event_dim.params.key = "value"
GROUP BY
  1
ORDER BY 
  num_times_spent DESC


複雑なクエリ

両プラットフォームのアプリを使用して、特定の期間を対象とするクエリを実行したいときはどうすればよいでしょうか。Firebase Analytics データは日ごとにテーブルに分割されるので、BigQuery の TABLE_DATE_RANGE 関数を使えばこれを実現できます。


次のクエリは、1 週間の間にいくつの都市のユーザーがアクセスしているかを返します。
SELECT
  user_dim.geo_info.city,
  COUNT(user_dim.geo_info.city) as city_count 
FROM
TABLE_DATE_RANGE([firebase-analytics-sample-data:android_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP()),
TABLE_DATE_RANGE([firebase-analytics-sample-data:ios_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP())
GROUP BY
  user_dim.geo_info.city
ORDER BY
  city_count DESC

同様に、両プラットフォームにおけるスマートフォンとタブレットからのアクセス回数が、1 週間でどれだけなのかを比較するクエリも書くことができます。

SELECT
  user_dim.app_info.app_platform as appPlatform,
  user_dim.device_info.device_category as deviceType,
  COUNT(user_dim.device_info.device_category) AS device_type_count FROM
TABLE_DATE_RANGE([firebase-analytics-sample-data:android_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP()),
TABLE_DATE_RANGE([firebase-analytics-sample-data:ios_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP())
GROUP BY
  1,2
ORDER BY
  device_type_count DESC

少し複雑になりますが、次のクエリは、2 週間の間に発生した両プラットフォームのユニーク ユーザー イベントのレポートを生成するものです。ここでは、PARTITION BYEXACT_COUNT_DISTINCT でユーザー プロパティと user_dim.user_id フィールドを使用し、イベント レポートからユーザーの重複を取り除いています。


SELECT 
  STRFTIME_UTC_USEC(eventTime,"%Y%m%d") as date,
  appPlatform,
  eventName,
  COUNT(*) totalEvents,
  EXACT_COUNT_DISTINCT(IF(userId IS NOT NULL, userId, fullVisitorid)) as users
FROM (
  SELECT
    fullVisitorid,
    openTimestamp,
    FORMAT_UTC_USEC(openTimestamp) firstOpenedTime,
    userIdSet,
    MAX(userIdSet) OVER(PARTITION BY fullVisitorid) userId,
    appPlatform,
    eventTimestamp,
    FORMAT_UTC_USEC(eventTimestamp) as eventTime,
    eventName
    FROM FLATTEN(
      (
        SELECT 
          user_dim.app_info.app_instance_id as fullVisitorid,
          user_dim.first_open_timestamp_micros as openTimestamp,
          user_dim.user_properties.value.value.string_value,
          IF(user_dim.user_properties.key = 'user_id',user_dim.user_properties.value.value.string_value, null) as userIdSet,
          user_dim.app_info.app_platform as appPlatform,
          event_dim.timestamp_micros as eventTimestamp,
          event_dim.name AS eventName,
          event_dim.params.key,
          event_dim.params.value.string_value
        FROM
         TABLE_DATE_RANGE([firebase-analytics-sample-data:android_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP()),
TABLE_DATE_RANGE([firebase-analytics-sample-data:ios_dataset.app_events_], DATE_ADD('2016-06-07', -7, 'DAY'), CURRENT_TIMESTAMP())
), user_dim.user_properties)
)
GROUP BY
  date, appPlatform, eventName
同じアプリのデータが Google Analytics にある場合は、Google Analytics データを BigQuery にエクスポートし、Firebase Analytics からエクスポートされた BigQuery テーブルと JOIN することも可能です。


アナリティクス データのビジュアライズ

データの BigQuery へのエクスポートによって、モバイル アプリ データから新しいインサイトを収集したら、Google Data Studio を使用してそれをイメージとして視覚化してみましょう。


Data Studio は、BigQuery テーブルを直接読み出せるだけでなく、上述したようなカスタム クエリにも対応します。Data Studio を使用すれば、データの構造に応じた形で、時系列図、棒グラフ、円グラフ、ジオマップなど、さまざまなタイプのグラフやチャートを生成できます。


最初に、ユーザーがアプリにアクセスするために使っているデバイス タイプ(スマートフォンかタブレット)をプラットフォームごとに比較する棒グラフを描いてみましょう。先ほどのスマートフォン対タブレットのクエリを直接 Data Studio にペーストすると、次のグラフが得られます。



このグラフを見ると、iOS ユーザーの場合は、スマートフォンよりもタブレットを使ってゲームをしている傾向が強いことが簡単にわかります。


もう少し複雑にして、前述したプラットフォームごとのイベント数を比較するクエリから、比較のための棒グラフを作ることもできます。

BigQuery プロジェクトと Data Studio の詳細な接続手順については、こちらの投稿を参照してください。


使ってみよう

Firebase を初めて使う方は、ここから始めてください。すでに Firebase でモバイル アプリを構築している方は、Firebase プロジェクトと BigQuery のリンクに関する詳細なガイドを参照してください。


疑問点については、BigQuery のクエリ リファレンスと Stack Overflow の firebase-analyticsgoogle-bigquery タグをご覧ください。そして、このブログで取り上げてほしいテーマがありましたら、ぜひこちらまでお寄せください。


* この投稿は米国時間 9 月 22 日、Developer Advocate である Sara Robinson によって投稿されたもの(投稿はこちら)の抄訳です。

- Posted by Sara Robinson, Developer Advocate