探索的データ分析を実施する

データを収集したら、探索的データ分析(EDA)を行ってデータ品質の問題を特定し、対処します。これは、マーケティング ミックス モデリング(MMM)の重要なステップです。このステップでデータを評価することで、マーケティング活動、顧客の反応、その他の関連指標をデータが正確に表していることを確かめられるからです。EDA プロセスで発見した問題を修正することで、モデル出力の信頼性を高めることができます。

EDA を行う基本的な流れは次のとおりです。

  1. データの確認を行って、欠落しているデータや不完全なデータを特定します。
  2. 未加工の入力ファイル内の欠損値を修正します。
  3. データの精度を評価します。
  4. データの異常値、外れ値、不正確な部分を修正します。
  5. KPI、メディア、コントロール変数の間の相関関係を確認します。

メリディアンの EDA パッケージ

メリディアンの EDA パッケージを活用すれば、Google ドライブにエクスポート可能な探索的データ分析(EDA)HTML レポートを生成できるため、このプロセスをスムーズに進めることができます。この HTML レポートでは、ビジュアリゼーションとデータチェックが表示されるため、よくある潜在的なデータ問題の特定を簡単に行えます。各チェックまたはビジュアリゼーションには、データの問題点に関する説明と、それに対して取るべき具体的なアクションが記載されています。

検出された結果は、次の 3 つの重大度のいずれかに分類されます。

  • エラー: モデルの収束を妨げる可能性が非常に高い、極めて重大なデータの問題を示します。ERROR ステータスにはデフォルトの厳格なしきい値が使用され、最も重大なエラー(通常はデータ入力エラー)のみにこのステータスが報告されます。これらの問題を解決するまで、事後分布のサンプリングはブロックされます。
  • 注意: 重大なデータの問題の可能性を示します。これらの問題は、厳密にはモデルの収束を妨げるものではないかもしれませんが、精査や修正を検討すべき箇所であることを強く示唆しています。特定のユースケースではモデルの実行が妥当な場合もあるため、メリディアンでは事後分布のサンプリングをそのまま続行できるようになっています。ただし、現在のデータを用いて分析を続行することが適切かどうかは、ご自身のビジネス状況に照らして判断する必要があります。
  • 情報: ERROR または ATTENTION のステータスがトリガーされなかった場合、またはしきい値が設定されていないチェックに対してこのステータスが表示されます。これらのステータスでは、有用なモデルの構築を十分に期待できますが、それでも INFO レベルの指標とビジュアリゼーションを確認し、潜在的なデータの異常や不整合を特定しておくことをおすすめします。

EDA HTML 出力では、データの問題が次の 5 つのカテゴリに分類されます。

  1. 費用とメディア ユニット: チャネルレベルの費用シェアを分析し、費用とメディア ユニットを相互チェックします。
  2. 個々の説明変数または応答変数: 個々の変数のばらつきを調査し、標準偏差がゼロ(ばらつきがない状態)や極端な外れ値などの問題を特定します。
  3. 説明変数の人口スケーリング: 人口と説明変数の関係を評価します。
  4. 変数間の関係: 変数間の相関関係と、説明変数と時間または地域の主効果の関係を調べます。
  5. 事前分布の指定: 事前分布の設定内容、具体的には負のベースラインが生じる事前確率を評価します。

セットアップとレポートの生成

次の手順に沿って、EDA HTML レポートを生成するか、このドキュメントで説明する個々のデータチェックを実行します。

  1. まず、Meridian モデルと MeridianEDA オブジェクトをインスタンス化します。次のセットアップ コードを 1 回実行します。

    from meridian.model import model
    from meridian.model.eda import meridian_eda
    
    mmm = model.Meridian(...)
    mmm_eda = meridian_eda.MeridianEDA(mmm)
    

    注: このページの以降のコード スニペットでは、このセットアップを省略し、mmm_eda オブジェクトを使用する特定のメソッド呼び出しのみが表示されます。

  2. セットアップが完了したら、次のコードを実行して EDA HTML レポートの完全版を生成し、保存します。

    import IPython
    
    mmm_eda.generate_and_save_report(
        filename=your_filename, filepath=your_filepath
    )
    IPython.display.HTML(filename=f'{your_filepath}{your_filename}')
    

カテゴリ 1: 費用とメディア ユニット

このカテゴリでは、チャネルレベルの費用シェアを分析し、費用をメディア ユニットと相互チェックします。

費用シェア

出力例:

相対的な費用シェア

HTML レポートの棒グラフには、費用が下位 5 つのチャネルについて、各メディア チャネルと RF チャネルが全国レベルの費用(地域レベルのモデルの場合は、各地域の数値を集計したもの)に占める割合が表示されます。

合計費用に対する各チャネルの割合を確認します。費用シェアが極めて小さいチャネルは、推定が困難な場合があります。そのような場合は、他のチャネルと統合することを検討してください。

特定の地域に絞ったり、費用シェアが低いチャネルを任意の数だけ指定したりして、費用シェアをプロットすることも可能です。以下のように記述します。

mmm_eda.plot_relative_spend_share_barchart(
    geos=<list_of_geos>, n_channels=<your_integer_choice>
)

パラメータに対するデータポイントの比率

費用シェアの内訳を確認したら、モデル パラメータに対するデータポイントの比率を評価します。この比率は、モデル パラメータを確実に推定するために必要なデータ量の目安となります。この比率を評価する最も正確な方法は、モデルを実行して信頼区間の幅を評価する方法です。

この比率は n_data_points ÷ n_parameters として定義されます。ここで

  • n_data_points = n_geos × n_times
  • n_parameters = n_geos - 1 + n_knots + n_controls + n_treatments

この計算で使用される構成要素は次のとおりです。

  • n_geos: データセット内の地域の数。ベースラインの地域については 1 を減算します。
  • n_times: 期間の数。
  • n_knots: ModelSpecknots 引数を使用して指定されたノットの数。
  • n_controls: コントロール変数の数。
  • n_treatments: 有料メディア、オーガニック メディア、有料 RF、ORF、メディア以外の介入変数を含む、介入変数の合計数。

この計算では、n_treatmentsn_controls の個別の地域レベルのパラメータは除外されます。メリディアンの階層モデルでは、地域レベルの効果は独立していません。地域間で情報を共有することで、パラメータの有効数を大幅に減らすことができます。全国レベルの数値は、実用的で許容範囲の広いベースラインとして機能します。プーリングを想定しない厳密なビューとの比較については、必要なデータ量をご覧ください。

この比率が極めて小さい場合は、推定に必要なデータが不足している可能性があります。その場合は、分散が大きくなり、推定値の信頼性が損なわれます。このような場合は、チャネルを除外または統合するか、ModelSpecknots 引数を使用してノットの数を減らすことを検討してください。どのチャネルを修正するかを決定する際は、費用シェア サブセクションから得られた分析情報を活用して、費用が最も少ないチャネルを特定してください。

データ要件および地域の階層モデルの微妙な差異について詳しくは、必要なデータ量をご覧ください。

費用、メディア ユニット数、メディア ユニット単価

メディア チャネルと RF チャネルについては、費用、メディア ユニット数、メディア ユニット単価の相互チェックが行われます。ここで分析されるメディア ユニットは、未加工(未スケーリング)のメディア ユニットです。RF チャネルの場合、メディア ユニットは RF インプレッション数です。これは、未加工(未スケーリング)リーチ数に頻度を乗じて算出されます。

これらの相互チェックにより、費用とメディア ユニットのデータ間の不整合(費用がゼロでメディア ユニットが正の値、費用が正の値でメディア ユニットがゼロなど)が特定されます。不整合が見つかった場合は、ATTENTION ステータスが報告されます。このステータスが報告された有料メディア チャネルとその費用のデータ入力を確認します。

このチェックでは、メディア ユニット単価(費用をメディア ユニット数で割った値)に外れ値がある場合にも、ATTENTION ステータスが報告されます。メリディアンの EDA パッケージでは、四分位範囲(IQR)の経験則を使用して外れ値を定義します。値が Q1 - 1.5 × IQR より小さいか、Q3 + 1.5 × IQR より大きい場合、その値は外れ値と見なされます。HTML の表には、最も極端な外れ値の上位 5 つについて、メディア ユニット単価の絶対値が降順で表示されます。これらのチャネルで、データ入力エラーが発生していないか確認します。

次のコードを実行すると、すべてのメディア チャネルと RF チャネルについて、期間(地域モデルの場合は地域)ごとに算出されたメディア ユニット単価を取得できます。

# For geo models
[geo_cpm] = mmm_eda.geo_cost_per_media_unit_check_outcome.get_geo_artifacts()
geo_cpm.cost_per_media_unit_da

# For national models
[national_cpm] = (
    mmm_eda.national_cost_per_media_unit_check_outcome
    .get_national_artifacts()
)
national_cpm.cost_per_media_unit_da

HTML レポートには、ATTENTION ステータス(不整合または外れ値)を報告されたチャネルの時系列プロット(2 つ)も含まれています。1 つ目のプロットでは、チャネルレベルの費用の時系列データにメディア ユニットの時系列データが重ねて表示されます。2 番目のプロットには、メディア ユニット単価がチャネルごとに時系列で表示されます。各時系列プロットには、1 つのチャネルのデータが表示されます。

これらの HTML 時系列プロットは、全国レベルの数量に基づいています。地域レベルのデータセットでは、メディア ユニット単価を算出する前に、まず各チャネルの費用とメディア ユニットが全国レベルに集計されます。ATTENTION ステータスが報告されていない場合、これらのプロットは EDA HTML レポートに表示されません。

出力例:

費用、メディア ユニット数、メディア ユニット単価の時系列

特定のチャネルと地域について、費用、メディア ユニット数、メディア ユニット単価を時系列にプロットして、データの特定のサブセットを重点的に分析できます。以下のように記述します。

mmm_eda.plot_cost_per_media_unit_time_series(  
    geos=<list_of_geos>, channels=<list_of_channels>
)

注: ユーザーの費用データに時間ディメンションまたは地域ディメンションがない場合、メディア ユニットの比率に基づいて、それらのディメンションへ自動的に割り当てが行われます。これにより、メディア ユニット単価が一定になり、費用とメディア ユニット数の間に不整合が生じなくなります。その結果、これらの特定のデータチェックは常にパスすることになります。

カテゴリ 2: 個々の説明変数または応答変数

各変数のばらつきを箱ひげ図で示します。

グラフでは、変数は次のようにグループ化されます。

  • 有料メディアとオーガニック メディアのスケーリング済みインプレッション数: これらは入力データのドキュメントで詳述されているものと同じ変換が行われるため、1 つのグラフにまとめて表示されます。これには、RF チャネルと ORF チャネルのスケーリング済み RF インプレッション数が含まれます。スケーリング済み RF インプレッション数は、スケーリング済みリーチ数に頻度を掛けて算出されます。
  • スケーリング済みコントロール変数とメディア以外の介入変数: これらの変数は同様の方法で変換されるため、別のグラフに共に表示されます。
  • スケーリング済み KPI: 独自の箱ひげ図で表示されます。

地域レベルのデータセットの場合、メリディアンの EDA パッケージではまず、未加工(未スケーリング)変数が全国レベルに集計され、入力データのドキュメントに従って変数を変換してから、箱ひげ図が作成されます。

箱ひげ図に示されている説明変数と応答変数のばらつきを確認します。ばらつきが非常に小さい説明変数は推定が難しく、モデルの収束を妨げる可能性があります。それらを統合するまたは置き換えるか、無視できるほど小さい変数を除外するか、あるいは関連情報がある場合はカスタムの事前分布を使用することを検討してください。外れ値が見つかった場合は、入力データを確認し、それが単なる入力ミスではなく、実際に発生した正当な数値であるか検証してください。

出力例:

有料メディア変数とオーガニック メディア変数の箱ひげ図

メディア以外の介入変数とコントロール変数の箱ひげ図

KPI の箱ひげ図

特定の地域に関する箱ひげ図を作成できます。以下のように記述します。

# For paid and organic scaled impressions
mmm_eda.plot_treatments_without_non_media_boxplot(geos=<list_of_geos>)

# For controls and non-media treatments
mmm_eda.plot_controls_and_non_media_boxplot(geos=<list_of_geos>)

# For KPI
mmm_eda.plot_kpi_boxplot(geos=<list_of_geos>)

ばらつきの重大な欠如

変換された KPI の標準偏差は、地域モデルの場合はすべての地域と時間、全国モデルの場合はすべての時間で算出されます。変換済み KPI がほぼ完全に一定の場合(標準偏差が 1e-4 未満の場合)、ERROR がトリガーされます。つまり、応答変数にシグナルがないということです。データ入力エラーを確認するか、このデータセットを使用した統計モデリングの実現可能性を再検討する必要があります。

説明変数については、メリディアンはまず、時間ディメンションと地域ディメンション(該当する場合)に沿って、スケーリング済みのコントロール変数と介入変数(RF チャネルと ORF チャネルのスケーリング済みリーチを含む)の標準偏差を個別に算出します。

  • 地域間のばらつき: 全国モデルには地域が 1 つしかないため、地域ディメンションに沿ったスケーリング済み変数の標準偏差は、地域レベルのデータセットでのみ評価されます。ERROR ステータスは、knots = n_times を設定していて、地域間で変化しない変数(たとえば、地域レベルのデータセットに存在する全国レベルの変数)がある場合に発生します。knots = n_times の場合、各期間に独自のノット パラメータが割り当てられます。全国レベルの変数は、時間の経過とともに変化しますが、地域によって変化することはありません。そのため、時間と完全な共線関係にあり、フルノット モデルでは冗長になります。この冗長性を解消するには、(1)全国レベルの変数を保持して knots < n_times を設定するか、(2)地域間で変化しない変数を除外します。どちらを選択するかは、具体的な解釈の目的によって異なります。
  • 時間によるばらつき: 地域モデルの場合、変数が時間によって変化しないと、地域の主効果 $au_g$ と完全に共線関係になるため、ERROR ステータスが発生します。このような冗長な変数はモデルの収束を妨げるため、時間によって変化しない変数は除外する必要があります。全国モデルの場合、時間の経過とともに変化しない変数は、シグナルをもたらさない定数項として機能し、モデルの収束を妨げる原因となります。ERROR ステータスが発生するため、この定数変数はモデルから除外する必要があります。

外れ値とデータのスパース性の可能性

メリディアンの EDA パッケージでは、標準の四分位範囲(IQR)の経験則を使用して、スケーリング済みの介入変数、コントロール変数、KPI の外れ値もそれぞれチェックされます(このチェックは、地域レベルのデータセットでは地域単位で行われます)。

外れ値が存在する場合、ATTENTION ステータスが報告され、EDA HTML レポートに最も極端な外れ値の上位 5 つ(絶対値に基づく)が表示されます。これらの値が正当なものであり、誤りではないことを確認するために、入力データを検証する必要があります。

外れ値の特定とは別に、外れ値を含めた場合と除外した場合の両方で各変数の標準偏差を算出することで、データのスパース性の可能性も評価します。外れ値を削除した後に標準偏差がゼロになった場合(つまり、変数のばらつきが外れ値のみに起因する場合)、このチェックでは追加の ATTENTION ステータスが報告されます。

  • 外れ値を削除した後に介入変数またはコントロール変数の標準偏差がゼロになる場合、それはデータがスパースであることを示唆している可能性があります。これは意図的なもの(「ゴーダーク」期間によるデータのスパース性など)である可能性もありますが、モデルの収束や識別可能性に影響を与えるおそれがあります。これが意図したとおりのものであるか確認してください。意図したものでない場合は、モデルの安定性を高めるために、これらの変数を集計することを検討してください。
  • 外れ値を除去した後に、特定の地域で KPI の標準偏差がゼロになる場合は、その地域の応答変数においてシグナルが弱いか、あるいは存在しないことを意味します。入力データを見直すか、これらの地域を一つにまとめることを検討してください。

次のコードを使用すると、各変数の標準偏差(地域モデルでは特定の地域ごとに算出)を取得し、アクセスしやすいように辞書形式にまとめることができます。

# For geo models
geo_std = mmm_eda.geo_stdev_check_outcome.analysis_artifacts
geo_std_dict = {a.variable: a.std_ds for a in geo_std}

# For national models
national_std = mmm_eda.national_stdev_check_outcome.analysis_artifacts
national_std_dict = {a.variable: a.std_ds for a in national_std}

カテゴリ 3: 説明変数の人口スケーリング

このカテゴリは、地域レベルのデータセットにのみ適用されます。全国レベルのデータセットでは、単一の(全国)地域は名目上の人口が 1.0 として扱われます。また、メリディアンの内部スケーリング(中央値スケーリングまたは標準化)によって全国的な人口の影響が相殺されるため、人口の値がモデルに影響を及ぼすことはありません。

人口と、有料メディアまたはオーガニック メディアの未加工変数の相関関係

このチェックでは、地域の人口と、有料メディアまたはオーガニック メディアの未加工の変数の間のスピアマン相関を評価します。これらの変数には、未加工のメディア ユニット、未加工のリーチ(RF チャネルの場合)、未加工のオーガニック メディア ユニット、未加工のオーガニック リーチ(ORF チャネルの場合)が含まれます。ここでは、人口とこれらの変数の間にある対数線形関係を調べるために、スピアマン相関を用いて評価を行います。

これらの変数については、スピアマンの相関係数が正の値になることが想定されます。相関が低い場合や負の相関が見られる場合は、入力データを確認してください。メリディアンの EDA パッケージのこれらのチェックでは、ERRORATTENTION のステータスではなく、INFO のみがトリガーされますが、値を確認することを強くおすすめします。

出力例:

人口と、工メディアの未加変数間の相関関係

次のコードを使用して、前述の各変数の相関値を取得できます。

[pop_corr_raw] = (
    mmm_eda.eda_engine.check_population_corr_raw_media()
    .get_overall_artifacts()
)
pop_corr_raw.correlation_ds

人口と、スケーリング済みの介入変数およびコントロール変数の相関関係

ここでスケーリング済みの介入変数およびコントロール変数とは、入力データのドキュメントに従って変換された数量を指します。メディア以外の介入変数とコントロール変数についても、それぞれ ModelSpecnon_media_population_scaling_id 引数と control_population_scaling_id 引数に依存した形で処理されます。人口と、スケーリング済みの介入変数ユニットまたはコントロール変数との間のスピアマン相関を確認してください。

  • コントロール変数とメディア以外のチャネル: メリディアンでは、デフォルトではこれらの変数は人口でスケーリングされることはありません。相関性が高い場合は、ModelSpeccontrol_population_scaling_id または non_media_population_scaling_id 引数を使用して、人口スケーリングを適用することをおすすめします。詳細については、人口のスケーリング コントロール変数をご覧ください。
  • 有料メディア チャネルとオーガニック メディア チャネル: これらのチャネルは、デフォルトで自動的に人口スケーリングが実施されます。相関が高い場合は、変数がメリディアンに渡される前に人口スケーリングが実施されている可能性があります。データ入力のパイプライン(工程)をご確認ください。

前のチェックと同様に、このチェックは INFO としてのみ報告されますが、値を確認する必要があります。

出力例:

人口とスケーリング済み変数の相関関係

次のコードを使用して、相関値を取得できます。

[pop_corr_scaled] = (
    mmm_eda.eda_engine.check_population_corr_scaled_treatment_control()
    .get_overall_artifacts()
)
pop_corr_scaled.correlation_ds

カテゴリ 4: 変数間の関係

このカテゴリでは、変数間の相関関係に加えて、説明変数と時間または地域の主効果との関係を詳しく見ていきます。

相関ヒートマップ

変数間のペアワイズ相関が高いと、モデルの識別可能性や収束に問題が生じる可能性があります。強い相関が見られる場合は、該当する変数を統合することを検討してください。

出力例:

相関ヒートマップ

ヒートマップは、スケーリング済みの介入変数とコントロール変数の間のピアソン相関を示しています。スケーリング済み介入変数には、RF チャネルと ORF チャネルの両方のスケーリング済み RF インプレッションが含まれます。ここでいうスケーリング済みの介入変数とコントロール変数は、入力データのドキュメントに記載されている手順に従って変換された数値を指します。HTML ヒートマップには、全国レベルでスケーリングされた変数に基づく相関関係が表示されます。地域レベルのデータセットの場合、未加工(未スケーリング)変数は全国レベルに集計され、変換されてから、ペアワイズ相関が算出されます。

次のコードを使用して、特定の地域の相関ヒートマップをプロットできます。

mmm_eda.plot_pairwise_correlation(geos=<list_of_geos>)

分散拡大係数(VIF)を用いた多重共線性のチェック

多重共線性をさらに詳しく評価するため、スケーリング済みの介入変数ユニットとコントロール変数すべてについて、分散拡大係数(VIF)を算出します。VIF は、他の介入変数またはコントロール変数との共線性によって、各変数の分散がどの程度増大するかを推定します。VIF が 1 であれば共線性がないことを示し、値が大きくなるほど多重共線性の度合いが強まります。変数間の完全なペアワイズ相関は、多重共線性を引き起こす典型的な要因です。多重共線性が高いと、係数の信頼区間が広くなり、事後分布の推論の信頼性が低下します。

VIF チェックによってデータが評価され、モデルタイプに応じて、次のようなステータスがトリガーされます。

  • 地域モデルの ERROR ステータス: 地域モデルの場合、すべての地域と時間に対して VIF が算出されます。具体的には、すべての地域と時間の各変数の値が単一の配列にフラット化され、これらのフラット化された配列ごとに VIF が算出されます。ある変数が他の変数のほぼ完全な線形結合として表現され、VIF がデフォルトの全体しきい値である 1,000 を超えた場合に、ERROR ステータスがトリガーされます。この問題に対処するには、他の変数の線形結合となっている変数を除外するか、それらの変数を統合することを検討してください。

    次のコードを使用して、地域モデルの全体的な VIF(すべての地域と時間に対して算出)を取得できます。

    [overall_vif] = mmm_eda.eda_engine.check_geo_vif().get_overall_artifacts()
    overall_vif.vif_da
    
  • 全国モデルの ERROR ステータス: 全国モデルの場合、地域は 1 つしかないため、すべての時間に対して VIF が算出されます。変数の VIF がデフォルトの全国しきい値 1,000 を超えると、ERROR ステータスがトリガーされます。この問題に対処するには、他の変数の線形結合となっている変数を除外するか、それらの変数を統合することを検討してください。

    次のコードを使用して、全国モデルの算出済み VIF を取得できます。

    [national_vif] = mmm_eda.eda_engine.check_national_vif().get_national_artifacts()
    national_vif.vif_da
    
  • 地域モデルの ATTENTION ステータス: 地域モデルの場合、特定の地域ごとにすべての時間に対して VIF が算出されます。個々の地域内で変数がデフォルトの地域しきい値 1,000 を超えると、ATTENTION ステータスがトリガーされます。この問題に対処するには、データを確認するか、これらの変数を結合することを検討してください。特に、複数の地域で高い VIF が見られる場合は、この対応が重要になります。

    次のコードを使用して、地域モデルにおける個々の地域の VIF を取得できます。

    [geo_vif] = mmm_eda.eda_engine.check_geo_vif().get_geo_artifacts()
    geo_vif.vif_da
    

必要に応じて、これらの極端なしきい値を調整できます。これらのしきい値の設定方法の詳細については、VIF のカスタムしきい値をご覧ください。

これらの ERROR ステータスまたは ATTENTION ステータスのいずれかがトリガーされると、HTML レポートには VIF が最も大きい上位 5 つの変数が表形式で表示され、それらの変数と相関関係が強い他の変数が一覧表示されます。

地域の主効果 $\tau_g$ との共線性

このチェックでは、地域をカテゴリ変数として、各変数の回帰分析を行います。この分析では、R-squared(決定係数)が高いほど、その変数の時間的なばらつきが小さいことを意味します。その結果、地域の主効果によってモデルの識別性が弱まり、収束しにくくなるおそれがあります。R-squared が非常に高い変数は除外することを検討してください。HTML レポートには、R-squared 値が最も大きい上位 5 つの変数が表形式で表示されます。このチェックは ERRORATTENTION を報告するしきい値のない INFO レベルですが、表の内容を確認することをおすすめします。

時間の主効果 $\mu_t$ との共線性

このチェックでは、地域をカテゴリ変数として、各変数の回帰分析を行います。R-squared が高いほど、その変数の地域的なばらつきが小さいことを意味します。ノットを多数使用している場合、モデルの識別性が弱まり、収束しなくなるおそれがあります。R-squared が非常に高い変数を除外するか、ModelSpecknots 引数を減らすことを検討してください。HTML レポートには、R-squared 値が最も大きい上位 5 つの変数が表形式で表示されます。このチェックは INFO レベル(ERROR または ATTENTION を示すしきい値なし)ですが、表を確認することをおすすめします。

次のコードを使用して、すべての変数について、(地域と時間に対して)算出された R-squared 値を取得できます。

[mmm_geo_time_collinearity] = (
    mmm_eda.eda_engine.check_variable_geo_time_collinearity()
    .get_overall_artifacts()
)
mmm_geo_time_collinearity.rsquared_ds

カテゴリ 5: 事前分布の指定

このカテゴリでは、事前分布の設定内容、具体的には負のベースラインが生じる事前確率を評価します。負のベースラインが発生しているということは、介入変数の効果が過大に評価されていることを意味しています。チャネルレベルの貢献度の事前平均を示した棒グラフと照らし合わせながら、負のベースラインが生じる事前確率を確認してください。負のベースラインの事前確率が高い場合は、介入変数のカスタム事前分布の使用を検討してください。特に、カスタムの contribution 事前分布タイプを使用するのが効果的な場合があります。

出力例:

貢献度の事前平均

プロットには上位 15 個のチャネルのみが表示されます。次のコードを使用して、負のベースラインが生じる事前確率と、チャネルレベルの貢献度の事前平均を取得できます。

[prior_check] = mmm_eda.eda_engine.check_prior_probability().get_overall_artifacts()

# This returns the prior probability of negative baseline
prior_check.prior_negative_baseline_prob

# This returns the channel-level prior mean of contribution
prior_check.mean_prior_contribution_da

その他のチェック、ビジュアリゼーション、カスタマイズ

HTML レポート以外にも、追加のデータ診断やカスタム設定を活用して、EDA プロセスをカスタマイズできます。

ノットを重ねた KPI 時系列グラフ

全国レベルの KPI 時系列データに、ModelSpec で指定したノットを重ね合わせて可視化することができます。

mmm_eda.plot_national_kpi_with_knots_time_series()

出力例:

ノットを重ねた KPI 時系列グラフ

表示されるノットは、ModelSpec で設定した knots 引数によって決まります。

  • デフォルト設定: メリディアンでは、地域レベルのデータセットにはフルノットが使用されます。一方、全国モデルでは単一のノットがデフォルトとなります(ノットが 1 つのみの場合、プロットは省略されます)。
  • AKS アルゴリズム: enable_aks = True の場合、この関数によりノットの自動選択(AKS)メソッドで選択されたノットがプロットされます。
  • 手動指定: 手動で定義したノットの位置がプロットされます。

ノットを重ねたこの KPI 時系列プロットは、ノットの配置を評価し、ノットを手動で追加または除外する必要があるかどうかを判断するのに役立ちます。詳しいガイダンスについては、ノットを設定するをご覧ください。

ペアワイズ相関チェック

メリディアンの EDA パッケージでは、スケーリング済みの介入変数ユニットとコントロール変数のすべての間で、ピアソンのペアワイズ相関が算出されます。

  • 地域モデルの ERROR ステータス: 地域モデルの場合、まずすべての地域と時間に対してペアワイズ相関が算出されます。具体的には、すべての地域と時間における各変数の値が 1 つの配列にフラット化され、これらのフラット化された配列間でペアワイズ相関が算出されます。変数のペアが、すべての地域と期間でほぼ完全な相関関係にある場合(ペアワイズ相関の絶対値がデフォルトのしきい値 0.999 を超える場合)、ERROR ステータスがトリガーされます。この問題を解決するには、入力データから冗長な変数のいずれかを削除します。

    次のコードを使用して、地域モデルの全体的なペアワイズ相関(すべての地域と時間に対して算出)を取得できます。

    [overall_corr] = mmm_eda.eda_engine.check_geo_pairwise_corr().get_overall_artifacts()
    overall_corr.corr_matrix
    
  • 全国モデルの ERROR ステータス: 全国モデルの場合、地域が 1 つしかないため、すべての時間に対してペアワイズ相関が算出されます。変数ペアのペアワイズ相関の絶対値がデフォルトのしきい値 0.999 を超えると、ERROR ステータスがトリガーされます。この問題を解決するには、入力データから冗長な変数のいずれかを削除します。

    次のコードを使用して、全国モデルに対して算出されたペアワイズ相関を取得できます。

    [national_corr] = mmm_eda.eda_engine.check_national_pairwise_corr().get_national_artifacts()
    national_corr.corr_matrix
    
  • 地域モデルの ATTENTION ステータス: 地域モデルの場合、特定の地域ごとのすべての期間に対するペアワイズ相関も算出されます。変数のペアが個々の地域内でほぼ完全な相関関係を示し、デフォルトのしきい値 0.999 を超えると、ATTENTION ステータスが報告されます。この問題に対処するには、データを確認するか、複数の地域で高いペアワイズ相関が見られる場合は、これらの変数を統合することを検討してください。

    次のコードを使用して、地域モデルにおける個々の地域のペアワイズ相関を取得できます。

    [geo_corr] = mmm_eda.eda_engine.check_geo_pairwise_corr().get_geo_artifacts()
    geo_corr.corr_matrix
    

必要に応じて、これらの極端なしきい値を調整できます。これらのしきい値の設定方法の詳細については、ペアワイズ相関のカスタムしきい値をご覧ください。

ユーザーによる設定が可能なカスタマイズ

メリディアンの EDA パッケージには、特定のデータセットとモデリングのニーズに合わせて EDA プロセスをカスタマイズするための設定オプションがいくつか用意されています。

地域レベルから全国レベルへのカスタム集計方法

地域レベルのデータセットに対して全国レベルの EDA を実行する場合、変換を適用する前に、メリディアンの EDA パッケージにより、まず地域レベルの未加工(未スケーリング)データを内部的に集計して全国レベルのデータが作成されます。これにより、ユーザーがまず独自の地域レベルのデータセットを手動で全国レベルに集計し、その全国レベルのデータをメリディアンに渡して EDA を実行する場合と、結果が実質的に同じになります。

デフォルトでは、メディア ユニット、オーガニック メディア ユニット、リーチ、KPI のすべての生データは、地域をまたいで合算されます。頻度を集計するために、メリディアンの EDA パッケージは、地域ごとに未加工の RF インプレッション(リーチに頻度を掛けたもの)を算出し、すべての地域の RF インプレッションとリーチを合計したうえで、全国の合計 RF インプレッションを全国の合計リーチで割ります。オーガニック頻度を集計する場合も、同様の算出方法が用いられます。

ほとんどの変数にはデフォルトの合計による集計が適していますが、特定のコントロール変数やメディア以外の介入変数については、独自の集計方法を定義することも可能です。バイナリ変数や、率またはパーセントを表す変数を扱う場合に、この機能は特に役立ちます。

たとえば、rating という名前のコントロール変数の平均をすべての地域にわたって算出したい場合は、以下のように記述します。

from meridian.model import model
from meridian.model.eda import eda_spec
import numpy as np

mmm_agg_config = eda_spec.AggregationConfig(
    control_variables={'rating': np.mean}
)
mmm_eda_spec = eda_spec.EDASpec(aggregation_config=mmm_agg_config)
mmm = model.Meridian(..., eda_spec=mmm_eda_spec)

VIF のカスタムしきい値

メリディアンの EDA パッケージでは、ほぼ完全な多重共線性といった極めて深刻なデータの問題が検知されると、ERROR または ATTENTION ステータスがトリガーされます。数値の不安定性を回避しつつ柔軟性を確保するため、このパッケージでは VIF の上限を無限大(infinity)とするのではなく、デフォルトで 1,000 という極端なしきい値を設定しています。これらのしきい値は、ビジネスの状況や独自の判断に基づいて調整可能です。

  • geo_threshold: 地域レベルのデータセット向け。特定の地域において変数の VIF がこの値を超えると、ATTENTION ステータスがトリガーされます。ただし、事後分布のサンプリングは引き続き実行可能です。
  • overall_threshold: 地域レベルのデータセット向け。変数の VIF(すべての地域と期間を対象に算出)がこの値を超えると、ERROR ステータスがトリガーされます。この場合、事後分布のサンプリングがブロックされます。
  • national_threshold: 全国レベルのデータセットの向け。変数の VIF がこの値を超えると、ERROR ステータスがトリガーされます。この場合、事後分布のサンプリングがブロックされます。

たとえば、多重共線性に関する overall_threshold のしきい値を 1,000 から 50 に引き下げるには、以下のように記述します。

from meridian.model import model
from meridian.model.eda import eda_spec

mmm_custom_vif = eda_spec.VIFSpec(overall_threshold=50)
mmm_eda_spec = eda_spec.EDASpec(vif_spec=mmm_custom_vif)
mmm = model.Meridian(..., eda_spec=mmm_eda_spec)

ペアワイズ相関のカスタムしきい値

ペアワイズ相関が極端に高い場合も、ERROR または ATTENTION のステータスがトリガーされます。極端な相関に対するデフォルトのしきい値は 0.999 に設定されています。これらのしきい値は、お使いのデータセットの特徴や分析の目的に合わせて、調整可能です。

  • geo_threshold: 地域レベルのデータセット向け。特定の地域において、2 つの変数間のペアワイズ相関の絶対値がこの値を超えると、ATTENTION ステータスがトリガーされます。ただし、事後分布のサンプリングは引き続き実行可能です。
  • overall_threshold: 地域レベルのデータセット向け。ペアワイズ相関(すべての地域と期間を対象に算出)の絶対値がこの値を超えると、ERROR ステータスがトリガーされます。この場合、事後分布のサンプリングがブロックされます。
  • national_threshold: 全国レベルのデータセットの向け。ペアワイズ相関の絶対値がこの値を超えると、ERROR ステータスがトリガーされます。この場合、事後分布のサンプリングがブロックされます。

たとえば、地域モデルのペアワイズ相関における overall_threshold のしきい値を 0.999 から 0.95 に引き下げる場合は、以下のように記述します。

from meridian.model import model
from meridian.model.eda import eda_spec

mmm_custom_corr = eda_spec.PairwiseCorrSpec(overall_threshold=0.95)
mmm_eda_spec = eda_spec.EDASpec(pairwise_corr_spec=mmm_custom_corr)
mmm = model.Meridian(..., eda_spec=mmm_eda_spec)

その他のカスタマイズ

メリディアンの EDA パッケージでは、EDASpec で他のカスタマイズ可能なしきい値を使用できます。これらのデフォルト値は、パッケージが定数変数と見なすものの内部ガードレールとして機能します。これらのデフォルト値を調整する必要はほとんどありませんが、特定のエッジケースで使用できます。

  • KpiInvariabilitySpec をカスタマイズする: ばらつきの重大な欠如で説明したように、変換された KPI の全体的な標準偏差がデフォルトの 1e-4 のしきい値よりも小さい場合、メリディアンの EDA パッケージは ERROR をトリガーし、事後分布のサンプリングをブロックします。KpiInvariabilitySpec を使用すると、変動の少ない KPI がこの ERROR をトリガーするタイミングを決定する std_threshold を調整できます。

    たとえば、KpiInvariabilitySpecstd_threshold を 1e-5 に引き下げるには、次のようにします。

    from meridian.model import model
    from meridian.model.eda import eda_spec
    
    custom_kpi_spec = eda_spec.KpiInvariabilitySpec(std_threshold=1e-5)
    mmm_eda_spec = eda_spec.EDASpec(kpi_invariability_spec=custom_kpi_spec)
    mmm = model.Meridian(..., eda_spec=mmm_eda_spec)
    
  • StandardDeviationSpec のカスタマイズ: 外れ値とデータのスパース性の可能性で詳しく説明されているように、外れ値を削除した後に計算された標準偏差が極端に小さい変数は、データのスパース性の可能性またはシグナルの欠如を示しています。StandardDeviationSpec を使用すると、これらの変動性の低い変数が ATTENTION アラートをトリガーするタイミングを決定するしきい値を調整できます。

    たとえば、地域モデルの標準偏差のしきい値を 1e-5 に引き下げるには、geo_std_threshold を調整します。

    from meridian.model import model
    from meridian.model.eda import eda_spec
    
    custom_std_spec = eda_spec.StandardDeviationSpec(geo_std_threshold=1e-5)
    mmm_eda_spec = eda_spec.EDASpec(std_spec=custom_std_spec)
    mmm = model.Meridian(..., eda_spec=mmm_eda_spec)
    

    全国モデルの場合は、代わりに national_std_threshold を調整します。

  • VIF 計算から定数変数をフィルタする: ほぼ定数の変数は、分散拡大係数(VIF)の計算中に計算エラーが発生する可能性があります。デフォルトでは、標準偏差が 1e-4 未満の変数は VIF 計算から除外されます。この上限は、VIFSpecstd_threshold パラメータを使用して調整できます。たとえば、このしきい値を 1e-3 に引き上げるには、次のようにします。

    from meridian.model import model
    from meridian.model.eda import eda_spec
    
    custom_vif_std = eda_spec.VIFSpec(std_threshold=1e-3)
    mmm_eda_spec = eda_spec.EDASpec(vif_spec=custom_vif_std)
    mmm = model.Meridian(..., eda_spec=mmm_eda_spec)