Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

67 строки
2.5 KiB
Python

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from statsmodels.stats.stattools import durbin_watson
from scipy import stats
import seaborn as sns
import matplotlib.pyplot as plt
import statsmodels.api as sm
# === Загружаем данные ===
columns = ['Position', 'Height(inches)', 'Weight(pounds)', 'Age']
df = pd.read_csv('SOCR_Data_MLB_HeightsWeights.txt', sep='\t', nrows=115, usecols=columns)
# Кодируем категориальный признак "Position"
df['Position_num'] = pd.factorize(df['Position'])[0]
# === Множественная регрессия (Weight = f(Position, Height, Age)) ===
X = df[['Position_num', 'Height(inches)', 'Age']]
y = df['Weight(pounds)']
model = LinearRegression().fit(X, y)
y_pred = model.predict(X)
# === Остатки ===
res2 = y - y_pred
# === Проверка нормальности остатков ===
print('=== Проверка нормальности остатков ===')
shapiro_stat, shapiro_p = stats.shapiro(res2)
print(f"Статистика Шапиро–Уилка: {shapiro_stat:.4f}, p-value = {shapiro_p:.4f}")
if shapiro_p > 0.05:
print("→ Остатки распределены нормально (нет оснований отвергнуть H₀).")
else:
print("→ Остатки не распределены нормально (отвергаем H₀).")
# === Графики остатков ===
plt.figure(figsize=(12, 5))
# Гистограмма
plt.subplot(1, 2, 1)
sns.histplot(res2, bins=20, kde=True, color='lightblue', edgecolor='black')
plt.title('Гистограмма остатков')
plt.xlabel('Остатки')
# QQ-график
plt.subplot(1, 2, 2)
sm.qqplot(res2, line='s', ax=plt.gca())
plt.title('QQ-график остатков')
plt.tight_layout()
plt.show()
# === Статистика Дурбина–Уотсона ===
dw_stat = durbin_watson(res2)
# Явный вывод для отчёта
print('\n=== Статистика Дурбина–Уотсона ===')
print(f"Значение статистики Дурбина–Уотсона: {dw_stat:.4f}")
# Интерпретация
if dw_stat < 1.5:
print("→ Наблюдается положительная автокорреляция остатков.")
elif dw_stat > 2.5:
print("→ Наблюдается отрицательная автокорреляция остатков.")
else:
print("→ Автокорреляция остатков отсутствует (остатки независимы).")