Линейная регрессия и метод наименьших квадратов
Корреляция говорит, есть ли связь. Линейная регрессия идёт дальше: строит формулу, по которой можно предсказывать.
Простая линейная регрессия описывает связь двух величин прямой 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, объяснённая моделью.
- Экстраполяция за пределы данных и выбросы делают прогноз ненадёжным.