Update README.md, menu_load.py, and 2 more files...

This commit is contained in:
cheykrym 2024-10-15 00:22:25 +03:00
parent 64f0c7e6af
commit 9cef66de67
4 changed files with 107 additions and 13 deletions

View File

@ -2,12 +2,6 @@ chezahuynya1
============= =============
bts metodi 1 bts metodi 1
1 +
2 +
3 +
4 +
5 -
6 -
-------- --------

View File

@ -3,6 +3,7 @@ from app.zadachi.zadacha1 import zadacha1
from app.zadachi.zadacha2 import zadacha2 from app.zadachi.zadacha2 import zadacha2
from app.zadachi.zadacha3 import zadacha3 from app.zadachi.zadacha3 import zadacha3
from app.zadachi.zadacha4 import zadacha4 from app.zadachi.zadacha4 import zadacha4
from app.zadachi.zadacha5 import zadacha5
class menu: class menu:
@ -17,8 +18,7 @@ class menu:
print('2. Задача 2') print('2. Задача 2')
print('3. Задача 3') print('3. Задача 3')
print('4. Задача 4') print('4. Задача 4')
print('5. Задача 5 (недоступно)') print('5. Задача 5')
print('6. Задача 6 (недоступно)')
print('0. Exit') print('0. Exit')
choice = input('Select an option: ') choice = input('Select an option: ')
@ -33,9 +33,7 @@ class menu:
elif choice == '4': elif choice == '4':
self.zadacha4_menu() # Добавлен вызов меню задачи 4 self.zadacha4_menu() # Добавлен вызов меню задачи 4
elif choice == '5': elif choice == '5':
print('Временно недоступно') self.zadacha5_menu() # Добавлен вызов меню задачи 5
elif choice == '6':
print('Временно недоступно')
elif choice == '0': elif choice == '0':
print('Exiting program...') print('Exiting program...')
break break
@ -134,10 +132,11 @@ class menu:
break # Вернуться в основное меню break # Вернуться в основное меню
else: else:
print('Неверный выбор, попробуйте снова.') print('Неверный выбор, попробуйте снова.')
def zadacha4_menu(self): def zadacha4_menu(self):
"""Меню для задачи 4 (работа с полиномиальными данными).""" """Меню для задачи 4"""
clear_console() clear_console()
z4 = zadacha4() # Создаем объект задачи 4 #z4 = zadacha4() # Создаем объект задачи 4
while True: while True:
print('\nЗадача 4:') print('\nЗадача 4:')
@ -155,3 +154,25 @@ class menu:
break break
else: else:
print('Неверный выбор, попробуйте снова.') 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('Неверный выбор, попробуйте снова.')

View File

@ -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("Остатки гомоскедастичны. Условие линейной регрессии выполнено.")