Быстрая оценка эффекта рекламы/события на ключевые показатели: Python + Causal Impact
Приветствую, меня зовут Владислав Поляков, я аналитик данных в Сбербанке. Уже не раз я сталкивался с задачами, которые содержат в себе ключевые слова «оценка эффекта», и, как правило, такие задачи нужно делать быстро. Сегодня я хочу поделиться, пожалуй, самым простым и быстрым способом оценки эффекта рекламы/события на ключевые показатели. Способ заключается в использовании библиотеки pycausalimpact для Python. Документация к библиотеке.
Вводные:
Данные: Данные ЦБ РФ по ключевой ставке и объему выданных кредитов физическим лицам с 2013 года.
Что будем оценивать?: Как повышение ключевой ставки повлияло на объем выданных кредитов.
Как будем оценивать?: С помощью библиотеки pycausalimpact для Python
Установка библиотеки
Для начала установим библиотеку
pip install pycausalimpact
Подготовка данных
Я уже собрал данные ЦБ РФ по ключевой ставке и объему выданных кредитов с сентября 2013 года по май 2024 года. Данные будут лежать в репозитории GitHub. Вот как они выглядят:
import pandas as pd
df = pd.read_excel('amt_key.xlsx')
Данные ЦБ РФ по ключевой ставке и объему выданных кредитов физическим лицам
График по объему выданных кредитов физлицам и ключевая ставка ЦБ РФ
Теперь определим период для оценки влияния ключевой ставки на объем выданных кредитов. Для примера возьмем ситуацию в марте 2022 года, когда ЦБ РФ резко поднял ключевую ставку с 9,58% до 20,00%, и оценим, насколько уменьшился объем выданных кредитов относительно ситуации, если бы ЦБ РФ не поднимал ставку.
График с выделенным периодом, который будем оценивать
Для предсказания Causal Impact использует Линейную регрессию и для нее, как и для любой модели, действует правило — чем больше данных, тем лучше прогноз. Поэтому создадим дополнительные предикторы (признаки) для нашей модели на основе тех данных, которые у нас есть. Для этого я создал функцию create_features:
def create_features(df_in, lags=3, target='cred_amt'):
tmp = df_in.copy()
tmp['day'] = tmp.index.day
tmp['year'] = tmp.index.year
tmp['month'] = tmp.index.month
tmp['month_to_new_year'] = 12 - tmp.index.month
tmp['rolling_mean_{}'.format(lags)] = tmp[target].rolling(lags, closed='left').mean()
for lag in range(1, lags+1):
tmp['lag_{}'.format(lag)] = tmp[target].shift(lag)
return tmp
train_data = create_features(df).dropna()
После создания новых признаков наши данные выглядят следующим образом:
Как выглядят наши данные после добавления новых признаков
Также для точности добавим такой показатель как количество населения России. Ведь население росло, а от этого (и не только) рос и объем выданных кредитов. Данные о количестве населения я взял из Росстата.
pop = pd.read_excel('rf_population.xlsx')
train_index = train_data.index
train_data = train_data.merge(pop, left_on='year', right_on='date')
train_data.index = train_index
В итоге наши данные выглядят вот так:
Как выглядят наши данные после добавления данных о населении РФ
Важно отметить: При подаче данных в пакет Causal Impact, мы должны соблюдать следующее правило.
В индексе наших данных должна быть дата, первым столбцом должен идти целевой показатель, а последующими столбцами должны быть признаки.
Использование Causal Impact
Данные подготовлены, осталось всего ничего! Используем Causal Impact для оценки эффекта от повышения ключевой ставки.
Для начала импортируем библиотеку и зададим временные рамки:
from causalimpact import CausalImpact
training_start = '2013-12-31'
training_end = '2022-02-28'
treatment_start = '2022-03-31'
treatment_end = '2022-05-31'
Здесь training_start и training_end (включительно) — обозначают период до возникновения события. treatment_start и treatment_end — обозначают период, когда событие продолжалось.
Нам остается лишь подать данные в функцию CausalImpact:
impact = CausalImpact(
train_data,
pre_period = [training_start, training_end],
post_period = [treatment_start, treatment_end]
)
После того, как функция приняла наши данные и обучила линейную регрессию на периоде до возникновения события, мы можем построить графики с помощью следующей команды:
impact.plot();
Результат применения Causal Impact
Первый график — самый важный, на нем пунктиром изображен прогноз линейной регрессии, а сплошной линией фактические данные.
Но, чтобы не пытаться оценить эффект по картинке, мы можем использовать функцию, которая выдаст нам подробное описание эффекта:
print(impact.summary())
Результат Causal Impact
Здесь мы можем увидеть результаты работы пакета Causal Impact. Например, мы можем сделать вывод, что абсолютный эффект от резкого повышения ключевой ставки составил в среднем -282 млрд. руб./мес. (плюс минус 75 млрд. руб.).
Результат Causal Impact
Иначе говоря, объем выданных кредитов оказался ниже ожидаемого в среднем на 21% (плюс минус 6%) в месяц:
Результат Causal Impact
Также в конце результата нам отображается вероятность того, что изменения являются следствием события, в нашем случае это 100%:
Результат Causal Impact
Может случится и такое, что мы увидим высокое значения p-value и, например, вероятность около 60%. Это будет означать, что вероятность того, что изменение ключевого показателя это следствие какого-то события, довольно мала, и мы не можем утверждать, что какой-то эффект вообще был.
Получить предсказания, которые сделал пакет Causal Impact, можно с помощью следующего метода:
impact.inferences
Вот как выглядят предсказания в виде DataFrame:
DataFrame с предсказаниями от Causal Impact
Здесь:
preds — предсказанное число
preds_lower — нижняя граница 95% доверительного интервала по предсказанному числу
preds_upper — верхняя граница 95% доверительного интервала по предсказанному числу
Вывод
Итак, мы применили библиотеку pycausalimpact на реальных данных и оценили, как повлияло резкое повышение ключевой ставки в марте 2022 года с 9,58% до 20,00% на объем выданных кредитов физическим лицам:
Абсолютный эффект от резкого повышения ключевой ставки составил в среднем -282 млрд. руб./мес. (плюс минус 75 млрд. руб.).
Объем выданных кредитов оказался ниже ожидаемого в среднем на 21% (плюс минус 6%) в месяц
Спасибо за внимание! Если эта статья была для вас полезной, поделитесь ею с коллегами и друзьями. Если у вас есть вопросы или предложения, не стесняйтесь оставлять комментарии. Удачи в ваших аналитических проектах и до новых встреч!
GitHub | Репозиторий с данными и кодом к этой статье