<jupyter_start><jupyter_text><NAME>1. Разбиваем всю облость значений случайной величины $X$ на $m$ интервалов $\Delta_{1}, \Delta_{2}, ..., \Delta_{m}$2. Подсчитываем вероятности $p_{i}  (i = 1, 2, ..., m)$ поподания случайной величины $X$ (т.е. наблюдения) в интервал, используя формулу $P(\alpha \leq X \leq \beta) = F_{0}(\beta) - F_{0}(\alpha)$ 3. Теоретические число значений случайной величины $X$, попавших в интервал $\Delta_{i}$, можно рассчитать по формуле: $n \cdot p_{i}$Т.о. получаем статистический ряд распределения случайной величины $X$ и теоретический ряд распределения4. Если эмпирические частоты ($n_{i}$) сильно отличается от теоритических ($np_{i} = n^{'}_{i}$), то проверяемую нулевую гипотезу следует отвергнуть; в противном случае принять.Согласно теореме Пирсона, при $n \rightarrow \infty$ статистика имеет $\chi^{2}$ - распределение с $k = m - r - 1$ степенями свободы, где $m$ - число групп (интервалов) выборки, $r$ - число параметров предпологаемего распределения.    В частности, если предпологаемое распределение нормально, то оценивают два параметра ($\alpha$ и $\sigma$), поэтому степеней свободы $k = m - 3$ Правило применения критерия $\chi^{2}$:1. Вычисляем выборочное значение статистики критерия:$\chi^{2} = \sum^{m}_{i=1} \dfrac{(n_{i} - np_{i})^{2}}{np_{i}} = \sum^{m}_{i=1} \dfrac{n^{2}_{i}}{np_{i}} - n$2. Выбрав уровень значимости $\alpha$ критерия, по таблице $\chi^{2}$ - распределения находим критическую точку (квантиль) $\chi^{2}_{\alpha,k}$.3. Если $\chi^{2} \leqslant \chi^{2}_{\alpha,k}$, то нулевая гипотеза не противоречит опытным данным, иначе нулевая гипотеза отвергается.**Необходимым условием применения критерия Пирсона, является наличие в каждом из интервалов не менее 5 наблюдений**<jupyter_code>import pandas as pd<jupyter_output><empty_output><jupyter_text>Задание<jupyter_code># Измерены 100 обработанных деталей, отклонения от заданного размера приведены в таблице:
n = 100
df = pd.DataFrame({"[x_{i}, x_{i+1})":[[-3, -2], [-2, -1], [-1, 0], [0, 1], [1, 2], [2, 3], [3, 4], [4, 5]], "n_i": [3, 10, 15, 24, 25, 13, 7, 3]})

alpha = 0.01

# Нулевая гипотеза - отклонения от проектного размера подчиняются нормальному закону распределения
df<jupyter_output><empty_output><jupyter_text>РешениеЧисло набдюдений с крайних интервалах меньше 5, поэтому объединяем их с соседними<jupyter_code>df_new = pd.DataFrame({"interval":[[-3, -2, -1], [-1, 0], [0, 1], [1, 2], [2, 3], [3, 4, 5]], "n_i": [13, 15, 24, 25, 13, 10]})
df_new<jupyter_output><empty_output><jupyter_text>Случайную величину - отклонение - обозначаем через **X**. Для вычисления вероятностей $p_{i}$ необходимо вычислить параметры, определяющие нормальный закон распределения ($\alpha$ и $\sigma$). их оценки вычисляем по выборке:<jupyter_code>def X_Mean(column):    
    x_mean = []
    
    for i in range(column.size):
        x_sum = 0
        j = 0
        for x_i in column[i]:
            x_sum = x_sum + x_i
            j = j + 1
        
        x_mean.append(x_sum / j)
    
    return x_mean   


df_new["x_mean"] = X_Mean(df_new.interval)
df_new
x = 1 / n * (df_new.n_i * df_new.x_mean).sum()
x<jupyter_output><empty_output><jupyter_text>$x \approx 0.9$<jupyter_code>D_B = 1/n * (df_new.n_i * df_new.x_mean ** 2).sum() - x ** 2
D_B<jupyter_output><empty_output><jupyter_text>$D_{B} \approx 2.809$<jupyter_code>import math 
sigma =  math.sqrt(D_B)
sigma<jupyter_output><empty_output><jupyter_text>$\sigma \approx 1.7$Находим $p_{i}, (i = \overline{1,6})$. Так как $X \sim N(\alpha, \sigma)$ определена на $(-\infty, \infty)$, то крайние интервалы в ряде распределения заменяем, соответственно на $(-\infty, -1)$ и $(3, \infty)$. Тогда $p_{1} = p\{-\infty < X < -1 \} = \Phi_{0}(\dfrac{-1-0.9}{1.7}) - \Phi_{0}(-\infty) = 0.5 - \Phi(1.12)$ $p_{6} = p\{-\infty < X < -1 \} = \Phi_{0}(\infty) -  \Phi_{0}(\dfrac{3-0.9}{1.7}) = 0.5 - \Phi(1.24)$<jupyter_code>df_new.interval[0][-1]
def F_left(column, x, sigma):
    F = []
    for i in range(column.size):
        if i == (column.size - 1):
            F.append(0.5)
        else:
            F.append((column[i][-1] - x) / sigma)
    return F

def F_right(column, x, sigma):
    F= []
    for i in range(column.size):
        if i == 0:
            F.append(-0.5)
        else:
            F.append((column[i][0] - x) / sigma)
    return F



df_new['F_left'] = [round(i,2) for i in F_left(df_new.interval, x, sigma)]
df_new['F_right'] = [round(i,2) for i in F_right(df_new.interval, x, sigma)]

df_new<jupyter_output><empty_output><jupyter_text>Результаты F_left и F_right по таблице $\Phi_{0}$<jupyter_code>df_F = pd.DataFrame({"F_left":[-0.3686, -0.2019, 0.0279, 0.2486, 0.3962, 0.5], "F_right":[-0.5, -0.3686, -0.2019, 0.0279, 0.2486, 0.3962]})
df_F
df_F["difference"] = df_F.F_left - df_F.F_right
df_F["np_i"] = n * df_F["difference"]
df_F<jupyter_output><empty_output><jupyter_text>Вычисляем выборочное значение статистики критерия:$\chi^{2} = \sum^{m}_{i=1} \dfrac{(n_{i} - np_{i})^{2}}{np_{i}} = \sum^{m}_{i=1} \dfrac{n^{2}_{i}}{np_{i}} - n$<jupyter_code>x_2 = sum((df_new.n_i**2)/df_F.np_i) - n
x_2<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.18158717748240813, 'fraction_numerical': 0.04202501954652072, 'mean_word_length': 4.122122122122122, 'pattern_counts': {'":': 6, '<': 42, '<?xml version=': 0, '>': 38, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 7, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '326189', 'license': 'MIT', 'n_tokens_mistral': 2375, 'n_tokens_neox': 2461, 'n_words': 494, 'path': 'Part_5/example_1.ipynb', 'repo_name': 'FluffyHamster/mathematical-statistics', 'size': '5126'}