Firebase Analytics データを BigQuery にインポートする

このチュートリアルでは、データを詳細に解析するため、イベントログを Firebase Analytics から Google BigQuery にエクスポートする方法を説明します。

Firebase は、データとファイルのストレージ、リアルタイム同期、認証などの機能を含めて、モバイルアプリを構築するためのプラットフォームです。 Firebase Analytics は、Firebase 機能の使用状況を追跡し、アプリの使用状況およびユーザー エンゲージメントに関するインサイトを提供します。

BigQuery は、ペタバイト級のアナリティクス データ ウェアハウスであり、巨大容量のデータに対して SQL に似たクエリをリアルタイムに近い速度で実行できます。

Firebase Analytics データを BigQuery にインポートすると、次の利点があります。

  • カスタム イベント パラメータ — Firebase Analytics では、追跡するカスタム イベントとパラメータを定義できます。Firebase Analytics データを BigQuery にインポートすることにより、標準とカスタムのイベント パラメータの両方に対して豊富な分析を実行できるようになります。

  • 複数のソースからデータを集約 — Google Analytics 360、Firebase Analytics、およびモバイル バックエンド サービスによって収集されたカスタム アナリティクスなど、複数の場所でユーザー イベントを追跡する場合、これらのすべてのソースから BigQuery にデータをインポートして、イベントデータの全体像を提供する分析を行うことができます。

  • 元データへのアクセス — Firebase Analytics ダッシュボードは、イベントデータの集約ビューを提供します。BigQuery にデータをインポートすると、元データ値にアクセスして、より柔軟にイベントの分析を行うことができるようになります。25 のイベント パラメータおよびユーザー プロパティのすべてにアクセスできます。

  • アクセス制御 — BigQuery にデータをエクスポートすると、BigQuery ACL を使用してプロジェクトとデータセットに対する権限を管理し、Firebase アプリに対するアクセス権を提供することなくデータを共有できるようになります。

  • コールドデータのアーカイブ — 元アナリティクス データを保持する必要がある場合、BigQuery にデータを取り込み、次にそのデータを Google Cloud Storage や安価で長期保存が可能な他のストレージにアーカイブすることができます。

目標

このチュートリアルでは、次の方法について説明します。

  • Firebase Analytics と BigQuery のリンク。これにより、Firebase Analytics は毎日 BigQuery にイベントログをエクスポートします。
  • イベントログを Firebase Analytics に送信する iOS アプリまたは Android アプリへのコードの追加。
  • BigQuery に保存されている Firebase Analytics のクエリ。

費用

Firebase Analytics データを BigQuery に送信するには、Firebase プロジェクトを Blaze レベルのサービスにアップグレードする必要があります。詳細については、Firebase の料金をご覧ください。

さらに、BigQuery にデータを格納およびクエリを行うと料金が発生します。詳細については、BigQuery の料金をご覧ください。

始める前に

  1. Firebase プロジェクトを作成します。

  2. Cloud Platform Console で、Firebase プロジェクトを選択します。 BigQuery API を有効にする。

    Enable the API

  3. Firebase Analytics にイベントを送信するアプリをビルドします。 サンプルアプリは、iOSAndroid、および C++ 用に使用できます。

Firebase Analytics データを BigQuery にリンク

Firebase アプリを BigQuery にリンクすると、元のサンプリングされていないイベントデータ、およびユーザーのすべてのパラメータとプロパティにアクセスできます。 Firebase アプリを BigQuery プロジェクトにリンクした後、Firebase Analytics は、対応する BigQuery データセットにイベントデータを毎日エクスポートします。

さらに、その日に受信したイベントのためのテーブルがインポートされます。このテーブルの名前は app_events_intraday_YYYYMMDD です。これらのテーブルでは、一部のフィールドが入力されません。詳細については、BigQuery エクスポート スキーマをご覧ください。

自分のデータセットをクエリ、エクスポート、または外部ソースからのデータと結合して、カスタム分析を実行できます。

Firebase プロジェクトを BigQuery にリンク

Firebase プロジェクトを BigQuery にリンクするには、次の処理を行います。

  1. Firebase コンソールを開きます。

  2. 設定の歯車をクリックし、[プロジェクトを設定] を選択します。

  3. [アカウントのリンク] タブを選択します。

  4. BigQuery カードで、[BigQuery にリンク] を選択します。

  5. BigQuery エクスポートの一部として、広告 ID を含めるかどうかを選択します。含めると、より豊富なデータが提供されますが、BigQuery で追加のストレージ コストとクエリコストが発生します。

  6. プロジェクトを BigQuery にリンクした後、イベントの最初の日次エクスポート時に、関連付けられた BigQuery プロジェクトに対応するデータセットが作成されます。毎日、リンクされた各アプリの元イベントデータが、関連付けられたデータセット内の新しいテーブルに入ります。

BigQuery にデータを送信するアプリの管理

デフォルトでは、Firebase プロジェクトを BigQuery にリンクすると、そのプロジェクト内のすべてのアプリが BigQuery にリンクされ、また後でプロジェクトに追加するアプリもリンクされます。

BigQuery にデータを送信するアプリを構成するには、次の手順に従います。

  1. Firebase コンソールを開きます。

  2. 設定の歯車をクリックし、[プロジェクトを設定] を選択します。

  3. [アカウントのリンク] タブを選択します。

  4. BigQuery カードで、[リンクを管理] をクリックします。

  5. アプリが BigQuery にデータを送信するのを停止するには、[BigQuery にデータを送信] の選択を解除します。

  6. [データを停止] をクリックして確認します。

BigQuery から Firebase プロジェクトのリンクを解除

BigQuery からリンクを解除するには、次の手順に従います。

  1. Firebase コンソールを開きます。
  2. 設定の歯車をクリックし、[プロジェクトを設定] を選択します。

  3. [アカウントのリンク] タブを選択します。

  4. BigQuery カードで、[リンクを管理] をクリックします。

  5. [プロジェクトの詳細] で、[プロジェクトのリンクを解除] をクリックします。

  6. [データを停止] をクリックして確認します。

BigQuery を使用して Firebase Analytics データをクエリ

データが BigQuery ロードされると、BigQuery を使用して、SQL に似たクエリを実行できます。詳細については、BigQuery のドキュメントでデータのクエリをご覧ください。

BigQuery は、フォームに入力して [クエリを実行] をクリックするだけで、データに対するクエリを簡単に実行できるウェブ UI を提供します。詳細については、BigQuery のドキュメントでウェブ UI を使用したクイックスタートをご覧ください。

次に、Firebase Analytics データに対して実行できるクエリの例を示します。これらのクエリは、Firebase Analytics ダッシュボードでは提供されないレポートを生成します。

カスタム イベント パラメータのクエリ

Firebase Analytics では、イベントにカスタム パラメータ キーと値を設定できます。キーは String に型指定されており、値は String 型、Long 型、または Double 型にすることができます。

以下のクエリは、カスタム イベント値を集約して、ビジネス インサイトを提供するレポートを生成する方法を具体的に示しています。

例 1:

モバイルゲーム デベロッパーは、ゲームのどのレベルで、ゲーム内の購入フローが最大になるか知りたいと思っています。そのために、プレーヤーがゲーム内購入フローを開始すると実行される、次のカスタム イベント呼び出しをゲームに追加します。

この例では、カスタム イベントの名前は trigger_purchase であり、プレーヤーが購入を開始したときのレベルを示す整数値を指定するキー level を持っています。

iOS - Objective C

[FIRAnalytics logEventWithName:@"trigger_purchase"
                parameters:@{
                              @"level": 3,
}];

iOS - Swift

FIRAnalytics.logEventWithName("trigger_purchase", parameters: [
  "level": 3
])

Android - Java

Bundle params = new Bundle();
params.putInt("level", 3);
mFirebaseAnalytics.logEvent("trigger_purchase", params);

このカスタム イベントでは、BigQuery 内の結果としてのエントリは次のようになります。

フィールド
`event_dim.name` trigger_purchase
`event_dim.params.key` level
`event_dim.params.value.int_value` 3

レベルごとの購入数を判断するため、「trigger_in_app_purchase」イベント カウントの分布を、ユーザーの現在のレベルごとにグループ化してレポートするクエリを記述します。このクエリは、データ範囲 2015/01/01 から 2016/12/31 にわたって実行されます。

SELECT COUNT(event_dim.name) as NumberOfPurchases,
event_dim.params.value.int_value as level
FROM
TABLE_DATE_RANGE(com_game_example_ANDROID.app_events_, TIMESTAMP('2015-01-01'), TIMESTAMP('2016-12-31'))
WHERE event_dim.name = 'trigger_purchase'
GROUP BY level

例 2:

同じゲームに対して作業している 2 番目のデベロッパーは、どのキャラクター クラスが最も多くの敵を倒すか知りたいと思っています。そのために、プレーヤーが敵を倒すとログを記録する次のカスタム イベントを追加します。

この例では、カスタム イベントの名前は defeat_opponent であり、敵の名前を示す文字列値を指定するキー character を持ちます。

iOS - Objective C

[FIRAnalytics logEventWithName:@"defeat_opponent"
                parameters:@{
                              @"character": "Hercules"
}];

iOS - Swift

FIRAnalytics.logEventWithName("defeat_opponent", parameters: [
  "character": "Hercules"
])

Android - Java

Bundle params = new Bundle();
params.putString("character", "Hercules");
mFirebaseAnalytics.logEvent("defeat_opponent", params);

このカスタム イベントでは、BigQuery 内の結果としてのエントリは次のようになります。

フィールド
event_dim.name defeat_opponent
event_dim.params.key character
event_dim.params.value.string_value Hercules

最も成功したキャラクター クラスを見つけるために、キャラクター クラスが defeat-opponent カスタム イベントに関係した回数をカウントするクエリを記述します。

SELECT COUNT(event_dim.name) as DefeatEvents,
event_dim.params.value.string_value as CharacterClass
FROM
TABLE_DATE_RANGE( com_game_example_ANDROID.app_events_, TIMESTAMP('2015-01-01'), TIMESTAMP('2016-12-31'))
WHERE event_dim.name = 'defeat_opponent'
AND event_dim.params.key = 'character'
GROUP BY CharacterClass
ORDER BY DefeatEvents desc

ユーザー イベントのクエリ

カスタム イベントのクエリに加えて、ユーザー イベント値を集計してビジネス インサイトを提供するレポートを生成することもできます。

例 3:

Firebase Cloud Messaging を使用して、最近アプリを利用していないユーザーに再エンゲージメントのプッシュ通知を送信します。通知の連絡先リストを作成するために、以下のクエリを使用して、この 1 年間に登録したユーザーのうち、過去 2 週間アプリを利用していないユーザーを特定します。 このクエリでは、iOS と Android の両方のユーザーが、初めてアプリを開いた日の日付とともに返されます。

以下のクエリの user_dim.user_id フィールドにはユーザー ID が含まれます。このユーザー ID は、アプリで setUserId API を呼び出して設定します。この値は、いったん設定すると Firebase Analytics で保持されて、そのユーザーに関連する以降のすべての行に含まれます。 過去の行にさかのぼって追加されることはありません。

user_dim.user_id を設定しない場合は、app_info.app_instance_id フィールドを user_dim.user_id の代わりに使用できます。このフィールドには、Firebase によって生成されるデフォルトの ID が含まれます。同じ端末で Firebase アプリをアンインストールして再インストールするたびに新しい app_info.app_instance_id が生成されることに注意してください。

BigQuery にエクスポートされるデータテーブルは、IOS アプリでは com_retail_example_IOS.app_events_<date>、Android では com_retail_example_ANDROID.app_events_<date> です。

SELECT
  userId,
  DATE(MIN( firstOpenTime )) firstOpenTime
FROM (
  SELECT
    user_dim.user_id AS userId,
    user_dim.first_open_timestamp_micros AS firstOpenTime
  FROM (TABLE_DATE_RANGE([com_retail_example_IOS.app_events_],
    DATE_ADD(CURRENT_TIMESTAMP(), -1, 'YEAR'), CURRENT_TIMESTAMP())),
    (TABLE_DATE_RANGE([com_retail_example_ANDROID.app_events_],
    DATE_ADD(CURRENT_TIMESTAMP(), -1, 'YEAR'), CURRENT_TIMESTAMP())) )
WHERE
  userId NOT IN (
  SELECT
    user_dim.user_id AS userId
  FROM (TABLE_DATE_RANGE([com_retail_example_IOS.app_events_],
    DATE_ADD(CURRENT_TIMESTAMP(), -14, 'DAY'), CURRENT_TIMESTAMP())),
    (TABLE_DATE_RANGE([com_retail_example_ANDROID.app_events_],
    DATE_ADD(CURRENT_TIMESTAMP(), -14, 'DAY'), CURRENT_TIMESTAMP())) )
GROUP BY
  userId

例 4:

iOS と Android の両方のプラットフォームでアプリのアクティブ ユーザー数が多い国を特定します。そのためには、以下のクエリを使用して、特定の日のユーザーとイベントの数を国別に表示します。

内側のクエリは、特定の行の user_idcountry を返し、その行のすべてのイベントをカウントします。このクエリでは、RECORDevent_dim として WITHIN RECORD 句を使用しています。これは、ネストされたレコードを集計する際のベスト プラクティスです。

外側のクエリでは、ユーザーの合計数の正確な値を取得するために userIdEXACT_COUNT_DISTINCT を使用しています。代わりに COUNT(DISTINCT user_id) を使用することもできますが、正確な値ではなく概算値になります。概算値の方が高速に処理できるため、非常に大きなデータセットで期間中の傾向を特定する場合など、正確さよりスピードが重視される場合には、概算値を使用できます。

SELECT
  country,
  EXACT_COUNT_DISTINCT(user_id) AS users,
  SUM(noOfEvents) AS totalEvents
FROM (
  SELECT
    user_dim.app_info.app_instance_id AS user_id,
    user_dim.geo_info.country AS country,
    COUNT(event_dim.name) WITHIN RECORD noOfEvents
  FROM
    [com_retail_example_IOS.app_events_20160723],
    [com_retail_example_ANDROID.app_events_20160723]
    )
GROUP BY
  1
ORDER BY
  2 DESC

BigQuery 内の Firebase Analytics スキーマについて

Firebase Analytics を BigQuery に接続すると、Firebase は、毎日データを BigQuery にエクスポートします。そのときに、次の形式でエクスポートします。

データセット

Firebase Analytics は、各 Firebase アプリに対して BigQuery で新しいデータセットを作成します。データセット名は [app_name]_[PLATFORM] の形式であり、ここで app_name はバンドル ID(iOS)またはパッケージ名(Android)を示します。

Firebase Analytics は、BigQuery の命名規則に合わせるため、バンドル ID またはパッケージ名のピリオドをアンダースコアに変換します。Firebase Analytics は、Firebase の命名規則に合わせるため、プラットフォーム名を大文字で指定します。

たとえば、バンドル ID として「com.username.myapp」を持つ iOS アプリに対応するデータセットは、com_username_myapp_IOS という名前のデータセットになります。

Firebase Analytics は、毎日、アプリに対応する BigQuery データセット内に新しいテーブルを作成します。テーブルには、パターン app_events_YYYYMMDD を使用して名前が付けられ、指定された日に記録されたイベントが含まれます。

イベントのバンドルに対応するテーブル内の各行。バンドルのサイズは、Firebase Analytics SDK の呼び出しでデータを送信するアプリによって決まります。

Firebase Analytics は、カスタムデータ イベントを含む列としてユーザー イベントをエクスポートします。BigQuery にエクスポートされる標準列のリストについては、Firebase ヘルプ ドキュメントで BigQuery エクスポート スキーマをご覧ください。

クリーンアップ

このチュートリアルで使用するリソースについて、Google Cloud Platform アカウントに課金されないようにするには、次の手順に従います。

請求を停止する最も単純な方法は、プロジェクトを削除することです。Firebase プロジェクトと Cloud Platform プロジェクトはまったく同じであることから、Firebase コンソールまたは Cloud Platform Console のいずれかを使用して削除できます。

  1. Cloud Platform Console で、[プロジェクト] ページに移動します。

    [プロジェクト] ページに移動する

  2. プロジェクト名の右側にある、ゴミ箱アイコンをクリックします。

Cloud Platform および Firebase プロジェクトを削除したくない場合、BigQuery からデータセットを削除することによりコストを削減できます。

  1. BigQuery ウェブ UI に移動します。

    BigQuery ウェブ UI に移動する。

  2. ナビゲーションで、アプリのデータセットの上にカーソルを合わせます。

  3. ナビゲーションのデータセット名の横にある下矢印アイコン 下矢印の画像 をクリックし、次に [データセットの削除] をクリックします。

  4. [データセットの削除] ダイアログ ボックスで、データセットの名前を入力し、[OK] をクリックして削除コマンドを確認します。

次のステップ

  • BigQuery 用のクエリの記述の詳細 — BigQuery ドキュメントのデータのクエリに同期クエリおよび非同期クエリを実行する方法、ユーザー定義の関数(UDF)を作成する方法などが説明されています。

  • BigQuery 構文の探索 — BigQuery は、SQL に類似した構文を使用します。この構文は、クエリ リファレンス(レガシー SQL)に説明されています。

フィードバックを送信...