Blog

Setup Google Analytics 4 Ott Video Services

Tech Talk

Analytics

OTT

GOOGLE ANALYTICS 4をOTTビデオサービスに設定する方法

Jan 28, 2020

Google Analytics 4を活用してOTTビデオストリーミングサービスのビデオ再生イベントを追跡し、コンテンツの人気度を確認する方法をご覧ください。

2019年、GoogleはGoogle Analytics SDKを使用したモバイルアプリレポートの廃止を開始しました。これにより、OTTモバイルアプリから利用データを収集したい企業は、Googleの後継サービスに切り替える必要がありました:それが、Google Analytics 4です。

Google Analytics 4は、アプリやサイトによって生成されたOTTビデオ再生イベントをトラッキングするための強力なツールです。さらに、単純な視聴回数よりもはるかに深いレベルで、貴社のサービスにおけるコンテンツの人気度を追跡することができます。また、何人のユーザーがコンテンツを視聴しているかをほぼリアルタイムで確認することができます。

Google Analytics 4を始めよう

ゼロからデータ収集を始める立場にあるのであれば、Googleの新しいOTTデータ分析用のGoogle Analytics 4プロパティタイプ(旧App + Web)を使用することをお勧めします。これにより、ウェブサイトとアプリのトラフィックをGoogleアナリティクスの1つの表示ビューにまとめて追跡できるようになります。Googleのサポートサイトでは、Google Analytics 4プロパティを作成するための優れたステップ・バイス・テップガイドを提供しています。Google Analytics 4プロパティで新規サイトを立ち上げる方法から、すでにアナリティクスを導入しているサイトに Google Analytics 4 プロパティを追加する方法まで、いくつかの設定オプションが用意されています。

GOOGLE ANALYTICS 4でOTTのビデオイベントを開発する

初期設定

まず、Firebase SDKを含むようにOTTアプリをアップデートする必要があります。これは、Googleのクイックスタートガイドを使用して行うことができます。すでにGoogle Analytics 4のプロパティにアプリのデータストリームを追加している場合、Analyticsは自動的にリンクされたFirebaseプロジェクトを作成します。

ビデオ再生イベント

次に、特定のユーザー再生イベントが発生したときに Google Analytics 4にイベントを送信するように、動画プレーヤーを更新する必要があります。すべての動画再生イベントが特定のユーザーに関連付けられるように、必ずユーザーIDを設定してください。これは、匿名 ID(登録不要で無料の OTT 動画を提供している場合など)でも、サブスクライバーIDでもかまいません。ユーザーIDにメールアドレスを使用することは、PIIに該当し、Googleの利用規約に反するため、避けてください。すべての動画再生イベントに対して、イベント名を 「video_playback」 に設定し、イベントに以下のパラメーターを含めます。

以下のアクションが発生したときにGoogle Analytics 4にイベントを送信します。

Androidのサンプルコード

このサンプルコードでは、動画プレーヤーから Google Analytics 4に送信できるさまざまな種類の再生イベントを示します:

class MainActivity : AppCompatActivity(){

private lateinit var firebaseAnalytics: FirebaseAnalytics override fun onCreate(savedInstanceState: Bundle?){ super.onCreate(savedInstanceState) // firebase developer documentation // https: //firebase.google.com/docs/reference/android/com/google/firebase/analytics/package-summary firebaseAnalytics = FirebaseAnalytics.getInstance(this) // set user id firebaseAnalytics.setUserId(“test_user_id”) / video playback events / // video start val videoStartBundle = Bundle() videoStartBundle.putString(“video_event”,”start”) videoStartBundle.putString(“video_id”,”tt7984734″) videoStartBundle.putString(“video_title”,”The Lighthouse”) videoStartBundle.putInt(“video_position”,0) videoStartBundle.putInt(“video_duration”,6540) videoStartBundle.putDouble(“video_progress”,0.0) firebaseAnalytics.logEvent(“video_playback”, videoStartBundle) // video pause val videoPauseBundle = Bundle() videoPauseBundle.putString(“video_event”,”pause”) videoPauseBundle.putString(“video_id”,”tt7984734″) videoPauseBundle.putString(“video_title”,”The Lighthouse”) videoPauseBundle.putInt(“video_position”,654) videoPauseBundle.putInt(“video_duration”,6540) videoPauseBundle.putDouble(“video_progress”,10.0) firebaseAnalytics.logEvent(“video_playback”, videoPauseBundle) // video resume val videoResumeBundle = Bundle() videoResumeBundle.putString(“video_event”,”resume”) videoResumeBundle.putString(“video_id”,”tt7984734″) videoResumeBundle.putString(“video_title”,”The Lighthouse”) videoResumeBundle.putInt(“video_position”,654) videoResumeBundle.putInt(“video_duration”,6540) videoResumeBundle.putDouble(“video_progress”,10.0) firebaseAnalytics.logEvent(“video_playback”, videoResumeBundle) // video rewind val videoRewindBundle = Bundle() videoRewindBundle.putString(“video_event”,”rewind”) videoRewindBundle.putString(“video_id”,”tt7984734″) videoRewindBundle.putString(“video_title”,”The Lighthouse”) videoRewindBundle.putInt(“video_position”,327) videoRewindBundle.putInt(“video_duration”,6540) videoRewindBundle.putDouble(“video_progress”,5.0) firebaseAnalytics.logEvent(“video_playback”, videoRewindBundle) // video fast-forward val videoFastForwardBundle = Bundle() videoFastForwardBundle.putString(“video_event”,”fastforward”) videoFastForwardBundle.putString(“video_id”,”tt7984734″) videoFastForwardBundle.putString(“video_title”,”The Lighthouse”) videoFastForwardBundle.putInt(“video_position”,4905) videoFastForwardBundle.putInt(“video_duration”,6540) videoFastForwardBundle.putDouble(“video_progress”,75.0) firebaseAnalytics.logEvent(“video_playback”, videoFastForwardBundle) // video stop val videoStopBundle = Bundle() videoStopBundle.putString(“video_event”,”stop”) videoStopBundle.putString(“video_id”,”tt7984734″) videoStopBundle.putString(“video_title”,”The Lighthouse”) videoStopBundle.putInt(“video_position”,6000) videoStopBundle.putInt(“video_duration”,6540) videoStopBundle.putDouble(“video_progress”,91.74) firebaseAnalytics.logEvent(“video_playback”, videoStopBundle) // video skip val videoSkipBundle = Bundle() videoSkipBundle.putString(“video_event”,”skip”) videoSkipBundle.putString(“video_id”,”tt7984734″) videoSkipBundle.putString(“video_title”,”The Lighthouse”) videoSkipBundle.putInt(“video_position”,6000) videoSkipBundle.putInt(“video_duration”,6540) videoSkipBundle.putDouble(“video_progress”,91.74) firebaseAnalytics.logEvent(“video_playback”, videoSkipBundle) // video progress // send progress events at: // – first 30 seconds reached // – 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 100% of video completion val videoProgressBundle = Bundle() videoProgressBundle.putString(“video_event”,”progress”) videoProgressBundle.putString(“video_id”,”tt7984734″) videoProgressBundle.putString(“video_title”,”The Lighthouse”) videoProgressBundle.putInt(“video_position”,654) videoProgressBundle.putInt(“video_duration”,6540) videoProgressBundle.putDouble(“video_progress”,10.0) firebaseAnalytics.logEvent(“video_playback”, videoProgressBundle) setContentView(R.layout.activity_main) }}

   override fun onCreate(savedInstanceState: Bundle?){
       super.onCreate(savedInstanceState)

       // firebase developer documentation
       // https: //firebase.google.com/docs/reference/android/com/google/firebase/analytics/package-summary

       firebaseAnalytics = FirebaseAnalytics.getInstance(this)

       // set user id
       firebaseAnalytics.setUserId(“test_user_id”)

       / video playback events /

       // video start
       val videoStartBundle = Bundle()
       videoStartBundle.putString(“video_event”,”start”)
       videoStartBundle.putString(“video_id”,”tt7984734″)
       videoStartBundle.putString(“video_title”,”The Lighthouse”)
       videoStartBundle.putInt(“video_position”,0)
       videoStartBundle.putInt(“video_duration”,6540)
       videoStartBundle.putDouble(“video_progress”,0.0)
       firebaseAnalytics.logEvent(“video_playback”, videoStartBundle)

       // video pause
       val videoPauseBundle = Bundle()
       videoPauseBundle.putString(“video_event”,”pause”)
       videoPauseBundle.putString(“video_id”,”tt7984734″)
       videoPauseBundle.putString(“video_title”,”The Lighthouse”)
       videoPauseBundle.putInt(“video_position”,654)
       videoPauseBundle.putInt(“video_duration”,6540)
       videoPauseBundle.putDouble(“video_progress”,10.0)
       firebaseAnalytics.logEvent(“video_playback”, videoPauseBundle)

       // video resume
       val videoResumeBundle = Bundle()
       videoResumeBundle.putString(“video_event”,”resume”)
       videoResumeBundle.putString(“video_id”,”tt7984734″)
       videoResumeBundle.putString(“video_title”,”The Lighthouse”)
       videoResumeBundle.putInt(“video_position”,654)
       videoResumeBundle.putInt(“video_duration”,6540)
       videoResumeBundle.putDouble(“video_progress”,10.0)
       firebaseAnalytics.logEvent(“video_playback”, videoResumeBundle)

       // video rewind
       val videoRewindBundle = Bundle()
       videoRewindBundle.putString(“video_event”,”rewind”)
       videoRewindBundle.putString(“video_id”,”tt7984734″)
       videoRewindBundle.putString(“video_title”,”The Lighthouse”)
       videoRewindBundle.putInt(“video_position”,327)
       videoRewindBundle.putInt(“video_duration”,6540)
       videoRewindBundle.putDouble(“video_progress”,5.0)
       firebaseAnalytics.logEvent(“video_playback”, videoRewindBundle)

       // video fast-forward
       val videoFastForwardBundle = Bundle()
       videoFastForwardBundle.putString(“video_event”,”fastforward”)
       videoFastForwardBundle.putString(“video_id”,”tt7984734″)
       videoFastForwardBundle.putString(“video_title”,”The Lighthouse”)
       videoFastForwardBundle.putInt(“video_position”,4905)
       videoFastForwardBundle.putInt(“video_duration”,6540)
       videoFastForwardBundle.putDouble(“video_progress”,75.0)
       firebaseAnalytics.logEvent(“video_playback”, videoFastForwardBundle)

       // video stop
       val videoStopBundle = Bundle()
       videoStopBundle.putString(“video_event”,”stop”)
       videoStopBundle.putString(“video_id”,”tt7984734″)
       videoStopBundle.putString(“video_title”,”The Lighthouse”)
       videoStopBundle.putInt(“video_position”,6000)
       videoStopBundle.putInt(“video_duration”,6540)
       videoStopBundle.putDouble(“video_progress”,91.74)
       firebaseAnalytics.logEvent(“video_playback”, videoStopBundle)

       // video skip
       val videoSkipBundle = Bundle()
       videoSkipBundle.putString(“video_event”,”skip”)
       videoSkipBundle.putString(“video_id”,”tt7984734″)
       videoSkipBundle.putString(“video_title”,”The Lighthouse”)
       videoSkipBundle.putInt(“video_position”,6000)
       videoSkipBundle.putInt(“video_duration”,6540)
       videoSkipBundle.putDouble(“video_progress”,91.74)
       firebaseAnalytics.logEvent(“video_playback”, videoSkipBundle)

       // video progress
       // send progress events at:
       // – first 30 seconds reached
       // – 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90%, 100% of video completion
       val videoProgressBundle = Bundle()
       videoProgressBundle.putString(“video_event”,”progress”)
       videoProgressBundle.putString(“video_id”,”tt7984734″)
       videoProgressBundle.putString(“video_title”,”The Lighthouse”)
       videoProgressBundle.putInt(“video_position”,654)
       videoProgressBundle.putInt(“video_duration”,6540)
       videoProgressBundle.putDouble(“video_progress”,10.0)
       firebaseAnalytics.logEvent(“video_playback”, videoProgressBundle)

       setContentView(R.layout.activity_main)
   }
}

Google Analytics 4のデバッグ

Google Analytics 4には、テストを非常に効率化するDebugView機能があります。この機能を有効にすると、Google Analytics 4コンソールにほぼリアルタイムで配信されるイベントのストリームが表示されます。また、Google Analytics 4コンソールでは見ることができない、すべてのカスタム・イベント・パラメータと値を見ることができます。この機能を使用して、イベントが正しい時間に正しい値で発火していることを確認することを強くお勧めします。

BIGQUERYでエクスポート

Google Analytics 4とGoogle Analyticsでは、生のデータにアクセスするための新しい枠組みがあります。Google AnalyticsはこれまでReporting APIを提供してきましたが、Google Analytics 4ではGoogle BigQueryと呼ばれるデータベースを提供します。

BigQuery for Google Analytics 4を有効にするには、いくつかの追加ステップが必要です。Blazeプランは従量課金制のプランで、Googleが1ヶ月あたりの利用枠を無料で提供しているため、アプリから発生するトラフィックの量によっては、利用料金の支払いがほとんど発生しない場合もあります。

BigQueryとの連携は、設定を有効にした日からデータ配信が開始されるため、できるだけ早く有効にすることをお勧めします。BigQueryに遡ってデータが反映されることはありません。

BigQueryのセットアップには、いくつかの重要な利点があります:

  • データの迅速なアドホック分析の提供
  • 生データに簡単にアクセスできます

一部のデータ(カスタム・パラメータなど)は、Google Analytics 4コンソールでは全体を表示できませんが、BigQueryではすべてのデータを利用できます。生データへのアクセスは、アドバンスド・ユーザーや、完全なデータセットに依存する BrightcoveAudience Insights のようなサードパーティのオーディエンス分析プラットフォームにとって不可欠です。