Регрессионный анализ для аналитика: как найти факторы, которые реально влияют на метрику, и объяснить это бизнесу

Выручка просела на 8% - и сразу начинается угадайка: маркетинг списывает на сезон, продукт говорит про интерфейс, коммерческий директор уверен, что всё дело в ценах. Каждый по-своему прав, но никто не может сказать, сколько именно принёс или забрал каждый фактор.

Регрессионный анализ для аналитика - это инструмент, который переводит подобные споры в числа. Он позволяет количественно оценить вклад каждой переменной в изменение показателя и ответить не «кажется, реклама влияет», а «при росте рекламного бюджета на 100 тысяч рублей выручка в среднем увеличивается на 340 тысяч, при прочих равных».

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

Коротко:

  • Линейная регрессия оценивает, как один фактор связан с метрикой; множественная - сразу несколько факторов одновременно.
  • Коэффициент при переменной показывает, на сколько единиц меняется метрика при росте этой переменной на единицу - при условии, что остальные факторы зафиксированы.
  • R-squared - не главная цифра: важнее p-value коэффициентов и то, насколько допущения модели выполнены на ваших данных.
  • Корреляция и мультиколлинеарность могут исказить выводы: их нужно проверять до презентации результатов.
  • Бизнесу не нужны формулы - нужен вывод в формате «если мы увеличим X, метрика вырастет на Y при условии Z».

Что такое регрессия и зачем она нужна аналитику

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

Ключевое отличие от декомпозиции метрик или drill-down - здесь мы не просто разбиваем показатель на части, а строим количественную связь. После модели можно сказать: «сезонность объясняет 40% дисперсии выручки, рекламный бюджет - ещё 35%, остальное - шум или неучтённые переменные».

Два основных формата:

  • Парная (простая) линейная регрессия - один фактор, одна метрика. Удобна для первичной проверки гипотезы.
  • Множественная регрессия - несколько факторов. Это рабочий инструмент большинства бизнес-задач, потому что метрики почти никогда не зависят от одной переменной.

Когда регрессия подходит, а когда нет

Метод хорошо работает, когда:

  • Нужно оценить вклад нескольких факторов и понять, какие из них статистически значимы.
  • Есть достаточно данных - минимум 30-50 наблюдений, желательно больше.
  • Связь между факторами и метрикой линейная или её можно линеаризовать (логарифм, корень).
  • Нет задачи установить причинно-следственность строго - для этого нужны DiD или инструментальные переменные.

Когда лучше выбрать другой подход:

  • Данных меньше 20-30 наблюдений - результаты будут ненадёжными.
  • Зависимость нелинейная и её нельзя преобразовать - подойдут деревья решений или нелинейные методы.
  • Нужно доказать именно причинно-следственную связь - тогда регрессия даёт корреляцию, но не causality.

Строим модель в Python с помощью statsmodels

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

Установка и импорт:

pip install statsmodels pandas numpy

import pandas as pd
import numpy as np
import statsmodels.api as sm

Загружаем данные и смотрим на них:

df = pd.read_csv('weekly_revenue.csv')
print(df.describe())
print(df.corr())

Перед построением модели проверяем корреляцию между факторами. Если два фактора сильно коррелируют между собой (|r| > 0.8), это мультиколлинеарность - она искажает коэффициенты. В таком случае один из факторов лучше убрать.

Строим множественную регрессию:

X = df[['ad_budget', 'week_of_year', 'avg_check']]
X = sm.add_constant(X)  # добавляем свободный член
y = df['revenue']

model = sm.OLS(y, X).fit()
print(model.summary())

Вывод summary() пугает объёмом, но нас интересует несколько строк.

Как читать вывод statsmodels

Разберём ключевые части таблицы на примере гипотетического вывода:

ПоказательЧто означаетНа что смотреть
coefКоэффициент при переменнойЗнак и величина эффекта
P>|t|p-value коэффициентаМеньше 0.05 - значимо
R-squaredДоля объяснённой дисперсииНе главное, но полезно
Adj. R-squaredR² с поправкой на число переменныхЛучше обычного R² для сравнения моделей
[0.025, 0.975]95% доверительный интервал коэффициентаНе должен пересекать ноль у значимых переменных

Интерпретация коэффициентов регрессии

Допустим, модель выдала такие коэффициенты:

  • ad_budget: 3.4, p = 0.001
  • week_of_year: 12500, p = 0.03
  • avg_check: 180, p = 0.41

Читаем так: при росте рекламного бюджета на 1 рубль выручка увеличивается в среднем на 3.4 рубля - при условии, что сезонность и средний чек не изменились. Это и есть интерпретация коэффициентов регрессии: каждый коэффициент говорит об изолированном эффекте одного фактора.

Сезонность значима (p = 0.03): в зависимости от недели года выручка меняется примерно на 12 500 рублей за единицу переменной week_of_year. Средний чек - нет: p = 0.41, то есть при наших данных мы не можем отличить его эффект от случайного шума.

Важно: p-value < 0.05 не означает, что эффект большой или практически значимый. Огромная выборка делает значимым даже ничтожный коэффициент. Смотрите на величину коэффициента и доверительный интервал вместе с p-value.

Проверка допущений: можно ли доверять модели

Линейная регрессия работает корректно при нескольких условиях. Нарушения не делают модель бесполезной, но требуют оговорок.

Остатки должны быть нормально распределены. Проверяется визуально через Q-Q plot или тестом Шапиро-Уилка. Небольшие отклонения при большой выборке допустимы.

import matplotlib.pyplot as plt
import scipy.stats as stats

residuals = model.resid
stats.probplot(residuals, dist="norm", plot=plt)
plt.show()

Гомоскедастичность - дисперсия остатков не должна расти вместе с предсказанными значениями. Если на графике «остатки vs предсказанные значения» виден конус - это гетероскедастичность. Решение: логарифмировать зависимую переменную или использовать робастные стандартные ошибки (model.fit(cov_type='HC3')).

Нет автокорреляции остатков - актуально для временных рядов. Тест Дарбина-Уотсона: значения от 1.5 до 2.5 приемлемы.

from statsmodels.stats.stattools import durbin_watson
print(durbin_watson(residuals))

Мультиколлинеарность - если два фактора сильно коррелируют, коэффициенты нестабильны. Проверяем через VIF (Variance Inflation Factor):

from statsmodels.stats.outliers_influence import variance_inflation_factor

vif_data = pd.DataFrame()
vif_data["feature"] = X.columns
vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print(vif_data)

VIF выше 10 - сигнал убрать один из коллинеарных факторов.

Множественная регрессия в Excel

Для тех, кто работает без Python, Excel покрывает базовые потребности.

  1. Убедитесь, что включена надстройка «Пакет анализа»: Файл - Параметры - Надстройки - Пакет анализа - ОК.
  2. Данные - Анализ данных - Регрессия.
  3. Укажите диапазон Y (метрика) и диапазон X (факторы - несколько столбцов).
  4. Поставьте галочку «Вывод остатков» и «Графики подбора».

Excel выдаст таблицу с коэффициентами, p-value, R² и доверительными интервалами - всё то же самое, что statsmodels. Ограничение: нет удобных инструментов для проверки допущений и итерационного улучшения модели. Для разовых задач вполне достаточно, для регулярного использования лучше перейти на Python.

Пример вывода Excel (упрощённо):

Коэффициенты: Константа = 850 000, ad_budget = 3.4, week_of_year = 12 500

R² = 0.74 - модель объясняет 74% дисперсии выручки.

P-значение для ad_budget = 0.001, для week_of_year = 0.03 - оба фактора значимы.

Как объяснить регрессию бизнесу

Руководители не хотят слышать про p-value и гетероскедастичность. Им нужен ответ на конкретный вопрос. Вот рабочая схема перевода.

Шаг 1. Сформулируйте один вывод. Не пересказывайте модель - назовите главный результат. «Рекламный бюджет и сезонность объясняют три четверти колебаний выручки. Средний чек в нашем диапазоне данных статистически не связан с выручкой».

Шаг 2. Переведите коэффициент в бизнес-язык. «Каждые дополнительные 100 000 рублей в рекламу приносят в среднем 340 000 рублей выручки. Это при условии, что сезон и ассортимент не меняются».

Шаг 3. Назовите ограничения. «Модель построена на данных за последние 18 месяцев. Если выйдем на новый рынок или кардинально изменим ассортимент, коэффициент может измениться. Это не прогноз, а оценка текущей зависимости».

Шаг 4. Дайте рекомендацию. «Если стоит вопрос, куда направить дополнительный бюджет в Q4, данные говорят, что реклама работает эффективнее, чем работа со средним чеком - по крайней мере, в рамках нашей истории».

Шаблон для слайда или письма:
«Мы проверили три фактора, которые могут объяснять изменение [метрики]. Значимыми оказались [фактор 1] и [фактор 2]. При росте [фактор 1] на [единицу] метрика в среднем [растёт/падает] на [X]. Модель объясняет [N%] исторических колебаний. [Фактор 3] в наших данных значимой связи не показал.»

Типичные ошибки при построении и интерпретации

Путать корреляцию с причинностью. Регрессия показывает статистическую связь, а не доказывает, что X вызывает Y. Рост продаж мороженого и рост утоплений коррелируют - оба зависят от температуры. Всегда думайте, нет ли третьей переменной, которая объясняет оба явления.

Не проверять мультиколлинеарность. Если в модель включены «рекламный бюджет в телевизоре» и «общий рекламный бюджет», они почти наверняка коррелируют. Коэффициенты обоих станут нестабильными и нечитаемыми.

Оптимизировать только R². Добавив 10 переменных, вы почти всегда поднимете R². Но часть из них будет случайно коррелировать с метрикой на историческом периоде и не даст прогностической силы. Смотрите на Adjusted R² и p-value каждого коэффициента.

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

Применять модель за пределами диапазона данных. Если модель обучена на бюджетах от 500 тысяч до 3 миллионов рублей, экстраполировать её на 10 миллионов некорректно - зависимость может стать нелинейной.

Когда добавить категориальные переменные

Реальные бизнес-данные редко состоят только из чисел. Канал привлечения, день недели, тип продукта - всё это категории. Их можно включить в модель через дамми-переменные (one-hot encoding).

# Добавляем дамми для канала привлечения
df_dummies = pd.get_dummies(df, columns=['channel'], drop_first=True)

X = df_dummies[['ad_budget', 'week_of_year', 'channel_email', 'channel_social']]
X = sm.add_constant(X)
model = sm.OLS(y, X).fit()

Коэффициент при channel_email покажет, на сколько в среднем отличается выручка при email-канале по сравнению с базовым (который мы убрали через drop_first=True), при прочих равных условиях.

Итерационный подход: как улучшать модель

Хорошую модель редко получают с первого раза. Рабочий процесс выглядит так:

  1. Сформулируйте гипотезы - какие факторы могут влиять на метрику. Опирайтесь на доменное знание, а не перебирайте все доступные переменные подряд.
  2. Изучите данные - распределения, выбросы, корреляции между факторами.
  3. Постройте базовую модель с 2-3 ключевыми факторами.
  4. Проверьте допущения - остатки, гетероскедастичность, автокорреляция.
  5. Добавляйте или убирайте переменные осознанно, не автоматически. Каждое изменение - проверка гипотезы.
  6. Зафиксируйте финальную модель и сформулируйте выводы.

Про data leakage: не включайте в X переменные, которые становятся известны только после того, как Y уже произошло. Например, нельзя предсказывать выручку месяца, используя факт её закрытия как один из признаков - это тривиальная утечка.

Чеклист перед презентацией результатов

  • Проверены корреляции между факторами, VIF в норме (ниже 10).
  • p-value значимых коэффициентов ниже принятого порога (обычно 0.05).
  • Доверительные интервалы значимых коэффициентов не пересекают ноль.
  • Остатки проверены на нормальность и гомоскедастичность.
  • Для временных данных - проверена автокорреляция (тест Дарбина-Уотсона).
  • Выбросы в данных обработаны или объяснены.
  • Модель не применяется за пределами диапазона обучающих данных.
  • Выводы сформулированы на языке бизнеса, ограничения названы явно.

Часто задаваемые вопросы

Парная строит зависимость метрики от одного фактора. Множественная учитывает несколько факторов одновременно и позволяет изолировать эффект каждого при фиксированных остальных. В большинстве бизнес-задач нужна именно множественная: метрики почти всегда многофакторны.

R² показывает, какую долю дисперсии целевой переменной объясняет модель. Значение 0.5 означает, что модель объясняет 50% колебаний - остальные 50% связаны с неучтёнными факторами или шумом. Достаточность зависит от задачи: в маркетинге 0.5 нормально, в финансах или физике ожидают выше. Важнее смотреть на значимость коэффициентов, а не гнаться за высоким R².

Начните с sm.OLS(y, X).fit() и вывода summary() . Сосредоточьтесь на трёх числах: coef (величина и знак эффекта), P>|t| (значимость) и Adj. R-squared (качество модели). Этого достаточно для первых выводов. Допущения проверяйте постепенно по мере накопления опыта.

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

Есть два подхода. Первый - числовая переменная: номер недели или месяца. Работает, если зависимость монотонная. Второй - дамми-переменные для каждого периода (11 дамми для 12 месяцев). Это гибче: модель обучается на реальном профиле сезонности без предположения о монотонности.

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

Регрессия показывает статистическую ассоциацию - насколько изменение X связано с изменением Y в данных. Каузальный вывод (DiD, инструментальные переменные) позволяет утверждать, что X вызывает Y, контролируя ненаблюдаемые конфаундеры. Регрессия - инструмент для ежедневного анализа метрик, каузальный вывод нужен, когда важно доказать причинно-следственную связь строго.

Итог

Регрессионный анализ - один из самых полезных инструментов в арсенале аналитика, потому что он даёт числовой ответ там, где обычно остаются догадки. Вы строите модель, получаете коэффициенты, проверяете их значимость - и уже можете сказать не «кажется, реклама работает», а «рубль в рекламу приносит 3.4 рубля выручки, и это статистически не случайно».

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

Начните с простого: возьмите одну гипотезу, загрузите данные в statsmodels или Excel, постройте модель и интерпретируйте коэффициенты. Уже первая итерация покажет, насколько это мощнее, чем просто смотреть на корреляционные матрицы.