BigQuery と Firebase Analytics によるモバイル アプリのカスタム分析
2016年9月28日水曜日
今年 5 月の Google I/O で、Firebase はモバイル アプリのデベロッパーを支援する新しい製品スイートを発表しました。

また、使用言語や地理的な位置といった、ユーザー ベースのさまざまなセグメントを表現するために定義した属性を格納する user_properties レコードも、ユーザー データに含まれています。なお、Firebase Analytics はデフォルトで数種類のユーザー プロパティをキャプチャするため、独自に定義できるプロパティは 25 個までです。
このグラフを見ると、iOS ユーザーの場合は、スマートフォンよりもタブレットを使ってゲームをしている傾向が強いことが簡単にわかります。

BigQuery プロジェクトと Data Studio の詳細な接続手順については、こちらの投稿を参照してください。
新しい 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 BY と EXACT_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 にペーストすると、次のグラフが得られます。


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

使ってみよう
Firebase を初めて使う方は、ここから始めてください。すでに Firebase でモバイル アプリを構築している方は、Firebase プロジェクトと BigQuery のリンクに関する詳細なガイドを参照してください。
疑問点については、BigQuery のクエリ リファレンスと Stack Overflow の firebase-analytics、google-bigquery タグをご覧ください。そして、このブログで取り上げてほしいテーマがありましたら、ぜひこちらまでお寄せください。
* この投稿は米国時間 9 月 22 日、Developer Advocate である Sara Robinson によって投稿されたもの(投稿はこちら)の抄訳です。
- Posted by Sara Robinson, Developer Advocate
- Posted by Sara Robinson, Developer Advocate
0 件のコメント :
コメントを投稿