From 9cef66de67805bfbc6209c10817231603940a80f Mon Sep 17 00:00:00 2001 From: cheykrym Date: Tue, 15 Oct 2024 00:22:25 +0300 Subject: [PATCH] Update README.md, menu_load.py, and 2 more files... --- README.md | 6 ---- app/menu_load.py | 35 ++++++++++++++---- app/zadachi/zadacha5.py | 79 +++++++++++++++++++++++++++++++++++++++++ app/zadachi/zadacha6.py | 0 4 files changed, 107 insertions(+), 13 deletions(-) delete mode 100644 app/zadachi/zadacha6.py diff --git a/README.md b/README.md index 8d64498..b87a322 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,6 @@ chezahuynya1 ============= bts metodi 1 -1 + -2 + -3 + -4 + -5 - -6 - -------- diff --git a/app/menu_load.py b/app/menu_load.py index 4a9a13e..45f9129 100644 --- a/app/menu_load.py +++ b/app/menu_load.py @@ -3,6 +3,7 @@ from app.zadachi.zadacha1 import zadacha1 from app.zadachi.zadacha2 import zadacha2 from app.zadachi.zadacha3 import zadacha3 from app.zadachi.zadacha4 import zadacha4 +from app.zadachi.zadacha5 import zadacha5 class menu: @@ -17,8 +18,7 @@ class menu: print('2. Задача 2') print('3. Задача 3') print('4. Задача 4') - print('5. Задача 5 (недоступно)') - print('6. Задача 6 (недоступно)') + print('5. Задача 5') print('0. Exit') choice = input('Select an option: ') @@ -33,9 +33,7 @@ class menu: elif choice == '4': self.zadacha4_menu() # Добавлен вызов меню задачи 4 elif choice == '5': - print('Временно недоступно') - elif choice == '6': - print('Временно недоступно') + self.zadacha5_menu() # Добавлен вызов меню задачи 5 elif choice == '0': print('Exiting program...') break @@ -134,10 +132,11 @@ class menu: break # Вернуться в основное меню else: print('Неверный выбор, попробуйте снова.') + def zadacha4_menu(self): - """Меню для задачи 4 (работа с полиномиальными данными).""" + """Меню для задачи 4""" clear_console() - z4 = zadacha4() # Создаем объект задачи 4 + #z4 = zadacha4() # Создаем объект задачи 4 while True: print('\nЗадача 4:') @@ -155,3 +154,25 @@ class menu: break else: print('Неверный выбор, попробуйте снова.') + + def zadacha5_menu(self): + """Меню для задачи 5""" + clear_console() + + while True: + print('\nЗадача 5:') + print('1. Рассчитать статистики для определения выполнения условий применения линейной регрессии') + print('0. Назад') + + choice = input('Выберите подкатегорию: ') + + clear_console() + + if choice == '1': + z5 = zadacha5() + z5.calculate_spearman_rank_test() + z5.calculate_gq_test() + elif choice == '0': + break + else: + print('Неверный выбор, попробуйте снова.') diff --git a/app/zadachi/zadacha5.py b/app/zadachi/zadacha5.py index e69de29..00c1a8f 100644 --- a/app/zadachi/zadacha5.py +++ b/app/zadachi/zadacha5.py @@ -0,0 +1,79 @@ +import numpy as np +from app.zadachi.zadacha2 import zadacha2 +from app.zadachi.zadacha1 import zadacha1 + +class zadacha5: + def __init__(self): + self.z1 = zadacha1() + self.z2 = zadacha2() + + def calculate_spearman_rank_test(self): + """ + Выполняет тест ранговой корреляции Спирмена для проверки взаимосвязи между X и Y. + :return: коэффициент корреляции Спирмена и p-value + """ + # Генерируем данные + X, Y = self.z1.create_lin_array() + + # Вычисляем ранги + X_ranks = np.argsort(np.argsort(X)) + Y_ranks = np.argsort(np.argsort(Y)) + + # Вычисляем разницу рангов + diff_ranks = X_ranks - Y_ranks + + # Числитель формулы Спирмена + numerator = 6 * np.sum(diff_ranks**2) + + # Количество наблюдений + n = len(X) + + # Коэффициент корреляции Спирмена + spearman_coef = 1 - numerator / (n * (n**2 - 1)) + + # Оценка значимости результата (p-value) не рассчитывается вручную здесь, но коэффициент корреляции интерпретируется. + print(f'Коэффициент корреляции Спирмена: {spearman_coef:.3f}') + + # Интерпретация результата + if np.abs(spearman_coef) > 0.5: + print("Существует значимая взаимосвязь между X и Y.") + else: + print("Взаимосвязь между X и Y слабая или отсутствует.") + + def calculate_gq_test(self): + """ + Выполняет тест Голдфелда-Квандта для проверки гомоскедастичности. + :return: значение статистики F и результат теста + """ + # Генерируем данные + X, Y = self.z1.create_lin_array() + + # Рассчитываем коэффициенты регрессии + b0, b1 = self.z2.calculate_coefficients(X, Y) + + # Вычисляем остатки + residuals = Y - self.z2.predict(X, b0, b1) + + # Сортируем данные по X для выполнения теста + sorted_indices = np.argsort(X) + residuals_sorted = residuals[sorted_indices] + + # Разбиваем данные на две части + split_index = len(residuals_sorted) // 2 + residuals_low = residuals_sorted[:split_index] + residuals_high = residuals_sorted[split_index:] + + # Вычисляем средние квадраты остатков + var_low = np.var(residuals_low, ddof=1) + var_high = np.var(residuals_high, ddof=1) + + # Тестовая статистика F + f_stat = var_high / var_low + + print(f'Статистика F: {f_stat:.3f}') + + # Интерпретация результата + if f_stat > 2 or f_stat < 0.5: + print("Остатки не гомоскедастичны. Условие линейной регрессии нарушено.") + else: + print("Остатки гомоскедастичны. Условие линейной регрессии выполнено.") diff --git a/app/zadachi/zadacha6.py b/app/zadachi/zadacha6.py deleted file mode 100644 index e69de29..0000000