Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

6.4 KiB

M3_1 1)Создайте модуль М1, содержащий две функции:

функция 1: аргумент - список или кортеж с выборкой; функция должна произвести расчет по выборке оценки её дисперсии DX, а также наименьшего и наибольшего значений и вернуть эти значения в вызывающую программу в виде списка;

функция 2: аргументы - два списка или кортежа с выборками X и Y; функция должна произвести с помощью функции 1 расчет статистик по выборкам и рассчитать статистику Фишера:

	F=DX/DY

2)Создайте еще один модуль М2, в котором должны выполняться следующие операции:

запрашивается имя бинарного файла с выборками X и Y, проверяется его наличие и при отсутствии - повторяется запрос;

выборки считываются из файлов;

с помощью функции 1 по выборкам рассчитываются их статистики,

с помощью функции 2 рассчитывается значение статистики Фишера,

если числа элементов в выборках одинаково, графически отображается поле рассеивания для Х и Y;

результаты расчета с соответствующими заголовками выводятся в текстовый файл.

3)Создайте модуль М0 - главную программу, которая вызывает М2 и отображает результаты расчета на экране.

4)Создайте 2 бинарных файла: с выборками одинакового размера и с выборками разного размера. Проверьте программу с использованием этих файлов.

Модуль 1

import math
def disp(s): # функция рассчета дисперсии
    if len(s) == 0:
        return [0, 0, 0]
    sr = sum(s) / len(s)
    v = sum((x - sr) ** 2 for x in s) / len(s)   # среднее квадратов отклонений от среднего
    m_n = min(s)
    m_x = max(s)
    
    return [v, m_n, m_x]

def fisher_stat(sample_x, sample_y):  # статистика фишера
    stats_x = disp(sample_x)
    stats_y = disp(sample_y)
    
    dx = stats_x[0]  #  дисп х
    dy = stats_y[0]  #  дисп у
    
    if dy == 0:
        return 0, stats_x, stats_y
    else:
        f = dx / dy
        return f, stats_x, stats_y

Модуль 2

import pickle
import matplotlib.pyplot as plt
import M1  

def load_samples(filename): #Загружаем выборки х и у

    while True:
        try:
            with open(filename, 'rb') as f:
                data = pickle.load(f)
                x = data['X']
                y = data['Y']
                print(f"Файл {filename} успешно загружен!")
                return x, y
        except FileNotFoundError:
            print(f"Файл {filename} не найден!")
            filename = input("Введите имя файла снова: ")
        except Exception as e:
            print(f"Ошибка чтения файла: {e}")
            filename = input("Введите имя файла снова: ")

def analysis():
    x, y = load_samples(input("Введите имя бинарного файла: "))
    f, stats_x, stats_y = M1.fisher_stat(x, y) 
    
    print("\nРЕЗУЛЬТАТЫ РАСЧЕТА:")
    print(f"Размер выборки X: {len(x)}, Y: {len(y)}")
    print(f"X: Дисперсия={stats_x[0]:.4f}, мин={stats_x[1]:.4f}, макс={stats_x[2]:.4f}")
    print(f"Y: Дисперсия={stats_y[0]:.4f}, мин={stats_y[1]:.4f}, макс={stats_y[2]:.4f}")
    print(f"Статистика Фишера F = {f:.4f}")
    
    
    if len(x) == len(y): # График размеры одинаковые
        plt.figure(figsize=(8, 6))
        plt.scatter(x, y, alpha=0.7, color='blue')
        plt.xlabel('X')
        plt.ylabel('Y')
        plt.title('Поле рассеивания X-Y')
        plt.grid(True)
        plt.show()
    
    # Сохраняем в текстовый файл
    with open('results.txt', 'w') as f:  # Сохраняем в файл
        f.write("РЕЗУЛЬТАТЫ СТАТИСТИЧЕСКОГО АНАЛИЗА\n")
        f.write("=" * 40 + "\n\n")
        f.write(f"Размер выборки X: {len(x)}\n")
        f.write(f"Размер выборки Y: {len(y)}\n\n")
        f.write(f"СТАТИСТИКИ ПО X:\n")
        f.write(f"  Дисперсия DX = {stats_x[0]:.6f}\n")
        f.write(f"  Минимум      = {stats_x[1]:.6f}\n")
        f.write(f"  Максимум     = {stats_x[2]:.6f}\n\n")
        f.write(f"СТАТИСТИКИ ПО Y:\n")
        f.write(f"  Дисперсия DY = {stats_y[0]:.6f}\n")
        f.write(f"  Минимум      = {stats_y[1]:.6f}\n")
        f.write(f"  Максимум     = {stats_y[2]:.6f}\n\n")
        f.write(f"СТАТИСТИКА ФИШЕРА:\n")
        f.write(f"  F = DX/DY = {f:.6f}\n")
    
    print("Результаты сохранены в файл results.txt")
    return f, stats_x, stats_y



if __name__ == "__main__":
    analysis()

Модуль 0

import M2

def main():
    
    print("СТАТИСТИЧЕСКИЙ АНАЛИЗ")
    results = M2.analysis() # Запускаем анализ
    print("АНАЛИЗ ЗАВЕРШЕН!")


if __name__ == "__main__":
    main()
>>> import os
>>> os.chdir('C:\\Users\\Admin\\Documents\\Tsvetkova\\python-labs\\TEMA9')
>>> import M1
>>> import M2
>>> import M0
>>> M0.main()
СТАТИСТИЧЕСКИЙ АНАЛИЗ
Введите имя бинарного файла: same_size.bin
Файл same_size.bin успешно загружен!

РЕЗУЛЬТАТЫ РАСЧЕТА:
Размер выборки X: 20, Y: 20
X: Дисперсия=4.7969, мин=1.4282, макс=9.9043
Y: Дисперсия=3.2402, мин=2.1279, макс=7.5406
Статистика Фишера F = 1.4804