Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
68 строки
2.9 KiB
Python
68 строки
2.9 KiB
Python
import numpy as np
|
|
import pandas as pd
|
|
from sklearn.datasets import load_iris
|
|
from sklearn.linear_model import LinearRegression
|
|
from statsmodels.stats.stattools import durbin_watson
|
|
from scipy import stats
|
|
import matplotlib.pyplot as plt
|
|
|
|
# === Датасет Ирисы Фишера ===
|
|
iris = load_iris()
|
|
iris_pd = pd.DataFrame(data=np.c_[iris['data'], iris['target']],
|
|
columns=iris['feature_names'] + ['target'])
|
|
|
|
# === Признаки и целевая переменная ===
|
|
x1 = iris_pd['sepal length (cm)'].values
|
|
x2 = iris_pd['sepal width (cm)'].values
|
|
x3 = iris_pd['petal length (cm)'].values
|
|
x4 = iris_pd['petal width (cm)'].values # целевая переменная
|
|
|
|
# === Парная регрессия: x3 -> x4 ===
|
|
lr = LinearRegression().fit(x3.reshape(-1,1), x4)
|
|
y_pred1 = lr.predict(x3.reshape(-1,1))
|
|
residuals1 = x4 - y_pred1
|
|
|
|
# === Множественная регрессия: x1,x2,x3 -> x4 ===
|
|
X = np.vstack((x1, x2, x3)).T
|
|
mr = LinearRegression().fit(X, x4)
|
|
y_pred2 = mr.predict(X)
|
|
residuals2 = x4 - y_pred2
|
|
|
|
# === Графики остатков ===
|
|
fig, axes = plt.subplots(1, 2, figsize=(12,5))
|
|
axes[0].hist(residuals1, bins=15, color='lightblue', edgecolor='black')
|
|
axes[0].set_title('Остатки парной регрессии')
|
|
axes[1].hist(residuals2, bins=15, color='lightgreen', edgecolor='black')
|
|
axes[1].set_title('Остатки множественной регрессии')
|
|
plt.show()
|
|
|
|
# === Проверка нормальности остатков (Shapiro-Wilk) ===
|
|
print("=== Проверка нормальности остатков ===")
|
|
for i, res in enumerate([residuals1, residuals2], start=1):
|
|
stat, p = stats.shapiro(res)
|
|
print(f"Регрессия {i}: Статистика Шапиро–Уилка = {stat:.4f}, p-value = {p:.4f}")
|
|
if p > 0.05:
|
|
print("→ Остатки распределены нормально (H0 не отвергается).")
|
|
else:
|
|
print("→ Остатки не распределены нормально (H0 отвергается).")
|
|
|
|
# === Статистика Дурбина–Уотсона ===
|
|
from statsmodels.stats.stattools import durbin_watson
|
|
print("\n=== Статистика Дурбина–Уотсона ===")
|
|
dw1 = durbin_watson(residuals1)
|
|
dw2 = durbin_watson(residuals2)
|
|
print(f"Парная регрессия: DW = {dw1:.4f}")
|
|
print(f"Множественная регрессия: DW = {dw2:.4f}")
|
|
|
|
# Интерпретация
|
|
def interpret_dw(dw):
|
|
if dw < 1.5:
|
|
return "→ Положительная автокорреляция остатков."
|
|
elif dw > 2.5:
|
|
return "→ Отрицательная автокорреляция остатков."
|
|
else:
|
|
return "→ Остатки независимы (автокорреляции нет)."
|
|
|
|
print("Парная регрессия:", interpret_dw(dw1))
|
|
print("Множественная регрессия:", interpret_dw(dw2))
|