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 ()
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 '])
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)
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()
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 .