Advertisement
mirosh111000

Мат_Стат_Мірошниченко_СР№2.2

Sep 18th, 2024
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.60 KB | None | 0 0
  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. import scipy.stats
  5.  
  6. def table_1():
  7.        df = pd.DataFrame([[Mean], [Variance], [Std_Dev], [Valid_N]],
  8.                              index=["X_сер", "Дисперсія", "Сер. кв. відхил.", "Розмір вибірки"], columns=['Значення'])
  9.        return df
  10.  
  11. def table_2():
  12.        df = pd.DataFrame(data=[[Minimum], [Maximum], [(Maximum - Minimum) / n_interval]],
  13.                              index=['x_min', 'x_max', 'h'], columns=['Значення'])
  14.        df.columns.names = [f'Для {n_interval} інтервалів:']
  15.        return df
  16.  
  17. def table_3():
  18.        observed_freq, bin_edges = np.histogram(arr, bins=n_interval,
  19.                                                density=False)  # Розбиваємо вибірку на n інтервалів та отримуємо спостережувані частоти
  20.        observed_freq = np.insert(observed_freq, 0, 0)
  21.        df = pd.DataFrame({"Карман": bin_edges, "Частота": observed_freq})
  22.        df.iloc[0, 1] = ''
  23.        df.index.names = ['№']
  24.        return df
  25.  
  26. def grafic_1():
  27.     plt.xlabel('Карман')
  28.     plt.ylabel('Частота')
  29.     plt.title('Діаграма')
  30.     plt.hist(arr, bins=n_interval, density=False, alpha=0.6, edgecolor='black')
  31.     plt.show()
  32.  
  33. def pirson_table(method='norm'):
  34.     df = pd.DataFrame(columns=['Кармани', 'Емпіричні частоти', 'Теоритичні частоти', 'X^2_набл'])
  35.     for i in range(len(table3)):
  36.         df.loc[i] = [table3.iloc[i, 0], table3.iloc[i, 1], ' ', ' ']
  37.     df.loc[1:, 'Емпіричні частоти'] = table3.loc[1:, 'Частота']
  38.     rozpodil = ''
  39.     if method == 'norm':
  40.         rozpodil = 'Критерій Пірсона для нормального розподілу'
  41.         df.loc[1:, 'Теоритичні частоти'] = (scipy.stats.norm.cdf((df.iloc[1:, 0]), loc=Mean, scale=Std_Dev)
  42.                                             - scipy.stats.norm.cdf((df.iloc[0:-1, 0]), loc=Mean, scale=Std_Dev)) * Valid_N
  43.  
  44.     if method == 'exp':
  45.         rozpodil = 'Критерій Пірсона для експоненційного розподілу'
  46.         df.loc[1:, 'Теоритичні частоти'] = (scipy.stats.expon.cdf((df.iloc[1:, 0]), scale=Mean)
  47.                                             - scipy.stats.expon.cdf((df.iloc[0:-1, 0]), scale=Mean)) * Valid_N
  48.  
  49.     if method == 'uniform':
  50.         rozpodil = f'Критерій Пірсона для рівномірного розподілу'
  51.         df.loc[1:, 'Теоритичні частоти'] = [len(arr) / n_interval for i in range(n_interval)]
  52.  
  53.  
  54.  
  55.     df.loc[1:, 'X^2_набл'] = (df.loc[1:, 'Емпіричні частоти'] - df.loc[1:, 'Теоритичні частоти']) ** 2 / df.loc[1:,'Теоритичні частоти']
  56.     df.index.names = ['№']
  57.     df.columns = pd.MultiIndex.from_tuples([(rozpodil, i) for i in df.columns])
  58.  
  59.     return df
  60.  
  61. def grafic_distribution(data, x1, x2, method='norm'):
  62.     plt.hist(data, bins=n_interval, density=False, alpha=0.6, edgecolor='black', label='Емпіричні частоти')
  63.     x = np.zeros(n_interval)
  64.     x[0] = x1 + table2.iloc[-1, 0] / 2
  65.     for i in range(1, len(table4) - 1):
  66.         x[i] = x[i - 1] + table2.iloc[-1, 0]
  67.  
  68.     if method == 'norm':
  69.         plt.title('Діаграма нормального розподілу')
  70.         y = table4.loc[1:, table4.columns[2]]
  71.  
  72.     if method == 'exp':
  73.         plt.title('Діаграма експоненційного розподілу')
  74.         y = table5.loc[1:, table5.columns[2]]
  75.  
  76.     if method == 'uniform':
  77.         plt.title('Діаграма рівномірного розподілу')
  78.         y = table6.loc[1:, table6.columns[2]]
  79.  
  80.     plt.plot(x, y, linewidth=1.5, color='r')
  81.     plt.plot(x, y, 'ro', label='Теоритичні частоти')
  82.     plt.xlabel('Значення')
  83.     plt.ylabel('Частота')
  84.     plt.legend()
  85.     plt.show()
  86.  
  87. def table_7(alpha):
  88.  
  89.  
  90.     df = pd.DataFrame(data={'X^2_набл':[table4.iloc[1:, 3].sum(), table5.iloc[1:, 3].sum(), table6.iloc[1:, 3].sum()],
  91.                             '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=['Нормальний', 'Експоненційний', 'Рівномірний'])
  92.     df.index.names = ["Розподіл:"]
  93.     df['Гіпотеза:'] = ['Прийнята' if df.iloc[i, 0] < df.iloc[i, 1] else 'Відхилена' for i in range(3)]
  94.     df.columns = pd.MultiIndex.from_tuples([(f'Рівень значущості = {alpha}', i) for i in df.columns])
  95.  
  96.     return df
  97.  
  98. def smirnov_table(alpha, method='norm'):
  99.     df = pd.DataFrame(columns=['Кармани', 'Частота', 'Емпіричні частоти', 'Теоритичні частоти', 'Модуль різниць', 'Z'])
  100.     for i in range(len(table3)):
  101.         df.loc[i] = [table3.iloc[i, 0], table3.iloc[i, 1], '', '', '', '']
  102.     df.loc[1:, 'Емпіричні частоти'] = df.loc[1:, 'Частота'] / Valid_N
  103.  
  104.     if method == 'norm':
  105.         rozpodil = f'Критерій Колмогорова-Смирнова для нормального розподілу(рівень значущості={alpha})'
  106.         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))
  107.  
  108.     if method == 'exp':
  109.         rozpodil = f'Критерій Колмогорова-Смирнова для експоненційного розподілу(рівень значущості={alpha})'
  110.         df.loc[1:, 'Теоритичні частоти'] = scipy.stats.expon.cdf((df.iloc[1:, 0]), scale=Mean) - scipy.stats.expon.cdf((df.iloc[0:-1, 0]), scale=Mean)
  111.  
  112.     if method == 'uniform':
  113.         rozpodil = f'Критерій Колмогорова-Смирнова для рівномірного розподілу(рівень значущості={alpha})'
  114.         df.loc[1:, 'Теоритичні частоти'] = np.array([len(arr) / n_interval for i in range(n_interval)]) / Valid_N
  115.  
  116.     df.loc[1:, 'Модуль різниць'] = abs(df.loc[1:, 'Емпіричні частоти'] - df.loc[1:, 'Теоритичні частоти'])
  117.  
  118.     n1 = df.loc[1:, 'Емпіричні частоти'].sum()
  119.     n2 = df.loc[1:, 'Теоритичні частоти'].sum()
  120.     df.loc[n_interval + 1] = ['Сума', df.loc[1:, 'Частота'].sum(), n1, n2, '', (n1 * n2) / (n1 + n2)]
  121.  
  122.     for i in range(n_interval + 2, n_interval + 7): df.loc[i] = ['' for i in range(6)]
  123.  
  124.     df.iloc[n_interval + 3, 0:2] = ['dmax', df.loc[1:n_interval, 'Модуль різниць'].max()]
  125.     df.iloc[n_interval + 4, 0:2] = ['L^2_набл', df.iloc[n_interval + 1, -1] * np.sqrt(df.iloc[n_interval + 3, 1])]
  126.  
  127.     df.iloc[n_interval + 5, 0:2] = ['L^2_кр', scipy.stats.ksone.ppf(1 - alpha / 2, Valid_N)]
  128.     df.iloc[n_interval + 6, 0:2] = ['Гіпотеза', 'прийнята' if (df.iloc[n_interval + 4, 1] < df.iloc[n_interval + 5, 1]) else 'відхилена']
  129.  
  130.     df.columns = pd.MultiIndex.from_tuples([(rozpodil, i) for i in df.columns])
  131.     df.index = ['' for i in range(len(df))]
  132.  
  133.     return df
  134.  
  135. def new_grafic(x1, x2, method='norm'):
  136.     x = np.zeros(n_interval)
  137.     x[0] = x1 + table2.iloc[-1, 0] / 2
  138.     for i in range(1, len(table4) - 1):
  139.         x[i] = x[i - 1] + table2.iloc[-1, 0]
  140.  
  141.     y = table8_1.iloc[1:n_interval+1, 3]
  142.     heights = table8_1.iloc[1:n_interval+1, 2]
  143.     plt.title('Діаграма нормального розподілу(Колмогорова-Смирнова)')
  144.  
  145.     if method == 'exp':
  146.         y = table9_1.iloc[1:n_interval + 1, 3]
  147.         heights = table9_1.iloc[1:n_interval + 1, 2]
  148.         plt.title('Діаграма експоненційного розподілу(Колмогорова-Смирнова)')
  149.     if method == 'uniform':
  150.         y = table10_1.iloc[1:n_interval + 1, 3]
  151.         heights = table10_1.iloc[1:n_interval + 1, 2]
  152.         plt.title('Діаграма рівномірного розподілу(Колмогорова-Смирнова)')
  153.  
  154.     plt.bar(x, heights, alpha=0.6, label='Емпіричні частоти',  edgecolor='black', width=table2.iloc[-1, 0])
  155.     plt.plot(x, y, linewidth=1.5, color='r')
  156.     plt.plot(x, y, 'ro', label='Теоритичні частоти')
  157.     plt.xlabel('Значення')
  158.     plt.ylabel('Ймовірність потрапляння в карман')
  159.     plt.legend()
  160.     plt.show()
  161.  
  162.  
  163.  
  164. arr = [3.31, 1.15, 2.44, 0.82, 1.50, 2.53, 2.18, 3.20,
  165.         2.85, 2.27, 1.97, 0.98, 3.51, 2.42, 2.09, 2.83,
  166.         2.76, 0.18, 1.61, 2.21, 2.33, 3.06, 1.70, 2.44,
  167.         1.82, 3.02, 3.63, 1.52, 2.01, 2.17, 2.63, 1.94,
  168.         2.49, 2.31, 2.37, 1.03, 2.06, 0.67, 2.79, 2.42,
  169.         2.95, 0.45, 1.20, 1.61, 2.35, 1.73, 0.82, 1.10,
  170.         1.94, 2.14, 2.28, 2.54, 1.85, 2.40, 1.94, 1.30,
  171.         1.62, 2.03, 2.00, 2.70, 2.33, 2.86, 3.26, 1.71,
  172.         2.70, 2.96, 2.89, 0.73, 1.01, 1.85, 2.79, 3.10,
  173.         2.42, 3.12, 2.43, 1.85, 1.21, 1.53, 2.95, 1.22]
  174.  
  175. n_interval = 7
  176.  
  177. print(f'Вхідні дані:\n{arr}\n')
  178. Valid_N = len(arr)
  179. Mean = np.mean(arr)
  180. Minimum = min(arr)
  181. Maximum = max(arr)
  182. Variance = np.var(arr)
  183. Std_Dev = np.std(arr)
  184.  
  185.  
  186. table1 = table_1()
  187. print(table1, '\n')
  188. table2 = table_2()
  189. print(table2, '\n')
  190. table3 = table_3()
  191. print(table3, '\n')
  192. grafic_1()
  193. table4 = pirson_table('norm')
  194. print(table4, '\n')
  195. table5 = pirson_table('exp')
  196. print(table5, '\n')
  197. table6 = pirson_table('uniform')
  198. print(table6, '\n')
  199.  
  200. grafic_distribution(data=arr, x1=Minimum, x2=Maximum, method='norm')
  201. grafic_distribution(data=arr, x1=Minimum, x2=Maximum, method='exp')
  202. grafic_distribution(data=arr, x1=Minimum, x2=Maximum, method='uniform')
  203.  
  204. table7_1 = table_7(alpha=0.05)
  205. print(table7_1, '\n')
  206. table7_2 = table_7(alpha=0.1)
  207. print(table7_2, '\n')
  208. table8_1 = smirnov_table(alpha=0.05, method='norm')
  209. print(table8_1, '\n')
  210. table8_2 = smirnov_table(alpha=0.1, method='norm')
  211. print(table8_2, '\n')
  212. table9_1 = smirnov_table(alpha=0.05, method='exp')
  213. print(table9_1, '\n')
  214. table9_2 = smirnov_table(alpha=0.1, method='exp')
  215. print(table9_2, '\n')
  216. table10_1 = smirnov_table(alpha=0.05, method='uniform')
  217. print(table10_1, '\n')
  218. table10_2 = smirnov_table(alpha=0.1, method='uniform')
  219. print(table10_2, '\n')
  220.  
  221. new_grafic(x1=Minimum, x2=Maximum, method='norm')
  222. new_grafic(x1=Minimum, x2=Maximum, method='exp')
  223. new_grafic(x1=Minimum, x2=Maximum, method='uniform')
  224.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement