линейная регрессияpythonstatsmodelssklearnстатистика

Линейная регрессия простыми словами и Python

2026-07-10 12 мин

Коротко: линейная регрессия — это способ описать связь между двумя величинами прямой линией y = b0 + b1·x. Здесь b0 — точка, где линия пересекает ось Y (значение при x = 0), а b1 — наклон: на сколько в среднем меняется y, когда x растёт на единицу. Коэффициенты подбираются методом наименьших квадратов — так, чтобы сумма квадратов отклонений точек от линии была минимальной. Качество подгонки показывает R-квадрат: доля разброса y, которую объясняет модель.

Регрессия — базовый инструмент аналитика: она отвечает на вопрос «как одно влияет на другое и насколько сильно». Разберём её по кусочкам, а потом построим на Python в двух библиотеках — statsmodels (для интерпретации) и sklearn (для прогноза).

Что такое линейная регрессия простыми словами?

Представьте таблицу: сколько денег компания тратит на рекламу в месяц и сколько заявок приходит. Точки на графике «расходы — заявки» лежат не идеально, но заметно тянутся вверх: больше рекламы — больше заявок. Линейная регрессия проводит через это облако точек одну прямую, которая лучше всего описывает общий тренд.

Уравнение простой (парной) регрессии:

y = b0 + b1·x

Когда предикторов несколько, модель становится множественной:

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:

Что считать «хорошим» R-квадратом — зависит от области. В физике ждут 0,95+, в поведенческих и маркетинговых данных 0,3–0,5 уже полезно, потому что поведение людей шумное по своей природе.

Три предостережения, о которых часто забывают:

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

Что читать в первую очередь:

Практическое правило: коэффициент считают значимым, если p-value < 0.05 (порог можно менять под задачу). Если p-value большое, у вас нет статистических оснований утверждать, что этот фактор влияет на y. Подробнее логика порогов разобрана в статьях про p-value простыми словами и ошибки первого и второго рода.

F-статистика и её Prob проверяют модель целиком: значима ли регрессия в принципе (хотя бы один коэффициент не ноль). Маленький Prob (F-statistic) — модель осмысленна.

Регрессия часто всплывает на собеседованиях аналитика вместе с A/B-тестами и статистикой — потренировать формулировки поможет банк вопросов по статистике и AI-мок-собес.

Когда линейная регрессия неуместна?

Модель мощная, но у неё есть допущения. Если они нарушены, коэффициенты и p-value становятся ненадёжными, а прогноз — обманчивым. Основные ситуации, когда прямая не подходит:

И главное правило, которое повторяют на каждом курсе статистики: корреляция — не причинно-следственная связь. Регрессия покажет, что рост мороженого коррелирует с числом утоплений, но причина у обоих — жара, а не мороженое. Чтобы говорить о причинности, нужны эксперимент (A/B-тест) или квазиэкспериментальные методы вроде difference-in-differences. Регрессия отвечает на «как связано», а не «что причина чего».

Когда предпосылки выполнены и вы понимаете ограничения, линейная регрессия — один из самых прозрачных инструментов: её легко объяснить продакту, легко посчитать и легко проверить.

Что запомнить

Регрессия — навык, который проверяют почти на каждом собеседовании аналитика. Закрепить его лучше всего практикой: соберите модель на своих данных, прочитайте summary() и объясните каждый коэффициент вслух. Начать можно с бесплатных задач в Python-тренажёре — первые пять открыты без подписки, а дальше открывается полный доступ ко всем задачам по pandas, numpy и статистике. Для SQL-части подготовки рядом лежит SQL-тренажёр с настоящим PostgreSQL в браузере. А чтобы связать регрессию с продуктовыми метриками, посмотрите, как считаются retention и LTV — там регрессия помогает прогнозировать поведение когорт.

Тренируй Python на реальных задачах аналитика
Регрессия, разведочный анализ и pandas — в тренажёре. Первые 5 задач бесплатно, дальше открывается Pro-доступ ко всем 402 задачам.
Открыть Python-тренажёр →