Линейная регрессия и метод наименьших квадратов

Корреляция говорит, есть ли связь. Линейная регрессия идёт дальше: строит формулу, по которой можно предсказывать.

Простая линейная регрессия описывает связь двух величин прямой y = a·x + b, где a — наклон, b — сдвиг. Метод наименьших квадратов (МНК) выбирает такую прямую, чтобы суммарный квадрат отклонений точек от неё был минимален.

Идея «лучшей прямой»

Представьте облако точек на плоскости (например, площадь квартиры и её цена). Через него можно провести бесконечно много прямых. МНК выбирает ту, для которой сумма квадратов вертикальных отклонений точек от прямой минимальна — отсюда «наименьшие квадраты». Квадраты, как и в дисперсии, убирают знак и сильнее штрафуют большие промахи.

Формулы наклона и сдвига

Для прямой y = a·x + b коэффициенты считаются так:

  • наклон a = (сумма (x−x̄)(y−ȳ)) / (сумма (x−x̄)²);
  • сдвиг b = ȳ − a·x̄ (прямая проходит через точку средних).
from statistics import mean

# Площадь (кв. м) -> цена (млн руб.)
area  = [30, 40, 50, 60, 70, 80]
price = [3.1, 3.9, 5.2, 6.0, 7.1, 8.0]

mx, my = mean(area), mean(price)
a = sum((x - mx) * (y - my) for x, y in zip(area, price)) / sum((x - mx)**2 for x in area)
b = my - a * mx

print("Наклон a:", round(a, 4))
print("Сдвиг b:", round(b, 4))
print(f"Модель: цена = {round(a, 4)} * площадь + {round(b, 4)}")

Вывод:

Наклон a: 0.0997
Сдвиг b: 0.0657
Модель: цена = 0.0997 * площадь + 0.0657

Наклон 0.0997 означает: каждый дополнительный квадратный метр добавляет к цене примерно 0.0997 млн рублей (около 100 тысяч). Сдвиг b — теоретическая цена при площади 0; часто он сам по себе смысла не имеет, это просто параметр прямой.

Предсказание по модели

Главная польза регрессии — прогноз. Подставим в формулу площадь, которой не было в данных.

a, b = 0.0997, 0.0657

def predict(area):
    return a * area + b

for sq in [45, 55, 100]:
    print(f"Площадь {sq} кв.м -> прогноз цены: {predict(sq):.2f} млн")

Вывод:

Площадь 45 кв.м -> прогноз цены: 4.55 млн
Площадь 55 кв.м -> прогноз цены: 5.55 млн
Площадь 100 кв.м -> прогноз цены: 10.04 млн

Для 45 и 55 кв.м прогноз надёжен — это внутри диапазона данных. А вот 100 кв.м — экстраполяция за пределы наблюдений (у нас было максимум 80): такому прогнозу доверять опасно, связь за границей данных может вести себя иначе.

Насколько хороша прямая: R²

Качество линейной модели часто измеряют коэффициентом детерминации R² — долей разброса y, которую объясняет прямая. Для простой регрессии R² — это просто квадрат корреляции Пирсона. R² = 0.95 значит «модель объясняет 95% изменчивости».

from statistics import correlation

area  = [30, 40, 50, 60, 70, 80]
price = [3.1, 3.9, 5.2, 6.0, 7.1, 8.0]

r = correlation(area, price)
print("Корреляция r:", round(r, 4))
print("R-квадрат:", round(r**2, 4))

Вывод:

Корреляция r: 0.9984
R-квадрат: 0.9969

R² = 0.9969 — прямая объясняет 99.7% разброса цены. Площадь почти полностью определяет цену в этих данных, и линейная модель здесь отлично подходит.

Когда регрессия обманет

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

Поэтому регрессию всегда полезно сопровождать взглядом на диаграмму рассеяния — об этом следующий урок.

Итог

  • Линейная регрессия описывает связь прямой y = a·x + b и позволяет прогнозировать.
  • МНК подбирает прямую с минимальной суммой квадратов отклонений точек.
  • R² (квадрат корреляции) — доля разброса y, объяснённая моделью.
  • Экстраполяция за пределы данных и выбросы делают прогноз ненадёжным.
Проверьте себя
1. Что минимизирует метод наименьших квадратов?
AСумму значений y
BСумму квадратов вертикальных отклонений точек от прямой
CНаклон прямой
DЧисло точек
2. Что показывает коэффициент детерминации R²?
AНаклон прямой
BДолю разброса зависимой переменной, объяснённую моделью
CЧисло выбросов
DСреднее значение y
3. Почему прогноз цены для 100 кв.м в примере менее надёжен?
AПотому что 100 — некрасивое число
BЭто экстраполяция за пределы диапазона данных (макс. был 80 кв.м)
CПотому что регрессия не умеет считать большие числа
DПотому что R² слишком высокий
Поддержать проект