"""
    В группе учатся 28 студентов, {1, 2, .. 28}. Пусть – 100-балльная оценка студента . Из
    группы случайным образом 8 раз выбирается студент . Повторный выбор допускается. Пусть – студент,
    полученный после выбора , – его оценка. Среднюю оценку на случайной выборке обозначим 1/8 Sum(wj)
    . Оценки в группе даны: 11, 91, 1, 92, 64, 93, 86, 88, 0, 81, 52, 65, 70, 62, 96, 91, 86, 61, 95, 87, 60, 68,
    65, 60, 70, 62, 0, 100. Требуется найти: 1) дисперсию ; 2) центральный момент.

import numpy as np
import scipy.stats as stats
N = 28
nv = 8
marks = list(map(int, '11, 91, 1, 92, 64, 93, 86, 88, 0, 81, 52, 65, 70, 62, 96, 91, 86, 61, 95, 87, 60, 68, 65, 60, 70, 62, 0, 100'.split(', ')))

print("Var", np.var(marks)/nv, round(np.var(marks)/nv, 4))
print("Moment 3th", stats.moment(marks, moment=3)/nv**2, round(stats.moment(marks, moment=3)/nv**2, 4))

######################################################
    Пусть x = (x1, ... x40) - реализация случайной выборки из нормального распределения N(mu, sigma**2)
    . Проверяется на уровне значимости a = 0.02 гипотеза sigma = 1,19 против альтернативной гипотезы sigma != 1,19
    с критическим множеством вида K = (0, A) (B; +00). 1) Найдите значение статистики критерия chi2
    . 2) Найдите границы А и В критического множества и проверьте гипотезу . 3) Найдите -значение критерия. 4)
    Найдите вероятность ошибки второго рода для sigma_1 = 1.29.

import numpy as np
import scipy.stats as sps

x = '1,514; 1,239; 0,372; 2,053; 2,261; -0,064; 3,33; 1,59; 1,067; 0,294; 0,871; 2,235; 2,814; 0,545; -0,051; \
    -1,846; 0,774; 2,29; 1,075; 0,455; 3,237; 1,869; 1,313; 1,273; 1,629; 2,575; 1,241; 1,798; -0,616; 2,242; 1,461; \
    0,072; 3,174; 0,269; 4,231; 3,436; 0,915; 2,824; 1,376; 3,934'.replace(',', '.').split(';')
for i in range(len(x)):
  x[i] = float(x[i])

alpha = 0.02
sigma = 1.19
sigma1 = 1.29

s2 = 0
for i in range(len(x)):
  s2 += (x[i] - np.mean(x))**2
s2 = s2/(len(x)-1)

chi2 = (len(x)-1)*s2/sigma**2
B = sps.chi2.isf(1-alpha/2,len(x)-1)
A = sps.chi2.isf(alpha/2,len(x)-1)
pv = 2*min(sps.chi2.sf(chi2, len(x)-1), sps.chi2.cdf(chi2, len(x)-1))
beta = sps.chi2.cdf(sps.chi2.isf(alpha/2, len(x)-1)*sigma**2/sigma1**2, len(x)-1) - sps.chi2.cdf(sps.chi2.isf(1-alpha/2, len(x)-1)*sigma**2/sigma1**2, len(x)-1)

print("Статистика критерия",chi2)
print("Граница В",B)
print("Граница А", A)
print("Р-значение критерия", pv)
print("Вероятность ошибки второго рода", beta)


######################################################
    Пусть (x1, y1);....;(x33;y33) – реализация случайной выборки (X1, Y1)...(X33, Y33) из двумерного
    нормального распределения N(mux, muy, sigma_x, sigma_y, p). Используя векторы x и y,
    постройте асимптотический 0,75 - доверительный интервал для коэффициента корреляции p . В ответе
    укажите: 1) выборочный коэффициент корреляции 2) верхнюю границу построенного доверительного
    интервала для .

import math
import scipy.stats as stats
x = '-0,548; -0,505; -0,946; 0,63; -0,828; -0,729; -1,151; -2,4; 0,976; 1,446; -2,156; -0,277; -0,225; 1,307; 0,813; -1,319; 0,82; 0,491; 0,868; -1,583; 0,147; 0,167; -0,647; -0,177; 0,283; 2,188; -0,843; -3,163; 0,431; 1,305; -0,402; -0,305; 0,788'
y = '-0,21; -0,392; -0,536; 0,651; -0,488; 0,444; -1,002; -2,158; 1,171; 1,51; -1,481; -0,05; 0,189; 1,285; 0,965; -0,97; 1,527; 0,61; 0,641; -1,241; 0,459; 0,441; -0,218; -0,574; 0,331; 2,203; -0,735; -3,493; 0,305; 1,124; -0,847; -0,464; 0,441'
j = 0.75

x = [float(i.replace(',', '.')) for i in x.split(';')]
y = [float(i.replace(',', '.')) for i   in y.split(';')]

p = np.corrcoef(x,y)[0][1]
z = stats.norm.isf((1-j)/2)
high = math.tanh(math.atanh(p) + 1/(len(x)-3)**0.5 * z)

p = str(p).replace('.', ',')
high = str(high).replace('.', ',')
print(f'Выборочный коэффициент корреляции = ', p)
print(f'Верхняя граница доверительного интервала = ', high)


######################################################
Эмпирическое распределение признаков и на генеральной совокупности
задано таблицей частот
    Y   Y   Y
X
X
Из случайным образом без возвращения извлекаются 19 элементов. Пусть и – средние значения
признаков на выбранных элементах. Требуется найти: 1) математическое ожидание ; 2) стандартное
отклонение ; 3) ковариацию .

n = 19
x = [100, 200]
y = [2, 4, 6]
cell1 = [10, 26, 19]
cell2 = [15, 15, 15]


N = 100
Y = [cell1[i]+cell2[i] for i in range(3)] # частотное распр Y
EY = 1/N * sum([y[i]*Y[i] for i in range(3)])

EX = 1/N * sum([sum(cell1)*x[0], sum(cell2)*x[1]])
X = [sum(cell1), sum(cell2)]
VarX = 1/N * sum([(x[i] - EX)**2*X[i] for i in range(2)]) / n * (N-n) / (N-1)
sigma = VarX**0.5

lazy = (x[0]-EX)*(y[0]-EY)*cell1[0] + (x[0]-EX)*(y[1]-EY)*cell1[1] + (x[0]-EX)*(y[2]-EY)*cell1[2] + (x[1]-EX)*(y[0]-EY)*cell2[0] + (x[1]-EX)*(y[1]-EY)*cell2[1] + (x[1]-EX)*(y[2]-EY)*cell2[2]
cov = 1/N * lazy
Cov = cov/n * (N-n) / (N-1)

EY = str(round(EY,5)).replace('.', ',')
sigma = str(round(sigma,5)).replace('.', ',')
Cov = str(round(Cov,5)).replace('.', ',')

print('Математическое ожидание:', EY)
print('Стандартное отклонение:', sigma)
print('Ковариация:', Cov)


######################################################
Поток состоит из k групп: , k = 4. На потоке учатся студентов n = n1+n2+nk, где –
число студентов в группе , . Пусть – 100-балльная оценка студента . Далее
используются следующие обозначения: – среднее значение, – (эмпирическое) стандартное отклонение
признака на группе . Дано: , , , , , , , , ,
, , . Требуется найти: 1) среднее значение на потоке ; 2) (эмпирическое) стандартное
отклонение на потоке .

k = 4
n = [23, 20, 25, 24]
xi = [76, 75, 70, 73]
sigma = [7, 5, 8, 9]

N = sum(n)

a = []
for i in range(len(n)):
  a.append(n[i]*xi[i])
  x = 1/N *sum(a)
print("Среднее значение:",str(round(x,3)).replace('.', ','))

b = []
for i in range(k):
  b.append(n[i]*(xi[i]-x)**2)

c = []
for i in range(k):
  c.append(sigma[i]**2*n[i])

sd = (1/N * (sum(b) + sum(c)))**0.5
print("Стандартное отклонение:",str(round(sd,3)).replace('.', ','))

######################################################
    Пусть x=(x1, x2...x25)– реализация случайной выборки из нормального
    распределения N(mu, 0.7**2), а y = (y1, ..., y30) – реализация случайной выборки из
    нормального распределения N(mu, 1.4**2). Известно, что и независимы. Проверяется гипотеза
    против альтернативной гипотезы . При уровне значимости применяется критерий с критической
    областью , где статистика критерия – это нормированная разность , –
    зависящее от критическое значение. Соответствующее критическое множество имеет вид . 1)
    Найдите значение статистики критерия Zнабл = Z(x, y). 2) Найдите P-значение критерия. 3) Найдите
    критическое значение A, критическое множество K и проверьте гипотезу при a=0,03. 4) Найдите
    мощность критерия W в случае mu_x - mu_y = 1 и a = 0,03.

sigma_1 = 0.7**2
sigma_2 = 1.4**2

alpha = 0.03
delta = 1 ## разници между mu_x mu_y

data_x = '4,193; 3,998; 5,62; 4,677; 4,571; 3,26; 4,221; 4,998; 4,379; 4,632; 3,266; 3,286; 4,062; 4,336; 4,089; 5,079; 2,979; 4,379; 4,724; 4,168; 4,595; 3,348; 3,549; 4,037; 4,372'
data_x = data_x.replace(',','.')
data_x = data_x.replace(';',',')
data_x = np.array(list(map(lambda x: float(x),data_x.split(', '))))

data_y = '3,204; 3,929; 4,304; 3,222; 2,424; 3,442; 4,046; 6,624; 5,723; 3,29; 2,786; 4,551; 3,6; 5,99; 2,399; 3,497; 2,326; 3,12; -0,318; 3,014; 3,277; 5,993; 2,96; 4,239; 1,721; 5,536; 3,394; 4,451; 2,553; 4,21'
data_y = data_y.replace(',','.')
data_y = data_y.replace(';',',')
data_y = np.array(list(map(lambda x: float(x),data_y.split(', '))))

Z = stats.norm()
m = len(data_x)
n = len(data_y)

z_nabl = (np.mean(data_x) - np.mean(data_y)) / np.sqrt( sigma_1/m + sigma_2/n )
print('статистика критерия Zнабл = ', round(z_nabl, 4))

print('p-value =',round(Z.sf(z_nabl), 4))

print('Значение критической области А =',round(Z.isf(alpha), 4))

W = 1 - Z.cdf(Z.isf(alpha) - np.sqrt(n*m)/np.sqrt(n*sigma_1 + m*sigma_2)*delta)

print('мощность критерия =',round(W, 5))

######################################################
    Пусть x = (x1, ....x20)– реализация случайной выборки X = (X1...X20) из нормального
    распределения N(mu, sigma**2). Проверяется на уровне значимости a=0,04 основная гипотеза mu=1.45 против
    альтернативной гипотезы mu!=1.45с критическим множеством вида K=(-00, -A) (A, 00). 1)
    Найдите значение статистики критерия t. 2) Найдите границу А критического множества.  3)
    Найдите P-значение критерия и сделайте выводы. 4) Найдите мощность W критерия для mu = 1.34.

alpha = 0.04
mu0 = 1.45
mu1 = 1.34  # для мощности 
x = '1,494; 0,274; 10,106; 1,165; 1,411; -0,809; 0,617; 4,121; 6,242; -3,752; 0,98; 0,884; 6,619; 1,781; 6,055; -3,969; 1,481; 4,778; -4,171; 1,672'


x = [float(i.replace(',', '.')) for i in x.split(';')]
n = len(x)
ex = np.mean(x)
s2 = 1/(n-1) * sum((i-ex)**2 for i in x)
t = (ex - mu0)/s2**0.5 * n**0.5 
A = stats.t.isf(alpha/2, n-1)
pv = 2 * min(stats.t.sf(t, n-1), stats.t.cdf(t, n-1))
delta = np.sqrt(n) * (mu1 - mu0)/np.sqrt(s2)
power = 1 - (stats.nct.cdf(A, n-1, delta) - stats.nct.cdf(-A, n-1, delta) )

t = str(round(t,5)).replace('.', ',')
A = str(round(A,5)).replace('.', ',')
pv = str(round(pv,5)).replace('.', ',')
power = str(round(power,5)).replace('.', ',')

print('Значение статистики критерия:', t)
print('Граница А критического множества:', A)
print('P-значение критерия:', pv)
print('Мощность критерия:', power)

######################################################
Следующие 30 чисел – это умноженные на 10000 и округленные до ближайшего целого дневные логарифмические
доходности акции компании АВС: -956, 744, 1024, -794, 17, -252, -1122, -853, 65, -200, 991, 277, 59, -105, -95, 729, 20, 584,
-832, -232, -490, -590, 197, -20, -278, -123, -275, -72, -416, -165. Будем называть их преобразованными доходностями (ПД).
Финансовый аналитик Глеб предполагает, что преобразованные доходности (как и исходные) приближенно распределены по
нормальному закону. Чтобы проверить свое предположение Глеб нашел нижнюю квартиль L и верхнюю квартиль H
нормального распределения , для которого – это среднее арифметическое ПД, а – эмпирическое стандартное
отклонение ПД. Затем Глеб подсчитал количество ПД, попавших в интервал от L до H (надеясь, что в этот интервал попадет
половина ПД). Результат этого вычисления показался ему недостаточно убедительным. Чтобы окончательно развеять
сомнения относительно нормальности ПД, Глеб построил на одном рисунке графики функций: и , где –
эмпирическая функция распределения ПД, а – функция распределения . В качестве меры совпадения двух
графиков Глеб решил использовать расстояние между функциями и , которое он вычислил, исходя из
определения: . В ответе укажите результаты вычислений Глеба: 1) среднее арифметическое ПД; 2)
эмпирическое стандартное отклонение ПД; 3) квартили L и H; 4) количество ПД, попавших в интервал от L до H; 5)
расстояние между функциями и .

from statistics import mean
from numpy import std
#from statistics import NormalDist
import scipy.stats as sps

pd = [ -956, 744, 1024, -794, 17, -252, -1122, -853, 65, -200, 991, 277, 59, -105, -95, 729, 20, 584,
-832, -232, -490, -590, 197, -20, -278, -123, -275, -72, -416, -165]
mean_pd = mean(pd)
deviation = std(pd)
norm = sps.norm(mean_pd, deviation)
L = norm.ppf(0.25)
H = norm.ppf(0.75)
count = len([x for x in pd if L <= x <= H])

dist = []
for pdd in sorted(set(pd)):
  v1 = norm.cdf(pdd)
  v2 = 1 - (sorted(pd)[::-1].index(pdd)) / len(pd)
  dist.append(abs(v1 - v2))

print(mean_pd)
print(deviation)
print(L)
print(H)
print(count)
print(max(dist))

######################################################
Пусть x = (x1,... x30) – реализация случайной выборки X = (X1, ... X30) из нормального распределения N(u, 2.7**2)
. Проверяется на уровне значимости a = 0.04 основная гипотеза против mu = 1,58 альтернативной гипотезы mu != 1,58
с критическим множеством вида K = (-00; -A) (A;+00). 1) Найдите значение статистики критерия Zнабл 
. 2) Найдите границу А критического множества. 3) Найдите -значение критерия и сделайте выводы. 4)
Найдите мощность критерия для mu = 1,46.

from scipy.special import erf

sigma = 2.7
alpha = 0.04
mu0 = 1.58
mu1 = 1.46  # для мощности
x = '2,268; 3,937; -1,518; 5,412; 3,246; 3,861; 3,358; 2,528; -1,523; 4,68; 0,239; -1,611; 6,277; 2,238; 3,951; 5,617; -2,837; 1,686; 0,176; 2,842; 4,715; 3,395; 0,539; -1,869; 2,038; 3,592; -0,328; 1,86; -0,333; 3,272'


x = [float(i.replace(',', '.')) for i in x.split(';')]
n = len(x)
ex = np.mean(x)
z = (n)**0.5*(ex-mu0)/sigma
A = stats.norm.isf(alpha/2)
pv = 2*(1 - stats.norm.cdf(abs(z)))
laplace = lambda x: erf(x/2**0.5)/2
delta = np.sqrt(n)*(mu0-mu1)/sigma
power = 1 - (laplace(A + delta) + laplace(A - delta))

print('Значение статистики критерия:', z)
print('Граница А критического множества:', A)
print('P-значение критерия:', pv)
print('Мощность критерия:', power)

######################################################
мпирическое распределение признаков и на генеральной совокупности задано
таблицей частот. Из случайным образом без возвращения извлекаются 7 элементов. Пусть и – средние значения признаков на
выбранных элементах. Требуется найти: 1) математическое ожидание ; 2) дисперсию ; 3) коэффициент
корреляции .

n = 7
x = [200, 300]
y = [1,3,5]
cell1 = [18,27,11]
cell2 = [18,11,15]

N = 100
EX = 1/N * sum([sum(cell1)*x[0], sum(cell2)*x[1]])

Y = [cell1[i]+cell2[i] for i in range(3)] 
EY = 1/N * sum([y[i]*Y[i] for i in range(3)])
vary = 1/N * sum([(y[i] - EY)**2*Y[i] for i in range(3)])
VarY = vary/n * (N-n) / (N-1) 

temp = (x[0]-EX)*(y[0]-EY)*cell1[0] + (x[0]-EX)*(y[1]-EY)*cell1[1] + (x[0]-EX)*(y[2]-EY)*cell1[2] + (x[1]-EX)*(y[0]-EY)*cell2[0] + (x[1]-EX)*(y[1]-EY)*cell2[1] + (x[1]-EX)*(y[2]-EY)*cell2[2]
cov = 1/N * temp
Cov = cov/n * (N-n) / (N-1)
X = [sum(cell1), sum(cell2)]
VarX = 1/N * sum([(x[i] - EX)**2*X[i] for i in range(2)]) / n * (N-n) / (N-1)
rho = Cov/ (VarX*VarY)**0.5

print('E:', round(EX,4))
print('Var:', round(VarY,4))
print('Cor', round(rho,4))

######################################################
Пусть x = (x1, ... x45) – реализация случайной выборки X = (X1, .. X45) из нормального распределения N(1.56;sigma**2)
. Проверяется на уровне значимости гипотеза против альтернативной гипотезы
с критическим множеством вида . 1) Найдите значение статистики критерия . 2)
Найдите границы А и В критического множества и проверьте гипотезу . 3) Найдите -значение критерия. 4) Найдите
вероятность ошибки второго рода для .

mu = 1.56 # условие
alpha = 0.05 # уровень значимости
sigma = 1.15 # нулевая гипотеза
sigma1 = 1.25 # пункт 4)
x = '0,122; 1,236; 0,217; -1,332; 2,551; 0,788; \
1,378; 1,428; 2,711; 0,163; 1,445; 2,005; 0,125; 2,408; 1,718; -0,541; 1,283; 1,244; 0,069; 2,391; -0,484; 0,568; -1,056; -0,206;\
1,684; 0,511; 1,155; 0,686; -0,351; 2,006; 3,419; 1,546; 0,729; 0,474; 2,432; 0,705; 0,416; 1,666; 1,698; 0,945; -0,614; 1,121;\
-0,397; 0,317; 2,064'

x = [float(i.replace(',', '.')) for i in x.split(';')]
n = len(x)
chi = 1/sigma**2 * sum((i-mu)**2 for i in x)
X = stats.chi2(len(x))
A = X.isf(1-alpha/2)
B = X.isf(alpha/2)
pv = 2*X.sf(chi)
beta = sps.chi2.cdf(sps.chi2.isf(alpha/2,n)*sigma**2/sigma1**2,n) - sps.chi2.cdf(sps.chi2.isf(1-alpha/2,n)*sigma**2/sigma1**2,n)

print('Значение статистики критерия = ', str(round(chi,5)).replace('.',','))
print('Граница критического множества А = ', str(round(A,5)).replace('.',','), 'Граница критического множества В = ', str(round(B,5)).replace('.',','))
print('P значение критерия = ', str(round(pv,5)).replace('.',','))
print('Вероятность ошибки второго рода = ', str(round(beta, 5)).replace('.',','))

######################################################

    Для трех групп финансовых показателей A: , B: , C: , которые по
    предположению независимы и распределены, соответственно, по трем нормальным законам , ,
    (с одинаковой неизвестной дисперсией ) на уровне значимости с помощью F-критерия
    (Фишера) проверяется гипотеза 

a = '0,616; 1,046; 2,575; -0,344; 2,339; -0,68; 3,739; 2,251; -1,252; 3,536; -0,491; 5,556; 4,856; -1,68; 2,33; 1,345; 2,829; 2,539; 3,304; 3,497; 0,211; 3,563; 0,94; 3,642; 1,956; 3,919; 3,568'.replace(',', '.').split(';')
for i in range(len(a)):
    a[i] = float(a[i])
    
b = '2,834; 1,504; -0,678; 5,619; 0,97; 1,617; 3,768; -1,309; 3,343; -1,778; -0,854; 1,04; 2,83; -2,335; 4,853; 5,6; 4,341; 4,362; 3,52; 1,151; -0,621; -2,88; 1,697; 1,753; 0,211; 2,157; 1,989; 2,457; 1,399; 1,61; -0,558; 2,132; 2,293'.replace(',', '.').split(';')
for i in range(len(b)):
    b[i] = float(b[i])
    
c = '2,398; -2,77; 4,679; 1,924; 0,574; 5,329; 0,699; 4,457; -0,3; 1,682; -1,34; 0,046; -1,096; 1,935; 2,411; 4,134; 5,643; 3,071; 6,526; 4,941; 2,844; -0,43; -2,066; 0,22; 0,317; -1,923; 1,38; -2,485; 0,111; -0,542; 4,78; 1,93; 0,462; 5,487; -3,547; 2,933; -0,987; -0,21; 3,955'.replace(',', '.').split(';')
for i in range(len(c)):
    c[i] = float(c[i])

alpha = 0.01

abc = a + b + c

delta2 = len(a)*(np.mean(a)-np.mean(abc))**2 + len(b)*(np.mean(b)-np.mean(abc))**2 + len(c)*(np.mean(c)-np.mean(abc))**2
delta2 = delta2/len(abc)
sigma2 = (np.var(a)*len(a) + np.var(b)*len(b) + np.var(c)*len(c))/len(abc)
F = delta2 * (len(abc) - 3) / (2*sigma2)
K = sps.f.isf(alpha, 2, len(abc)-3)
pv = sps.f.sf(F, 2, len(abc) - 3)

print(delta2)
print(sigma2)
print(F)
print(K)
print('гипотеза принимается')
print(pv)

######################################################
Распределение баллов на экзамене до перепроверки задано таблицей
Работы будут перепроверять 7 преподавателей, которые разделили все работы между собой поровну случайным
образом. Пусть – средний балл (до перепроверки) работ, попавших к одному из преподавателей. Требуется найти:
1) математическое ожидание ; 2) стандартное отклонение .

number = [80, 12, 55, 56]
n = 7

score = [2,3,4,5]
N = sum(number)
n1 = N/n
e = sum([score[i]*number[i] for i in range(4)])/N

v = 1/N*sum([(score[i]**2*number[i]) for i in range(4)])-e**2
var = v*(N-n1)/(n1*(N-1))
e = str(round(e,5)).replace('.', ',')
var = str(round(var**0.5,5)).replace('.', ',')

print('Мат ожидание:', e)
print('Стандартное отклонение:', var)

###########################################################

Имеется 12 пронумерованных монет. Монеты подбрасываются до тех пор, пока не выпадет
99 различных (с учетом номера монеты) комбинаций орел-решка. Пусть – число орлов в
комбинации с номером ; а – среднее число орлов в полученных таким образом
комбинациях. Требуется найти: 1) математическое ожидание ; 2) дисперсию .

k = 12 #сколько монет
n = 99

p = q = 0.5 #вероятность орла и решки const
EX = k*p
EX = str(round(EX,5)).replace('.', ',')
print('Мат ожидание:', EX)

var = k*p*q
N = 2**k
var = var/n*(N-n)/(N-1)
var = str(round(var,5)).replace('.', ',')
print("Дисперсия:",var)
"""