Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import pandas as pd
- import matplotlib.pyplot as plt
- import scipy.stats
- def table_1():
- df = pd.DataFrame([[Mean], [Variance], [Std_Dev], [Valid_N]],
- index=["X_сер", "Дисперсія", "Сер. кв. відхил.", "Розмір вибірки"], columns=['Значення'])
- return df
- def table_2():
- df = pd.DataFrame(data=[[Minimum], [Maximum], [(Maximum - Minimum) / n_interval]],
- index=['x_min', 'x_max', 'h'], columns=['Значення'])
- df.columns.names = [f'Для {n_interval} інтервалів:']
- return df
- def table_3():
- observed_freq, bin_edges = np.histogram(arr, bins=n_interval,
- density=False) # Розбиваємо вибірку на n інтервалів та отримуємо спостережувані частоти
- observed_freq = np.insert(observed_freq, 0, 0)
- df = pd.DataFrame({"Карман": bin_edges, "Частота": observed_freq})
- df.iloc[0, 1] = ''
- df.index.names = ['№']
- return df
- def grafic_1():
- plt.xlabel('Карман')
- plt.ylabel('Частота')
- plt.title('Діаграма')
- plt.hist(arr, bins=n_interval, density=False, alpha=0.6, edgecolor='black')
- plt.show()
- def pirson_table(method='norm'):
- df = pd.DataFrame(columns=['Кармани', 'Емпіричні частоти', 'Теоритичні частоти', 'X^2_набл'])
- for i in range(len(table3)):
- df.loc[i] = [table3.iloc[i, 0], table3.iloc[i, 1], ' ', ' ']
- df.loc[1:, 'Емпіричні частоти'] = table3.loc[1:, 'Частота']
- rozpodil = ''
- if method == 'norm':
- rozpodil = 'Критерій Пірсона для нормального розподілу'
- df.loc[1:, 'Теоритичні частоти'] = (scipy.stats.norm.cdf((df.iloc[1:, 0]), loc=Mean, scale=Std_Dev)
- - scipy.stats.norm.cdf((df.iloc[0:-1, 0]), loc=Mean, scale=Std_Dev)) * Valid_N
- if method == 'exp':
- rozpodil = 'Критерій Пірсона для експоненційного розподілу'
- df.loc[1:, 'Теоритичні частоти'] = (scipy.stats.expon.cdf((df.iloc[1:, 0]), scale=Mean)
- - scipy.stats.expon.cdf((df.iloc[0:-1, 0]), scale=Mean)) * Valid_N
- if method == 'uniform':
- rozpodil = f'Критерій Пірсона для рівномірного розподілу'
- df.loc[1:, 'Теоритичні частоти'] = [len(arr) / n_interval for i in range(n_interval)]
- df.loc[1:, 'X^2_набл'] = (df.loc[1:, 'Емпіричні частоти'] - df.loc[1:, 'Теоритичні частоти']) ** 2 / df.loc[1:,'Теоритичні частоти']
- df.index.names = ['№']
- df.columns = pd.MultiIndex.from_tuples([(rozpodil, i) for i in df.columns])
- return df
- def grafic_distribution(data, x1, x2, method='norm'):
- plt.hist(data, bins=n_interval, density=False, alpha=0.6, edgecolor='black', label='Емпіричні частоти')
- x = np.zeros(n_interval)
- x[0] = x1 + table2.iloc[-1, 0] / 2
- for i in range(1, len(table4) - 1):
- x[i] = x[i - 1] + table2.iloc[-1, 0]
- if method == 'norm':
- plt.title('Діаграма нормального розподілу')
- y = table4.loc[1:, table4.columns[2]]
- if method == 'exp':
- plt.title('Діаграма експоненційного розподілу')
- y = table5.loc[1:, table5.columns[2]]
- if method == 'uniform':
- plt.title('Діаграма рівномірного розподілу')
- y = table6.loc[1:, table6.columns[2]]
- plt.plot(x, y, linewidth=1.5, color='r')
- plt.plot(x, y, 'ro', label='Теоритичні частоти')
- plt.xlabel('Значення')
- plt.ylabel('Частота')
- plt.legend()
- plt.show()
- def table_7(alpha):
- df = pd.DataFrame(data={'X^2_набл':[table4.iloc[1:, 3].sum(), table5.iloc[1:, 3].sum(), table6.iloc[1:, 3].sum()],
- 'X^2_кр':[scipy.stats.chi2.ppf(1 - alpha, n_interval - 3), scipy.stats.chi2.ppf(1 - alpha, n_interval - 2), scipy.stats.chi2.ppf(1 - alpha, n_interval - 3)]}, index=['Нормальний', 'Експоненційний', 'Рівномірний'])
- df.index.names = ["Розподіл:"]
- df['Гіпотеза:'] = ['Прийнята' if df.iloc[i, 0] < df.iloc[i, 1] else 'Відхилена' for i in range(3)]
- df.columns = pd.MultiIndex.from_tuples([(f'Рівень значущості = {alpha}', i) for i in df.columns])
- return df
- def smirnov_table(alpha, method='norm'):
- df = pd.DataFrame(columns=['Кармани', 'Частота', 'Емпіричні частоти', 'Теоритичні частоти', 'Модуль різниць', 'Z'])
- for i in range(len(table3)):
- df.loc[i] = [table3.iloc[i, 0], table3.iloc[i, 1], '', '', '', '']
- df.loc[1:, 'Емпіричні частоти'] = df.loc[1:, 'Частота'] / Valid_N
- if method == 'norm':
- rozpodil = f'Критерій Колмогорова-Смирнова для нормального розподілу(рівень значущості={alpha})'
- df.loc[1:, 'Теоритичні частоти'] = (scipy.stats.norm.cdf((df.iloc[1:, 0]), loc=Mean, scale=Std_Dev) - scipy.stats.norm.cdf((df.iloc[0:-1, 0]), loc=Mean, scale=Std_Dev))
- if method == 'exp':
- rozpodil = f'Критерій Колмогорова-Смирнова для експоненційного розподілу(рівень значущості={alpha})'
- df.loc[1:, 'Теоритичні частоти'] = scipy.stats.expon.cdf((df.iloc[1:, 0]), scale=Mean) - scipy.stats.expon.cdf((df.iloc[0:-1, 0]), scale=Mean)
- if method == 'uniform':
- rozpodil = f'Критерій Колмогорова-Смирнова для рівномірного розподілу(рівень значущості={alpha})'
- df.loc[1:, 'Теоритичні частоти'] = np.array([len(arr) / n_interval for i in range(n_interval)]) / Valid_N
- df.loc[1:, 'Модуль різниць'] = abs(df.loc[1:, 'Емпіричні частоти'] - df.loc[1:, 'Теоритичні частоти'])
- n1 = df.loc[1:, 'Емпіричні частоти'].sum()
- n2 = df.loc[1:, 'Теоритичні частоти'].sum()
- df.loc[n_interval + 1] = ['Сума', df.loc[1:, 'Частота'].sum(), n1, n2, '', (n1 * n2) / (n1 + n2)]
- for i in range(n_interval + 2, n_interval + 7): df.loc[i] = ['' for i in range(6)]
- df.iloc[n_interval + 3, 0:2] = ['dmax', df.loc[1:n_interval, 'Модуль різниць'].max()]
- df.iloc[n_interval + 4, 0:2] = ['L^2_набл', df.iloc[n_interval + 1, -1] * np.sqrt(df.iloc[n_interval + 3, 1])]
- df.iloc[n_interval + 5, 0:2] = ['L^2_кр', scipy.stats.ksone.ppf(1 - alpha / 2, Valid_N)]
- df.iloc[n_interval + 6, 0:2] = ['Гіпотеза', 'прийнята' if (df.iloc[n_interval + 4, 1] < df.iloc[n_interval + 5, 1]) else 'відхилена']
- df.columns = pd.MultiIndex.from_tuples([(rozpodil, i) for i in df.columns])
- df.index = ['' for i in range(len(df))]
- return df
- def new_grafic(x1, x2, method='norm'):
- x = np.zeros(n_interval)
- x[0] = x1 + table2.iloc[-1, 0] / 2
- for i in range(1, len(table4) - 1):
- x[i] = x[i - 1] + table2.iloc[-1, 0]
- y = table8_1.iloc[1:n_interval+1, 3]
- heights = table8_1.iloc[1:n_interval+1, 2]
- plt.title('Діаграма нормального розподілу(Колмогорова-Смирнова)')
- if method == 'exp':
- y = table9_1.iloc[1:n_interval + 1, 3]
- heights = table9_1.iloc[1:n_interval + 1, 2]
- plt.title('Діаграма експоненційного розподілу(Колмогорова-Смирнова)')
- if method == 'uniform':
- y = table10_1.iloc[1:n_interval + 1, 3]
- heights = table10_1.iloc[1:n_interval + 1, 2]
- plt.title('Діаграма рівномірного розподілу(Колмогорова-Смирнова)')
- plt.bar(x, heights, alpha=0.6, label='Емпіричні частоти', edgecolor='black', width=table2.iloc[-1, 0])
- plt.plot(x, y, linewidth=1.5, color='r')
- plt.plot(x, y, 'ro', label='Теоритичні частоти')
- plt.xlabel('Значення')
- plt.ylabel('Ймовірність потрапляння в карман')
- plt.legend()
- plt.show()
- arr = [3.31, 1.15, 2.44, 0.82, 1.50, 2.53, 2.18, 3.20,
- 2.85, 2.27, 1.97, 0.98, 3.51, 2.42, 2.09, 2.83,
- 2.76, 0.18, 1.61, 2.21, 2.33, 3.06, 1.70, 2.44,
- 1.82, 3.02, 3.63, 1.52, 2.01, 2.17, 2.63, 1.94,
- 2.49, 2.31, 2.37, 1.03, 2.06, 0.67, 2.79, 2.42,
- 2.95, 0.45, 1.20, 1.61, 2.35, 1.73, 0.82, 1.10,
- 1.94, 2.14, 2.28, 2.54, 1.85, 2.40, 1.94, 1.30,
- 1.62, 2.03, 2.00, 2.70, 2.33, 2.86, 3.26, 1.71,
- 2.70, 2.96, 2.89, 0.73, 1.01, 1.85, 2.79, 3.10,
- 2.42, 3.12, 2.43, 1.85, 1.21, 1.53, 2.95, 1.22]
- n_interval = 7
- print(f'Вхідні дані:\n{arr}\n')
- Valid_N = len(arr)
- Mean = np.mean(arr)
- Minimum = min(arr)
- Maximum = max(arr)
- Variance = np.var(arr)
- Std_Dev = np.std(arr)
- table1 = table_1()
- print(table1, '\n')
- table2 = table_2()
- print(table2, '\n')
- table3 = table_3()
- print(table3, '\n')
- grafic_1()
- table4 = pirson_table('norm')
- print(table4, '\n')
- table5 = pirson_table('exp')
- print(table5, '\n')
- table6 = pirson_table('uniform')
- print(table6, '\n')
- grafic_distribution(data=arr, x1=Minimum, x2=Maximum, method='norm')
- grafic_distribution(data=arr, x1=Minimum, x2=Maximum, method='exp')
- grafic_distribution(data=arr, x1=Minimum, x2=Maximum, method='uniform')
- table7_1 = table_7(alpha=0.05)
- print(table7_1, '\n')
- table7_2 = table_7(alpha=0.1)
- print(table7_2, '\n')
- table8_1 = smirnov_table(alpha=0.05, method='norm')
- print(table8_1, '\n')
- table8_2 = smirnov_table(alpha=0.1, method='norm')
- print(table8_2, '\n')
- table9_1 = smirnov_table(alpha=0.05, method='exp')
- print(table9_1, '\n')
- table9_2 = smirnov_table(alpha=0.1, method='exp')
- print(table9_2, '\n')
- table10_1 = smirnov_table(alpha=0.05, method='uniform')
- print(table10_1, '\n')
- table10_2 = smirnov_table(alpha=0.1, method='uniform')
- print(table10_2, '\n')
- new_grafic(x1=Minimum, x2=Maximum, method='norm')
- new_grafic(x1=Minimum, x2=Maximum, method='exp')
- new_grafic(x1=Minimum, x2=Maximum, method='uniform')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement