Á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:-

  1. 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!