Приветствую, меня зовут Владислав Поляков, я аналитик данных в Сбербанке. Уже не раз я сталкивался с задачами, которые содержат в себе ключевые слова «оценка эффекта», и, как правило, такие задачи нужно делать быстро. Сегодня я хочу поделиться, пожалуй, самым простым и быстрым способом оценки эффекта рекламы/события на ключевые показатели. Способ заключается в использовании библиотеки pycausalimpact для Python. Документация к библиотеке.
![](https://habrastorage.org/getpro/habr/upload_files/54f/40e/dd0/54f40edd0fb05b284c1e85621810a791.png)
Вводные:
Данные: Данные ЦБ РФ по ключевой ставке и объему выданных кредитов физическим лицам с 2013 года.
Что будем оценивать?: Как повышение ключевой ставки повлияло на объем выданных кредитов.
Как будем оценивать?: С помощью библиотеки pycausalimpact для Python
Установка библиотеки
Для начала установим библиотеку
pip install pycausalimpact
Подготовка данных
Я уже собрал данные ЦБ РФ по ключевой ставке и объему выданных кредитов с сентября 2013 года по май 2024 года. Данные будут лежать в репозитории GitHub. Вот как они выглядят:
import pandas as pd
df = pd.read_excel('amt_key.xlsx')
![Данные ЦБ РФ по ключевой ставке и объему выданных кредитов физическим лицам Данные ЦБ РФ по ключевой ставке и объему выданных кредитов физическим лицам](https://habrastorage.org/getpro/habr/upload_files/cca/555/c9a/cca555c9a88e17f8f8a0a7eec6c3e474.png)
![График по объему выданных кредитов физлицам и ключевая ставка ЦБ РФ График по объему выданных кредитов физлицам и ключевая ставка ЦБ РФ](https://habrastorage.org/getpro/habr/upload_files/030/c10/f29/030c10f29b5f5a7a049dffa2d27d11a8.png)
Теперь определим период для оценки влияния ключевой ставки на объем выданных кредитов. Для примера возьмем ситуацию в марте 2022 года, когда ЦБ РФ резко поднял ключевую ставку с 9,58% до 20,00%, и оценим, насколько уменьшился объем выданных кредитов относительно ситуации, если бы ЦБ РФ не поднимал ставку.
![График с выделенным периодом, который будем оценивать График с выделенным периодом, который будем оценивать](https://habrastorage.org/getpro/habr/upload_files/441/081/50a/44108150a4b77dce4f0fd6b13be64490.png)
Для предсказания 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()
После создания новых признаков наши данные выглядят следующим образом:
![Как выглядят наши данные после добавления новых признаков Как выглядят наши данные после добавления новых признаков](https://habrastorage.org/getpro/habr/upload_files/adc/b22/3e0/adcb223e0bf6bad8c223b8499e76639d.png)
Также для точности добавим такой показатель как количество населения России. Ведь население росло, а от этого (и не только) рос и объем выданных кредитов. Данные о количестве населения я взял из Росстата.
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
В итоге наши данные выглядят вот так:
![Как выглядят наши данные после добавления данных о населении РФ Как выглядят наши данные после добавления данных о населении РФ](https://habrastorage.org/getpro/habr/upload_files/a1f/17f/074/a1f17f0746eae1cb7b81f431a95251be.png)
Важно отметить: При подаче данных в пакет Causal Impact, мы должны соблюдать следующее правило.
![](https://habrastorage.org/getpro/habr/upload_files/e9e/c3b/3b7/e9ec3b3b78168935ce83bbdb7afbac76.jpg)
В индексе наших данных должна быть дата, первым столбцом должен идти целевой показатель, а последующими столбцами должны быть признаки.
Использование 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 Результат применения Causal Impact](https://habrastorage.org/getpro/habr/upload_files/87a/a26/e94/87aa26e945ed8ac39a6a6f5ee5a86395.png)
Первый график – самый важный, на нем пунктиром изображен прогноз линейной регрессии, а сплошной линией фактические данные.
Но, чтобы не пытаться оценить эффект по картинке, мы можем использовать функцию, которая выдаст нам подробное описание эффекта:
print(impact.summary())
![Результат Causal Impact Результат Causal Impact](https://habrastorage.org/getpro/habr/upload_files/16a/bcd/730/16abcd730c78d4a8d4f9392d9b608372.png)
Здесь мы можем увидеть результаты работы пакета Causal Impact. Например, мы можем сделать вывод, что абсолютный эффект от резкого повышения ключевой ставки составил в среднем -282 млрд. руб./мес. (плюс минус 75 млрд. руб.).
![Результат Causal Impact Результат Causal Impact](https://habrastorage.org/getpro/habr/upload_files/431/ff3/031/431ff3031c3da00b4eb912f0cd196201.png)
Иначе говоря, объем выданных кредитов оказался ниже ожидаемого в среднем на 21% (плюс минус 6%) в месяц:
![Результат Causal Impact Результат Causal Impact](https://habrastorage.org/getpro/habr/upload_files/0ee/e53/9b6/0eee539b683f6bf9f8ffdc68ea1f4570.png)
Также в конце результата нам отображается вероятность того, что изменения являются следствием события, в нашем случае это 100%:
![Результат Causal Impact Результат Causal Impact](https://habrastorage.org/getpro/habr/upload_files/cb7/52e/581/cb752e58154f099492984120d3bf19f4.png)
Может случится и такое, что мы увидим высокое значения p-value и, например, вероятность около 60%. Это будет означать, что вероятность того, что изменение ключевого показателя это следствие какого-то события, довольно мала, и мы не можем утверждать, что какой-то эффект вообще был.
Получить предсказания, которые сделал пакет Causal Impact, можно с помощью следующего метода:
impact.inferences
Вот как выглядят предсказания в виде DataFrame:
![DataFrame с предсказаниями от Causal Impact DataFrame с предсказаниями от Causal Impact](https://habrastorage.org/getpro/habr/upload_files/fb9/3df/ef7/fb93dfef75e1b464cf9ee709ac10cf52.png)
Здесь:
preds - предсказанное число
preds_lower - нижняя граница 95% доверительного интервала по предсказанному числу
preds_upper - верхняя граница 95% доверительного интервала по предсказанному числу
Вывод
Итак, мы применили библиотеку pycausalimpact на реальных данных и оценили, как повлияло резкое повышение ключевой ставки в марте 2022 года с 9,58% до 20,00% на объем выданных кредитов физическим лицам:
Абсолютный эффект от резкого повышения ключевой ставки составил в среднем -282 млрд. руб./мес. (плюс минус 75 млрд. руб.).
Объем выданных кредитов оказался ниже ожидаемого в среднем на 21% (плюс минус 6%) в месяц
Спасибо за внимание! Если эта статья была для вас полезной, поделитесь ею с коллегами и друзьями. Если у вас есть вопросы или предложения, не стесняйтесь оставлять комментарии. Удачи в ваших аналитических проектах и до новых встреч!
hitlocker
ооо. спасибо))) будет полезно.