Книга: Думай как аналитик. Статистика и данные с примерами на Python. 3-е изд.
Назад: Глава 7. Связь между переменными
Дальше: Глава 9. Проверка гипотез

Глава 8. Оценка

Предположим, что вы живете в городе с населением 10 000 человек и хотите предсказать, кто победит на предстоящих выборах. Теоретически можно спросить всех жителей города, за кого они собираются голосовать. Если бы все из опрошенных ответили честно, то можно было бы составить достоверный прогноз.

Но даже в небольшом городе, пожалуй, затруднительно провести опрос всей популяции. К счастью, в этом нет необходимости. Если опросить случайное подмножество жителей, то можно использовать эту выборку для определения избирательных предпочтений всей популяции. Такой процесс использования выборки для получения выводов о генеральной совокупности называется статистическим выводом (statistical inference).

Статистический вывод включает в себя оценку (estimation) — тема этой главы, а также проверку гипотез — предмет обсуждения следующей главы.

Вес пингвинов

Представьте, что вы — исследователь в Антарктиде, изучающий местные по­пуляции пингвинов. Одна из ваших задач — следить за средним весом пингвинов, который меняется в течение года. Было бы нецелесообразно взвешивать каждого пингвина, обитающего на территории, поэтому вы планируете каждую неделю случайным образом выбирать 10 пингвинов, взвешивать их и использовать эту выборку для оценки среднего значения по всей популяции, называемого средним значением генеральной совокупности (population mean).

Существуют разные способы использования выборки для оценки среднего значения генеральной совокупности, но мы рассмотрим только два из них: выборочное среднее значение (sample mean) и выборочную медиану (sample median). Оба варианта приемлемы, но попробуем определить, какой из них лучше, а также подумаем, что можно называть «лучшим».

Для примера предположим, что вес пингвинов описывается нормальным распределением с известными средним значением и стандартным отклонением. Обозначим их как mu и sigma и присвоим им значения в килограммах:

mu = 3.7

sigma = 0.46

Эти величины являются параметрами нормального распределения, что означает, что они точно определяют конкретное распределение. При заданных параметрах мы можем использовать библиотеку NumPy для моделирования процесса выборки и генерации выборки (sample) любого размера. Например, вот гипотетическая выборка из 10 значений веса:

sample = np.random.normal(mu, sigma, size=10)

sample

array([4.44719887, 3.41859205, 3.45704099, 3.20643443, 4.09808751,

       2.6412922 , 4.50261341, 3.34984483, 3.84675798, 3.58528963])

А вот выборочные среднее значение и медиана:

np.mean(sample), np.median(sample)

(3.6553151902291945, 3.521165310619601)

Среднее значение и медиана достаточно сильно отличаются друг от друга, поэтому стоит задаться вопросом, какая оценка лучше. Чтобы выяснить это, воспользуемся следующей функцией для генерации гипотетических выборок заданного размера n:

def make_sample(n):

    return np.random.normal(mu, sigma, size=n)

Проведем первый эксперимент и посмотрим, как ведут себя выборочное среднее значение и выборочная медиана по мере увеличения размера выборки. Воспользуемся NumPy-функцией logspace, чтобы создать массив равномерно распределенных значений на логарифмической шкале в диапазоне от 10 до 100 000 и присвоить его переменной ns:

ns = np.logspace(1, 5).astype(int)

Чтобы сгенерировать возможную выборку для каждого значения n, вычислить среднее значение и сохранить результаты, воспользуемся списковым включением (list comprehension):

means = [np.mean(make_sample(n)) for n in ns]

Поступим так же с медианой:

medians = [np.median(make_sample(n)) for n in ns]

Статистический показатель, такой как выборочное среднее значение или медиана, используемый для оценки какого-либо свойства генеральной совокупности, называется оценкой (estimator).

Следующий рисунок демонстрирует, как ведут себя эти оценки при увеличении размера выборки. Горизонтальная линия обозначает фактическое среднее значение по популяции:

plt.axhline(mu, color="gray", lw=1, alpha=0.5)

plt.plot(ns, means, "--", label="среднее")

plt.plot(ns, medians, alpha=0.5, label="медиана")

 

decorate(xlabel="Размер выборки", xscale="log", ylabel="Оценка")

Обе оценки (estimate) с увеличением объема выборки приближаются к фактическому значению. Это говорит о том, что они состоятельные (consistent) — одно из свойств, которым должна обладать хорошая статистическая оценка. Если руководствоваться этим критерием, то среднее значение и медиана кажутся одинаково хорошими.

Глядя на рисунок выше, можно заметить, что оценка временами чрезмерно завышена, а порой слишком занижена, и похоже, что эти отклонения примерно симметричны относительно истинного значения. Это наводит на мысль о следующем эксперименте: что, если собрать много выборок одинакового размера и посчитать оценку для каждой? Каково будет тогда среднее значение этих оценок?

Цикл ниже воспроизводит этот сценарий, генерируя 10 001 выборку из 10 пингвинов и вычисляя среднее значение для каждой выборки:

means = [np.mean(make_sample(n=10)) for i in range(10001)]

np.mean(means)

3.70034508492869

Среднее значение средних близко к фактическому среднему значению, которое мы использовали для генерации выборок, — 3.7 кг.

Следующий цикл имитирует тот же сценарий, но на этот раз он вычисляет медиану для каждой выборки:

medians = [np.median(make_sample(n=10)) for i in range(10001)]

np.mean(medians)

3.701214089907223

Среднее значение этих гипотетических медиан также очень близко к фактическому среднему значению генеральной совокупности.

Эти результаты показывают, что выборочное среднее и выборочная медиана являются несмещенными (unbiased) оценками, то есть в среднем они верны. Слово «смещенный» в разных ситуациях означает разное, что может приводить к путанице. В описанном контексте «несмещенный» подразумевает, что среднее значение оценок является истинным значением.

Пока что мы убедились, что обе оценки являются состоятельными и несмещенными, но до сих пор неясно, какая из них лучше. Проведем еще один эксперимент: посмотрим, какая из оценок более верная. Смысл слова «верный» (accurate) также зависит от контекста. В качестве одного из способов перевода его на язык цифр рассмотрим показатель средний квадрат ошибки (mean squared error, MSE). Функция ниже вычисляет разницу между оценками (estimates) и истинным значением (actual), возвращая среднее значение квадратов этих ошибок (errors):

def mse(estimates, actual):

    """Средний квадрат ошибки последовательности оценок."""

    errors = np.asarray(estimates) - actual

    return np.mean(errors**2)

Обратите внимание, что величину MSE можно вычислить только в том случае, если известно фактическое значение. На деле оно известно редко: ведь если бы мы знали истинное значение, нам не пришлось бы его оценивать. Но в нашем эксперименте мы знаем, что истинное среднее значение генеральной совокупности составляет 3.7 кг, поэтому можем использовать его для вычисления MSE выборочного среднего:

mse(means, mu)

0.020871984891289382

При наличии выборок размера 10 и использовании выборочного среднего для оценки среднего значения по популяции средний квадрат ошибки составляет около 0.021 килограмма в квадрате. Теперь посчитаем MSE выборочных медиан:

mse(medians, mu)

0.029022273128644173

Если использовать выборочную медиану для оценки среднего значения совокупности, то средний квадрат ошибки составит около 0.029 килограмма в квадрате. В этом примере выборочное среднее значение оказывается лучше, чем выборочная медиана; и в целом, если данные получены на основе нормального распределения, то это наилучшая несмещенная оценка среднего значения генеральной совокупности, поскольку она минимизирует величину MSE.

Минимизация MSE — полезное свойство оценки, но MSE не всегда является лучшей характеристикой ошибок. Прежде всего ее трудно интерпретировать. В нашем примере единицами измерения MSE являются килограммы в квадрате, поэтому трудно понять, что эта величина означает.

Одно из решений — использовать квадратный корень из MSE, то есть корень из среднего квадрата ошибки (root mean squared error, RMSE). Другой вариант — использовать среднее значение абсолютных значений ошибок, называемое «средней абсолютной ошибкой» (mean absolute error, MAE). Следующая функция вычисляет MAE для последовательности оценок:

def mae(estimates, actual):

    """Средняя абсолютная ошибка последовательности оценок."""

    errors = np.asarray(estimates) - actual

    return np.mean(np.abs(errors))

Вот значение MAE для выборочных средних:

mae(means, mu)

0.11540433749505272

И для выборочных медиан:

mae(medians, mu)

0.13654429774596036

Можно ожидать в среднем, что выборочное среднее отклонится от истинного среднего примерно на 0.115 кг, а выборочная медиана — на 0.137 кг. Таким образом, выборочное среднее, вероятно, является более удачным методом оценки — по крайней мере, для данного примера.

Робастность

Теперь рассмотрим другой сценарий. Предположим, что, когда вы пытаетесь взвесить пингвина, в 2 % случаев он случайно нажимает кнопку единиц измерения на весах, и вес записывается в фунтах вместо килограммов. Если ошибка остается незамеченной, она приводит к появлению в выборке выбросов.

Функция ниже моделирует этот сценарий, умножая 2 % показаний веса на переводной коэффициент, равный 2.2 фунта на килограмм:

def make_sample_with_errors(n):

    sample = np.random.normal(mu, sigma, size=n)

    factor = np.random.choice([1, 2.2], p=[0.98, 0.02], size=n)

    return sample * factor

Чтобы проверить, как это влияет на распределение, сгенерируем бо́льшую выборку:

sample = make_sample_with_errors(n=1000)

Чтобы построить график распределения выборки, используем ядерную оценку плотности и Pdf-объект из раздела «Ядерная оценка плотности» главы 6 на с. 111:

from scipy.stats import gaussian_kde

from thinkstats import Pdf

 

kde = gaussian_kde(sample)

domain = 0, 10

pdf = Pdf(kde, domain)

pdf.plot(label='оценка плотности')

decorate(xlabel="Вес пингвина (кг)", ylabel="Плотность вероятности")

В дополнение к моде в районе 3.7 кг, ошибки измерения приводят к появлению второй моды около 8 кг.

Теперь повторим предыдущий эксперимент с моделированием множества выборок размером 10, подсчетом среднего значения для каждой выборки и последующим вычислением среднего значения выборочных средних:

means = [np.mean(make_sample_with_errors(n=10)) for i in range(10001)]

np.mean(means)

3.786352945690677

Ошибки измерения приводят к тому, что среднее значение выборочных средних превышает 3.7 кг.

Теперь проведем такой же эксперимент с расчетом выборочных медиан:

medians = [np.median(make_sample_with_errors(n=10)) for i in range(10001)]

np.mean(medians)

3.7121869836715353

Среднее значение выборочных медиан также превышает 3.7 кг, но отклонение не так значительно. Если сравнить MSE этих двух оценок, то можно убедиться, что выборочная медиана значительно вернее:

mse(means, mu), mse(medians, mu)

(0.06853430354724438, 0.031164467796883758)

Если измерения действительно описываются нормальным распределением, то выборочное среднее значение минимизирует MSE. Но в данном примере это предположение нарушено, поэтому выборочное среднее не минимизирует MSE. Выборочная медиана менее чувствительна к выбросам, поэтому она является менее смещенной, к тому же ее MSE меньше. Оценки, которые хорошо работают с выбросами и другими похожими нарушениями теоретических допущений, называют робастными (robust) или устойчивыми.

Оценка дисперсии

Рассмотрим еще один пример. Представьте, что вам надо оценить дисперсию веса пингвинов. В разделе «Сводные статистические показатели» главы 1 на с. 28 вы познакомились с двумя способами вычисления дисперсии выборки. Тогда я пообещал объяснить разницу между ними позже. Это время пришло.

Причина, по которой существует два разных способа вычисления дисперсии выборки, заключается в том, что один из них является смещенной оценкой дисперсии генеральной совокупности, а другой — несмещенной. Следующая функция вычисляет смещенную (biased) оценку, которая равна сумме квадратов отклонений (deviations), деленной на n:

def biased_var(xs):

    # Вычислить дисперсию с n в знаменателе.

    n = len(xs)

    deviations = xs — np.mean(xs)

    return np.sum(deviations**2) / n

Чтобы ее протестировать, сгенерируем множество выборок размером 10, вычислим смещенную оценку дисперсии каждой выборки, а затем рассчитаем среднее значение всех оценок:

biased_vars = [biased_var(make_sample(n=10)) for i in range(10001)]

np.mean(biased_vars)

0.19049277659404473

Результат составляет около 0.19, но в данном случае нам известно, что фактическая дисперсия генеральной совокупности примерно равна 0.21, так что эта версия выборочной дисперсии в среднем дает заниженное значение, что подтверждает ее смещенность.

Следующая функция вычисляет несмещенную (unbiased) оценку, которая равна сумме квадратов отклонений, деленной на n–1:

def unbiased_var(xs):

    # Вычислить дисперсию с n–1 в знаменателе.

    n = len(xs)

    deviations = xs - np.mean(xs)

    return np.sum(deviations**2) / (n - 1)

Проверим ее, сгенерировав множество выборок и вычислив несмещенную оценку дисперсии для каждой из них:

unbiased_vars = [unbiased_var(make_sample(n=10)) for i in range(10001)]

np.mean(unbiased_vars)

0.21159109492300626

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

При размере выборки 10 разница между смещенной и несмещенной оценками составляет около 10 %, что нельзя считать пренебрежимо малой величиной. При размере выборки 100 разница составляет всего 1 %, что достаточно мало, чтобы ею можно было пренебречь на практике.

Выборочное распределение

До сих пор мы работали с данными моделирования, предполагая, что значения веса пингвинов описываются нормальным распределением с известными параметрами. Теперь посмотрим, что получится, если воспользоваться реальными данными.

В промежутке с 2007 по 2010 год исследователи на антарктической станции Палмер измерили и взвесили 342 пингвина из местных популяций. Собранные ими данные общедоступны — инструкции по их загрузке приведены в Jupyter-блокноте этой главы.

Используем библиотеку Pandas для считывания данных:

penguins = pd.read_csv("penguins_raw.csv").dropna(subset=["Body Mass (g)"])

penguins.shape

(342, 17)

Датасет содержит данные для трех видов (species) пингвинов:

penguins["Species"].value_counts()

Species

Adelie Penguin (Pygoscelis adeliae)          151

Gentoo penguin (Pygoscelis papua)            123

Chinstrap penguin (Pygoscelis antarctica)     68

Name: count, dtype: int64

Для первого примера выберем только пингвинов вида антарктический пингвин (Chinstrap penguin):

chinstrap = penguins.query('Species.str.startswith("Chinstrap")')

Используем эту функцию для построения графика оценки функции плотности вероятности (ФПВ):

def plot_kde(sample, name="оценка плотности", **options):

    kde = gaussian_kde(sample)

    m, s = np.mean(sample), np.std(sample)

    plt.axvline(m, color="gray", ls=":")

 

    domain = m - 4 * s, m + 4 * s

    pdf = Pdf(kde, domain, name)

    pdf.plot(**options)

Вот распределение веса антарктического пингвина в килограммах. Вертикальной пунктирной линией обозначено выборочное среднее значение:

weights = chinstrap["Body Mass (g)"] / 1000

plot_kde(weights, "weights")

decorate(xlabel="Вес пингвина (кг)", ylabel="Плотность вероятности")

Выборочное среднее веса составляет около 3.7 кг:

sample_mean = np.mean(weights)

sample_mean

3.733088235294118

Оценка 3.7 кг выглядит разумной для среднего значения по популяции, но насколько она точна (precise)?

Один из способов ответить на этот вопрос — вычислить выборочное распределение среднего значения, которое показывает, насколько существенно оценка среднего изменяется от выборки к выборке. Если бы мы знали фактическое среднее значение и стандартное отклонение генеральной совокупности, то могли бы смоделировать процесс выборки и рассчитать выборочное распределение. Но если бы мы знали фактическое среднее значение по популяции, нам не пришлось бы его оценивать!

К счастью, существует простой способ аппроксимировать выборочное распределение, называемый повторной выборкой или ресемплингом (resampling). Его основная идея в том, чтобы использовать выборку для создания модели генеральной совокупности, а затем использовать эту модель для воспроизведения процесса выборки.

Точнее говоря, нам поможет параметрический ресемплинг (parametric resampling), когда сначала с помощью выборки оцениваются параметры генеральной совокупности, а затем используется теоретическое распределение для генерации новых выборок.

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

def resample(sample):

    m, s = np.mean(sample), np.std(sample)

    return np.random.normal(m, s, len(sample))

В цикле ниже функция resample используется для генерации совокупности выборок и вычисления среднего значения для каждой из них:

sample_means = [np.mean(resample(weights)) for i in range(1001)]

На рисунке ниже показано распределение этих выборочных средних:

plot_kde(sample_means, "выборочное среднее")

decorate(xlabel="Выборочное среднее веса (кг)", ylabel="Плотность вероятности")

Мы получаем аппроксимацию выборочного распределения среднего по выборке. Она показывает, насколько сильно может меняться выборочное среднее значение, если собрать множество выборок одинакового размера — при условии, что наша модель генеральной совокупности верна.

Проще говоря, выборочное среднее для выборок одинакового размера может принимать значение как 3.55, так и 3.9.

Стандартная ошибка

Чтобы количественно оценить ширину выборочного распределения, можно вычислить его стандартное отклонение. Полученную величину называют стандартной ошибкой (standard error):

standard_error = np.std(sample_means)

standard_error

0.04626531069684985

В данном случае стандартная ошибка составляет около 0.045 кг, поэтому если мы соберем множество выборок, то ожидается, что выборочное среднее значение будет варьироваться в среднем примерно на 0.045 кг.

Часто путают стандартную ошибку и стандартное отклонение. Запомните:

• стандартное отклонение количественно выражает разброс в измерениях;

• стандартная ошибка количественно характеризует точность оценки.

В этом датасете стандартное отклонение веса пингвинов вида антарктический пингвин равно примерно 0.38 кг:

np.std(weights)

0.3814986213564681

Стандартная ошибка среднего веса составляет около 0.046 кг:

np.std(sample_means)

0.04626531069684985

Стандартное отклонение показывает, насколько пингвины различаются по весу. Стандартная ошибка показывает, насколько точна оценка. Они отвечают на разные вопросы.

Однако между ними существует взаимосвязь. Если мы знаем стандартное отклонение и размер выборки, то можем приблизительно рассчитать стандартную ошибку среднего значения следующим образом:

def approximate_standard_error(sample):

    n = len(sample)

    return np.std(sample) / np.sqrt(n)

approximate_standard_error(weights)

0.046263503290595163

Это значение близко к тому, что мы получили при помощи ресемплинга.

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

Другим способом охарактеризовать выборочное распределение является вычисление доверительного интервала (confidence interval). Например, 90%-ный доверительный интервал содержит 90 % значений в выборочном распределении. Его мы можем найти, вычислив 5-й и 95-й процентили. Вот 90%-ный доверительный интервал для среднего веса антарктического пингвина:

ci90 = np.percentile(sample_means, [5, 95])

ci90

array([3.6576334 , 3.80737506])

При интерпретации доверительного интервала возникает соблазн сказать, что существует 90%-ная вероятность того, что истинное значение данного параметра генеральной совокупности попадает в 90%-ный доверительный интервал. В данном случае это означало бы заявить, что с вероятностью 90 % среднее значение веса по популяции антарктического пингвина попадает в интервал от 3.66 до 3.81 кг.

Согласно строгой концепции вероятности, называемой частотным подходом (frequentism), такая интерпретация была бы недопустима. К тому же во многих книгах по статистике утверждается, что она ошибочна.

На мой взгляд, такое ограничение чрезмерно строго. При разумных взглядах на вероятность доверительный интервал означает именно то, что люди ожидают от него: существует 90%-ная вероятность того, что истинное значение попадает в 90%-ный доверительный интервал.

Однако доверительный интервал позволяет оценить только вариативность, обу­словленную выборкой, то есть характеризует только часть генеральной совокупности. Выборочное распределение оставляет за скобками другие источники ошибок, в частности смещение выборки (sampling bias) и погрешность измерений, которые рассматриваются в следующем разделе.

Источники ошибок

Представьте теперь, что вместо среднего веса пингвинов Антарктиды вы хотите узнать средний вес женщин вашего города. Вы не можете случайным образом составить репрезентативную выборку женщин и взвесить их всех.

Как альтернативный вариант можно попробовать телефонную выборку (telephone sampling): в телефонной книге можно произвольным образом выбрать номер, позвонить по нему и попросить к телефону взрослую женщину, а дальше поинтересоваться ее весом. Но такая телефонная выборка имеет очевидные недостатки.

Например, выборка ограничена людьми, чьи телефонные номера указаны в телефонном справочнике. Поэтому в ней заведомо отсутствуют люди без телефона (вероятно, с достатком ниже среднего) и абоненты, чьи номера не указаны (возможно, с достатком выше среднего). Кроме того, если звонить на домашние телефоны в дневное время, то в выборку с меньшей вероятностью попадут работающие люди. А если отбирать только тех, кто отвечает на телефонный звонок, то в выборку с меньшей вероятностью попадут абоненты, пользующиеся одной телефонной линией.

Если такие факторы, как доход, занятость и размер домохозяйства, связаны с весом, что вполне вероятно, то это так или иначе повлияет на результаты вашего опроса. Подобное затруднение называют смещенностью выборки (sampling bias), поскольку оно является особенностью процесса составления выборки.

Также на процесс выборки может повлиять самоотбор (self-selection) респондентов, что тоже является своего рода смещенностью выборки. Некоторые люди отказываются отвечать на подобные вопросы, и если вероятность отказа связана со значением веса, то это может сказаться на результатах.

Наконец, если спрашивать людей про их вес вместо того, чтобы их взвешивать, результаты могут оказаться неверными. Даже отзывчивые респонденты могут округлять свой реальный вес в бо́льшую или меньшую сторону, если он у них вызывает неловкость. К тому же не все респонденты оказываются готовы помочь. Такие погрешности являются примерами ошибки измерений (measurement error).

Когда вы приводите оценку некоторой величины, полезно также описать меру изменчивости, обусловленную выборкой, указав стандартную ошибку или доверительный интервал. Но помните, что эта вариативность является только одним из источников ошибок, и зачастую не самым главным.

Глоссарий

Среднее значение популяции (population mean)

Истинное среднее значение некоторой величины во всей популяции, в отличие от среднего значения выборки, вычисляемого на некотором ее подмножестве.

Параметр (parameter)

Одно из значений, выделяющих конкретное распределение из некоторого множества распределений: например, параметрами нормального распределения являются математическое ожидание (среднее) и стандартное отклонение.

Оценка (estimator)

Статистический показатель, рассчитываемый по выборке и используемый для оценки некоторого параметра популяции.

Состоятельный (consistent)

Оценка является состоятельной, если она стремится к фактическому значению параметра по мере увеличения размера выборки.

Несмещенный (unbiased)

Оценка является несмещенной, если для конкретного размера выборки среднее значение выборочных оценок равно фактическому значению параметра.

Средний квадрат ошибки (mean squared error, MSE)

Мера верности оценки, равная среднему квадрату разности между расчетным и истинным значениями параметра, при условии, что истинное значение известно.

Робастный (robust)

Оценка является робастной (устойчивой), если она остается верной даже в том случае, когда набор данных содержит выбросы или ошибки либо не полностью соответствует теоретическому распределению.

Ресемплинг, или повторная выборка (resampling)

Способ аппроксимации выборочного распределения оценки путем моделирования процесса выборки.

Выборочное распределение (sampling distribution)

Распределение статистического показателя по возможным выборкам из одной и той же популяции.

Параметрический ресемплинг (parametric resampling)

Вид ресемплинга (повторной выборки), в котором сначала на основе данных выборки оцениваются параметры популяции, а затем для моделирования процесса выборки используется теоретическое распределение.

Стандартная ошибка (standard error)

Стандартное отклонение выборочного распределения, которое количественно характеризует изменчивость оценки из-за случайного отбора (но не из-за ошибки измерения или нерепрезентативности выборки).

Доверительный интервал (confidence interval)

Интервал, содержащий наиболее вероятные значения в выборочном распределении.

Смещенность выборки (sampling bias)

Недостаток в способе отбора выборки, который делает ее нерепрезентативной в отношении популяции.

Ошибка измерения (measurement error)

Погрешность процесса наблюдения, измерения или регистрации данных.

Упражнения

Упражнение 8.1

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

Вычислите выборочное стандартное отклонение веса пингвинов вида антарктический пингвин (Chinstrap). Затем используйте функцию resample для аппроксимации выборочного распределения стандартного отклонения. Задействуйте выборочное распределение для вычисления стандартной ошибки оценки и 90%-ного доверительного интервала.

Упражнение 8.2

Датасет Системы наблюдения за поведенческими факторами риска (Behavioral Risk Factor Surveillance System, BRFSS) США содержит данные о росте и весе, записанные со слов респондентов, для некоторой выборки взрослых жителей Соединенных Штатов. Используйте эти данные для оценки среднего роста взрослых мужчин. Воспользуйтесь ресемплингом для аппроксимации выборочного распределения и вычисления 90%-ного доверительного интервала.

Поскольку объем выборки очень большой, доверительный интервал совсем мал. Это означает, что изменчивость, обусловленная случайной выборкой, невелика. Но вклад других факторов может быть больше. Какие еще источники ошибок, по вашему мнению, влияют на результаты?

Упражнение 8.3

В таких играх, как футбол и хоккей, время между забитыми мячами обычно описывается экспоненциальным распределением (как вы узнали из раздела «Экспоненциальная функция плотности вероятности» главы 6 на с. 107). Предположим, у нас имеется выборка со значениями промежутков времени между голами. Если предположить, что выборка получена из экспоненциального распределения, как оценить фактическое среднее значение распределения? Потенциально можно использовать либо выборочное среднее, либо выборочную медиану. Посмотрим, является ли какая-либо из этих оценок состоятельной и несмещенной. В наших опытах будем считать, что фактическое среднее (actual_mean) время между забитыми мячами составляет 10 минут:

actual_mean = 10

Следующая функция генерирует выборку из экспоненциального распределения с указанным средним значением и заданного объема:

def make_exponential(n):

    return np.random.exponential(actual_mean, size=n)

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

Затем снова сгенерируйте выборки разного объема и вычислите медиану для каждой из них. Сходятся ли выборочные медианы к фактическому значению медианы?

Далее сгенерируйте множество выборок размером 10 и проверьте, является ли выборочное среднее значение несмещенной оценкой среднего значения популяции.

Наконец, проверьте, является ли выборочная медиана несмещенной оценкой медианы популяции.

Упражнение 8.4

В этой главе мы проверили смещенную оценку дисперсии и убедились, что она действительно смещенная. Мы также показали, что несмещенная оценка является несмещенной. Теперь поработаем со стандартным отклонением.

Чтобы оценить стандартное отклонение популяции, вычислим квадратный корень из смещенной (biased_std) или несмещенной оценки (unbiased_std) дисперсии следующим образом:

def biased_std(sample):

    # Квадратный корень из смещенной оценки дисперсии

    var = biased_var(sample)

    return np.sqrt(var)

def unbiased_std(sample):

    # Квадратный корень из несмещенной оценки дисперсии

    var = unbiased_var(sample)

    return np.sqrt(var)

Используйте функцию make_sample, чтобы сгенерировать множество выборок размером 10 из нормального распределения со средним значением 3.7 и стандартным отклонением 0.46. Проверьте, является ли какая-либо из этих двух оценок несмещенной оценкой стандартного отклонения.

Упражнение 8.5

Идея этого упражнения заимствована из задачи о немецких танках (German tank problem), которая представляет собой упрощенную версию реального анализа, проведенного отделом экономической войны (Economic Warfare Division) американского посольства в Лондоне во время Второй мировой войны.

Представьте, что вы разведчик союзников и ваша задача — оценить, сколько танков построили немцы. В качестве данных у вас есть серийные номера, снятые с k трофейных танков.

Если предположить, что у немцев произведено N танков с номерами от 1 до N и что все эти танки могут быть захвачены с равной вероятностью, то N можно оценить следующим образом:

def estimate_tanks(sample):

    m = np.max(sample)

    k = len(sample)

    return m + (m - k) / k

В качестве примера предположим, что N равно 122:

N = 122

tanks = np.arange(1, N + 1)

Для генерации случайной выборки из k танков можно использовать следующую функцию:

def sample_tanks(k):

    return np.random.choice(tanks, replace=False, size=k)

Вот пример выборки:

sample = sample_tanks(5)

sample

array([74, 71, 95, 10, 17])

И вот оценка на ее основе:

estimate_tanks(sample)

113.0

Проверьте, является ли эта оценка смещенной.

Упражнение 8.6

В некоторых видах спорта, особенно в баскетболе, многие игроки и болельщики верят в феномен «горячей руки» (hot hand), который подразумевает, что игрок, поразивший цель несколько раз подряд, с большей вероятностью попадет и в следующий раз, а игрок, промахнувшийся несколько раз, скорее всего, промахнется.

В одной известной статье был предложен способ проверить, реален ли данный феномен или он является заблуждением, при помощи анализа последовательности попаданий и промахов в профессиональных баскетбольных матчах. Для каждого игрока авторы рассчитали общую вероятность попадания и условную вероятность попадания после трех последовательных попаданий. Как они выяснили, у восьми из девяти игроков вероятность попадания после трех попаданий подряд была ниже. Отталкиваясь от этого и других результатов, они пришли к выводу, что «нет доказательств положительной корреляции между результатами последовательных попыток». И несколько десятилетий многие считали, что миф о «горячей руке» был развенчан.

Однако этот вывод был основан, по крайней мере частично, на статистической ошибке. В статье, опубликованной в 2018 году, было показано, что статистический показатель, использованный в первой статье, — вероятность попадания после трех попаданий — является смещенным. Даже если вероятность попадания в цель при каждом ударе равна 0.5 и между результатами в действительности нет корреляции, вероятность поразить цель после трех попаданий составляет менее 0.5.

Справедливость этого утверждения неочевидна — именно поэтому эта ошибка так долго оставалась незамеченной, и я не буду пытаться ее здесь объяснить. Но мы можем задействовать методы этой главы для проверки данной гипотезы. Воспользуемся следующей функцией для создания последовательности из нулей и единиц с вероятностью 0.5 и в отсутствие корреляции:

def make_hits_and_misses(n):

    # Генерировать случайную последовательность из 0 и 1

    return np.random.choice([0, 1], size=n)

В блокноте этой главы я привожу функцию, которая находит все подпоследовательности из трех попаданий (единиц) и возвращает элементы последовательности, следующие за ними.

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

Если вы повторите такое моделирование множество раз, каков будет средний процент попаданий? Как меняется этот результат при увеличении или уменьшении длины последовательности?


Одно из двух основных направлений в статистике (наряду с байесовским подходом), которое определяет вероятность как предел относительной частоты события при бесконечно большом числе повторений эксперимента. — Примеч. пер.

Гилович Т. (T. Gilovich), Валлоне Р. (R. Vallone) и Тверски А. (A. Tversky). «The Hot Hand in Basketball: On the Misperception of Random Sequences», Cognitive Psychology, 17 (3): 295–314.

Миллер Дж. Б.  (J. B. Miller) и Санджурджо А. (A. Sanjurjo). «Surprised by the Hot Hand Fallacy? A Truth in the Law of Small Numbers», Econometrica 86 (6): 2019-2047.

Назад: Глава 7. Связь между переменными
Дальше: Глава 9. Проверка гипотез