Jak wykonać prostą regresję liniową w pythonie (krok po kroku)


Prosta regresja liniowa to technika, której możemy użyć do zrozumienia związku pomiędzy pojedynczą zmienną objaśniającą a pojedynczą zmienną odpowiedzi .

Technika ta znajduje linię, która najlepiej „pasuje” do danych i przyjmuje następującą postać:

ŷ = b 0 + b 1 x

Złoto:

  • ŷ : Szacowana wartość odpowiedzi
  • b 0 : Początek linii regresji
  • b 1 : Nachylenie linii regresji

Równanie to może pomóc nam zrozumieć związek pomiędzy zmienną objaśniającą a zmienną odpowiedzi oraz (zakładając, że jest istotne statystycznie) może zostać wykorzystane do przewidywania wartości zmiennej odpowiedzi, biorąc pod uwagę wartość zmiennej objaśniającej.

Ten samouczek zawiera szczegółowe wyjaśnienie sposobu przeprowadzania prostej regresji liniowej w języku Python.

Krok 1: Załaduj dane

Na potrzeby tego przykładu utworzymy fałszywy zbiór danych zawierający dwie zmienne dla 15 uczniów:

  • Łączna liczba godzin poświęconych na niektóre egzaminy
  • Wynik egazminu

Spróbujemy dopasować prosty model regresji liniowej, wykorzystując godziny jako zmienną objaśniającą i wyniki badań jako zmienną odpowiedzi.

Poniższy kod pokazuje, jak utworzyć ten fałszywy zbiór danych w Pythonie:

 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

Krok 2: Wizualizuj dane

Przed dopasowaniem prostego modelu regresji liniowej musimy najpierw wizualizować dane, aby je zrozumieć.

Po pierwsze, chcemy mieć pewność, że związek między godzinami a wynikiem jest w przybliżeniu liniowy, ponieważ jest to podstawowe założenie prostej regresji liniowej.

Możemy utworzyć prosty wykres rozrzutu, aby zwizualizować związek między dwiema zmiennymi:

 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 ()

Chmura punktów w Pythonie

Z wykresu widać, że zależność wydaje się być liniowa. Wraz ze wzrostem liczby godzin wynik również ma tendencję do zwiększania się liniowo.

Następnie możemy utworzyć wykres pudełkowy, aby zwizualizować rozkład wyników egzaminu i sprawdzić wartości odstające . Domyślnie Python definiuje obserwację jako wartość odstającą, jeśli jest 1,5-krotnością rozstępu międzykwartylowego powyżej trzeciego kwartyla (Q3) lub 1,5-krotności rozstępu międzykwartylowego poniżej pierwszego kwartyla (Q1).

Jeśli obserwacja jest odstająca, na wykresie pudełkowym pojawi się małe kółko:

 df. boxplot (column=[' score ']) 

Wykres pudełkowy w Pythonie

Na wykresie pudełkowym nie ma małych okręgów, co oznacza, że w naszym zbiorze danych nie ma wartości odstających.

Krok 3: Wykonaj prostą regresję liniową

Kiedy już potwierdzimy, że związek między naszymi zmiennymi jest liniowy i nie ma żadnych wartości odstających, możemy przystąpić do dopasowania prostego modelu regresji liniowej, wykorzystując godziny jako zmienną objaśniającą i wynik jako zmienną odpowiedzi:

Uwaga: Do dopasowania modelu regresji użyjemy funkcji OLS() z biblioteki 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                            
==================================================== ============================
Dept. Variable: R-squared score: 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
Model: 1                                         
Covariance Type: non-robust                                         
==================================================== ============================
                 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
==================================================== ============================

Z podsumowania modelu widzimy, że dopasowane równanie regresji ma postać:

Wynik = 65,334 + 1,9824*(godziny)

Oznacza to, że każda dodatkowa godzina nauki wiąże się ze średnim wzrostem wyniku z egzaminu o 1,9824 pkt. Oryginalna wartość 65 334 mówi nam, jaki jest średni oczekiwany wynik egzaminu dla studenta studiującego przez zero godzin.

Możemy również użyć tego równania, aby znaleźć oczekiwany wynik egzaminu na podstawie liczby godzin spędzonych przez studenta. Przykładowo student studiujący 10 godzin powinien uzyskać na egzaminie wynik 85,158 :

Wynik = 65,334 + 1,9824*(10) = 85,158

Oto jak zinterpretować pozostałą część podsumowania modelu:

  • P>|t| : Jest to wartość p powiązana ze współczynnikami modelu. Ponieważ wartość p dla godzin (0,000) jest znacznie mniejsza niż 0,05, możemy powiedzieć, że istnieje statystycznie istotny związek pomiędzy godzinami a wynikiem .
  • R-kwadrat: liczba ta mówi nam, że procent zróżnicowania wyników egzaminu można wyjaśnić liczbą godzin nauki. Ogólnie rzecz biorąc, im większa wartość R-kwadrat modelu regresji, tym lepiej zmienne objaśniające są w stanie przewidzieć wartość zmiennej odpowiedzi. W tym przypadku 83,1% zróżnicowania wyników wynika z przepracowanych godzin.
  • Statystyka F i wartość p: Statystyka F ( 63,91 ) i odpowiadająca jej wartość p ( 2.25e-06 ) mówią nam o ogólnym znaczeniu modelu regresji, tj. czy zmienne objaśniające w modelu są przydatne w wyjaśnianiu zmienności . w zmiennej odpowiedzi. Ponieważ wartość p w tym przykładzie jest mniejsza niż 0,05, nasz model jest istotny statystycznie i godziny uważa się za przydatne do wyjaśnienia zmienności wyniku .

Krok 4: Utwórz działki resztkowe

Po dopasowaniu prostego modelu regresji liniowej do danych ostatnim krokiem jest utworzenie wykresów reszt.

Jednym z kluczowych założeń regresji liniowej jest to, że reszty modelu regresji mają w przybliżeniu rozkład normalny i są homoskedastyczne na każdym poziomie zmiennej objaśniającej. Jeżeli te założenia nie zostaną spełnione, wyniki naszego modelu regresji mogą wprowadzać w błąd lub być niewiarygodne.

Aby sprawdzić, czy założenia te są spełnione, możemy utworzyć następujące wykresy reszt:

Wykres reszt w funkcji dopasowanych wartości: Wykres ten jest przydatny do potwierdzenia homoskedastyczności. Oś x wyświetla dopasowane wartości, a oś y wyświetla reszty. Dopóki reszty wydają się być losowo i równomiernie rozmieszczone na wykresie wokół wartości zerowej, możemy założyć, że homoskedastyczność nie jest naruszona:

 #define figure size
fig = plt. figure (figsize=(12.8))

#produce residual plots
fig = sm.graphics. plot_regress_exog (model, ' hours ', fig=fig)

Wykresy resztowe w Pythonie

Produkowane są cztery działki. Ten w prawym górnym rogu przedstawia wykres rezydualny w porównaniu z wykresem skorygowanym. Oś x na tym wykresie pokazuje rzeczywiste wartości punktów zmiennych predykcyjnych, a oś y pokazuje resztę dla tej wartości.

Ponieważ reszty wydają się być losowo rozproszone wokół zera, oznacza to, że heteroskedastyczność nie jest problemem w przypadku zmiennej objaśniającej.

Wykres QQ: Ten wykres jest przydatny do określenia, czy reszty mają rozkład normalny. Jeśli wartości danych na wykresie przebiegają mniej więcej po linii prostej pod kątem 45 stopni, wówczas dane mają rozkład normalny:

 #define residuals
res = model. reside

#create QQ plot
fig = sm. qqplot (res, fit= True , line=" 45 ")
plt.show() 

Wykres QQ w Pythonie

Wartości resztkowe odbiegają nieco od linii 45 stopni, ale nie na tyle, aby powodować poważne obawy. Można założyć, że założenie normalności jest spełnione.

Ponieważ reszty mają rozkład normalny i homoskedastyczny, sprawdziliśmy, czy spełnione są założenia prostego modelu regresji liniowej. Zatem wynik naszego modelu jest niezawodny.

Pełny kod Pythona użyty w tym samouczku można znaleźć tutaj .

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *