Приветствую, меня зовут Владислав Поляков, я аналитик данных в Сбербанке. Уже не раз я сталкивался с задачами, которые содержат в себе ключевые слова «оценка эффекта», и, как правило, такие задачи нужно делать быстро. Сегодня я хочу поделиться, пожалуй, самым простым и быстрым способом оценки эффекта рекламы/события на ключевые показатели. Способ заключается в использовании библиотеки 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
Результат применения Causal Impact

Первый график – самый важный, на нем пунктиром изображен прогноз линейной регрессии, а сплошной линией фактические данные.

Но, чтобы не пытаться оценить эффект по картинке, мы можем использовать функцию, которая выдаст нам подробное описание эффекта:

print(impact.summary())
Результат Causal Impact
Результат Causal Impact

Здесь мы можем увидеть результаты работы пакета Causal Impact. Например, мы можем сделать вывод, что абсолютный эффект от резкого повышения ключевой ставки составил в среднем -282 млрд. руб./мес. (плюс минус 75 млрд. руб.).

Результат Causal Impact
Результат Causal Impact

Иначе говоря, объем выданных кредитов оказался ниже ожидаемого в среднем на 21% (плюс минус 6%) в месяц:

Результат Causal Impact
Результат Causal Impact

Также в конце результата нам отображается вероятность того, что изменения являются следствием события, в нашем случае это 100%:

Результат Causal Impact
Результат Causal Impact

Может случится и такое, что мы увидим высокое значения p-value и, например, вероятность около 60%. Это будет означать, что вероятность того, что изменение ключевого показателя это следствие какого-то события, довольно мала, и мы не можем утверждать, что какой-то эффект вообще был.

Получить предсказания, которые сделал пакет Causal Impact, можно с помощью следующего метода:

impact.inferences

Вот как выглядят предсказания в виде DataFrame:

DataFrame с предсказаниями от Causal Impact
DataFrame с предсказаниями от Causal Impact

Здесь:

  • preds - предсказанное число

  • preds_lower - нижняя граница 95% доверительного интервала по предсказанному числу

  • preds_upper - верхняя граница 95% доверительного интервала по предсказанному числу

Вывод

Итак, мы применили библиотеку pycausalimpact на реальных данных и оценили, как повлияло резкое повышение ключевой ставки в марте 2022 года с 9,58% до 20,00% на объем выданных кредитов физическим лицам:

  • Абсолютный эффект от резкого повышения ключевой ставки составил в среднем -282 млрд. руб./мес. (плюс минус 75 млрд. руб.).

  • Объем выданных кредитов оказался ниже ожидаемого в среднем на 21% (плюс минус 6%) в месяц

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

GitHub | Репозиторий с данными и кодом к этой статье

Комментарии (1)


  1. hitlocker
    30.07.2024 15:06

    ооо. спасибо))) будет полезно.