Átfogó útmutató a lényeges feltevések megértéséhez és teszteléséhez a lineáris regresszió valódi erejének felszabadításához
I. Bevezetés
Mi az a lineáris regresszió?
A lineáris regresszió egy függő változó és egy vagy több független változó közötti kapcsolat modellezésére szolgáló statisztikai módszer.
Miért fontos a feltevések tesztelése?
Ez azért fontos, mert a modell pontossága és megbízhatósága attól függ, hogy mennyire elégíti ki a feltételezéseit. Ez tovább vezethet az eredmény helytelen értelmezéséhez, és nem feltétlenül oldja meg megfelelően a probléma célját, amelyet kezelni próbálunk.
Ebben a bejegyzésben megteheti
- Ismerje meg a lineáris regresszió főbb feltételezéseit és azt, hogy miért fontos
- Hogyan lehet tesztelni az egyes feltételezéseket Pythonban
- Kijavításuk, ha egy vagy több feltételezés megsértődik
Akkor kezdjük
II. A lineáris regresszió főbb feltételezései
A lineáris regressziónak több olyan feltevése van, amelyeknek meg kell felelnem egy megbízható modell felépítéséhez. Ők:-
- Linearitás
Feltételezi, hogy a független és a függő változó között lineáris kapcsolat van. Egyszerűen fogalmazva, az „x” változó változása arányos az „y” változó változásával
A lineáris eloszlás vizualizálása
2. A maradékok normalitásaja
Feltételezi, hogy a maradékok (a tényleges értékek és a becsült értékek közötti különbség) normális eloszlásúak, azaz a maradékok eloszlásának átlaga nulla és állandó varianciája van
A normál eloszlás vizualizálása
3. Nincsenek outliersek
A kiugró értékek szélsőséges vagy szokatlan adatpontok az adatkészlet többi adatához képest. Itt az a feltételezés, hogy nincsenek jelentős kiugró értékek, amelyek befolyásolhatnák a regressziós eredményeket.
A kiugró értékek megjelenítése egy disztribúcióban
4. Nincs magas multikollinearitás
Feltételezi, hogy a független változók között nincs magas korreláció.
A multikollinearitás megjelenítése egy eloszlásban
Itt a fenti ábrán láthatjuk, hogy az x1 és az x3 jellemzők erősen korrelálnak egymással
5. Homoscedaszticitást
Feltételezi, hogy a reziduumok varianciája állandó a függő változó különböző értékei esetén, vagy a terjedése a diagramon látható módon nem formájú.
A homoszcedaszticitás vizualizálása egy disztribúcióban
A heteroszkedaszticitás vizualizálása egy eloszlásban
6. A maradékok függetlenséget
Feltételezi, hogy a reziduumoknak vagy hibáknak (a függő változó előrejelzett értékei és tényleges értékei közötti különbségek) függetlennek kell lenniük egymástól. Ha a reziduumok véletlenszerűen oszlanak el az átlag körül, akkor megállapítható, hogy a függetlenségi feltételezés nem sérül.
Amaradékok függetlenségének megjelenítése
III. A lineáris regressziós feltételezések ellenőrzése
1. Linearitást
Háromféleképpen ellenőrizhetjük a linearitási feltételezést
- Szórványdiagramok: Ha azt találjuk, hogy az adatpontok egy lineáris vonalban helyezkednek el, akkor a függő és a független változó közötti szóródási diagramot használva megállapíthatjuk, hogy lineáris kapcsolat van közöttük.
Python kód minta bemeneti adatok generálásához és a linearitás ellenőrzéséhez szóródiagram segítségével
# Import Basic Packages import numpy as np import matplotlib.pyplot as plt # Generate 1000 custom values with a linear relationship np.random.seed(123) x = np.linspace(0, 10, num=1000) y = 2*x + np.random.normal(loc=0, scale=1, size=1000) # with some random noise # Visualize the data in a scatter plot plt.scatter(x, y) plt.title('Scatter plot of 200 custom values with a linear relationship') plt.xlabel('Independent variable') plt.ylabel('Dependent variable') plt.show()
Kimenet:
- Korrelációs együtthatók: Az egyes független változók és függő változók között korrelációs együttható értékeket is használhatunk. Ha a korrelációs együttható értéke közelebb van 1-hez vagy -1-hez, akkor azt a következtetést vonhatjuk le, hogy erős lineáris kapcsolat áll fenn. Ha a korrelációs együttható értéke közelebb van a 0-hoz, akkor azt a következtetést vonhatjuk le, hogy kicsi vagy nincs lineáris kapcsolat
Python kód a linearitás ellenőrzéséhez a fent létrehozott adatokból származó korrelációs együtthatók segítségével
# Check linearity using correlation coefficients from scipy.stats import pearsonr corr, p_value = pearsonr(x, y) print('Correlation coefficient:', corr) print('p-value:', p_value) Output: Correlation coefficient: 0.9851961071699518 p-value: 0.0
Elemzés: Itt a p-érték a számított korrelációs együttható nullhipotézis szerinti megfigyelésének valószínűségét jelenti.
ahol, H0: Nincs lineáris kapcsolat x és y között.
A szignifikanciaszintnél kisebb p-érték (általában 0,05) azt jelzi, hogy a korrelációs együttható statisztikailag szignifikáns, és a nullhipotézist elvethetjük az alternatív hipotézis javára, miszerint x és y között lineáris kapcsolat van.
- Fennmaradó diagramok: ezek a maradékok (vagy hibák) és a függő változó közötti szóródási diagramok. Ha a maradékok véletlenszerűen oszlanak el az átlag körül, akkor megállapítható, hogy a linearitási feltételezés teljesül. Ha megfigyelünk egy mintát, akkor azt a következtetést vonhatjuk le, hogy a linearitási feltevés sérül
Python kód a linearitás ellenőrzéséhez a fent létrehozott adatokból származó maradék diagramok segítségével
# Check linearity using residual plots from statistics import mean from sklearn.linear_model import LinearRegression model = LinearRegression().fit(x.reshape(-1, 1), y) y_pred = model.predict(x.reshape(-1, 1)) resid = y - y_pred plt.scatter(y_pred, resid) plt.axhline(y=mean(resid), color='r', linestyle='--') # add horizontal line at y=0 plt.xlabel('Dependent variable') plt.ylabel('Residuals') plt.title('Residual plot for linearity') plt.show()
Kimenet:
Megjegyzés: Fontos megjegyezni, hogy egyetlen technika sem tudja egyértelműen bizonyítani az adathalmaz linearitását. Szükséges lehet a fenti technikák bármelyikének vagy mindegyikének alkalmazása, hogy megfelelő következtetést lehessen levonni a linearitás feltételezésével kapcsolatban.
2. A maradványok normálisságat
Háromféleképpen ellenőrizhetjük a maradékok normálisságát
- Hisztogram diagram: A reziduumok ezen gyakorisági diagramján vizualizáción keresztül ellenőrizhetjük a normálisság feltételezését. Ha normális eloszlású, akkor alakja közel lesz a harang alakú görbéhez
Python kód minta bemeneti adatok generálásához és a normálság ellenőrzéséhez hisztogram diagram segítségével
# Import Basic Packages import numpy as np import matplotlib.pyplot as plt import scipy.stats as stats from sklearn.linear_model import LinearRegression import seaborn as sns # Generate some random data for linear regression np.random.seed(123) X = np.random.uniform(0, 10, 1000) y = 2 * X + 3*np.random.normal(size=1000)
Python kód az egyéni adatoknak a lineáris regressziós modellhez való illesztéséhez és a maradékok kiszámításához
# Fit a linear regression model model = LinearRegression().fit(X.reshape(-1, 1), y) # Predict y values using the fitted model y_pred = model.predict(X.reshape(-1, 1)) # Calculate the residuals residuals = y - y_pred
Python-kód a maradékok hisztogramjának ábrázolásához
# Create a histogram of the residuals plt.hist(residuals, bins=20, density=True, alpha=0.5, color='blue') plt.xlabel('Residuals') plt.ylabel('Frequency') plt.title('Histogram of Residuals') plt.show()
Kimenet:
- Q-Q diagram: ezen a diagramon grafikusan hasonlítjuk össze a maradék értékeket egy szabványos normál eloszlással. Ha a maradékok normális eloszlásúak, akkor egyenes vonalban kell esniük.
Python kód a normálitás ellenőrzéséhez a fenti egyéni generált adatokból a Q-Q diagram segítségével
# Create a Q-Q plot of the residuals stats.probplot(residuals, dist='norm', plot=plt) plt.title('Q-Q Plot of Residuals') plt.show()
Kimenet:
- Shapiro-Wilk-teszt: Ez egy hipotézisteszt, amely a nullhipotézist teszteli, azaz a maradékok normál eloszlásúak. Ha a p-érték nagyobb, mint a szignifikancia szint (tipikusan 0,05), akkor nem utasítjuk el a nullhipotézist, és arra a következtetésre jutunk, hogy a maradékok normális eloszlásúak.
hol, H0: A maradékok normál eloszlásúak
Python kód a normálitás ellenőrzéséhez a Shapiro-Wilk teszt segítségével a fenti egyéni generált adatokból
# Perform Shapiro-Wilk test for normality w_stat, p_value = stats.shapiro(residuals) print(f'Shapiro-Wilk test for normality: W = {w_stat:.4f}, p-value = {p_value:.4f}') if p_value < 0.05: print('The residuals do not follow a normal distribution') else: print('The residuals follow a normal distribution') Output: Shapiro-Wilk test for normality: W = 0.9977, p-value = 0.1880 The residuals follow a normal distribution
Megjegyzés: A dobozdiagram használható az adatok mediánjának, kvartiliseinek és tartományának megjelenítésére. Ha az adatok normális eloszlásúak, a doboznak nagyjából szimmetrikusnak kell lennie, és a medián körül kell középre helyeznie.
3. Nincsenek outliersek
Kétféleképpen ellenőrizhetjük a Outlierek jelenlétét az adatkészletben
- Box plot: ezen a diagramon grafikusan ábrázoljuk az adatkészletet. Megjeleníti az adatkészlet mediánjának, kvartiliseinek és szélsőértékeinek összegzését.
Python kód minta bemeneti adatok generálásához és a kiugró értékek ellenőrzéséhez
# Import Basic Packages import numpy as np import matplotlib.pyplot as plt import seaborn as sns # Generate some data with outliers data = np.concatenate([np.random.normal(loc=10, scale=2, size=50), np.random.normal(loc=50, scale=10, size=5)])
Python-kód a kiugró értékek megjelenítéséhez a boxploton keresztül
# Create a boxplot to visualize outliers sns.boxplot(x=data) # Add a title to the plot plt.title("Boxplot of Data with Outliers") # Show the plot plt.show()
Kimenet:
- Szórványdiagram: A függő és független változók közötti szóródási diagram segítségével megtalálhatunk minden olyan pontot, amely kívül esik az adatok általános mintáján
Python kód a kiugró értékek szóródási diagramon keresztül történő megjelenítéséhez
# Create a scatterplot to visualize outliers sns.scatterplot(x=range(len(data)), y=data) # Add a horizontal line at the median value plt.axhline(np.median(data), color='r', linestyle='--') # Add a title to the plot plt.title("Scatterplot of Data with Outliers") # Show the plot plt.show()
Kimenet:
4. Nincs magas multikollinearitás
Kétféleképpen ellenőrizhetjük, hogy van-e magas multikollinearitás az adathalmazban
- Korrelációs mátrix: A korrelációs mátrix használható a független változók közötti páronkénti korrelációs együtthatók kiszámításához. A magas korrelációs együtthatók (0,7 vagy 0,8 felett) a multikollinearitás jelenlétét jelzik.
Python kód minta bemeneti adatok generálásához és a többkollinearitás ellenőrzéséhez
# Import Basic Packages import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from statsmodels.stats.outliers_influence import variance_inflation_factor # Generate custom dataset with multicollinearity np.random.seed(42) n = 1000 x1 = np.random.normal(size=n) x2 = x1 + np.random.normal(size=n) x3 = 2*x1 + np.random.normal(size=n) y = 3*x1 + 5*x2 + np.random.normal(size=n) df = pd.DataFrame({'x1': x1, 'x2': x2, 'x3': x3, 'y': y})
Python kód a korrelációs mátrix ábrázolásához
# Extract predictor variables and calculate correlation matrix X = df.drop('y', axis=1) corr_matrix = X.corr() # Visualize correlation matrix with a heatmap sns.heatmap(corr_matrix, annot=True) plt.title('Correlation Matrix') # Show the plots plt.show()
Kimenet:
Elemzés: A fenti ábrán láthatjuk, hogy az x1 és x3 jellemzők erősen korrelálnak egymással
- Variance Inflation Factor (VIF):A VIF a multikollinearitás mértéke egy lineáris regressziós modellben. Kiszámítása minden független változóra 1/(1-R²), ahol R² az adott változónak az összes többi független változóra történő regressziójából származó determinációs együttható. Az 5 vagy 10 feletti VIF értékek multikollinearitás jelenlétét jelzik.
Python kód a VIF kiszámításához a fent generált adatokból
# Calculate VIFs for each predictor variable vif = pd.DataFrame() vif["VIF Factor"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])] vif["Features"] = X.columns vif = vif.round(2) print(vif) Output: VIF Factor Features 0 5.98 x1 1 1.89 x2 2 5.06 x3
Megjegyzés: A multikollinearitás nem feltétlenül jelenti azt, hogy egy változót ki kell hagyni az elemzésből. Inkább intő jel, hogy a modell instabil lehet, és további vizsgálatot, elemzést igényel
5. Homoscedaszticitást
Ezen keresztül ellenőrizhetjük a homoszedaszticitás jelenlétét az adatkészletben
- Fennmaradó diagramok: A maradékok (vagy hibák) és a függő változó közötti szóródási diagramok, és a homoszkedaszticitási feltételezés tesztelésére is használhatók. Ha a reziduumok véletlenszerűen oszlanak el az átlag körül, akkor megállapítható, hogy a homoszkedaszticitási feltételezés teljesül. Ha megfigyelünk egy mintát, akkor azt a következtetést vonhatjuk le, hogy a homoszkedaszticitás feltevés sérül
Python kód minta bemeneti adatok generálásához és a homoszedaszticitás ellenőrzéséhez
# Import Basic packages import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression # Generate some sample data with homoscedastic errors np.random.seed(1) X = np.random.randn(100, 1) y = 2*X + np.random.randn(100, 1)*0.5
Python kód az egyéni adatoknak a lineáris regressziós modellhez való illesztéséhez és a maradékok kiszámításához
# Fit a linear regression model reg = LinearRegression().fit(X, y) y_pred = reg.predict(X) # Calculate residuals residuals = y - y_pred
Python kód a maradék diagram megjelenítéséhez
# Plot residuals against predicted values plt.scatter(y_pred, residuals) plt.axhline(y=0, color='r', linestyle='-') plt.xlabel('Dependent variable') plt.ylabel('Residuals') plt.title('Homoscedasticity plot') plt.show()
Kimenet:
6. A maradékok függetlenséget
Kétféleképpen ellenőrizhetjük a maradékok függetlenségét az adatkészletben
- Maradékok ábrázolása: ahol a maradékok a független változók függvényében vannak ábrázolva. Ha a reziduumok véletlenszerűen oszlanak el az átlag körül, akkor megállapítható, hogy a függetlenségi feltételezés nem sérül. Ha megfigyelünk egy mintát, akkor azt a következtetést vonhatjuk le, hogy a függetlenségi feltevés sérül.
Python kód minta bemeneti adatok generálásához és a maradékok függetlenségének ellenőrzéséhez
# Import Basic packages import numpy as np import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression # Generate some random data np.random.seed(123) x = np.random.normal(0, 1, 100) y = 2 * x + np.random.normal(0, 1, 100)
Python kód az egyéni adatoknak a lineáris regressziós modellhez való illesztéséhez és a maradékok kiszámításához
# Fit a linear regression model model = LinearRegression() model.fit(x.reshape(-1, 1), y) y_pred = model.predict(x.reshape(-1, 1)) # Calculate residuals residuals = y - y_pred
Python kód a maradék diagram megjelenítéséhez
# Plot the residuals against the predictor variable sns.scatterplot(x=x, y=residuals) plt.axhline(y=0, color='r', linestyle='-') plt.xlabel('Independent Variable') plt.ylabel('Residuals') plt.title('Independence Check') plt.show()
Kimenet:
- Durbin-Watson teszt: Ez egy statisztikai teszt, amelyet az autokorreláció jelenlétének ellenőrzésére használnak a lineáris regressziós modell maradékaiban. Autokorreláció akkor következik be, amikor a reziduumok korrelálnak egymással, ami sérti a lineáris regresszió függetlenségi feltételezését.
Python kód a maradékok függetlenségének ellenőrzésére a Durbin-Watson teszt segítségével a fenti egyéni generált adatoktól
# Durbin-Watson Test from statsmodels.stats.stattools import durbin_watson # Calculate the Durbin-Watson test statistic dw = durbin_watson(residuals) # Print the test statistic print('Durbin-Watson test statistic:', dw) Outpu: Durbin-Watson test statistic: 1.859803229200614
Elemzés: Ha a Durbin-Watson teszt statisztikája közel van a 2-hez, akkor a függetlenségi feltételezés nem sérül. Ha a teszt statisztika szignifikánsan eltér a 2-től, akkor autokorreláció lehet a maradékokban, és további vizsgálatra lehet szükség. A tartomány 0 és 4 között van, az1,5 és 2,5 közötti érték pedig azt jelzi, hogy nincs szignifikáns autokorreláció.
IV. Mi a teendő, ha valamelyik feltételezés megsértődik?
Ha bármelyik feltevést megsértik, az a regressziós együtthatók torz vagy pontatlan becsléséhez és pontatlan előrejelzésekhez vezethet.
Íme néhány módszer, amelyekkel kezelhető
- Változók átalakítása: Itt megpróbálhatunk matematikai függvényt, például négyzetgyököt vagy logaritmust használni a változókhoz a változók (függő és/vagy független) átalakításához.
- További változók felvétele: Megpróbálhatunk további változókat is bevonni a regressziós modellbe, például négyzetet, logót stb. Ez segíthet a nemlinearitás jobb rögzítésében és a teljesítmény javításában.
- Nemlineáris modell használata: Megpróbálhatunk nemlineáris modellt, például polinomiális regressziót, amely jobban rögzíti a görbületet nemlineáris összefüggésben. Ebben a "cikkben" részletes magyarázatot találhat a polinomiális regresszió használatáról.
- Kiugró értékek eltávolítása: Megpróbálhatjuk módosítani vagy eltávolítani a kiugró értékeket, ha ezek okozzák a feltételezés megsértését.
- Nem paraméteres regressziós módszerek: Megpróbálhatunk olyan nem paraméteres regressziós módszereket használni, mint például a döntési fa regresszió, a véletlenszerű erdőregresszió stb., amelyek nem támaszkodnak a sokaság mögöttes eloszlására vonatkozó feltételezésekre.
- Regularizálási technikák: Ha nagy a multikollinearitás, akkor a rendszerezési technikák, például a gerinc-regresszió vagy a LASSO-regresszió javíthatja a modell stabilitását. Ebben a "cikkben" részletes magyarázatot találhat a polinomiális regresszió használatáról.
Python példa arra, hogyan működik az átalakítás egyénileg generált adatokkal
# Import Basic packages import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.metrics import r2_score # Generate some sample data with a nonlinear relationship np.random.seed(123) x = np.random.uniform(0, 10, 100) y = np.sin(x) + np.random.normal(0, 0.1, 100)
Az egyéni generált adatok megjelenítése
# Visualize the data in a scatter plot plt.scatter(x, y) plt.title('Scatter plot of 1000 custom values with a linear relationship') plt.xlabel('Independent variable') plt.ylabel('Dependent variable') plt.show()
Átalakítás alkalmazása
# Apply a transformation to the x variable x_transformed = np.sin(x)
A modell illesztése az egyéni adatokkal
# Fit a linear regression model to the transformed data model = LinearRegression() model.fit(x_transformed.reshape(-1, 1), y)
Modell előrejelzése és megjelenítése
# prediction y_pred = model.predict(x_transformed.reshape(-1, 1)) # Plot the data and the linear regression line plt.scatter(x, y) plt.plot(x, y_pred, color='red') plt.xlabel('x') plt.ylabel('y') plt.title('Linear regression of x vs. y') plt.show()
Kimenet
Az R-négyzet kiszámítása
# Calculate the R-squared value r2 = r2_score(y, y_pred) print(f"R-squared value: {r2:.4f}") Output: R-squared value: 0.9796
Ha transzformáció nélkül próbálkozunk, akkor nagyon rossz illeszkedési modellt kapunk, nagy pontatlansággal.
Következtetésként nincs mindenre alkalmas megoldás a feltételezések megsértésének kezelésére. Gondosan meg kell vizsgálni a jogsértés természetét, a modellre gyakorolt hatását és a lehetséges alternatív módszert, amellyel pontos és megbízható eredmények érhetők el.
GitHub-link a python-kód megvalósításához
Egyéb fontos cikkek, amelyeket hasznosnak találhat
Ha hasznosnak találta a „Ne ragadj bele a lineáris regressziós csapdába: ellenőrizze a feltételezéseket a megbízható eredményekért” című blogot, mindenképpen tapsoljon, és kövessen engem a statisztikákkal és adatokkal kapcsolatos informatív bejegyzésekért. tudomány!