Линейная регрессия — Excel, R и Python
От корреляции к модели
Корреляция (коэффициент Пирсона) измеряет силу линейной связи двух числовых переменных. Простая линейная регрессия подбирает прямую y = β₀ + β₁·x + ε, где y — отклик (например, чаевые), x — предиктор (сумма счёта), β₀ — свободный член (intercept), β₁ — наклон.
Регрессия даёт уравнение для прогноза и тест на значимость наклона. Она не доказывает причинность — см. Причинно-следственный анализ. Проверить производную простой функции или получить LaTeX для отчёта — SymPy — уравнения и производные; график scatter + линия — Matplotlib — примеры.
Теория углублена в Основы статистики; здесь — параллель в трёх средах на учебном наборе tips (счёт total_bill, чаевые tip).
Excel
Перед регрессией полезно уверенно пользоваться базовыми формулами — СУММ, СРЗНАЧ, ссылки на ячейки; примеры с разбором — Excel и Google Sheets — формулы — формулы в Lab.
| Шаг | Действие |
|---|---|
| 1 | Столбцы total_bill, tip; scatter plot |
| 2 | Добавить линию тренда → линейная; показать уравнение на графике |
| 3 | Функции НАКЛОН(y; x) и ОТРЕЗОК(y; x) — те же β₁ и β₀ |
| 4 | КОРРЕЛ — сверить с наклоном и масштабом данных |
Надстройка "Анализ данных" → Регрессия выводит таблицу с R², стандартными ошибками и F-тестом — удобно сверить с R/Python.
R
tips <- read.csv("tips.csv", stringsAsFactors = FALSE)
fit <- lm(tip ~ total_bill, data = tips)
summary(fit)
summary() — коэффициенты, стандартные ошибки, t-тест для β₁, R². График:
plot(tips$total_bill, tips$tip, pch = 16, col = "#33333388")
abline(fit, col = "steelblue", lwd = 2)
Разбиение train/test для оценки прогноза на новых строках — sample(), затем lm() на обучающей части; метрика RMSE на тесте (Основы статистики — предсказание).
Python
import pandas as pd
import seaborn as sns
import statsmodels.formula.api as smf
tips = sns.load_dataset("tips")
model = smf.ols("tip ~ total_bill", data=tips).fit()
print(model.summary())
Для только прогноза без полной таблицы коэффициентов:
from sklearn.linear_model import LinearRegression
import numpy as np
X = tips[["total_bill"]].values
y = tips["tip"].values
reg = LinearRegression().fit(X, y)
print(reg.intercept_, reg.coef_[0])
Визуализация — sns.regplot(data=tips, x="total_bill", y="tip") (Python для анализа данных — Seaborn).
Сравнение результатов
| Элемент | Excel | R lm | Python statsmodels |
|---|---|---|---|
| Наклон β₁ | НАКЛОН | Coefficients | total_bill coef |
| Перехват β₀ | ОТРЕЗОК | (Intercept) | Intercept |
| R² | линия тренда / отчёт регрессии | Multiple R-squared | R-squared |
| p-значение наклона | отчёт надстройки | `Pr(> | t |
Числа должны совпасть с точностью до округления. Расхождение — сигнал проверить фильтры строк, пропуски или разные подмножества данных.
См. также
| Материал | Тема |
|---|---|
| Вероятность для аналитика данных — вероятность | перед регрессией |
| Табличные данные — Pandas, Polars, SQL и PySpark — таблицы + Excel | операции до модели |
| Простые приложения на R — R, tips | полный пример в R |