chezahuynya1/app/zadachi/zadacha4.py

62 lines
2.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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