Добавить в корзинуПозвонить
Найти в Дзене
Герман Геншин

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

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

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

Что такое statsmodels?

-2

statsmodels — это Python-библиотека для запуска наиболее популярных статистических тестов. Особенно она крутa в задачах регрессии, которые часто встречаются в эконометрике. Но пользоваться ею просто, и вам совсем не нужно быть экономистом или академиком.

Поначалу statsmodels может показаться неудобной, но когда в ней разбираешься, она оказывается намного гибче и мощнее, чем стандартные средства вроде Excel. Только помните: графики statsmodels не рисует — для визуализации отлично подойдёт Seaborn.

Самое важное — statsmodels даёт результаты, которые совпадают с профессиональными пакетами вроде R, Stata или SAS. Если хотите проводить серьёзный анализ на научном или профессиональном уровне — это ваш выбор.

Простая линейная регрессия

Нужно выяснить, как связаны две переменные — зависимая (например, y) и независимая (x)? Для этого statsmodels подходит идеально.

Если раньше вы работали с R или хотите быстро построить модель на pandas DataFrame, statsmodels поддерживает знакомый синтаксис формул из R.

Сначала импортируем statsmodels и формульный API:

В качестве примера возьмём классический датасет чаевых и счетов в ресторане Нью-Йорка, который есть в Seaborn.

Посмотрим первые строки данных с помощью head:

-3

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

-4

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

-5

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

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

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

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

-6

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

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

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

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

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

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

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

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

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

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

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

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

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

-7

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

-8

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

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

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

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

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

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

-9

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

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

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

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

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

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

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

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

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

-10

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

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

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

results = sm.stats.anova_lm(penguin_multi_lm)

print(results)

-11

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

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

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

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

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