Как выполнить простую линейную регрессию в Python (шаг за шагом)

Как выполнить простую линейную регрессию в Python (шаг за шагом)

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

Этот метод находит линию, которая лучше всего «соответствует» данным, и принимает следующий вид:

ŷ = б 0 + б 1 х

куда:

  • ŷ : Расчетное значение отклика
  • b 0 : точка пересечения линии регрессии
  • b 1 : Наклон линии регрессии

Это уравнение может помочь нам понять взаимосвязь между объясняющей переменной и переменной отклика, и (при условии, что она статистически значима) его можно использовать для прогнозирования значения переменной отклика при заданном значении объясняющей переменной.

В этом руководстве представлено пошаговое объяснение того, как выполнить простую линейную регрессию в Python.

Шаг 1: Загрузите данные

В этом примере мы создадим поддельный набор данных, содержащий следующие две переменные для 15 студентов:

  • Общее количество часов, отработанных для некоторого экзамена
  • Оценка экзамена

Мы попытаемся подогнать простую модель линейной регрессии, используя часы в качестве объясняющей переменной и экзаменационный балл в качестве переменной ответа.

Следующий код показывает, как создать этот поддельный набор данных в Python:

import pandas as pd

#create dataset
df = pd.DataFrame({'hours': [1, 2, 4, 5, 5, 6, 6, 7, 8, 10, 11, 11, 12, 12, 14],
 'score': [64, 66, 76, 73, 74, 81, 83, 82, 80, 88, 84, 82, 91, 93, 89]})


#view first six rows of dataset
df[0:6]

 hours score
0 1 64
1 2 66
2 4 76
3 5 73
4 5 74
5 6 81

Шаг 2: Визуализируйте данные

Прежде чем мы подберем простую модель линейной регрессии, мы должны сначала визуализировать данные, чтобы понять их.

Во-первых, мы хотим убедиться, что связь между часами и счетом примерно линейна, так как это основное предположение простой линейной регрессии.

Мы можем создать простую диаграмму рассеяния , чтобы просмотреть взаимосвязь между двумя переменными:

import matplotlib.pyplot as plt

plt.scatter (df.hours, df.score)
plt.title('Hours studied vs. Exam Score')
plt.xlabel('Hours')
plt.ylabel('Score')
plt.show()
Диаграмма рассеяния в Python

Из графика видно, что зависимость кажется линейной. По мере увеличения количества часов оценка также имеет тенденцию к линейному увеличению.

Затем мы можем создать блочную диаграмму, чтобы визуализировать распределение результатов экзаменов и проверить наличие выбросов.По умолчанию Python определяет наблюдение как выброс, если оно в 1,5 раза превышает межквартильный размах, превышающий третий квартиль (Q3), или в 1,5 раза превышает межквартильный размах, меньший первого квартиля (Q1).

Если наблюдение является выбросом, на диаграмме появится крошечный кружок:

df.boxplot(column=['score']) 
Блочная диаграмма в Python

На диаграмме нет крошечных кружков, что означает, что в нашем наборе данных нет выбросов.

Шаг 3: выполните простую линейную регрессию

После того, как мы убедились, что взаимосвязь между нашими переменными является линейной и что нет никаких выбросов, мы можем приступить к подбору простой модели линейной регрессии, используя часы в качестве объясняющей переменной и оценку в качестве переменной ответа:

Примечание. Мы будем использовать функцию OLS() из библиотеки statsmodels, чтобы соответствовать модели регрессии.

import statsmodels.api as sm

#define response variable
y = df['score']

#define explanatory variable
x = df[['hours']]

#add constant to predictor variables
x = sm.add_constant (x)

#fit linear regression model
model = sm. OLS (y, x). fit ()

#view model summary
print(model. summary ())

 OLS Regression Results 
==============================================================================
Dep. Variable: score R-squared: 0.831
Model: OLS Adj. R-squared: 0.818
Method: Least Squares F-statistic: 63.91
Date: Mon, 26 Oct 2020 Prob (F-statistic): 2.25e-06
Time: 15:51:45 Log-Likelihood: -39.594
No. Observations: 15 AIC: 83.19
Df Residuals: 13 BIC: 84.60
Df Model: 1 
Covariance Type: nonrobust 
==============================================================================
 coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 65.3340 2.106 31.023 0.000 60.784 69.884
hours 1.9824 0.248 7.995 0.000 1.447 2.518
==============================================================================
Omnibus: 4.351 Durbin-Watson: 1.677
Prob(Omnibus): 0.114 Jarque-Bera (JB): 1.329
Skew: 0.092 Prob(JB): 0.515
Kurtosis: 1.554 Cond. No. 19.2
==============================================================================

Из сводки модели мы видим, что подобранное уравнение регрессии:

Оценка = 65,334 + 1,9824 * (часы)

Это означает, что каждый дополнительный час обучения связан со средним увеличением экзаменационного балла на 1,9824 балла. А значение отрезка 65,334 говорит нам о среднем ожидаемом экзаменационном балле для студента, который учится ноль часов.

Мы также можем использовать это уравнение, чтобы найти ожидаемую оценку экзамена на основе количества часов, которые изучает студент. Например, студент, который занимается 10 часов, должен получить экзаменационный балл 85,158 :

Оценка = 65,334 + 1,9824 * (10) = 85,158

Вот как интерпретировать остальную часть сводки модели:

  • P>|t|: это значение p, связанное с коэффициентами модели. Поскольку p-значение для часов (0,000) значительно меньше 0,05, мы можем сказать, что существует статистически значимая связь между часами и оценкой .
  • R-квадрат: это число говорит нам о том, какую процентную вариацию в экзаменационных баллах можно объяснить количеством часов обучения. В целом, чем больше значение R-квадрата регрессионной модели, тем лучше независимые переменные способны предсказать значение переменной отклика. В этом случае 83,1% вариации баллов можно объяснить часами обучения.
  • F-статистика и p-значение: F-статистика ( 63,91 ) и соответствующее значение p ( 2,25e-06 ) говорят нам об общей значимости регрессионной модели, т. е. о том, полезны ли независимые переменные в модели для объяснения вариации. в переменной ответа. Поскольку p-значение в этом примере меньше 0,05, наша модель является статистически значимой, и считается, что часы полезны для объяснения вариаций в баллах .

Шаг 4: Создайте остаточные графики

После того, как мы подогнали простую модель линейной регрессии к данным, последним шагом является создание остаточных графиков.

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

Чтобы убедиться, что эти предположения выполняются, мы можем построить следующие остаточные графики:

График остаточных и подобранных значений: этот график полезен для подтверждения гомоскедастичности. На оси X отображаются подогнанные значения, а на оси Y — остатки. Пока остатки кажутся случайно и равномерно распределенными по диаграмме вокруг нулевого значения, мы можем предположить, что гомоскедастичность не нарушена:

#define figure size
fig = plt.figure(figsize=(12,8))

#produce residual plots
fig = sm.graphics. plot_regress_exog (model, 'hours', fig=fig)
Остаточные графики в Python

Изготовлены четыре участка. Тот, что в верхнем правом углу, - это остаточный график по сравнению с подогнанным. По оси X на этом графике показаны фактические значения точек переменной предиктора, а по оси Y показана невязка для этого значения.

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

График QQ: этот график полезен для определения того, следуют ли остатки нормальному распределению. Если значения данных на графике падают примерно по прямой линии под углом 45 градусов, то данные распределяются нормально:

#define residuals
res = model. resid

#create Q-Q plot
fig = sm. qqplot (res, fit= True , line=" 45 ")
plt.show()
График QQ в Python

Остатки немного отклоняются от 45-градусной линии, но не настолько, чтобы вызывать серьезное беспокойство. Можно считать, что условие нормальности выполнено.

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

Полный код Python, использованный в этом руководстве, можно найти здесь .

Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.