форкнуто от main/python-labs
Родитель
7c1552aa67
Сommit
69a9d61875
@ -0,0 +1,154 @@
|
|||||||
|
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
|
||||||
|
```py
|
||||||
|
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
|
||||||
|
```py
|
||||||
|
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
|
||||||
|
```py
|
||||||
|
import M2
|
||||||
|
|
||||||
|
def main():
|
||||||
|
|
||||||
|
print("СТАТИСТИЧЕСКИЙ АНАЛИЗ")
|
||||||
|
results = M2.analysis() # Запускаем анализ
|
||||||
|
print("АНАЛИЗ ЗАВЕРШЕН!")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
```
|
||||||
|
|
||||||
|
```py
|
||||||
|
>>> 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
|
||||||
|
```
|
||||||
|

|
||||||
Загрузка…
Ссылка в новой задаче