chezahuynya1/app/zadachi/zadacha4.py

62 lines
2.9 KiB
Python
Raw Normal View History

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