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

9.8 KiB

Тест по модулю 3

Сарайкина Вера, А-02-23

Задание

M3_24

  1. Создайте модуль М1, содержащий две функции:
  • функция 1: аргумент - список или кортеж с выборкой; функция должна рассчитать по выборке оценки математического ожидания, дисперсии, стандартного отклонения и медианы;

  • функция 2: аргумент - список или кортеж с выборкой; функция должна произвести расчет по той же выборке оценки коэффициента асимметрии:

    ma=[(x1-Mx)3+:+xN-Mx)^3]/[(N-1)*sx^3],

где Mx,sx - оценки математического ожидания и стандартного отклонения по выборке. При этом среднее значение и стандартное отклонение должны быть вычислены с помощью функции 1.

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

  • выборка вводится из файла и записывается в список;

  • с помощью функций 1 и 2 по выборке рассчитываются оценки математического ожидания, дисперсии, стандартного отклонения, медианы и коэффициента асимметрии,

  • по выборке рассчитывается гистограмма и отображается в виде графика на экране;

  • результаты расчета записываются в бинарный файл с именем Res3737.bin.

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

  2. Подготовьте 2 текстовых файла с выборками и проверьте программу.

Выполнение

модуль 1


import math as m

def f1(d):
    "Функция 1: среднее, дисперсия, откл, медиана"
    if not d:
        return 0, 0, 0, 0
    
    n = len(d)
    mx = sum(d) / n
    
    v = sum((x - mx) ** 2 for x in d) / (n - 1) if n > 1 else 0
    sx = m.sqrt(v) if v > 0 else 0
    
    sd = sorted(d)
    if n % 2 == 1:
        med = sd[n // 2]
    else:
        med = (sd[n // 2 - 1] + sd[n // 2]) / 2
    
    return mx, v, sx, med

def f2(d):
    """Функция 2: коэффициент асимметрии"""
    if not d:
        return 0
    
    mx, _, sx, _ = f1(d)
    
    if sx == 0:
        return 0
    
    n = len(d)
    sc = sum((x - mx) ** 3 for x in d)
    ma = sc / ((n - 1) * (sx ** 3)) if n > 1 else 0
    
    return ma

модуль 2

import os
import struct
import math
import matplotlib.pyplot as plt
import M1


def read_file():
    "Чтение файла с выборкой"
    while True:
        filename = input("Введите имя файла: ").strip()
        if not filename.endswith('.txt'):
            filename += '.txt'

        if os.path.exists(filename):
            try:
                with open(filename, 'r', encoding='utf-8') as file:
                    content = file.read()
                    numbers = []
                    for part in content.split():
                        cleaned = part.strip(',;:')
                        try:
                            numbers.append(float(cleaned))
                        except ValueError:
                            continue

                    if numbers:
                        print(f"Прочитано {len(numbers)} чисел из файла {filename}")
                        return numbers
                    else:
                        print("Файл не содержит чисел")
            except Exception as e:
                print(f"Ошибка при чтении файла: {e}")
        else:
            print(f"Файл {filename} не найден")


def create_histogram(data):
    "Создание и отображение гистограммы"
    if not data:
        return

    # Определяем количество интервалов
    num_bins = min(15, int(math.sqrt(len(data))))

    plt.figure(figsize=(10, 6))
    plt.hist(data, bins=num_bins, edgecolor='black', alpha=0.7)
    plt.title('Гистограмма выборки')
    plt.xlabel('Значения')
    plt.ylabel('Частота')
    plt.grid(True, alpha=0.3)


    plt.savefig('histogram.png')
    print("Гистограмма сохранена в файл ")


    plt.show()


def save_to_binary(stats, asymmetry):
    "Сохранение результатов в бинарный файл"
    try:
        with open('Res3737.bin', 'wb') as file:
            # Записываем все 5 значений
            for value in [stats[0], stats[1], stats[2], stats[3], asymmetry]:
                file.write(struct.pack('d', value))
        print("Результаты сохранены в файл 'Res3737.bin'")
    except Exception as e:
        print(f"Ошибка при сохранении в файл: {e}")


def main():
    "Основная функция модуля M2"

    sample = read_file()
    if not sample:
        print("Не удалось получить выборку. Программа завершена.")
        return

    print(f"\nХарактеристики выборки:")
    print(f"Размер выборки: {len(sample)}")
    print(f"Минимальное значение: {min(sample):.4f}")
    print(f"Максимальное значение: {max(sample):.4f}")

    # Расчет статистик
    mean, variance, std_dev, median = M1.f1(sample)
    asymmetry_coeff = M1.f2(sample)

    print(f"\nРезультаты расчетов:")
    print(f"Математическое ожидание: {mean:.4f}")
    print(f"Дисперсия: {variance:.4f}")
    print(f"Стандартное отклонение: {std_dev:.4f}")
    print(f"Медиана: {median:.4f}")
    print(f"Коэффициент асимметрии: {asymmetry_coeff:.4f}")


    create_histogram(sample)


    save_to_binary((mean, variance, std_dev, median), asymmetry_coeff)

    return sample, mean, variance, std_dev, median, asymmetry_coeff


if __name__ == "__main__":
    main()

основной модуль

import M2

def main():
    "Главная программа"
    print("=" * 40)
    print("АНАЛИЗ ВЫБОРКИ")
    print("=" * 40)
    
    r = M2.main()
    
    if r:
        d, mx, v, sx, med, ma = r
        
        print("\n" + "-" * 40)
        print("РЕЗУЛЬТАТЫ:")
        print(f"n = {len(d)}")
        print(f"min = {min(d):.4f}")
        print(f"max = {max(d):.4f}")
        print(f"mx  = {mx:.4f}")
        print(f"v   = {v:.4f}")
        print(f"sx  = {sx:.4f}")
        print(f"med = {med:.4f}")
        print(f"ma  = {ma:.4f}")
        
        if abs(ma) < 0.5:
            t = "~симм"
        elif ma > 0:
            t = "вправо"
        else:
            t = "влево"
        
        print(f"тип: {t}")
        
        if mx != 0:
            cv = sx / mx * 100
            print(f"CV  = {cv:.1f}%")
    
    print("\n" + "=" * 40)
    print("КОНЕЦ")
    print("=" * 40)

if __name__ == "__main__":
    main()

Вывод для test1

C:\Users\Yarik\PycharmProjects\PythonProject1\.venv\Scripts\python.exe C:\Users\Yarik\Desktop\labi\python-labs\TEMA9\M0.py 
========================================
АНАЛИЗ ВЫБОРКИ
========================================
Введите имя файла: test1
Прочитано 10 чисел из файла test1.txt

Характеристики выборки:
Размер выборки: 10
Минимальное значение: 12.5000
Максимальное значение: 17.4000

Результаты расчетов:
Математическое ожидание: 14.5900
Дисперсия: 2.4766
Стандартное отклонение: 1.5737
Медиана: 14.5000
Коэффициент асимметрии: 0.2955
Гистограмма сохранена в файл 

Вывод для test2

C:\Users\Yarik\PycharmProjects\PythonProject1\.venv\Scripts\python.exe C:\Users\Yarik\Desktop\labi\python-labs\TEMA9\M0.py 
========================================
АНАЛИЗ ВЫБОРКИ
========================================
Введите имя файла: test2
Прочитано 15 чисел из файла test2.txt

Характеристики выборки:
Размер выборки: 15
Минимальное значение: 95.0000
Максимальное значение: 110.0000

Результаты расчетов:
Математическое ожидание: 102.2667
Дисперсия: 23.3524
Стандартное отклонение: 4.8324
Медиана: 102.0000
Коэффициент асимметрии: 0.1178
Гистограмма сохранена
Результаты сохранены в файл 'Res3737.bin'

----------------------------------------
РЕЗУЛЬТАТЫ:
n = 15
min = 95.0000
max = 110.0000
mx  = 102.2667
v   = 23.3524
sx  = 4.8324
med = 102.0000
ma  = 0.1178
тип: ~симм
CV  = 4.7%

========================================
КОНЕЦ
========================================

Process finished with exit code 0