2024-10-15 00:02:41 +03:00
|
|
|
|
import numpy as np
|
|
|
|
|
import matplotlib.pyplot as plt
|
|
|
|
|
from app.zadachi.zadacha2 import zadacha2
|
|
|
|
|
from app.zadachi.zadacha1 import zadacha1
|
|
|
|
|
|
|
|
|
|
class zadacha4:
|
|
|
|
|
def __init__(self):
|
|
|
|
|
self.z1 = zadacha1()
|
|
|
|
|
self.z2 = zadacha2()
|
|
|
|
|
|
|
|
|
|
def analyze_residuals(self):
|
|
|
|
|
"""
|
|
|
|
|
Выполняет визуальный анализ остатков по линейной модели.
|
|
|
|
|
Строит графики 2*2: скаттерограмма, график исходной зависимости,
|
|
|
|
|
распределение остатков и гистограмму остатков.
|
|
|
|
|
"""
|
|
|
|
|
# Генерируем данные
|
|
|
|
|
X, Y = self.z1.create_lin_array()
|
|
|
|
|
|
|
|
|
|
# Рассчитываем коэффициенты методом наименьших квадратов
|
|
|
|
|
b0, b1 = self.z2.calculate_coefficients(X, Y)
|
|
|
|
|
|
|
|
|
|
# Предсказанные значения
|
|
|
|
|
Y_pred = self.z2.predict(X, b0, b1)
|
|
|
|
|
|
|
|
|
|
# Вычисляем остатки
|
|
|
|
|
residuals = Y - Y_pred
|
|
|
|
|
|
|
|
|
|
# Создаем графики 2*2
|
|
|
|
|
fig, axs = plt.subplots(2, 2, figsize=(12, 8))
|
|
|
|
|
|
|
|
|
|
# Первый график: скаттерограмма с линией МНК
|
|
|
|
|
axs[0, 0].scatter(X, Y, label='Данные с шумом', alpha=0.6)
|
|
|
|
|
axs[0, 0].plot(X, Y_pred, color='red', label='Прямая по МНК')
|
|
|
|
|
axs[0, 0].set_title('Скаттерограмма и прямая по МНК')
|
|
|
|
|
axs[0, 0].legend()
|
|
|
|
|
|
|
|
|
|
# Второй график: исходная зависимость и линия МНК
|
|
|
|
|
axs[0, 1].scatter(X, Y, label='Данные', alpha=0.6)
|
|
|
|
|
axs[0, 1].plot(X, self.z1.create_lin_array(b0, b1, len(X))[1], color='green', label='Истинная линия')
|
|
|
|
|
axs[0, 1].plot(X, Y_pred, color='red', linestyle='--', label='Прямая по МНК')
|
|
|
|
|
axs[0, 1].set_title('Истинная линия и прямая по МНК')
|
|
|
|
|
axs[0, 1].legend()
|
|
|
|
|
|
|
|
|
|
# Третий график: распределение остатков
|
|
|
|
|
axs[1, 0].scatter(X, residuals, color='purple', alpha=0.6)
|
|
|
|
|
axs[1, 0].axhline(y=0, color='red', linestyle='--')
|
|
|
|
|
axs[1, 0].set_title('Распределение остатков')
|
|
|
|
|
|
|
|
|
|
# Четвертый график: гистограмма остатков
|
|
|
|
|
axs[1, 1].hist(residuals, bins=30, color='orange', edgecolor='black', alpha=0.7)
|
|
|
|
|
axs[1, 1].set_title('Гистограмма остатков')
|
|
|
|
|
|
|
|
|
|
# Выравниваем графики и отображаем
|
|
|
|
|
plt.tight_layout()
|
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
|
# Отдельное окно для гистограммы
|
|
|
|
|
plt.figure()
|
|
|
|
|
plt.hist(residuals, bins=30, color='orange', edgecolor='black', alpha=0.7)
|
|
|
|
|
plt.title('Гистограмма остатков (отдельно)')
|
|
|
|
|
plt.show()
|