スポットA-URシミュレーターを作りました

はじめに

REVISIOデータサイエンティストの本川です。(mtkwT (Tetsuya Motokawa) · GitHub)

12/1にスポットA-URシミュレーターというテレビCMプラニングためのツールをローンチしたので、その裏側の仕組みについて書き残します。

ツール紹介

スポットA-URシミュレーターは、テレビCMのバイイング方法の1つである「スポットCM」におけるプランニングツールです。 テレビ業界ではこれまでグロスのリーチ指標(GRPやTRPなど)が主に使用されていましたが、近年ユニークリーチ指標も着目されるようになりました。 A-URはAttention Unique Reachの略称で、REVISIO特有のテレビCM評価指標の1つです。 従来のデータではテレビ画面の前にいるという意味での接触した人数でしたが、 REVISIOではそこから先のテレビ画面を注視しているという意味で「CMに1回以上接触した人数の割合」を表すユニークリーチ指標です。

スポットA-URシミュレーターでは、関東/関西の主要5局における最適な予算配分を算出可能です。 ここでの最適な予算配分とは、A-URが最大化されるような予算配分のことです。 また、任意の予算配分を設定した時のA-URをシミュレーションすることも可能です。

以下のような背景でスポットA-URシミュレーター開発を行いました。

prtimes.jpスポットCMのユニークリーチを最大化!最適な予算配分をレコメンドする 「スポットA-URシミュレーター」の提供開始 | REVISIO株式会社のプレスリリースより引用

GRPのアクチュアル(獲得した視聴率の合計)は、年々低下傾向で達成が難しい状況にあります。そんな中、テレビCMの無駄打ちをなくし、ターゲットにきちんとテレビCMを届けたいという広告主様、広告会社様の声が多くなっておりました。 この課題を解決するため、既に一部の広告主様、広告会社様に注視ユニークリーチのご提供を開始し、主にテレビCM出稿後の効果検証を目的にご利用いただいておりました。注視ユニークリーチを高めることで、テレビCMの認知度が上がるという相関分析もできており、高評価をいただいておりました。ご利用いただいている広告主様、広告会社様より、テレビCM出稿後の効果検証だけではなく、テレビCM出稿前のプランニングにもデータを活用したいというご要望をいただき、この度、注視ユニークリーチを最大化できる最適な予算配分をシミュレーションできるツール「スポットA-URシミュレーター」を開発しました。

また、REVISIOでは「タイムCM」プランニングのためのタイムA-URシミュレーターも展開しています。 https://telescope-lp.revisio.com/wp-content/uploads/2021/06/831d002d2e9e8e2cf08c100c653f4984.pdf

ロジック

スポットA-URシミュレーターでは、ユーザ自身で以下のパラメータを設定ができます。

  • スポットCMの投下予算
  • 放送局別のCM放送単価(GRPパーコスト)
  • 放送局別のCM放送枠パターン(絵柄)

ユーザがこれらを入力すると、そのパラメータの時に局合算でのA-URが最大となるような放送局別の予算配分(局シェア)が算出されます。

ロジックのフローとしては大きく以下の2段階に分けられます。

  1. 「リーチカーブの推定」局ごとのGRP(≒投下予算)とA-URの関係性を導出
  2. 「局シェアの最適化」 総予算を条件としたときにA-URが最適となる予算配分を求める

1. リーチカーブの推定

局ごとのGRPとA-URの散布図から、リーチカーブのパラメータを推定します。 リーチカーブの関数系としては対数関数やHill関数などがよく用いられますが、 スポットA-URシミュレーターでは、以下の式で表現される負の二項分布から得られるリーチカーブを用いています。
負の二項分布から得られるリーチカーブ:

 \begin{align} 
R_b(g_b) = 1 - (\frac{\alpha}{\alpha + \theta g_b})^{\alpha}
\end{align}

高々2つのパラメータで構成されるモデルなので以下のような関数を定義し、scipy.optimize.curve_fitを用いてパラメータの推定を行うことが可能です。(Pythonの例)

def nbd_aur_function(
    g: float,
    alpha: float,
    theta: float
):
    """
    NBD(負の二項分布)から得られるA-URの曲線関数
    目的変数(A-UR)の値は[0,1]でないといけない
    """
    return 1 - (alpha / (alpha + theta * g)) ** alpha

alpha, theta, _ = scipy.optimize.curve_fit(
    nbd_aur_function, 
    grp_list, 
    aur_list
)

負の二項分布から得られるリーチカーブの導出には弊社CDOの森下による資料を参照ください。

speakerdeck.com

2. 局シェアの最適化

局ごとのリーチカーブが推定できたら、次は局シェアの最適化です。

最適化問題の定式化

最適化としては以下のような問題設定を考えます。

 \begin{align}
\max_{\boldsymbol{g}} E\lbrack R |  \boldsymbol{g} \rbrack \tag{1} \\\
s.t.\ \boldsymbol{c} \boldsymbol{g}^{T} = C
\end{align}

ここで、  Rは局合算のトータルA-UR、 \boldsymbol{g}は局ごとのGRP、 \boldsymbol{c}は局ごとのGRPパーコスト、 Cはトータルの予算を表します。
この問題を解くにはトータルA-URの条件付き期待値を \boldsymbol{g}の関数として書き下す必要があります。

トータルA-URの分解

まず、期待値の中身の R(トータルA-UR)について具体的に考えます。
個人 i = 1, 2, ..., Nに対して、CMに注視接触したら1、していなければ0を取る確率変数を R_iとします。 トータルA-URは個人全体における接触人数の割合なので、 R = \frac{1}{N} \sum_i R_{i}で計算可能です。
このとき、トータルA-URの局ごとのGRPによる条件付き期待値は以下のように分解できます。

 \begin{align}
E\lbrack R |  \boldsymbol{g} \rbrack &= E\lbrack \frac{1}{N} \sum_i R_{i} |  \boldsymbol{g} \rbrack \\\
&= \frac{1}{N} \sum_i E\lbrack R_{i} |  \boldsymbol{g} \rbrack \tag{2} \\\
&= \frac{1}{N} \sum_i Pr(R_{i} = 1 |  \boldsymbol{g})
\end{align}

1段目から2段目への変形は期待値の加法性を用いており、 2段目から3段目への変形は0, 1の値を取る確率変数の期待値は1を取る確率に等しくなる性質を用いています。
ここで、個人iごとにGRPによって条件付けられた接触確率を考えるのは難しいので、全て一定であると仮定します。
すると、

 \begin{align}
E\lbrack R |  \boldsymbol{g} \rbrack &= \frac{1}{N} \sum_i Pr(R = 1 |  \boldsymbol{g}) \\\
&= Pr(R = 1 |  \boldsymbol{g}) \tag{3}
\end{align}

のように変形ができます。

放送局合算のGRPから条件付けられる接触確率を、放送局ごとのGRPの条件付き確率を用いて分解します。
局ごとの接触が独立だと仮定すると、放送局合算の接触確率は放送局ごとの接触確率の積を1から引くことで求められます。

 \begin{align}
Pr(R = 1 |  \boldsymbol{g}) = 1 - \prod_{b \in B} {(1 - Pr(R_b = 1 | g_b))} \tag{4}
\end{align}

ここで集合 Bは放送局の集合を表します。

つまり、局合算のA-UR:  Pr(R = 1 |  \boldsymbol{g})は、 局ごとのA-UR:  Pr(R_b = 1 | g_b)が計算できれば求めることができます。
局ごとのA-UR:  Pr(R_b = 1 | g_b)は局ごとのGRPとその時のA-URの点をいくつか計算し、 負の二項分布から得られるリーチカーブ

 \begin{align} 
R_b(g_b) = 1 - (\frac{\alpha}{\alpha + \theta g_b})^{\alpha}
\end{align}

を当てはめることで近似することができます。
局ごとのA-URに分解された式を元の最適化問題に当てはめることで、局ごとの最適GRP配分を計算できます。 既に局ごとのGRPパーコストも分かっているので、最適なGRP配分が分かれば局ごとの予算配分に戻すことができます。

ただし実際には、局ごとの接触が独立であるという仮定が成り立たない可能性が高いです。
例えば、以下のような傾向があるかもしれません。

  • テレビをよく見る個人はどの局でも接触する確率が高い
  • あまりテレビを見ない人はどの局でも接触する確率が低い
  • 局Aの視聴者は局Dを見る確率が低い

スポットA-URシミュレーターではこのような視聴の特性に対して補正を行うことでより妥当な近似を行って局合算のA-URを計算しています。
詳細は割愛しますが、アイディアとしては以下のようになります。

  • 式(4)における局ごとの非接触確率の積部分:  \prod_{b \in B} {(1 - Pr(R_b = 1 | g_b))}を展開する
  • 組み合わせの項が出てくるので累乗別に共通の係数パラメータを導入し、線形モデルで補正する

アプリケーションの実装

アプリケーション実装にはStreamlitを用いました。Streamlit • A faster way to build and share data apps

Webアプリの開発に精通していない人でも簡単にフロントエンドの実装が可能になります。 特にデータフレームやグラフの可視化をするようなアプリの作成に特化しており、非常に簡単・高速に開発を行うことができます。
以下のようにシンプルな見た目ですが、開発チームの手を借りることなくフロントエンドの実装を行うことができました。 また、より凝った見た目にしたい場合はStreamlitの上からCSSを適用させることも可能なので、ある程度カスタマイズも可能です。

ユーザーの入力パラメータ画面
出力結果(一部)

ログイン機能にはAmazon Cognitoを用いて作成しました。弊社エンジニアの植草の書いた記事を参考にしました。 tech.revisio.co.jp

インフラ構築はエンジニアの方の多大なるご協力のもとでTerraformによって作成されています。 個人的にはこのTerraformによる開発体験に感銘を受けました。 Terraform Registry

最後に

REVISIOのDSチームでは主にテレビCMのマーケティング課題に対して、統計、数理モデル、機械学習を用いた分析を行っています。
スポットA-URシミュレーターは、特定のクライアントの課題を解決するために開発されましたが、 そのロジックは他の課題にも応用可能であると判断し、抽象化してツールの開発を一貫して行いました。
今回のツール開発により、Streamlitを用いたアプリケーション開発やTerraformによるインフラ構築など、スキルの幅を広げる貴重な機会となりました。