Когнитивные технологии

Алла Тамбовцева

Доверительные интервалы для доли и среднего

Доверительный интервал для доли

Начнём с доверительного интервала для доли. Создадим массив из $0$ и $1$, чтобы в дальнейшем построить 95%-ный доверительный интервал. Представим, что мы опросили группу жителей Москвы и зафиксировали, кто из них считает себя «совой» по режиму дня.

In [1]:
import numpy as np
In [2]:
owls = np.array([1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1])  # 1 - сова, 0 - жаворонок (или не знает, кто)

Теперь построим доверительный интервал. Проще всего это сделать вручную, вспомнив формулу расчёта доверительного интервала для доли:

$$ \hat{p} \pm z^* \cdot \sqrt{\frac{p (1-p)}{n}}. $$

Посчитаем $\hat{p}$ – долю «сов» в нашей выборке:

In [16]:
n = owls.size  # объём выборки
p = owls.sum() / n  # доля сов

Теперь рассчитаем предельную ошибку и назовём её se:

In [5]:
se = np.sqrt(p * (1 - p) / n)
se

Осталось определить границы 95%-ного доверительного интервала. Это можно сделать по формуле, предварительно вычислив $z*$ с помощью функции для нахождения квантилей, но мы поступим проще: импортируем модуль stats из библиотеки scipy и определим границы интервала, который накрывает 95% значений случайной величины, имеющей нормальное распределение с математическим ожиданием равным p и стандартным отклонением равным se.

In [7]:
import scipy.stats as st
In [9]:
# 95% CI
st.norm.interval(0.95, loc=p, scale=se)
Out[9]:
(0.3520819870781754, 0.8479180129218246)

Получается, если мы будем проводить аналогичные исследования на выборках такого же объёма много раз, в 95% случаев истинная доля «сов» среди жителей Москвы будет лежать в интервале от $0.35$ до $0.85$. Можем проверить результаты выше, подставив нужно значение $z^*$ в формулу:

In [10]:
(p - 1.96 * se, p + 1.96 * se)  # 1.96 - квантиль уровня 0.975
Out[10]:
(0.35207743144279907, 0.8479225685572009)

Результаты примерно одинаковы, небольшие различия в значениях обусловлены погрешностью из-за округления значения $z^*$ до второго знака после запятой.

Доверительный интервал для среднего

Доверительный интервал для среднего выборки, взятой из нормального распределения, предлагаю построить с помощью библиотеки statsmodels. Эта библиотека не является базовой, но если у вас установлена Anaconda, то и statsmodels тоже установлена. Эта библиотека очень полезна для статистических вычислений, тестов, моделей, поскольку не просто выдаёт лаконичные результаты, но и формирует расширенную выдачу по итогам тестов. Импортируем из этой библиотеки модуль stats:

In [12]:
import statsmodels.stats.api as stm

Создадим массив ages – небольшую выборку со значениями возраста респондентов.

In [11]:
ages = np.array([25, 24, 26, 27, 29, 22, 21, 32, 33, 21, 30, 29, 27])

Теперь построим 95%-ный доверительный интервал для среднего значения возраста:

In [17]:
stm.DescrStatsW(ages).tconfint_mean()  # уровень доверия 95% выставлен по умолчанию
Out[17]:
(24.229399479092713, 29.00136975167652)

Если мы будем проводить аналогичные исследования на основе выборок такого же объёма, в 95% случаев истинное среднее значение возраста будет лежать в интервале от 24 до 29 лет (при этом истинное среднее одно, оно может либо попадать в этот интервал, либо не попадать).

Уровень доверия можем изменять:

In [18]:
stm.DescrStatsW(ages).tconfint_mean(0.9)  # 90%-ный доверительный интервал
Out[18]:
(26.474833330441232, 26.755935900328)