Иллюзия 95%: гайд по самой частой элементарной ошибке в Data Science

в 17:28, , рубрики: python, анализ данных, визуализация данных, доверительный интервал, математическая статистика, ошибки мышления, статистика, статистическая значимость, теория вероятностей

Представьте классическую ситуацию. Вы — аналитик. Вы только что провели A/B-тест или оценили средний чек. Ваш скрипт на Python выдал результат:

95% Confidence Interval: [100, 120].

Вы приходите к продакт-менеджеру и уверенно говорите:

С вероятностью 95% истинный средний чек находится между 100 и 120 рублями.

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

Если бы в комнате сидел настоящий математик, он бы начал кричать:

Нет там никакой вероятности! Параметр либо там, либо нет!.

Вы бы подумали, что он сумасшедший. Но самое смешное (и страшное) в том, что он прав.

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

Здесь мы напишем симуляцию на Python, увидим, как «прыгают» интервалы, поймем, как тут могут помочь пластмассовые игрушки советских детей, и узнаем, как же тогда математически точно отвечать менеджерам на их вопросы, чтобы они перестали с вами разговаривать.

Добро пожаловать в кроличью нору частотной статистики.


1. Тест на интуицию

Давайте проверим вашу интуицию на прочность. Забудьте сложные формулы, включите здравый смысл.

Дано: Мы провели эксперимент и получили 95% доверительный интервал: [5, 10].

Вопрос: Какова вероятность того, что истинное среднее значение находится внутри этого отрезка? Выберите вариант:

  1. 95%. (Ну, это же 95-процентный интервал, очевидно).

  2. 5%. (Вопрос с подвохом?).

  3. 0 или 1. (Либо да, либо нет).

  4. 50%. (Как встретить динозавра: либо встречу, либо нет).

Нажмите, чтобы узнать правильный ответ

Правильный ответ: 3 (0 или 1).

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

В чем подвох?

Когда мы говорим «вероятность 95%», наш мозг рисует такую картину: границы интервала — это твердые стены, а истинный параметр — это «призрачный шарик», который случайно болтается где-то посередине.

Но классическая (частотная) статистика видит мир иначе:

  1. Истинный параметр mu — это константа. Он не случайный, он просто есть.

  2. Интервал — это ловушка. Это мы строим рамку вокруг предполагаемого места.

Поскольку вы уже получили числа (5 и 10), рамка нарисована. Гвоздь (истина) либо попал внутрь рамки, либо нет.

  • Если попал — вероятность 100%.

  • Если промахнулся — вероятность 0%.

Третьего не дано. Гвоздь не может быть «на 95% внутри рамки».


2. Бог не играет в кости (а мы играем)

В мире частотной статистики действует жесткое правило: истина одна и она неизменна.

Представьте, что мы хотим узнать истинный рост всех людей на Земле. Это число существует. Если бы мы могли остановить время и измерить всех, мы бы получили конкретное число, скажем, 170.543... см.

Откуда тогда берется 95%?

Если камень неподвижен, что тогда движется? Движемся мы.

Мы не можем измерить всех, поэтому берем выборку.

  • Сегодня мы зачерпнули воду и поймали много высоких людей — среднее выборки улетело вправо.

  • Завтра зачерпнули — попались низкие. Среднее улетело влево.

Доверительный интервал — это не твердая коробка, в которую мы ловим дрожащий атом истины. Всё ровно наоборот. Истинное значение параметра — это неподвижный атом. А доверительный интервал — это дрожащая коробка, которую мы пытаемся на него накинуть.

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

import numpy as np
import scipy.stats as stats

# 1. Бог не играет в кости: Фиксируем Истину
TRUE_MEAN = 100      # Невидимый гвоздь
POPULATION_STD = 15  # Разброс в генеральной совокупности

# Параметры нашей игры
SAMPLE_SIZE = 50     # Размер выборки
N_EXPERIMENTS = 10   # Количество попыток

print(f"ИСТИНА (скрытая от нас): {TRUE_MEAN}n")

# ИСПРАВЛЕННАЯ СТРОКА ЗАГОЛОВКА:
print(f"{'Exp #':<7} | {'Нижняя' :<10} | {'Верхняя':<10} | {'Поймали?'}")
print("-" * 50)

for i in range(N_EXPERIMENTS):
    # Генерируем выборку (черпаем данные)
    sample = np.random.normal(loc=TRUE_MEAN, scale=POPULATION_STD, size=SAMPLE_SIZE)
    
    # Считаем статистики
    sample_mean = np.mean(sample)
    sample_sem = stats.sem(sample)
    
    # Строим 95% CI (Это случайная величина!)
    confidence = 0.95
    interval = stats.t.interval(confidence, df=len(sample)-1, loc=sample_mean, scale=sample_sem)
    
    lower, upper = interval
    hit = lower <= TRUE_MEAN <= upper
    status = "✅ ДА" if hit else "❌ НЕТ"
    
    # ИСПРАВЛЕННАЯ СТРОКА ВЫВОДА:
    print(f"{i+1:<7} | {lower:.2f}     | {upper:.2f}     | {status}")

Результат:

ИСТИНА (скрытая от нас): 100

Exp # | Нижняя | Верхняя | Поймали?

1 | 96.96 | 106.52 | ✅ ДА
2 | 94.98 | 104.08 | ✅ ДА
3 | 96.94 | 104.81 | ✅ ДА
4 | 96.04 | 103.58 | ✅ ДА
5 | 100.26 | 109.15 | ❌ НЕТ
6 | 93.83 | 100.05 | ✅ ДА
7 | 96.59 | 106.00 | ✅ ДА
8 | 92.36 | 102.29 | ✅ ДА
9 | 96.09 | 104.04 | ✅ ДА
10 | 96.85 | 105.54 | ✅ ДА

Вы видите, что в большинстве случаев мы ловим истину. Но обратите внимание на неудачные попытки (например, Exp #5, зависит от запуска). Там интервал может быть [100.26, 109.15]. Истина (100) в него не входит. Для этого конкретного интервала вероятность попадания — ноль. Но аналитик, получивший эти данные, этого не знает!

Ложная интуиция и суровая реальность

Ложная интуиция и суровая реальность

3. Визуализация проблемы: лес зелёных и красных линий

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

  • Если интервал накрыл истину — красим в зеленый.

  • Если промахнулся — в красный.

import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats

NP = 100           # 100 исследователей
N_SAMPLES = 50     # Размер выборки
MU = 0             # Истина
SIGMA = 1          

plt.figure(figsize=(10, 8))

# Рисуем Истину (черная линия)
plt.axvline(x=MU, color='black', linestyle='-', linewidth=3, label=r'Истина ($mu$)')

missed_count = 0
np.random.seed(25) 

for i in range(NP):
    sample = np.random.normal(loc=MU, scale=SIGMA, size=N_SAMPLES)
    
    # Считаем CI
    ci = stats.t.interval(0.95, df=len(sample)-1, loc=np.mean(sample), scale=stats.sem(sample))
    low, high = ci
    
    # ИСПРАВЛЕННОЕ УСЛОВИЕ:
    # Проверяем, попал ли ноль (Истина) в интервал
    if low <= MU <= high:
        color = 'green'
    else:
        color = 'red'
        missed_count += 1
        
    plt.hlines(i, low, high, colors=color, alpha=0.8, linewidth=2)

plt.title(f'Forest Plot: {missed_count} промахов из {NP}', fontsize=16)
plt.xlabel('Значение параметра')
plt.yticks([])
plt.xlim(-1, 1)
plt.legend() # Выводим легенду
plt.show()
Построение 100 независимых интервалов

Построение 100 независимых интервалов

Что мы видим на графике?

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

Вы говорите: «Истина внутри с вероятностью 95%».
Но реальность такова, что истина вообще не там.

Главный вывод:
95% — это не свойство вашего конкретного интервала.
95% — это свойство алгоритма, который порождает эти интервалы.

Если мы будем бесконечно долго рисовать такие линии, то 95% из них будут зелеными. Но как только вы провели свой единственный эксперимент, магия вероятности исчезает. Вы держите в руках либо «победу», либо «промах». И вы никогда не узнаете, что именно.


4. Лучшая аналогия: кольцеброс

Почему наш мозг так сопротивляется этой логике? Потому что мы используем неверную ментальную модель «Стрельба по мишени», где мишень (интервал) висит на стене, а природа стреляет в неё истинным значением параметра.

Правильная модель — кольцеброс, детская игрушка родом из СССР.

Кольцеброс детский

Кольцеброс детский
  1. Колышек (истинное значение параметра) — вбит в землю. Он неподвижен.

  2. Кольца (интервалы) — у вас в руках.

  3. Бросок (эксперимент) — вы кидаете кольцо, пытаясь накрыть колышек.

Что означает «95%»? Это ваша меткость.

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


5. Почему мы все так ошибаемся? Байесовское мышление.

Если частотная интерпретация так не интуитивна, почему мы ею пользуемся?

Потому что наш мозг работает в Байесовском режиме.

Мы хотим знать вероятность события (где истина?), а не свойства инструмента (как часто ошибается метод?).

В Байесовской статистике понятие вероятности другое. Там параметр считается случайной величиной, а данные — фиксированным фактом. И там фраза "С вероятностью 95% параметр лежит здесь"верна (это называется Кредибильный Интервал).

Если у нас нет предварительных знаний и много данных, то численно Байесовский интервал почти совпадает с частотным. Мы приходим к правильным выводам («Истина где-то между 5 и 10») неправильным путем. Это работает, пока данных много. Но на малых выборках эта ошибка мышления может стоить вам дорого.


6. Зачем нам тогда доверительные интервалы?

Читатель может спросить:

Если я не знаю, "зеленая" у меня линия или "красная", зачем мне вообще эти интервалы? Зачем мне инструмент, который не говорит правду?»

Ответ здесь будет очень прагматичным

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

Вы не снайпер, вы — владелец казино

Представьте, что вы принимаете 100 продуктовых решений в год на основе A/B тестов.
Используя 95% доверительный интервал, вы заключаете сделку со статистикой:

  • «Я буду слепо следовать правилу: если интервал не пересекает ноль — внедряем».

  • «Я знаю, что в 5 случаях из 100 я ошибусь и внедрю "пустышку" (получу красную линию)».

  • «Зато в 95 случаях я буду прав».

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

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


7. Шпаргалка: как говорить правильно

Теперь вы обладаете знанием, которое отличает профи от новичка. Как это использовать?

НИКОГДА не говорите:

С вероятностью 95% истинное значение находится внутри этого интервала.

ГОВОРИТЕ так (строго):

Если мы повторим эксперимент много раз, 95% таких интервалов накроют истинное значение.

ГОВОРИТЕ так (для бизнеса):

Наши расчеты показывают диапазон от X до Y. Мы использовали метод, который дает верный ответ в 95% случаев. Риск ошибки есть, но он контролируемый...

Это честная позиция. Вы признаете риск, но опираетесь на надежность метода. Это тонкое различие? Да. Важное? Критически. Потому что оно переносит нас от ложной уверенности в конкретном результате к пониманию рисков метода.

Как только данных мало, или вы знаете что-то важное до начала эксперимента (например, «конверсия не может быть 90%»), частотный подход начнет давать сбои, а байесовский (с правильно настроенным Prior) спасет ситуацию. Но это уже тема для отдельной статьи.

В следующий раз, когда кто-то на митинге скажет:

Ну, вероятность 95%, что конверсия выросла

вы можете вздохнуть и сказать:

Вообще-то, коллега, параметр конверсии фиксирован. Вероятность относится лишь к процедуре построения интервала...

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

Автор: master_program

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js