Выручка просела на 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-squared | R² с поправкой на число переменных | Лучше обычного R² для сравнения моделей |
| [0.025, 0.975] | 95% доверительный интервал коэффициента | Не должен пересекать ноль у значимых переменных |
Интерпретация коэффициентов регрессии
Допустим, модель выдала такие коэффициенты:
ad_budget: 3.4, p = 0.001week_of_year: 12500, p = 0.03avg_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 покрывает базовые потребности.
- Убедитесь, что включена надстройка «Пакет анализа»: Файл - Параметры - Надстройки - Пакет анализа - ОК.
- Данные - Анализ данных - Регрессия.
- Укажите диапазон Y (метрика) и диапазон X (факторы - несколько столбцов).
- Поставьте галочку «Вывод остатков» и «Графики подбора».
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), при прочих равных условиях.
Итерационный подход: как улучшать модель
Хорошую модель редко получают с первого раза. Рабочий процесс выглядит так:
- Сформулируйте гипотезы - какие факторы могут влиять на метрику. Опирайтесь на доменное знание, а не перебирайте все доступные переменные подряд.
- Изучите данные - распределения, выбросы, корреляции между факторами.
- Постройте базовую модель с 2-3 ключевыми факторами.
- Проверьте допущения - остатки, гетероскедастичность, автокорреляция.
- Добавляйте или убирайте переменные осознанно, не автоматически. Каждое изменение - проверка гипотезы.
- Зафиксируйте финальную модель и сформулируйте выводы.
Про data leakage: не включайте в X переменные, которые становятся известны только после того, как Y уже произошло. Например, нельзя предсказывать выручку месяца, используя факт её закрытия как один из признаков - это тривиальная утечка.
Чеклист перед презентацией результатов
- Проверены корреляции между факторами, VIF в норме (ниже 10).
- p-value значимых коэффициентов ниже принятого порога (обычно 0.05).
- Доверительные интервалы значимых коэффициентов не пересекают ноль.
- Остатки проверены на нормальность и гомоскедастичность.
- Для временных данных - проверена автокорреляция (тест Дарбина-Уотсона).
- Выбросы в данных обработаны или объяснены.
- Модель не применяется за пределами диапазона обучающих данных.
- Выводы сформулированы на языке бизнеса, ограничения названы явно.