みなさんこんにちは!
私たちは開発者です(誇らしげに聞こえますよね?)、そして私たちは積極的に新機能を見つけ、バグを修正し、製品を改善しようとしています。 しかし、ユーザーが製品をどのように使用しているか、どの製品が好きか、どれがあまり良くないかを正確に理解するために、分析を使用します。 さまざまなツールがありますが、この記事では、開発と変更が活発に行われているGoogleの分析について具体的に説明したいと思います。 Google Analyticsという名前の古い戦闘機は、新しい戦闘機-Firebase用Google Analytics(旧称-Firebase Analytics)に置き換えられました。
名前でも、この変化の風をつかむことができます。 そして、変化の風は常に何らかの情報の空白を作り出し、そこにはさまざまな種類の噂が入りますが、それは常に信頼できるものではありません。
したがって、この分析で何が起こっているのか、最終的に何を使用するのかを詳細に理解してみましょう。 そして、生き続ける方法。
Googleアナリティクスに関する多くの情報があり、それが体系化されている場合(このリソースの価値、理想的なリファレンス)、Firebase向けのGoogleアナリティクスには、若くて活発に開発されている製品の典型的な病気があります-情報がほとんどなく、散在し、時には矛盾していることさえあります。 そして、私はかつて何が何であるかを理解するために多くの時間とエネルギーを費やした。
実際、この記事の主な目標は、Firebase向けGoogleアナリティクスの知識と現在の状態を体系化することです。 Firebase向けGoogleアナリティクスのロードマップ。
この「カード」は時間と神経をかなり節約してくれると確信しています=)
最も重要な神話。 Googleアナリティクスall
それでも、私は一番ホットなものから始めます。
Firebase Analyticsの登場以来、この噂が続いているように思えます。 そして一方で、Googleが2つの分析ツールを必要とする理由は論理的です。 ただし、Googleアナリティクス(GAと呼びます)とFirebase向けGoogleアナリティクス(以前はFAと呼びましょう)は、概念とアプローチが異なる2つの分析であり、これについては以下で説明します。
GAはどこにも行きませんし、消えません(少なくとも今のところ)、また誰にも飲み込まれません。 これは、Googleのモスクワ事務所の代表者からの情報と、開発者自身からの内部者の両方です。
GAファンはよく眠れます...今のところ。 しかし、誰が次に何が起こるかを知っています。 したがって、読み続けることを強くお勧めします=)
GA対FA。 一般的な概念
FAは、まったく異なる概念と哲学を持つ分析です。 イベントベースであり、携帯電話専用に設計されています。 GAはスクリーンベースであり、最初はWeb向けでしたが、その後初めて携帯電話向けに吹き替えられました。
GAは1つの値を持つ階層イベントを中心に構成され、FAは多数のパラメーター(キーと値のペア)を持つ1つのイベントを記録することを目的としています。
これらのアナリストは非常に異なっています。 したがって、それらを交換することはできません。
あるものから別のものへの移行は提供されません。 しかし、Googleはこれらのアナリストの特定の互換性に取り組んでいます。これについては後で説明します。
GA対FA。 イベント
すでにイベントのテーマに触れたので。 「イベント」を理解するという点では、GAとFAは非常に異なっています。 そして、これは例で特に顕著です。
アプリケーションがゲームであるとしましょう。 ゲームの最後に、ユーザーが最終的にどのようにプレイしたかに関する統計を送信します。 そして、ユーザーから合計スコア、殺された敵の数、完了したラウンドの数を知りたいと思います。
GAでは、次のようになります。
// total score mTracker = googleAnalytics.newTracker(R.xml.tracker_global_config); HitBuilders.EventBuilder builder = new HitBuilders.EventBuilder() .setCategory("gameOver") .setAction("totalScore") .setLabel("") .setValue(gameStats.getTotalScore()); mTracker.send(builder.build()); // enemies beaten mTracker = googleAnalytics.newTracker(R.xml.tracker_global_config); HitBuilders.EventBuilder builder = new HitBuilders.EventBuilder() .setCategory("gameOver") .setAction("enemiesBeaten") .setLabel("") .setValue(gameStats.getEnemiesBeaten()); mTracker.send(builder.build()); // roundsSurvived mTracker = googleAnalytics.newTracker(R.xml.tracker_global_config); HitBuilders.EventBuilder builder = new HitBuilders.EventBuilder() .setCategory("gameOver") .setAction("roundsSurvived") .setLabel("") .setValue(gameStats.getRoundsSurvived()); mTracker.send(builder.build());
GAでは、各イベントは基本的にパラメーターの階層を表します。
カテゴリ->アクション->ラベル->値
また、コンソール自体では、このパラメーターの階層を確認できます。 実際、追跡したいイベントを発明するとき、このパラダイムに導かれるべきです。 コンソールでも、これらのパラメーターに応じてさまざまなフィルターを作成できます。
しかし、GAにはイベントに関して小さなマイナスがあります。 上記に加えて、イベントに追加のパラメーターを追加したい場合、ここでは「カテゴリー」->「アクション」->「ラベル」->「値」の周りで踊り、新しい定式化などを考え出す必要があります。 不便。 少なくとも以前はそうでした。
さて、これらの統計をFAでどのように打ち負かすことができるかを見てみましょう。
Bundle params = new Bundle(); params.putLong("totalScore", gameStats.getTotalScore()); params.putLong("enemiesBeaten", gameStats.getEnemiesBeaten()); params.putLong("roundsSurvived", gameStats.getRoundSurvived()); mFirebaseAnalytics.logEvent("game_over", params);
ご覧のとおり、3つのイベントの代わりに、より論理的で便利な1つのイベントを送信します。 FAの「イベント」については、以下で詳しく説明します。
GA対FA。 コンソール
第二に、アナリストが非常に異なっているよりも、コンソールです。
GAでのコンソールの外観は次のとおりです ( 写真はクリック可能です )。
「イベント」は、左側の「動作」タブの奥深くに隠されています。 ただし、標準レポートはすぐにカテゴリ、アクション、ラベル ( クリック可能な画像 )に分類されます。
最初に表示されるのは概要です。 そして、私はすぐにユーザーエンゲージメントカード( クリック可能な画像 )に注意を払います 。
最後に、画面の通常の表示がFAコンソールに追加されました。 5月まで、私たちはそれなしで生きました。 つまり、ユーザーエンゲージメントイベントは送信されましたが、コンソールで表示できませんでした。 ひどかった。 そして、これはおそらく誰もがFAに切り替えたくない理由の1つです。
ご覧のように、[ イベント ]タブはダッシュボードのすぐ後ろにあり、FAがイベントの処理に向けられていることを確認します。 また、コンソールにも少し戻って、FAの「イベント」のこの広範なトピックに飛び込むことを提案します。
FAイベント
コードを簡単に見てみましょう。
Bundle bundle = new Bundle(); bundle.putString(FirebaseAnalytics.Param.ITEM_ID, id); bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, name); bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, "image"); mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle);
アプリケーションでは、定義済みのイベントを含む最大500種類のイベントを送信できます( FirebaseAnalytics.Event.SELECT_CONTENT
は事前定義されていますが、独自のタイプを設定することもできます)。 送信されるイベントの総数は制限されていません( ソース )。
各イベントに最大25個のパラメーターを添付できます ( Bundle
)。 パラメータも事前定義されていますが、カスタムパラメータの設定を禁止する人はいません。 ここで説明します 。
イベントとパラメーターのタイプは通常のString
です。
イベント名とパラメーター名は大文字と小文字が区別されます。 同じイベントは、タイプとパラメーターが一致する必要があります。
さらに、デフォルトでディスパッチされるイベントがあります。 説明付きの自動的に送られたイベントの全リストはこのリンクで与えられます。 ご覧のとおり、以前は受信できなかったような非常に興味深いイベントがたくさんあります。 かっこいい!
また、上記のリンクでは、特定のイベントに対して選択できる定義済みのイベントとパラメーターを確認できます。
FAイベント。 「紙の上では滑らかでしたが、渓谷を忘れていました」
イベントとパラメーターの事前定義された名前について、どういうわけか不審なことに言われていることに気付きました。 また、説明のための例では、通常送信されるのはこれらのイベントとパラメーターです。 しかし、これは偶然ではありません。 10個のカスタムパラメータを使用してイベントを送信するとします。 そして、イベントのコンソールに以下が表示されます( クリック可能な画像 ):
「しかし、私のすべての選択肢はどこにありますか?」とあなたは尋ねます。 しかし、このようにコンソールにはありません。
事実、すべての美しいグラフィックやものは、事前定義された名前を使用した場合にのみ構築されます。 独自の「カスタム」を使用すると、何も表示されません。 「イベントの数」と「ユーザーの数」のみ。
そして、I / O 17の前は、ひどい痛みでした。 チャートは、この記事のように、たとえばValueパラメーターを使用して作成できます。 しかし、これはもちろん、それだけではありません。
そして、ここではもちろん、すべてが人々のためのものであるGAについて思い出し、あらゆるもののためにあらゆる種類のフィルターを作成します。
しかし、ここで少し待ち伏せ。 標準レポート-はい、問題なくビルドできます。 ただし、ほとんどの場合、カスタムレポートが必要です。 たとえば、セカンダリディメンションを追加して、デバイスモデルごとにイベントを並べ替えます。 そして、ここで「サンプリング」という恐ろしい言葉がポップアップします。
レポートによって、GAのサンプリングアルゴリズムは異なります。 Googleは、各レポートでサンプルがどのように考慮されるかを正確に開示していませんが、一般に、すべての慣行はすでに知られています。 これは通常、 hiベースのサンプリングまたはcookieベースのサンプリングです。 最初のケースでは、すべてのレコード(イベント、ビューなど)からランダムサンプルが取得され、2番目のケースでは、すべてのユーザー(これがモバイルアプリケーションの場合、マークアップCookieまたはgaid / idfa)からランダムサンプルが取得されます。
したがって、各フィールドのエラーについて確実に話すことは不可能です。
実際には、5%を超えるサンプルでは、イベントレポートの絶対数の誤差は2.5%未満であると彼らは言います。
サンプリングに関する情報を提供するために、YandexのAlexander Sergeevに感謝します。
FAイベント。 継続
うん。 これらの「イベント」ではすべてが簡単ではありません。 実際、FAは一般の人々の希望を満たします。
まず、FAにはサンプリングがありません。 すべてのデータが利用可能です。
また、Google Analytics 360(サンプリングなしのGAの有料版)のコストはかなり大きいため、これは非常にクールです。 また、FAでは、データをBigQueryにアップロードして、必要な処理を実行できます。
次に、I / O 17の後、カスタムパラメータを使用してレポートを作成できるようになりました。
特定のイベントの画面で、 カスタムパラメータを登録するように求められます ( クリック可能な画像 ):
ただし、このアプリケーションでは合計で、これらのパラメーターを最大50個 ( 10個のテキストと40個の数値 )登録できます 。 この制限を回避するためにライフハックを試しました。異なるイベントに対して同じ名前のカスタムパラメータを登録しました。 役に立たなかったが、それでも「プラスワン」が行われた。
さらに、すぐに既成のレポートが表示されることを期待している場合は、お急ぎください。 レポートは累積的に構築されます。 レポートを作成するカスタムパラメータ「custom_1」を持つ「event_1」があるとします。 コンソールでは、このレポートを時点Xで作成するように構成しました。したがって、時点Xの後に来るすべてのイベント「event_1」はレポートに含まれます。また、時点Xまでのすべての「event_1」は悲しいことに処理されません。 だから注意してください。
つまり、より良いように見えますが、それほどではありません。 さらにmore辱的なことに、これらのレポートを何らかの形で組み合わせることはできません。 しかし、おそらくコンソールからの要求が多すぎます。 データを使用して何かをしたい場合は、BigQueryの素晴らしい世界へようこそ。 データの謎のこのベールを少し開きましょう。
Bigquery
BigQueryは通常、わずかに異なる銀河です。
プレミアムモードがある場合にのみ、GAを介してBigQueryを操作できます。 FAの[イベント]タブで、接続を確立するように求められます( クリック可能な図 )。
Googleは次のように述べています。「私たちはあなたに車を渡しますが、ガソリン代はあなたが支払います。」 ここで関税計画を見つけることができます 。 しかし、試してみるだけで、無料のBlaze関税制限で十分であると信じてください。 そして、軍隊の製品を扱うときでさえ、同志のレビューから判断して、支払いは非常にarbitrary意的です。
それでは、知り合いを始めましょう。 これがBigQueryコンソールの外観です( クリック可能な画像 ):
使用可能なデータのリストが左側のメニューに表示されます。 たとえば、 TestStepは、構成内に1つのアプリケーションがある私のテストプロジェクトです。 また、 bigquery-public-dataとPublic Datasetsは、ご想像のとおり、実験してクエリの作成を練習できるパブリックデータです。
右側には、成功したものとそうでないものの両方のリクエストのリストが表示されます。
それでは、2017年3月14日のテストアプリケーションデータ(表app_events_20170314、 クリック可能な数字 )を見てみましょう。
その日のすべてのデータをテーブルに投げました(52イベント)。 全体の表は目の前に表示されます。 ご覧のとおり、ここでは、すべてのプロパティを含む各イベントについて、可能な限り完全に説明します。これについては、以下で説明します。
データプレビュー([プレビュー]タブ、 クリック可能な画像 )を見てみましょう。
外出先での表形式ビューは有益ではありません。 より理解しやすい形式はJSON( クリック可能な画像 )です。
そして、イベント全体を紹介します。 何らかの理由で、UIでjson表示ウィンドウを展開できないため、最後の5つのイベントの完全なjsonを個別に提供します。
[ { "user_dim": { "user_id": null, "first_open_timestamp_micros": "1488878151620000", "user_properties": [ { "key": "first_open_time", "value": { "value": { "string_value": null, "int_value": "1488880800000", "float_value": null, "double_value": null }, "set_timestamp_usec": "1488878151620000", "index": null } } ], "device_info": { "device_category": "mobile", "mobile_brand_name": null, "mobile_model_name": null, "mobile_marketing_name": null, "device_model": "507SH", "platform_version": "6.0.1", "device_id": null, "resettable_device_id": null, "user_default_language": "ru-ru", "device_time_zone_offset_seconds": "10800", "limited_ad_tracking": "false" }, "geo_info": { "continent": "Europe", "country": "Russia", "region": "Moscow", "city": "Moscow" }, "app_info": { "app_version": "1.0", "app_instance_id": "d0c587de4d5804ddc1d34f8d54b981f9", "app_store": "manual_install", "app_platform": "ANDROID", "app_id": "com.example.matsyuk.testfirebase" }, "traffic_source": null, "bundle_info": { "bundle_sequence_id": "65", "server_timestamp_offset_micros": "-496748" }, "ltv_info": null }, "event_dim": [ { "date": "20170314", "name": "user_engagement", "params": [ { "key": "firebase_screen_class", "value": { "string_value": "SecondActivity", "int_value": null, "float_value": null, "double_value": null } }, { "key": "firebase_event_origin", "value": { "string_value": "auto", "int_value": null, "float_value": null, "double_value": null } }, { "key": "firebase_screen_id", "value": { "string_value": null, "int_value": "1109587836504693342", "float_value": null, "double_value": null } }, { "key": "engagement_time_msec", "value": { "string_value": null, "int_value": "4424", "float_value": null, "double_value": null } } ], "timestamp_micros": "1489478210462000", "previous_timestamp_micros": "1489478205970000", "value_in_usd": null } ] }, { "user_dim": { "user_id": null, "first_open_timestamp_micros": "1488878151620000", "user_properties": [ { "key": "first_open_time", "value": { "value": { "string_value": null, "int_value": "1488880800000", "float_value": null, "double_value": null }, "set_timestamp_usec": "1488878151620000", "index": null } } ], "device_info": { "device_category": "mobile", "mobile_brand_name": null, "mobile_model_name": null, "mobile_marketing_name": null, "device_model": "507SH", "platform_version": "6.0.1", "device_id": null, "resettable_device_id": null, "user_default_language": "ru-ru", "device_time_zone_offset_seconds": "10800", "limited_ad_tracking": "false" }, "geo_info": { "continent": "Europe", "country": "Russia", "region": "Moscow", "city": "Moscow" }, "app_info": { "app_version": "1.0", "app_instance_id": "d0c587de4d5804ddc1d34f8d54b981f9", "app_store": "manual_install", "app_platform": "ANDROID", "app_id": "com.example.matsyuk.testfirebase" }, "traffic_source": null, "bundle_info": { "bundle_sequence_id": "64", "server_timestamp_offset_micros": "-515257" }, "ltv_info": null }, "event_dim": [ { "date": "20170314", "name": "user_engagement", "params": [ { "key": "firebase_screen_class", "value": { "string_value": "MainActivity", "int_value": null, "float_value": null, "double_value": null } }, { "key": "firebase_event_origin", "value": { "string_value": "auto", "int_value": null, "float_value": null, "double_value": null } }, { "key": "firebase_screen_id", "value": { "string_value": null, "int_value": "1109587836504693341", "float_value": null, "double_value": null } }, { "key": "engagement_time_msec", "value": { "string_value": null, "int_value": "17278", "float_value": null, "double_value": null } } ], "timestamp_micros": "1489478205970000", "previous_timestamp_micros": "1489153178047000", "value_in_usd": null } ] }, { "user_dim": { "user_id": null, "first_open_timestamp_micros": "1488878151620000", "user_properties": [ { "key": "first_open_time", "value": { "value": { "string_value": null, "int_value": "1488880800000", "float_value": null, "double_value": null }, "set_timestamp_usec": "1488878151620000", "index": null } } ], "device_info": { "device_category": "mobile", "mobile_brand_name": null, "mobile_model_name": null, "mobile_marketing_name": null, "device_model": "507SH", "platform_version": "6.0.1", "device_id": null, "resettable_device_id": null, "user_default_language": "ru-ru", "device_time_zone_offset_seconds": "10800", "limited_ad_tracking": "false" }, "geo_info": { "continent": "Europe", "country": "Russia", "region": "Moscow", "city": "Moscow" }, "app_info": { "app_version": "1.0", "app_instance_id": "d0c587de4d5804ddc1d34f8d54b981f9", "app_store": "manual_install", "app_platform": "ANDROID", "app_id": "com.example.matsyuk.testfirebase" }, "traffic_source": null, "bundle_info": { "bundle_sequence_id": "63", "server_timestamp_offset_micros": "-500210" }, "ltv_info": null }, "event_dim": [ { "date": "20170314", "name": "ga_event", "params": [ { "key": "label", "value": { "string_value": "label1", "int_value": null, "float_value": null, "double_value": null } }, { "key": "firebase_screen_class", "value": { "string_value": "MainActivity", "int_value": null, "float_value": null, "double_value": null } }, { "key": "action", "value": { "string_value": "action1", "int_value": null, "float_value": null, "double_value": null } }, { "key": "firebase_event_origin", "value": { "string_value": "app", "int_value": null, "float_value": null, "double_value": null } }, { "key": "value", "value": { "string_value": null, "int_value": "1", "float_value": null, "double_value": null } }, { "key": "category", "value": { "string_value": "category1", "int_value": null, "float_value": null, "double_value": null } }, { "key": "firebase_screen_id", "value": { "string_value": null, "int_value": "1109587836504693341", "float_value": null, "double_value": null } } ], "timestamp_micros": "1489478204880000", "previous_timestamp_micros": "1489137436229000", "value_in_usd": null } ] }, { "user_dim": { "user_id": null, "first_open_timestamp_micros": "1488878151620000", "user_properties": [ { "key": "first_open_time", "value": { "value": { "string_value": null, "int_value": "1488880800000", "float_value": null, "double_value": null }, "set_timestamp_usec": "1488878151620000", "index": null } } ], "device_info": { "device_category": "mobile", "mobile_brand_name": null, "mobile_model_name": null, "mobile_marketing_name": null, "device_model": "507SH", "platform_version": "6.0.1", "device_id": null, "resettable_device_id": null, "user_default_language": "ru-ru", "device_time_zone_offset_seconds": "10800", "limited_ad_tracking": "false" }, "geo_info": { "continent": "Europe", "country": "Russia", "region": "Moscow", "city": "Moscow" }, "app_info": { "app_version": "1.0", "app_instance_id": "d0c587de4d5804ddc1d34f8d54b981f9", "app_store": "manual_install", "app_platform": "ANDROID", "app_id": "com.example.matsyuk.testfirebase" }, "traffic_source": null, "bundle_info": { "bundle_sequence_id": "62", "server_timestamp_offset_micros": "-499813" }, "ltv_info": null }, "event_dim": [ { "date": "20170314", "name": "select_content", "params": [ { "key": "firebase_screen_class", "value": { "string_value": "MainActivity", "int_value": null, "float_value": null, "double_value": null } }, { "key": "content_type", "value": { "string_value": "image", "int_value": null, "float_value": null, "double_value": null } }, { "key": "item_name", "value": { "string_value": "name1", "int_value": null, "float_value": null, "double_value": null } }, { "key": "firebase_event_origin", "value": { "string_value": "app", "int_value": null, "float_value": null, "double_value": null } }, { "key": "firebase_screen_id", "value": { "string_value": null, "int_value": "1109587836504693341", "float_value": null, "double_value": null } }, { "key": "item_id", "value": { "string_value": "1", "int_value": null, "float_value": null, "double_value": null } } ], "timestamp_micros": "1489478204208000", "previous_timestamp_micros": "1489137435605000", "value_in_usd": null } ] }, { "user_dim": { "user_id": null, "first_open_timestamp_micros": "1488878151620000", "user_properties": [ { "key": "first_open_time", "value": { "value": { "string_value": null, "int_value": "1488880800000", "float_value": null, "double_value": null }, "set_timestamp_usec": "1488878151620000", "index": null } } ], "device_info": { "device_category": "mobile", "mobile_brand_name": null, "mobile_model_name": null, "mobile_marketing_name": null, "device_model": "507SH", "platform_version": "6.0.1", "device_id": null, "resettable_device_id": null, "user_default_language": "ru-ru", "device_time_zone_offset_seconds": "10800", "limited_ad_tracking": "false" }, "geo_info": { "continent": "Europe", "country": "Russia", "region": "Moscow", "city": "Moscow" }, "app_info": { "app_version": "1.0", "app_instance_id": "d0c587de4d5804ddc1d34f8d54b981f9", "app_store": "manual_install", "app_platform": "ANDROID", "app_id": "com.example.matsyuk.testfirebase" }, "traffic_source": null, "bundle_info": { "bundle_sequence_id": "61", "server_timestamp_offset_micros": "-537470" }, "ltv_info": null }, "event_dim": [ { "date": "20170314", "name": "session_start", "params": [ { "key": "firebase_screen_class", "value": { "string_value": "MainActivity", "int_value": null, "float_value": null, "double_value": null } }, { "key": "firebase_event_origin", "value": { "string_value": "auto", "int_value": null, "float_value": null, "double_value": null } }, { "key": "firebase_screen_id", "value": { "string_value": null, "int_value": "1109587836504693341", "float_value": null, "double_value": null } } ], "timestamp_micros": "1489478198696000", "previous_timestamp_micros": "1489137330069000", "value_in_usd": null } ] } ]
美しさなど!
それでは、クエリを詳しく見てみましょう。 最初のものを選択しましょう( クリック可能な画像 ):
そして、私たちの前に次の画面が開きます( クリック可能な画像 ):
私たちの要求はまったくarbitrary意的です。 [結果]タブに注意してください。 実際には、クエリの結果が表示されます。
[説明]タブを開くと、リクエストを渡す詳細なプロセスが表示されます( クリック可能な画像 )。
さて、最も興味深いタブはジョブ情報( クリック可能な画像 )です:
処理済みバイト、請求済みバイト、およびバイト層を確認してください。 リクエスト中に26.4 KBが処理されましたが、Bites Tier = 1の下限で支払います。つまり、10 MBを支払います。 ただし、 ドキュメントから判断すると、1か月あたり1 TBが無料で、その後の料金はそれぞれ5ドルです。 十分にプレイして試してみるだけで十分です。 さて、重要な追加-あなたは成功したリクエストに対してのみ支払います!
BigQueryの非常に短い概要でさえ、かなり大きなものです。 これは、必要に応じてデータを分析できる非常に強力で機能的なツールです。 しかし、GAまたはFAの通常のコンソールとは異なり、BigQueryの5分では間違いなく理解できません。 したがって、チームまたは会社にこれを理解し、あらゆる種類の結果を得ることができる人がいれば、とてもクールです。
この人になりたい場合は、Googleの紹介ビデオから始めることができます。ちなみに、このビデオではコストの計算についても説明しています。 良い記事もあります-1 つと 2つ 。 さらに、 BigQueryの 公式ドックと本 (本全体、Karl!)を掘り下げることをお勧めします。
誰かがすでにこの方向にうまく掘り進めていて、ヒントや経験を共有できるなら素晴らしいでしょう=)
また、 Data StudioなどのBigQueryには、そこにデータをロードして便利に視覚化できるUIラッパーがあることに注意してください。 Data Studioはまだベータ版ですが、将来的には非常に便利なツールになると約束されています。
ユーザーのプロパティ
実際、ユーザープロパティはイベントの不可欠な部分であるため、イベントのテーマを継続します。
ユーザープロパティ(ロシア語の「ユーザープロパティ」)は、言語、地理的位置など、ユーザーベースのさまざまなセグメントを説明できる標識です。 これらは、各イベントに付加されるため、 スティッキーパラメーターとも呼ばれます。
最初は、デフォルトでプロパティのみが各イベントに添付されます。 そして、コード内で同様のコードを呼び出す場合:
mFirebaseAnalytics.setUserProperty("license_property", mLicenseType);
事前に設定された値(値「mLicenseType」)を持つプロパティ「license_property」が、その後の各イベントに添付されます。 また、アプリケーション、電話などを再起動した後でも、このプロパティは添付されます。 つまり、プロパティはpersistenceでもあります。
この場合、最初にコンソールでプロパティを登録する必要があります( クリック可能な画像 ):
ここおよびapiですべてを詳しく説明します 。
特定のアプリケーションでは、 最大25個のプロパティを送信できます (デフォルトで送信されるプロパティを除く)。 デフォルトで送信されるプロパティのリストはこちらです。
実際、コンソールでは、プロパティと「オーディエンス」(以下「オーディエンス」について少し説明します)で何でもフィルタリングできます。 たとえば、イベント( クリック可能な図面 ):
GA setUserProperty(...)
のsetUserProperty(...)
は、メソッドsetCustomDimension(...)
およびsetCustomMetric(...)
です。 唯一のことは、ディメンションデータとメトリックデータがスティッキーで永続的ではないことです。セッションごとに各イベントに手動で添付する必要があります。
イベント。 FA +その他の分析
すべてのアプリケーションには、少なくとも2つの分析ツールがあると思います。 通常、もっとたくさんあります。 アナリストも進歩的な人々であり、じっとしていません。 しかし、私たちは皆それをサポートしています。 はい、プラストラフィック。 だから何をするのが良いですか?
さまざまなオプションについて説明した非常に優れたGoogleの記事が既にあります。
簡単にご紹介しますので、次のように考えてください。
- 個別の分析を個別に送信するだけです。 コードでは、どこかで使用する何らかのユニバーサルファサードを作成する可能性があります。
短所は明らかだと思います。 より多くのトラフィックとコード。 - Googleタグマネージャー 。
このマネージャーはコンソールを介して接続され、そこで構成されます。 , ( build.gradle ), FA- — . Google Tag Manager FA- , (GA, AppsFlyer Google Tag Manager ). , FA (, - ).
. , , , , , . , , Google Tag Manager. , .
. — , , . — FA Google Tag Manager GA ecommerce data. - BigQuery.
, , GA FA, . GA BigQuery , Google Analytics 360.
FA
, . Android Studio , . , 15 . API? , .
FA Android Studio Assistant google-services.json
. , , , — FA.
build.gradle
:
dependencies { classpath 'com.google.gms:google-services:3.0.0' // ... }
google-services
— , google-services.json
, , FA. google-services
( FA). , app/build.gradle
:
apply plugin: 'com.google.gms.google-services'
google-services.json
Firebase, , .
{ "project_info": { "project_number": "887654601522", "firebase_url": "https://fir-test3-4bab3.firebaseio.com", "project_id": "fir-test3-4bab3", "storage_bucket": "fir-test3-4bab3.appspot.com" }, "client": [ { "client_info": { "mobilesdk_app_id": "1:887654601522:android:9c6c1c11f784b956", "android_client_info": { "package_name": "com.example.matsyuk.firebasetest3" } }, "oauth_client": [ { "client_id": "887654601522-o8rolth1g5mq5qq650844chk07mib2un.apps.googleusercontent.com", "client_type": 1, "android_info": { "package_name": "com.example.matsyuk.firebasetest3", "certificate_hash": "82f13b732dec32c5ebd4498c3a7acf4bda23a846" } }, { "client_id": "887654601522-4riqkg424gb236q6mqehksn03u4hoqqg.apps.googleusercontent.com", "client_type": 3 } ], "api_key": [ { "current_key": "AIzaSyAYRPNTcgxWP7qUzI__kx9gSwxnIgc3iBo" } ], "services": { "analytics_service": { "status": 1 }, "appinvite_service": { "status": 2, "other_platform_oauth_client": [ { "client_id": "887654601522-4riqkg424gb236q6mqehksn03u4hoqqg.apps.googleusercontent.com", "client_type": 3 } ] }, "ads_service": { "status": 2 } } } ], "configuration_version": "1" }
google-services
json , your_project\app\build\generated\res\google-services\debug\values\values.xml
:
<?xml version="1.0" encoding="UTF-8"?> <resources> <string translatable="false" name="default_web_client_id">887654601522-4riqkg424gb236q6mqehksn03u4hoqqg.apps.googleusercontent.com</string> <string translatable="false" name="firebase_database_url">https://fir-test3-4bab3.firebaseio.com</string> <string translatable="false" name="gcm_defaultSenderId">887654601522</string> <string translatable="false" name="google_api_key">AIzaSyAYRPNTcgxWP7qUzI__kx9gSwxnIgc3iBo</string> <string translatable="false" name="google_app_id">1:887654601522:android:9c6c1c11f784b956</string> <string translatable="false" name="google_crash_reporting_api_key">AIzaSyAYRPNTcgxWP7qUzI__kx9gSwxnIgc3iBo</string> <string translatable="false" name="google_storage_bucket">fir-test3-4bab3.appspot.com</string> </resources>
, firebase_database_url
, google_storage_bucket
.. Firebase, .
google-services.json
.
. Example applicationId
, , , com.fa.example
. flavors:
productFlavors { dev { applicationId "com.fa.example.dev" } qa { applicationId "com.fa.example.qa" } prod { // applicationId "com.fa.example" } }
FA Android Studio Assistant. Example , :
app/google-services.json
, ( flavors applicationId
) . flavor .
, google-services.json
. google-services.json
.
. Example FA. flavor . flavor . :
- flavor build.gradle.
:
google-services.json
( ) .
. ,
buildTypes
,build.gradle
- :
buildTypes { release { } ultra_debug { applicationIdSuffix ".ultra_debug" } debug { applicationIdSuffix ".debug" } }
ultra_debug
debug
. , buildTypes flavors:
productFlavors { dev { applicationId "com.fa.example.dev" } qa { applicationId "com.fa.example.qa" } prod { // applicationId "com.fa.example" } }
Android Studio Assistant FA. , ?
=) :
com.fa.example.debug com.fa.example.dev.debug com.fa.example.qa.debug
«debug», . .
.
flavors. flavor (, custom
), applicationId
, flavor :
productFlavors { dev { applicationId "com.fa.example.dev" } qa { applicationId "com.fa.example.qa" } prod { // applicationId "com.fa.example" } custom { // applicationId "com.fa.example" } }
, applicationId
. それではどうなりますか? :
- ( Example , ) .
-
com.fa.example
. -
google-services.json
. -
google-services.json
( ).
google-services.json
. google-services plugin
flavor. google-services.json
, . , google-services.json
app
. .
. , google-services.json
, app/
( flavors ), , . . GA id, FA . ( SO ):
FirebaseOptions options = new FirebaseOptions.Builder() .setApplicationId("bla-bla") // Required for Analytics. .setApiKey("bla-bla") // Required for Auth. .setDatabaseUrl("bla-bla") // Required for RTDB. .build(); FirebaseApp.initializeApp(this /* Context */, options, "secondary");
«Missing google_app_id. Firebase Analytics disabled» . Firebase .
google-services
- .
データを送信する
GA setLocalDispatcher(...)
. . , FA . GA setLocalDispatcher(-1)
, dispatchLocalHits()
. , , , ..
FA , .
setAnalyticsCollectionEnabled(boolean enabled)
, . , , :
<meta-data android:name="firebase_analytics_collection_enabled" android:value="false" />
, , :
setAnalyticsCollectionEnabled(true);
. setAnalyticsCollectionEnabled(true)
. :
<meta-data android:name="firebase_analytics_collection_deactivated" android:value="true" />
FA
FA . . , . StreamView/DebugView ( ):
StreamView, , . Snapshot ( User snapshot ), ( ):
DebugView . - . events properties, , events c properties . , DebugView .
StreamView DebugView .
«» FA
GA, FA, , «», « » .. , , , = . しかし、これはそうではありません。 — , ( foreground). API FA :
setMinimumSessionDuration (long milliseconds); // default 10 sec setSessionTimeoutDuration (long milliseconds); // default 30 min
minimumSessionDuration, . foreground minimumSessionDuration, .
, sessionTimeoutDuration, . , - , ( foreground), sessionTimeoutDuration+ ( , ), .
FA-
Audiences
, « , ». «» properties «country» = «Russia» «sex» = «male» event «reg_comleted» ( event) = «true».
Funnels
=)
, GA.
Attribution Cohorts. , , . , .
.
FA. 結論
. .
長所:
- FA — . , .
- FA events + BigQuery. FA. . BigQuery, . , «» FA .
- . , , . «». GA - , .
- Firebase. RemoteConfig. , .
短所:
- , . =)
- . , . . . .
, FA . , GA? ?
. . BigQuery. - , , — « », . , . FA + BigQuery. , .
, ! , ! !
PS , =)
PPS . 16 2017 MOSDROID , Android. , . . .