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()