
Сегодня Python — главный язык для анализа данных. Всё благодаря множеству удобных библиотек. Один из самых востребованных инструментов здесь — линейная регрессия. В библиотеке statsmodels собрано всё для работы с регрессией и дисперсионным анализом. Сейчас покажу, как быстро начать с линейных моделей на Python — и почему возвращаться к старым методам уже не захочется.
Что такое statsmodels?

statsmodels — это Python-библиотека для запуска наиболее популярных статистических тестов. Особенно она крутa в задачах регрессии, которые часто встречаются в эконометрике. Но пользоваться ею просто, и вам совсем не нужно быть экономистом или академиком.
Поначалу statsmodels может показаться неудобной, но когда в ней разбираешься, она оказывается намного гибче и мощнее, чем стандартные средства вроде Excel. Только помните: графики statsmodels не рисует — для визуализации отлично подойдёт Seaborn.
Самое важное — statsmodels даёт результаты, которые совпадают с профессиональными пакетами вроде R, Stata или SAS. Если хотите проводить серьёзный анализ на научном или профессиональном уровне — это ваш выбор.
Простая линейная регрессия
Нужно выяснить, как связаны две переменные — зависимая (например, y) и независимая (x)? Для этого statsmodels подходит идеально.
Если раньше вы работали с R или хотите быстро построить модель на pandas DataFrame, statsmodels поддерживает знакомый синтаксис формул из R.
Сначала импортируем statsmodels и формульный API:
В качестве примера возьмём классический датасет чаевых и счетов в ресторане Нью-Йорка, который есть в Seaborn.
Посмотрим первые строки данных с помощью head:

Хочется понять: есть ли связь между размером чаевых и итоговой суммой счёта? Для наглядности построим точечную диаграмму через Seaborn.

Похоже, зависимость есть. Теперь проверим это на регрессионной диаграмме:

По графику видно: чем выше счёт, тем щедрее чаевые. Но сами коэффициенты график не покажет — их вычислит statsmodels.
Для этого сначала подгоняем регрессионную линию к данным.
Формульный API statsmodels поддерживает привычный синтаксис из R — этим занимается библиотека patsy. OLS — это «метод наименьших квадратов», ищущий оптимальную прямую. В формуле «tip» — зависимая переменная, «total_bill» — независимая. Волна (~) играет роль знака равенства. «data=tips» — указывает источник данных. Метод .fit() запускает анализ и сохраняет результат в объект «results».
Посмотреть сводку можно разными способами: через print (для скриптов) или просто вызвать объект в интерактивной среде. Ниже я показываю именно второй вариант:

Перед нами полная таблица результатов. Подробности — чуть ниже.
Регрессию можно посчитать и на массивах NumPy, вручную добавив к признакам столбец единиц (смещение).
Сгенерируем случайные x и y через NumPy:
Для добавления столбца смещения удобно использовать функцию add_intercept из statsmodels.
Процесс создания модели здесь похож на работу с формулами из R.
Кстати, если использовать обычный API statsmodels (не формульный), функцию OLS нужно писать с большой буквы.
Множественная линейная регрессия
Добавить вторую (и любую следующую) независимую переменную проще простого. Это удобно, если подозреваете, что результат зависит не только от одного признака. В двумерном случае модель — плоскость, при большем числе переменных — гиперплоскость.
С формульным синтаксисом всё просто: добавляем в формулу дополнительный параметр через плюс. Например, вот как добавить размер компании к модели чаевых:
Чтобы включить ещё один фактор, в формуле просто используем «+».
Точно так же можно задавать нелинейные зависимости, например, квадратичные. Вот пример: генерируем модель в NumPy и собираем данные в pandas DataFrame.
Для визуального анализа строим точечную диаграмму:
Здесь явно видна парабола — то есть квадратичная зависимость.

В формуле для регрессии добавляем предиктор x в квадрате (x**2):

Обратите внимание: «I()» вокруг x**2 сообщает statsmodels, что это не отдельный признак, а выражение x в квадрате.
Как разобраться с результатами регрессии?
Как же читать вывод регрессионного анализа?
В results.summary() появится таблица. В правом верхнем углу — r-квадрат, коэффициент, который показывает, насколько хорошо модель объясняет ваши данные: чем ближе к 1, тем сильнее связь. В реальных данных идеальных значений почти не бывает, но часто даже корректированный r-квадрат 0,463 — отличный показатель.
Корректированный r-квадрат особенно полезен, если у вас несколько факторов — он учитывает их «лишний вес». Обычно этот коэффициент чуть ниже обычного r-квадрата.
Дальше смотрим в основную таблицу: здесь свободный член, коэффициенты признаков и статистика их качества. Для простой регрессии формула y = mx + b, где m — коэффициент, b — смещение. При большем количестве переменных принцип сохраняется. Справа показаны доверительные интервалы: с большой вероятностью истинное значение лежит внутри этого диапазона (на графиках — затемнённая область).

Столбец «std err» показывает, насколько значения расходятся относительно линии — чем меньше, тем лучше подгонка.
p-value — это показатель статистической значимости коэффициента. statsmodels автоматически проводит t-тест: если p-value меньше 0,05, этот коэффициент считается значимым.
Внизу таблицы приведены данные о распределении остатков (разниц между реальными точками и моделью). Чем ближе они к нормальному распределению — тем лучше ваша модель. Skew и kurtosis показывают отклонения остатков от идеальной формы. В жизни такие идеалы встречаются редко, но на них можно ориентироваться.
Однофакторный дисперсионный анализ (ANOVA)
Иногда нужно сравнить числовой параметр между категориями? Для этого используют ANOVA — дисперсионный анализ. В statsmodels всё просто: если у вас одна категория — это однофакторный ANOVA.
Давайте загрузим другой датасет — про пингвинов из Антарктиды.
Проверим: влияет ли вид пингвина на длину клюва? Модель как при регрессии, только с категориальной переменной:
Передаём данные функции anova_lm из statsmodels:
Смотрим результат:

Смотрим p-value в таблице: если оно очень маленькое (в записи с минусом), значит, вид пингвина действительно влияет на длину клюва.
Многофакторный дисперсионный анализ (ANOVA)
Хотите добавить второй категориальный фактор — например, остров? Просто добавьте его в формулу, и statsmodels выполнит двухфакторный ANOVA:
results = sm.stats.anova_lm(penguin_multi_lm)
print(results)

В такой формуле переменные объединяются через знак умножения.
Проводить регрессию и ANOVA по большим массивам данных вручную — практически невозможно. А с statsmodels можно за пару строк получить уверенный статистический анализ. Я теперь вообще не представляю себе аналитику без этого инструмента!
Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!
Премиум подписка — это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!
Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь
Также подписывайтесь на нас в:
- Telegram: https://t.me/gergenshin
- Youtube: https://www.youtube.com/@gergenshin
- Яндекс Дзен: https://dzen.ru/gergen
- Официальный сайт: https://www-genshin.ru







