Регрессия в Python: Как найти взаимосвязи в ваших данных
Просто собирать данные недостаточно. Вы можете заполнить таблицы данными, но это бесполезно, если вы не можете на них действовать. Регрессия — один из самых мощных статистических инструментов для поиска взаимосвязей в данных. Python упрощает это, и он гораздо более гибкий, чем таблица. Отложите карандаш и линейку и возьмите Python. Вот как начать.
Простая линейная регрессия: поиск трендов
Самая простая форма регрессии в Python — это простая линейная регрессия. При простой линейной регрессии вы пытаетесь выяснить, существует ли связь между двумя переменными, первая из которых называется «независимой переменной», а вторая — «зависимой переменной». Независимая переменная обычно отображается по оси x, а зависимая переменная — по оси y. Это создает классический диаграмму рассеяния точек данных. Цель состоит в том, чтобы провести линию, которая наилучшим образом подходит для этой диаграммы рассеяния.
Мы начнем с использования примерных данных о чаевых в ресторанах Нью-Йорка. Мы хотим выяснить, существует ли связь между общей суммой счета и чаевыми. Этот набор данных включен в пакет для статистической визуализации Seaborn, мой любимый инструмент для визуализации данных. Я настроил эти инструменты в окружении Mamba для удобного доступа.
Сначала мы импортируем Seaborn, базу данных для статистической визуализации.
import seaborn as sns
Тогда мы загрузим набор данных:
tips = sns.load_dataset('tips')
Если вы используете блокнот Jupyter, как тот, на который я ссылаюсь на своей странице GitHub, обязательно добавьте эту строку, чтобы изображения отображались в блокноте, а не в отдельном окне:
%matplotlib inline
Теперь мы рассмотрим диаграмму рассеяния с помощью метода relplot:
sns.relplot(x='total_bill',y='tip',data=tips)
Диаграмма рассеяния, по-видимому, в основном линейная. Это означает, что может существовать положительная линейная связь между суммой счета и чаевыми. Мы можем построить линию регрессии с помощью метода regplot:
sns.regplot(x='total_bill',y='tip',data=tips)
Эта линия действительно кажется довольно подходящей.
Мы можем использовать другую библиотеку, Pingouin, для более формального анализа. Метод linear_regression в Pingouin рассчитает коэффициенты для регрессионного уравнения линии, чтобы подстроиться под данные точки и определить качество подгонки.
import pingouin as pg pg.linear_regression(tips['total_bill'],tips['tip']).round(2)
Округление сделает результаты более удобочитаемыми. Число, на которое стоит обратить внимание в линейной регрессии, — это коэффициент корреляции. В полученной таблице он указан как «r2», так как это квадрат коэффициента корреляции. Он равен 0.46, что указывает на хорошую подгонку. Извлечение квадратного корня показывает, что это примерно 0.68, что довольно близко к 1, указывая на положительную линейную связь более формально, чем график, который мы видели ранее.
Мы также можем построить модель с значениями в таблице. Вы, возможно, помните уравнение прямой: y=mx + b. y будет зависимой переменной, m — коэффициент x, или общий счет, который равен 0.11. Это определяет, насколько крутой будет прямая. b — это y-пересечение, или 0.92.
Результирующее уравнение на основе этой модели — это
tip = 0.11(total bill) + 0.92
Уравнения для регрессии меняют это местами, так что это будет:
tip = 0.92 + 0.11(total_bill)
Мы можем написать короткую функцию на Python, которая предсказывает чаевые на основе суммы счета.
def tip(total_bill): return 0.92 + 0.11 * total_bill
Вторая строка должна быть с отступом, но наша CMS не может это отобразить, поэтому, пожалуйста, убедитесь, что вы отступили эту строку на своем компьютере. Помните, что отступы в Python состоят из четырех пробелов.
Давайте предскажем чаевые от чека ресторана на $100:
tip(100)
Ожидаемая чаевые составят около 12 долларов.
Множественная линейная регрессия: выведение регрессии в третье измерение и далее
Линейную регрессию можно расширить на большее количество переменных, чем только две. Вы можете рассмотреть больше независимых переменных. Вместо того, чтобы подгонять линию под точки данных на плоскости, вы подгоняете плоскость под диаграмму рассеяния. К сожалению, это сложнее визуализировать, чем с 2D регрессией. Я использовал множественную регрессию, чтобы построить модель цен на ноутбуки на основе их характеристик.
Мы будем использовать набор данных о чаевых. На этот раз мы посмотрим на размер группы по столбцу «size». Это легко сделать в Pingouin.
pg.linear_regression(tips[['total_bill','size']],tips['tip']).round(2)
Обратите внимание на двойные скобки вокруг первого аргумента, указывающего на общую сумму счета и размер компании. Заметьте, что r² идентичен. Это снова означает, что модель хорошо подходит, и общая сумма счета и размер стола являются хорошими предсказателями чаевых.
Мы можем переписать нашу предыдущую модель с учетом размера, используя коэффициент размера таблицы:
def tip(total_bill,size): return 0.67 + 0.09 * total_bill + 0.19 * size
Нелинейная регрессия: Подбор кривых
Вы можете не только провести линейную регрессию, но и подобрать нелинейные кривые. Я продемонстрирую это, используя NumPy для генерации некоторых точек данных, которые могут представлять квадратичное график.
Сначала я создам большой массив данных в NumPy для оси x:
x = np.linspace(-100,100,1000)
Теперь я создам квадратичный график для оси y.
y = 4*x**2 + 2*x + 3
Чтобы создать регрессию, я создам DataFrame Pandas, структуру данных, аналогичную реляционной базе данных, для осей x и y. Это создаст столбцы для значений x и y с именами «x» и «y». Мы передаем словарь для создаваемого DataFrame в Pandas. Мы назовем наш DataFrame «df.»
import pandas as pd df = pd.DataFrame({'x':x,'y':y})
Мы можем изучить наш DataFrame с помощью метода head:
df.head()
Мы можем создать диаграмму разброса с помощью Seaborn, как мы делали ранее с линейными данными:
sns.relplot(x='x',y='y',data=df)
Это похоже на классический параболический график, который вы могли запомнить из класса математики, строив его на вашем графическом калькуляторе (который может заменить Python). Давайте посмотрим, сможем ли мы подогнать параболу. Метод regplot в Seaborn имеет опцию order, которая указывает степень полиномиальной линии для подгонки. Поскольку мы пытаемся построить квадратичную линию, мы установим порядок равным 2:
sns.regplot(x='x',y='y',order=2,data=df)
Действительно, похоже, что это классическая квадратическая парабола.
Чтобы получить регрессионный формат, мы можем использовать метод нелинейной регрессии с Pingouin. Мы просто добавим еще один столбец в наш DataFrame, чтобы возвести в квадрат значения x:
df['x2'] = df['x']**2
Затем мы можем использовать линейную регрессию для подгонки квадратной кривой:
pg.linear_regression(df[['x','x2']],df['y']).round(2)
Поскольку это было искусственное создание, r² равно 1, что указывает на очень хорошую подгонку, чего вы, вероятно, не увидите на данных из реальной жизни.
Мы также можем создать предсказательную модель, используя функцию:
def quad(x): return 3 + 2*x + 4*x**2
Вы также можете расширить этот метод на многочлены с степенями выше 2.
Логистическая регрессия: Подгонка бинарных категорий
Если вы хотите найти взаимосвязь для бинарных категорий, таких как определенный фактор риска, например, курит ли человек или нет, мы можем использовать логистическую регрессию.
Самый простой способ визуализировать это снова — использовать библиотеку Seaborn. Мы загрузим набор данных о пассажирах на Титанике. Мы хотим выяснить, была ли цена билета предиктором того, кто выживет в этой несчастной поездке.
titanic = sns.load_dataset('titanic')
Мы можем проанализировать данные так же, как мы делали это с квадратным DataFrame:
titanic.head()
Мы используем метод lmplot, поскольку он может подогнать логистическую кривую:
sns.lmplot(x='fare',y='survived',logistic=True,data=titanic)
Мы видим логистическую кривую по количеству пассажиров, разделенную на выживших и не выживших. Столбец «выжили» уже разделен на 0 для «не выжили» и 1 для «выжили.»
Мы можем использовать Pingouin, чтобы формально определить, была ли цена билета предиктором выживания на Титанике, используя Pingouin, который среди многих своих статистических тестов предлагает логистическую регрессию:
pg.logistic_regression(titanic['fare'],titanic['survived']).round(2)
Число, на которое стоит обратить внимание в статистическом тесте, это p-значение, указанное в таблице как «pval.» Оно равно 0.0, что указывает на то, что цена билета была сильным предсказателем выживания в путешествии на Титанике.
Эти операции показывают, почему Python является языком выбора для анализа данных. Он позволяет выполнять операции, которые могли занять дни, если бы их делали вручную, или даже были бы за пределами того, что готовы делать статистики, всего за несколько секунд в Python. Эти регрессионные операции помогут вам просеивать ваши данные, чтобы найти взаимосвязи и делать прогнозы.











Добавить комментарий