import pandas as pd
import numpy as np

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

"""
Explanation: Тест. Доверительные интервалы для среднего
End of explanation
"""


water_data = pd.read_table('water.txt')
water_data.info()
water_data.describe()
water_data.head()

"""
Explanation: Для 61 большого города в Англии и Уэльсе известны средняя годовая смертность на 100000 населения (по данным 1958–1964) и концентрация кальция в питьевой воде (в частях на миллион). Чем выше концентрация кальция, тем жёстче вода. Города дополнительно поделены на северные и южные.
End of explanation
"""


mort_mean = water_data['mortality'].mean()
print('Mean mortality: %f' % mort_mean)

from statsmodels.stats.weightstats import _tconfint_generic

mort_mean_std = water_data['mortality'].std() / np.sqrt(water_data['mortality'].shape[0])
print('Mortality 95%% interval: %s' %  str(_tconfint_generic(mort_mean, mort_mean_std, water_data['mortality'].shape[0] - 1,
                                                         0.05, 'two-sided')))

"""
Explanation: Постройте 95% доверительный интервал для средней годовой смертности в больших городах. Чему равна его нижняя граница? Округлите ответ до 4 знаков после десятичной точки.
End of explanation
"""


water_data_south = water_data[water_data.location == 'South']
mort_mean_south = water_data_south['mortality'].mean()
print('Mean south mortality: %f' % mort_mean_south)

mort_mean_south_std = water_data_south['mortality'].std() / np.sqrt(water_data_south['mortality'].shape[0])
print('Mortality south 95%% interval: %s' %  str(_tconfint_generic(mort_mean_south, mort_mean_south_std,
                                                                   water_data_south['mortality'].shape[0] - 1,
                                                                   0.05, 'two-sided')))

"""
Explanation: На данных из предыдущего вопроса постройте 95% доверительный интервал для средней годовой смертности по всем южным городам. Чему равна его верхняя граница? Округлите ответ до 4 знаков после десятичной точки.
End of explanation
"""


water_data_north = water_data[water_data.location == 'North']
mort_mean_north = water_data_north['mortality'].mean()
print('Mean north mortality: %f' % mort_mean_north)

mort_mean_north_std = water_data_north['mortality'].std() / np.sqrt(water_data_north['mortality'].shape[0])
print('Mortality north 95%% interval: %s' %  str(_tconfint_generic(mort_mean_north, mort_mean_north_std,
                                                                   water_data_north['mortality'].shape[0] - 1,
                                                                   0.05, 'two-sided')))

"""
Explanation: На тех же данных постройте 95% доверительный интервал для средней годовой смертности по всем северным городам. Пересекается ли этот интервал с предыдущим? Как вы думаете, какой из этого можно сделать вывод?
End of explanation
"""


hardness_mean_south = water_data_south['hardness'].mean()
print('Mean south hardness: %f' % hardness_mean_south)

hardness_mean_north = water_data_north['hardness'].mean()
print('Mean north hardness: %f' % hardness_mean_north)

hardness_mean_south_std = water_data_south['hardness'].std() / np.sqrt(water_data_south['hardness'].shape[0])
print('Hardness south 95%% interval: %s' %  str(_tconfint_generic(hardness_mean_south, hardness_mean_south_std,
                                                                   water_data_south['hardness'].shape[0] - 1,
                                                                   0.05, 'two-sided')))

hardness_mean_north_std = water_data_north['hardness'].std() / np.sqrt(water_data_north['hardness'].shape[0])
print('Hardness north 95%% interval: %s' %  str(_tconfint_generic(hardness_mean_north, hardness_mean_north_std,
                                                                   water_data_north['hardness'].shape[0] - 1,
                                                                   0.05, 'two-sided')))

"""
Explanation: Пересекаются ли 95% доверительные интервалы для средней жёсткости воды в северных и южных городах?
End of explanation
"""


from scipy import stats
np.ceil((stats.norm.ppf(1-0.05/2) / 0.1)**2)

"""
Explanation: <b>
Вспомним формулу доверительного интервала для среднего нормально распределённой случайной величины с дисперсией σ2:
При σ=1 какой нужен объём выборки, чтобы на уровне доверия 95% оценить среднее с точностью ±0.1?
End of explanation
"""


