# Тест по модулю 3 Сарайкина Вера, А-02-23 ## Задание M3_24 1) Создайте модуль М1, содержащий две функции: - функция 1: аргумент - список или кортеж с выборкой; функция должна рассчитать по выборке оценки математического ожидания, дисперсии, стандартного отклонения и медианы; - функция 2: аргумент - список или кортеж с выборкой; функция должна произвести расчет по той же выборке оценки коэффициента асимметрии: ma=[(x1-Mx)3+:+xN-Mx)^3]/[(N-1)*sx^3], где Mx,sx - оценки математического ожидания и стандартного отклонения по выборке. При этом среднее значение и стандартное отклонение должны быть вычислены с помощью функции 1. 2) Создайте еще один модуль М2, в котором должны выполняться следующие операции: - запрашивается имя текстового файла с выборкой, проверяется его наличие и при отсутствии - повторяется запрос; - выборка вводится из файла и записывается в список; - с помощью функций 1 и 2 по выборке рассчитываются оценки математического ожидания, дисперсии, стандартного отклонения, медианы и коэффициента асимметрии, - по выборке рассчитывается гистограмма и отображается в виде графика на экране; - результаты расчета записываются в бинарный файл с именем Res3737.bin. 3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает результаты расчетов на экране. 4) Подготовьте 2 текстовых файла с выборками и проверьте программу. ## Выполнение ## модуль 1 ```py 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 ```py 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() ``` ## основной модуль ```py 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 ```py 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 Гистограмма сохранена в файл ``` ![](Figure_2.png) ## Вывод для test2 ```py 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 ``` ![](Figure_1.png)