"""Урок 6"""

from scipy.stats import norm
from scipy.stats import t as stud
import numpy as np
import pandas as pd

# 1. Даны значения величины заработной платы заемщиков банка (zp) и
# значения их поведенческого кредитного скоринга (ks):
# zp = [35, 45, 190, 200, 40, 70, 54, 150, 120, 110],
# ks = [401, 574, 874, 919, 459, 739, 653, 902, 746, 832].
# Найдите ковариацию этих двух величин с помощью элементарных действий,
# а затем с помощью функции cov из numpy
# Полученные значения должны быть равны.
# Найдите коэффициент корреляции Пирсона с помощью ковариации и
# среднеквадратичных отклонений двух признаков,
# а затем с использованием функций из библиотек numpy и pandas.
# Решение:
# У numpy и pandas разные значения ddof= по умолчанию, предпочитаю указать явно
zp = [35, 45, 190, 200, 40, 70, 54, 150, 120, 110]
ks = [401, 574, 874, 919, 459, 739, 653, 902, 746, 832]
df = pd.DataFrame(list(zip(zp, ks)), columns=['zp', 'ks'])
zp, ks = np.array(zp), np.array(ks)
covar = (zp * ks).mean() - zp.mean() * ks.mean()
pirson = covar / (zp.std(ddof=0) * ks.std(ddof=0))
print('# Ответ 1:')
print(f'# Ковариация zp и ks = {covar:.3f}')
print(f'# Ковариация numpy = {np.cov(zp, ks, ddof=0)[1, 0]:.3f}')
print(f'# Ковариация pandas = {df.cov(ddof=0).iloc[1, 0]:.3f}')
print(f'# Коэффициент корреляции Пирсона = {pirson:.5f}')
print(f'# Коэффициент корреляции numpy = {np.corrcoef(zp, ks)[1, 0]:.5f}')
print(f'# Коэффициент корреляции pandas = {df.corr().iloc[1, 0]:.5f}')
# Ответ 1:
# Ковариация zp и ks = 9157.840
# Ковариация numpy = 9157.840
# Ковариация pandas = 9157.840
# Коэффициент корреляции Пирсона = 0.88749
# Коэффициент корреляции numpy = 0.88749
# Коэффициент корреляции pandas = 0.88749

# 2. Измерены значения IQ выборки студентов,
# обучающихся в местных технических вузах:
# 131, 125, 115, 122, 131, 115, 107, 99, 125, 111.
# Известно, что в генеральной совокупности IQ распределен нормально.
# Найдите доверительный интервал для мат.ожидания с надежностью 0.95.
# Решение:
# Находим по таблице значение T, для которого уровень значимости будет равен:
# = (1 - вероятность) / 2 для числа степеней свободы n-1
X, p = np.array([131, 125, 115, 122, 131, 115, 107, 99, 125, 111]), 0.95
Mx = X.mean()
sigma = X.std(ddof=1)
T = stud.ppf((1 - p) / 2, len(X) - 1)
diff = T * sigma / len(X) ** 0.5
print('# Ответ 2:')
print(f'# Доверительный интервал [{Mx + diff:.2f}; {Mx - diff:.2f}]')
# Ответ 2:
# Доверительный интервал [110.56; 125.64]

# 3. Известно, что рост футболистов в сборной распределен нормально
# с дисперсией генеральной совокупности, равной 25 кв.см.
# Объем выборки равен 27,
# среднее выборочное составляет 174.2.
# Найдите доверительный интервал для мат.ожидания с надежностью 0.95.
# Решение:
# Находим по таблице значение Z, для которого вероятность будет равна:
# = (1- надежность)/2
Mx, sigma, n, p = 174.2, 25 ** 0.5, 27, 0.95
Z = norm.ppf((1 - p) / 2)
diff = Z * sigma / n ** 0.5
print('# Ответ 3:')
print(f'# Доверительный интервал [{Mx + diff:.2f}; {Mx - diff:.2f}]')
# Ответ 3:
# Доверительный интервал [172.31; 176.09]
