Коротко: линейная регрессия — это способ описать связь между двумя величинами прямой линией y = b0 + b1·x. Здесь b0 — точка, где линия пересекает ось Y (значение при x = 0), а b1 — наклон: на сколько в среднем меняется y, когда x растёт на единицу. Коэффициенты подбираются методом наименьших квадратов — так, чтобы сумма квадратов отклонений точек от линии была минимальной. Качество подгонки показывает R-квадрат: доля разброса y, которую объясняет модель.
Регрессия — базовый инструмент аналитика: она отвечает на вопрос «как одно влияет на другое и насколько сильно». Разберём её по кусочкам, а потом построим на Python в двух библиотеках — statsmodels (для интерпретации) и sklearn (для прогноза).
Что такое линейная регрессия простыми словами?
Представьте таблицу: сколько денег компания тратит на рекламу в месяц и сколько заявок приходит. Точки на графике «расходы — заявки» лежат не идеально, но заметно тянутся вверх: больше рекламы — больше заявок. Линейная регрессия проводит через это облако точек одну прямую, которая лучше всего описывает общий тренд.
Уравнение простой (парной) регрессии:
y = b0 + b1·x
y— зависимая переменная, то, что мы объясняем или прогнозируем (заявки).x— независимая переменная, предиктор (расходы на рекламу).b0— свободный член (intercept).b1— коэффициент наклона (slope).
Когда предикторов несколько, модель становится множественной:
y = b0 + b1·x1 + b2·x2 + ... + bn·xn
Например, заявки могут зависеть не только от бюджета, но и от сезона и числа менеджеров. Логика та же — просто прямая превращается в плоскость (или гиперплоскость), а каждый коэффициент показывает вклад своего фактора.
Ключевое слово в названии — «линейная». Оно означает, что модель линейна по коэффициентам: y складывается из слагаемых вида «коэффициент умножить на переменную». Сам x при этом можно возводить в квадрат или логарифмировать — модель останется линейной регрессией, просто с преобразованным признаком.
Если хотите сначала подтянуть работу с таблицами и массивами, на которых всё это считается, посмотрите серию pandas с нуля и numpy с нуля.
Как понимать коэффициенты b0 и b1?
Коэффициенты — это то, ради чего аналитик вообще строит регрессию. Каждый из них имеет прямой смысл на языке бизнеса.
Наклон b1 отвечает на вопрос «на сколько изменится y, если x вырастет на одну единицу, а остальное не поменяется». Допустим, получили b1 = 3.2 для модели «заявки от расходов в тысячах рублей». Читается так: каждая дополнительная тысяча рублей рекламного бюджета в среднем приносит 3,2 заявки. Знак важен: положительный b1 — связь прямая (растёт x, растёт y), отрицательный — обратная.
Свободный член b0 — это предсказанное значение y при x = 0. Иногда он осмысленный (сколько заявок придёт вообще без рекламы — за счёт органики), а иногда чисто технический. Если x = 0 в реальности не встречается (например, x — рост человека в сантиметрах), то b0 буквально интерпретировать не стоит: он просто фиксирует, где прямая пересекает ось.
Небольшая таблица для интуиции:
| Коэффициент | Смысл | Пример чтения |
|---|---|---|
| b0 (intercept) | y при x = 0 | «Без бюджета придёт ~12 заявок» |
| b1 > 0 | прямая связь | «+1 тыс. руб. → +3,2 заявки» |
| b1 < 0 | обратная связь | «+1 день просрочки → −0,8 к рейтингу» |
| b1 ≈ 0 | связи почти нет | «Цвет кнопки не влияет на выручку» |
Важный нюанс масштаба: величина b1 зависит от единиц измерения x. Если бюджет считать не в тысячах, а в рублях, тот же наклон станет 0,0032. Само по себе «маленькое» число не значит слабую связь — смотрите на единицы и на статистическую значимость, о которой ниже.
Как работает метод наименьших квадратов?
Через облако точек можно провести бесконечно много прямых. Метод наименьших квадратов (МНК, англ. OLS — Ordinary Least Squares) выбирает единственную — ту, при которой сумма квадратов вертикальных отклонений точек от линии минимальна.
Отклонение (остаток, residual) для каждой точки — это разница между реальным y и предсказанным линией значением:
остаток_i = y_i - (b0 + b1·x_i)
МНК минимизирует сумму квадратов этих остатков:
SS_res = сумма (y_i - b0 - b1·x_i)^2 -> минимум
Почему именно квадраты, а не просто модули отклонений? Три причины:
- Квадрат убирает знак — плюсовые и минусовые остатки не гасят друг друга.
- Квадрат сильнее штрафует большие промахи, поэтому линия «не терпит» далёких выбросов.
- Для квадратичной функции есть аккуратное аналитическое решение — коэффициенты считаются формулой, без перебора.
Для парной регрессии формулы такие:
b1 = cov(x, y) / var(x)
b0 = mean(y) - b1 · mean(x)
То есть наклон — это ковариация x и y, делённая на дисперсию x, а свободный член подбирается так, чтобы линия прошла через точку средних (mean(x), mean(y)). Проверим руками на numpy:
import numpy as np
x = np.array([10, 20, 30, 40, 50], dtype=float) # бюджет, тыс. руб.
y = np.array([42, 78, 96, 145, 168], dtype=float) # заявки
b1 = np.cov(x, y, bias=True)[0, 1] / np.var(x)
b0 = y.mean() - b1 * x.mean()
print(f"b1 = {b1:.3f}") # b1 = 3.190
print(f"b0 = {b0:.3f}") # b0 = 10.100
Наклон 3,19 означает, что каждая дополнительная тысяча рублей бюджета в среднем даёт около 3,2 заявки. Дальше эти же числа выдаст любая библиотека — просто спрятав арифметику под капот.
Что показывает R-квадрат и как его читать?
Коэффициенты говорят про направление и силу связи, но не про то, насколько хорошо прямая вообще описывает данные. За это отвечает R-квадрат (коэффициент детерминации).
R-квадрат — это доля дисперсии y, которую объясняет модель. Считается так:
R2 = 1 - SS_res / SS_tot
где SS_res — сумма квадратов остатков (что модель не объяснила), а SS_tot — сумма квадратов отклонений y от собственного среднего (весь разброс данных). Значение лежит от 0 до 1:
R2 = 1— линия проходит ровно через все точки, идеальное объяснение (в реальных данных почти не бывает).R2 = 0— модель не лучше, чем просто предсказывать средний y всегда.R2 = 0.7— модель объясняет 70% разброса, остальные 30% приходятся на факторы вне модели и случайность.
Что считать «хорошим» R-квадратом — зависит от области. В физике ждут 0,95+, в поведенческих и маркетинговых данных 0,3–0,5 уже полезно, потому что поведение людей шумное по своей природе.
Три предостережения, о которых часто забывают:
- Высокий R-квадрат не значит правильную модель. Можно получить 0,9 на связи, которой в реальности нет (ложная корреляция), или на переобученной модели.
- R-квадрат всегда растёт при добавлении признаков, даже бесполезных. Поэтому для множественной регрессии смотрят на скорректированный R-квадрат (adjusted R-squared) — он штрафует за лишние переменные.
- Низкий R-квадрат — не всегда провал. Если вы оцениваете эффект одного фактора (например, влияние промо на выручку), важнее значимость и величина коэффициента, а не общая объясняющая сила.
R-квадрат тесно связан с корреляцией: для парной регрессии он равен квадрату коэффициента корреляции Пирсона между x и y. Если хотите освежить корреляцию и её ловушки, полезен разбор нормального распределения и доверительного интервала простыми словами.
Как построить регрессию в statsmodels и sklearn?
В Python два основных пути. statsmodels даёт подробную статистическую сводку (коэффициенты, p-value, доверительные интервалы) — это выбор аналитика, когда нужно интерпретировать. sklearn заточен под машинное обучение и прогноз — минимум статистики, максимум удобства для пайплайнов и предсказаний.
Начнём со statsmodels:
import numpy as np
import statsmodels.api as sm
x = np.array([10, 20, 30, 40, 50, 60, 70], dtype=float)
y = np.array([42, 78, 96, 145, 168, 195, 240], dtype=float)
X = sm.add_constant(x) # добавляем столбец единиц для b0
model = sm.OLS(y, X).fit() # обучаем МНК
print(model.summary())
print("\nПрогноз для бюджета 80:", model.predict([1, 80]))
sm.add_constant добавляет столбец единиц — без него statsmodels посчитает регрессию без свободного члена (прямая через ноль), что почти всегда не то, что нужно. В predict первый элемент 1 — та самая константа.
Теперь sklearn, тот же смысл, другой интерфейс:
import numpy as np
from sklearn.linear_model import LinearRegression
x = np.array([10, 20, 30, 40, 50, 60, 70]).reshape(-1, 1) # признаки: 2D-массив
y = np.array([42, 78, 96, 145, 168, 195, 240])
model = LinearRegression().fit(x, y)
print("b1 (наклон):", model.coef_[0])
print("b0 (свободный член):", model.intercept_)
print("R2:", model.score(x, y))
print("Прогноз для 80:", model.predict([[80]])[0])
Обратите внимание: sklearn требует, чтобы признаки были двумерным массивом (reshape(-1, 1) для одного признака), а константу добавляет сам — отдельный столбец единиц не нужен. Коэффициенты обе библиотеки выдадут одинаковые: математика под капотом та же, отличается только упаковка результата.
Отработать подобные скрипты на живых датасетах можно в Python-тренажёре, а пошаговый заход в тему — через курс pandas и статью про разведочный анализ данных на Python.
Как интерпретировать вывод модели и p-value коэффициентов?
Главная ценность statsmodels — таблица summary(). Разберём её по строкам на примере вывода выше (числа условные, близкие к нашим данным):
coef std err t P>|t| [0.025 0.975]
const -3.2857 6.489 -0.506 0.634 -19.968 13.397
x1 3.2679 0.147 22.24 0.000 2.891 3.645
------------------------------------------------------------------
R-squared: 0.990
Adj. R-squared: 0.988
F-statistic: 494.6 Prob (F-statistic): 3.4e-06
Что читать в первую очередь:
- coef — сами коэффициенты.
x1 = 3.27— каждая тысяча бюджета даёт ~3,3 заявки.const = -3.29— формальный свободный член. - P>|t| (p-value) — вероятность увидеть такой коэффициент случайно, если на самом деле связи нет. Для x1 это 0.000 — связь бюджета и заявок статистически значима. Для const это 0.634 — свободный член неотличим от нуля, что нормально: он тут технический.
- [0.025 0.975] — 95% доверительный интервал коэффициента. Для x1 это [2.89, 3.65]: истинный наклон с высокой уверенностью лежит в этих границах. Если интервал не пересекает ноль — коэффициент значим.
- std err — стандартная ошибка оценки коэффициента; чем меньше, тем точнее оценка.
- t — коэффициент, делённый на свою стандартную ошибку; большие по модулю значения дают маленькое p-value.
Практическое правило: коэффициент считают значимым, если p-value < 0.05 (порог можно менять под задачу). Если p-value большое, у вас нет статистических оснований утверждать, что этот фактор влияет на y. Подробнее логика порогов разобрана в статьях про p-value простыми словами и ошибки первого и второго рода.
F-статистика и её Prob проверяют модель целиком: значима ли регрессия в принципе (хотя бы один коэффициент не ноль). Маленький Prob (F-statistic) — модель осмысленна.
Регрессия часто всплывает на собеседованиях аналитика вместе с A/B-тестами и статистикой — потренировать формулировки поможет банк вопросов по статистике и AI-мок-собес.
Когда линейная регрессия неуместна?
Модель мощная, но у неё есть допущения. Если они нарушены, коэффициенты и p-value становятся ненадёжными, а прогноз — обманчивым. Основные ситуации, когда прямая не подходит:
- Связь нелинейная. Если y растёт по параболе или выходит на плато, прямая усреднит всё в кашу. Признак — на графике остатков видна дуга или воронка. Иногда спасает преобразование признака (логарифм, квадрат), иначе нужна другая модель.
- Есть влиятельные выбросы. Из-за квадратов в МНК одна аномальная точка способна перекосить всю линию. Перед регрессией всегда стройте scatter-plot и смотрите на остатки — какой график выбрать, подсказывает разбор matplotlib и seaborn.
- Гетероскедастичность — разброс остатков растёт вместе с x (веер на графике). Тогда стандартные ошибки занижены, а p-value врут. Лечится робастными ошибками или преобразованием y.
- Автокорреляция остатков — частая беда временных рядов, где соседние наблюдения зависимы. Для рядов лучше специальные методы; полезен разбор pandas и временных рядов.
- Мультиколлинеарность — в множественной регрессии два предиктора сильно скоррелированы (например, «бюджет в рублях» и «бюджет в долларах»). Коэффициенты становятся неустойчивыми и меняют знак от мелких правок данных.
И главное правило, которое повторяют на каждом курсе статистики: корреляция — не причинно-следственная связь. Регрессия покажет, что рост мороженого коррелирует с числом утоплений, но причина у обоих — жара, а не мороженое. Чтобы говорить о причинности, нужны эксперимент (A/B-тест) или квазиэкспериментальные методы вроде difference-in-differences. Регрессия отвечает на «как связано», а не «что причина чего».
Когда предпосылки выполнены и вы понимаете ограничения, линейная регрессия — один из самых прозрачных инструментов: её легко объяснить продакту, легко посчитать и легко проверить.
Что запомнить
- Линейная регрессия описывает связь прямой
y = b0 + b1·x: b0 — старт при x = 0, b1 — на сколько меняется y при росте x на единицу. - Коэффициенты подбираются методом наименьших квадратов — минимизацией суммы квадратов остатков.
- R-квадрат — доля объяснённого разброса; высокое значение не гарантирует правильную модель, а низкое не всегда провал.
- statsmodels — для интерпретации (coef, p-value, доверительные интервалы), sklearn — для прогноза и пайплайнов.
- Коэффициент значим при p-value < 0.05 и доверительном интервале, не пересекающем ноль.
- Всегда проверяйте допущения: линейность, выбросы, гомоскедастичность — и помните, что корреляция не равна причинности.
Регрессия — навык, который проверяют почти на каждом собеседовании аналитика. Закрепить его лучше всего практикой: соберите модель на своих данных, прочитайте summary() и объясните каждый коэффициент вслух. Начать можно с бесплатных задач в Python-тренажёре — первые пять открыты без подписки, а дальше открывается полный доступ ко всем задачам по pandas, numpy и статистике. Для SQL-части подготовки рядом лежит SQL-тренажёр с настоящим PostgreSQL в браузере. А чтобы связать регрессию с продуктовыми метриками, посмотрите, как считаются retention и LTV — там регрессия помогает прогнозировать поведение когорт.