1.

Для 61 большого города в Англии и Уэльсе известны средняя годовая смертность на 100000 населения (по данным 1958–1964) и концентрация кальция в питьевой воде (в частях на маллион). Чем выше концентрация кальция, тем жёстче вода. Города дополнительно поделены на северные и южные. water.txt Есть ли связь между жёсткостью воды и средней годовой смертностью? Посчитайте значение коэффициента корреляции Пирсона между этими признаками, округлите его до четырёх знаков после десятичной точки.

2.

В предыдущей задаче посчитайте значение коэффициента корреляции Спирмена между средней годовой смертностью и жёсткостью воды. Округлите до четырёх знаков после десятичной точки.

3.

Сохраняется ли связь между признаками, если разбить выборку на северные и южные города? Посчитайте значения корреляции Пирсона между средней годовой смертностью и жёсткостью воды в каждой из двух подвыборок, введите наименьшее по модулю из двух значений, округлив его до четырёх знаков после десятичной точки.

4.

Среди респондентов General Social Survey 2014 года хотя бы раз в месяц проводят вечер в баре 203 женщины и 239 мужчин; реже, чем раз в месяц, это делают 718 женщин и 515 мужчин.

Посчитайте значение коэффициента корреляции Мэтьюса между полом и частотой похода в бары. Округлите значение до трёх знаков после десятичной точки.

5.

В предыдущей задаче проверьте, значимо ли коэффициент корреляции Мэтьюса отличается от нуля. Посчитайте достигаемый уровень значимости; используйте функцию scipy.stats.chi2_contingency. Введите номер первой значащей цифры (например, если вы получили 5.5×10−8, нужно ввести 8).

6.

В предыдущей задаче давайте попробуем ответить на немного другой вопрос: отличаются ли доля мужчин и доля женщин, относительно часто проводящих вечера в баре? Постройте 95% доверительный интервал для разности долей, вычитая долю женщин из доли мужчин. Чему равна его нижняя граница? Округлите до четырёх знаков после десятичной точки.

7.

Проверьте гипотезу о равенстве долей любителей часто проводить вечера в баре среди мужчин и женщин. Посчитайте достигаемый уровень значимости, используя двустороннюю альтернативу. Введите номер первой значащей цифры (например, если вы получили 5.5×10−8, нужно ввести 8).

8.

Посмотрим на данные General Social Survey 2014 года и проанализируем, как связаны ответы на вопросы "Счастливы ли вы?" и "Довольны ли вы вашим финансовым положением?"

Не доволен Более или менее Доволен Не очень счастлив 197 111 33 Достаточно счастлив 382 685 331 Очень счастлив 110 342 333 Чему равно значение статистики хи-квадрат для этой таблицы сопряжённости? Округлите ответ до четырёх знаков после десятичной точки.

9.

На данных из предыдущего вопроса посчитайте значение достигаемого уровня значимости. Введите номер первой значащей цифры (например, если вы получили 5.5×10−8, нужно ввести 8).

10.

Чему в предыдущей задаче равно значение коэффициента V Крамера для рассматриваемых признаков? Округлите ответ до четырёх знаков после десятичной точки.


In [34]:
import pandas as pd
import numpy as np
from scipy.stats import chi2_contingency
from statsmodels.stats.weightstats import zconfint
from statsmodels.stats.proportion import proportion_confint
from scipy.stats import norm

In [2]:
data = pd.read_csv('water.txt', sep='\t')

In [3]:
data.head()


Out[3]:
location town mortality hardness
0 South Bath 1247 105
1 North Birkenhead 1668 17
2 South Birmingham 1466 5
3 North Blackburn 1800 14
4 North Blackpool 1609 18

In [4]:
data.corr()


Out[4]:
mortality hardness
mortality 1.000000 -0.654849
hardness -0.654849 1.000000

In [5]:
data.corr(method='spearman')


Out[5]:
mortality hardness
mortality 1.000000 -0.631665
hardness -0.631665 1.000000

In [65]:
data[data['location']=='South'].corr()


Out[65]:
mortality hardness
mortality 1.000000 -0.602153
hardness -0.602153 1.000000

In [66]:
data[data['location']=='North'].corr()


Out[66]:
mortality hardness
mortality 1.000000 -0.368598
hardness -0.368598 1.000000

In [20]:
a, b, c, d = 239, 515, 203, 718
mcc = float((a*d - b*c)) / np.sqrt((a+b)*(a+c)*(b+d)*(c+d)) 
mcc


Out[20]:
0.10900237458678963

In [25]:
chi2_contingency([[a,b],[c,d]])[1]


Out[25]:
1.0558987006638747e-05

In [26]:
m = a / float(a+b)
f = c / float(c+d)

In [28]:
m, f


Out[28]:
(0.3169761273209549, 0.22041259500542887)

In [35]:
def proportions_diff_confint_ind(a, n1, b, n2, alpha = 0.05):    
    z = norm.ppf(1 - alpha / 2.)
    
    p1 = float(a) / n1
    p2 = float(b) / n2
    
    left_boundary = (p1 - p2) - z * np.sqrt(p1 * (1 - p1)/ n1 + p2 * (1 - p2)/ n2)
    right_boundary = (p1 - p2) + z * np.sqrt(p1 * (1 - p1)/ n1 + p2 * (1 - p2)/ n2)
    
    return (left_boundary, right_boundary)

In [36]:
proportions_diff_confint_ind(a, a+b, c, c+d)


Out[36]:
(0.053905233215813163, 0.13922183141523894)

In [37]:
def proportions_diff_z_stat_ind(a, n1, b, n2):   
    
    p1 = float(a) / n1
    p2 = float(b) / n2 
    P = float(p1*n1 + p2*n2) / (n1 + n2)
    
    return (p1 - p2) / np.sqrt(P * (1 - P) * (1. / n1 + 1. / n2))

In [40]:
def proportions_diff_z_test(z_stat, alternative = 'two-sided'):
    if alternative not in ('two-sided', 'less', 'greater'):
        raise ValueError("alternative not recognized\n"
                         "should be 'two-sided', 'less' or 'greater'")
    
    if alternative == 'two-sided':
        return 2 * (1 - norm.cdf(np.abs(z_stat)))
    
    if alternative == 'less':
        return norm.cdf(z_stat)

    if alternative == 'greater':
        return 1 - norm.cdf(z_stat)

In [41]:
print "p-value: %f" % proportions_diff_z_test(proportions_diff_z_stat_ind(a, a+b, c, c+d))


p-value: 0.000008

In [67]:
conting = [[197,111,33],[382, 685, 331], [110, 342, 333]]
chi2, p, dof, expected = chi2_contingency(conting)

In [68]:
chi2, p


Out[68]:
(293.68311039689746, 2.4964299580093476e-62)

In [69]:
v_c = np.sqrt(chi2 / (np.sum(conting) * 2))

In [70]:
v_c


Out[70]:
0.2412013934500338

In [ ]: