Этот пост представляет собой общий обзор «Коррекции смещения для платного поиска при моделировании медиамикса», содержащий код и реализацию ключевых концепций.

Коррекция смещения для платного поиска при моделировании медиамикса: Linked Paper

Моделирование медиамикса пытается оценить причинно-следственный эффект расходов в СМИ на продажи исключительно на основе данных наблюдений. И, как мы все знаем, оценка причинно-следственных связей на основе данных наблюдений сопряжена с трудностями.

Со временем появились две ведущие и взаимодополняющие рамки для работы с причинным выводом.

  1. Схема потенциальных результатов Рубина.
  2. Графический каркас Перла.

В этой статье исследуется использование графической структуры Pearl для управления систематической ошибкой выбора при моделировании медиамикса, в частности, в платной поисковой рекламе.

Настройка проблемы

Предположим, мы стремимся измерить причинное влияние поисковой рекламы (PPC) на продажи. В простой регрессионной модели мы можем регрессировать расходы на продажи и произвести причинно-следственную оценку:

продажи = average_sales + roas_estimate * search_spend + error

Мы можем подогнать приведенную выше модель с помощью обычного метода наименьших квадратов (OLS), и в простом мире это даст точную оценку ROAS. К сожалению, мир не так прост, и мы знаем, что часто встречаются смешанные переменные. Например, мы знаем, что органический поиск также является двигателем продаж и что как обычный поиск, так и платный поиск имеют первопричину, то есть потребительский спрос. График ниже иллюстрирует это.

Выше мы можем увидеть, как экономические факторы влияют на потребительский спрос, который, в свою очередь, стимулирует поисковые запросы, которые, в свою очередь, стимулируют платный поиск и обычный поиск.

Когда мы используем нашу простую модель, определенную выше, для моделирования более сложного мира, изображенного выше, мы сталкиваемся с проблемой предвзятости отбора или, в более широком смысле, эндогенности.

Эндогенность: термин, используемый в эконометрике, относится к объясняющей переменной, которая коррелирует с термином ошибки.

Проще говоря, наша модель отражает или поглощает объяснительную ценность органического поиска как в термине ошибки, так и в оценке ROAS, таким образом производя смещенную оценку ROAS.

Чтобы контролировать это, в статье предлагается использовать бэкдорный критерий Перла. Бэкдорный критерий Перла основан на идее использования графических моделей для описания причинно-следственных связей. Графические модели полезны, поскольку они позволяют нам включать знания предметной области и идеи из теории графов.

Одна такая идея id D-отделения.

D-разделение является сокращением от «направленного разделения» и позволяет нам сообщать, если два узла в графе разделены (или условно независимы друг от друга) набором третьих узлов.

Например, на графике ниже мы можем сказать, что Z отделено от Y или условно не зависит от Y при x1 и x2.

Еще одна важная идея - это критерий бэкдора.

Критерий бэкдора: для данной причинно-следственной диаграммы набор переменных Z удовлетворяет
критерию бэкдора относительно упорядоченной пары переменных (X, Y) на диаграмме, если: 1) нет узел в Z является потомком X; и 2) Z «блокирует» каждый путь между X и Y, который содержит стрелку в X.

Кроме того, если набор узлов Z удовлетворяет критерию бэкдора для направленной пары (X → Y), мы можем выявить несмещенную оценку X на Y, учитывая достаточно большой набор данных. Это также определяется как идентифицируемость.

Чтобы ознакомиться с концепцией критерия бэкдора, я рекомендую поиграть со следующим фрагментом кода (попробуйте создать различные графики и определить, какие узлы будут удовлетворять критерию бэкдора) и изучить дополнительные ресурсы.

from causalgraphicalmodels import CausalGraphicalModel
simple = CausalGraphicalModel(
    nodes=["x1", 'x2', 'z', 'y'],
    edges=[
        ("z", "x1"), 
        ("z", "x2"),
        ("x1", "y"),
        ("x2", "y"),
    ]
)
simple.draw()
simple.is_valid_backdoor_adjustment_set("x1", "y", {"z"})

Приложение для поиска

Теперь, когда мы изучили некоторые из основных концепций, связанных с причинно-следственными графическими моделями, мы можем увидеть, как они применяются для получения объективной оценки рентабельности инвестиций в рекламу для платного поиска. Для начала статья иллюстрирует причинную структуру окружающей среды. (см. ниже)

На приведенной выше диаграмме предполагается, что мы моделируем воздействие как:

продажи = average_sales + roas_estimate * search_spend + error_0 + error_1

Где error_0 и error_1 поглощают влияние потребительского спроса и обычного поиска соответственно.

Основываясь на наших знаниях графических моделей, мы теперь знаем, что, если мы сможем восстановить меру поисковых запросов, мы сможем удовлетворить критерий бэкдора для (поисковая реклама X → Продажи). Чтобы проверить это, мы можем использовать удобный пакет под названием причинно-следственные графические модели.

from causalgraphicalmodels import CausalGraphicalModel
search = CausalGraphicalModel(
    nodes=["economic_factors", "consumer_demand", "search_queriers", "auction", "organic_search", "paid_search", 'organic_search', 'sales'],
    edges=[
        ("economic_factors", "consumer_demand"), 
        ("consumer_demand", "sales"), 
        ("consumer_demand", "search_q"),
        ("search_q", "auction"), 
        ("auction", "paid_search"),
        ("search_q", "paid_search"),
        ("search_q", "organic_search"), 
        ("organic_search", "sales"), 
        ("paid_search", "sales"),
    ]
)
search.is_valid_backdoor_adjustment_set("paid_search", "sales", {"search_q"})
# output is True 

В приведенном выше коде мы определяем нашу причинно-следственную графическую модель (DAG) и проверяем, удовлетворяют ли наши контрольные переменные критерию бэкдора для (платный_поиск → продажи).

Затем мы генерируем образцы данных и запускаем регрессию OLS для сравнения оценок, когда мы удовлетворяем критерию бэкдора, а когда нет.

from causalgraphicalmodels import StructuralCausalModel
from causalgraphicalmodels import CausalGraphicalModel
import numpy as np
# create structural causal model. This let's us generate data. 
search_data = StructuralCausalModel({
    "consumer_demand": lambda n_samples:                  np.random.normal(100,5, size=n_samples) ,
    "search_q":        lambda consumer_demand, n_samples: np.random.normal(consumer_demand*.3,  1, n_samples)  ,
    "organic_search":  lambda search_q, n_samples:        np.random.normal(search_q*.6, 1)                ,
    "paid_search":     lambda search_q, n_samples:        np.random.normal(search_q*.1, 1)                ,
    
    "sales":           lambda organic_search, paid_search, n_samples: np.random.normal(75 + organic_search*.2  + paid_search*.3,  1 )
})
data = search_data.sample(156)
# run OLS without backdoor criterion satisfied for paid search --> sales
X = data[['paid_search' ]].values
X = sm.add_constant(X)
results = sm.OLS(data.sales.values, X).fit()
print(results.summary())
# run OLS without backdoor criterion satisfied for paid search --> sales
X = data[['paid_search' ]].values
X = sm.add_constant(X)
results = sm.OLS(data.sales.values, X).fit()
print(results.summary())
# with backdoor criterion satisfied 
X = data[['paid_search',   'search_q']].values
X = sm.add_constant(X)
results = sm.OLS(data.sales.values, X).fit()
print(results.summary())

В результате получаем следующие оценки ROAS:

Как мы видим, обе оценки отражают истинный параметр, а несмещенная оценка (критерий бэкдора удовлетворен) приближается к истинной оценке.

Теперь, возможно, вы заметили в примере кода, что мы отобрали только 156 точек данных, что равняется трехлетним еженедельным данным MMM. Это немного данных, и он поднимает важный вопрос: как узнать, достаточен ли размер нашей выборки?

В документе предполагается, что эта проблема может быть снята, «когда размер выборки достаточно велик, чтобы учесть непараметрические оценки», однако большие размеры выборки не распространены в моделировании MMM.

Для дальнейшего изучения этого вопроса я создал графики, показывающие, как меняются оценки рентабельности инвестиций в рекламу и доверительные интервалы при увеличении размеров выборки.

Как мы видим, несмещенная оценка сходится к истинным параметрам, тогда как смещенная оценка слишком оптимистична. Кроме того, на приведенных выше графиках показано, как небольшие размеры выборки дают очень большие доверительные интервалы. Что-то, на что следует обратить внимание, если размер выборки невелик.

На этом этапе мы рассмотрели основную часть теоретической части статьи и рассмотрели:

  • Смещение отбора в платном поиске и моделирование MMM
  • Причинно-следственные графические модели / каркас жемчуга
  • Как подать заявку на простой сценарий платного поиска
  • Как моделировать данные и реализовывать модели
  • Несколько "ловушек", на которые следует обратить внимание

В документе более подробно рассматриваются темы, затронутые здесь, и далее рассматриваются:

  1. Сложные сценарии
  2. Выполнение
  3. Эмпирические результаты

Я настоятельно рекомендую заинтересованному читателю ознакомиться с полным текстом статьи.