Шокирующе просто! Регрессия и ANOVA в Python — забудьте про Excel и R навсегда!

Изображение Python, окружённого графиками и диаграммами

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

Что такое statsmodels?

Официальный сайт 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 в Jupyter notebook.

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

Точечная диаграмма: чаевые против суммы счета (Seaborn).

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

Регрессионная линия и точки чаевых в зависимости от счета (Seaborn).

По графику видно: чем выше счёт, тем щедрее чаевые. Но сами коэффициенты график не покажет — их вычислит statsmodels.

Для этого сначала подгоняем регрессионную линию к данным.

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

Посмотреть сводку можно разными способами: через print (для скриптов) или просто вызвать объект в интерактивной среде. Ниже я показываю именно второй вариант:

Результат регрессии чаевых в зависимости от счета (statsmodels, Jupyter notebook).

Перед нами полная таблица результатов. Подробности — чуть ниже.

Регрессию можно посчитать и на массивах NumPy, вручную добавив к признакам столбец единиц (смещение).

Сгенерируем случайные x и y через NumPy:

Для добавления столбца смещения удобно использовать функцию add_intercept из statsmodels.

Процесс создания модели здесь похож на работу с формулами из R.

Кстати, если использовать обычный API statsmodels (не формульный), функцию OLS нужно писать с большой буквы.

Множественная линейная регрессия

Добавить вторую (и любую следующую) независимую переменную проще простого. Это удобно, если подозреваете, что результат зависит не только от одного признака. В двумерном случае модель — плоскость, при большем числе переменных — гиперплоскость.

С формульным синтаксисом всё просто: добавляем в формулу дополнительный параметр через плюс. Например, вот как добавить размер компании к модели чаевых:

Чтобы включить ещё один фактор, в формуле просто используем «+».

Точно так же можно задавать нелинейные зависимости, например, квадратичные. Вот пример: генерируем модель в NumPy и собираем данные в pandas DataFrame.

Для визуального анализа строим точечную диаграмму:

Здесь явно видна парабола — то есть квадратичная зависимость.

Точечная диаграмма с параболой в Seaborn.

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

Результаты квадратичной регрессии из statsmodels.

Обратите внимание: «I()» вокруг x**2 сообщает statsmodels, что это не отдельный признак, а выражение x в квадрате.

Как разобраться с результатами регрессии?

Как же читать вывод регрессионного анализа?

В results.summary() появится таблица. В правом верхнем углу — r-квадрат, коэффициент, который показывает, насколько хорошо модель объясняет ваши данные: чем ближе к 1, тем сильнее связь. В реальных данных идеальных значений почти не бывает, но часто даже корректированный r-квадрат 0,463 — отличный показатель.

Корректированный r-квадрат особенно полезен, если у вас несколько факторов — он учитывает их «лишний вес». Обычно этот коэффициент чуть ниже обычного r-квадрата.

Дальше смотрим в основную таблицу: здесь свободный член, коэффициенты признаков и статистика их качества. Для простой регрессии формула y = mx + b, где m — коэффициент, b — смещение. При большем количестве переменных принцип сохраняется. Справа показаны доверительные интервалы: с большой вероятностью истинное значение лежит внутри этого диапазона (на графиках — затемнённая область).

Множественная регрессия: чаевые против счета и компании (Jupyter, statsmodels).

Столбец «std err» показывает, насколько значения расходятся относительно линии — чем меньше, тем лучше подгонка.

p-value — это показатель статистической значимости коэффициента. statsmodels автоматически проводит t-тест: если p-value меньше 0,05, этот коэффициент считается значимым.

Внизу таблицы приведены данные о распределении остатков (разниц между реальными точками и моделью). Чем ближе они к нормальному распределению — тем лучше ваша модель. Skew и kurtosis показывают отклонения остатков от идеальной формы. В жизни такие идеалы встречаются редко, но на них можно ориентироваться.

Однофакторный дисперсионный анализ (ANOVA)

Иногда нужно сравнить числовой параметр между категориями? Для этого используют ANOVA — дисперсионный анализ. В statsmodels всё просто: если у вас одна категория — это однофакторный ANOVA.

Давайте загрузим другой датасет — про пингвинов из Антарктиды.

Проверим: влияет ли вид пингвина на длину клюва? Модель как при регрессии, только с категориальной переменной:

Передаём данные функции anova_lm из statsmodels:

Смотрим результат:

Результаты ANOVA для длины клюва у разных видов пингвинов (statsmodels).

Смотрим p-value в таблице: если оно очень маленькое (в записи с минусом), значит, вид пингвина действительно влияет на длину клюва.

Многофакторный дисперсионный анализ (ANOVA)

Хотите добавить второй категориальный фактор — например, остров? Просто добавьте его в формулу, и statsmodels выполнит двухфакторный ANOVA:

results = sm.stats.anova_lm(penguin_multi_lm)

print(results)

Двухфакторный ANOVA для пингвинов (statsmodels).

В такой формуле переменные объединяются через знак умножения.

Проводить регрессию и ANOVA по большим массивам данных вручную — практически невозможно. А с statsmodels можно за пару строк получить уверенный статистический анализ. Я теперь вообще не представляю себе аналитику без этого инструмента!

Если вам понравилась эта статья, подпишитесь, чтобы не пропустить еще много полезных статей!

Премиум подписка — это доступ к эксклюзивным материалам, чтение канала без рекламы, возможность предлагать темы для статей и даже заказывать индивидуальные обзоры/исследования по своим запросам!

Подробнее о том, какие преимущества вы получите с премиум подпиской, можно узнать здесь

Также подписывайтесь на нас в:

Алекс Бежбакин
Оцените автора
Добавить комментарий