Все материалы
Продуктовая аналитикаматериалсредний

Альтман: Practical Statistics for Medical Research

Обзор книги Дугласа Альтмана: план анализа, повторные измерения и несколько проверок. Собственные медицинские и продуктовые примеры в Python.

КейсПрактика24 сентября 2026 г.11 мин

В таблице десять визитов, но пациентов всего четыре. Можно получить аккуратное среднее и узкий интервал, а затем обнаружить, что расчёт отвечал не на тот вопрос. Practical Statistics for Medical Research Дугласа Альтмана стоит выбирать, когда вам нужен переход от статистических процедур к устройству исследования. Этот обзор опирается на проверенную библиографию и оглавление; три собственных примера показывают, какие решения требуется принять до запуска анализа.

Короткий ответ: когда читать Альтмана

  • Когда базовые термины уже знакомы, но вы затрудняетесь сформулировать вопрос, подготовить данные и выбрать сравнение.
  • Когда проверяете чужой анализ и хотите понять, согласованы ли дизайн, расчёт и формулировка вывода.
  • Когда готовы читать по-английски и отдельно осваивать современный инструмент расчёта.

Издание и границы этого обзора

Автор — Douglas G. Altman, Дуглас Г. Альтман. Оригинальное название — Practical Statistics for Medical Research. Для библиографической записи выбираем английское издание Chapman and Hall, 1991, ISBN 9780412386206: эти данные подтверждены Google Books. Проверенное русское издание в рамках обзора не установлено; перевод названия «Практическая статистика для медицинских исследований» здесь лишь пояснение смысла.

У нынешней карточки Routledge указан copyright 1990 и другое ISBN. Это не повод объединять сведения в одну запись или объявлять одну дату ошибкой. При цитировании используйте выходные данные своего экземпляра. Оглавление проверено по издателю; доступ к полному тексту книги для этого обзора не использовался.

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

Как устроен путь от данных к выводу

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

Сильная сторона этого маршрута для аналитика — возможность остановиться до вычислений. Как определён исход? Есть ли повторные наблюдения? Сравниваются ли сопоставимые группы? Что будет считаться полезным изменением? Это наши рабочие вопросы к заявленным темам книги; мы не приписываем автору конкретные формулировки, которых не проверяли в тексте.

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

Идея 1. Строка таблицы и независимый участник различаются

У четырёх условных пациентов среднее значение некоторого показателя равно 4, 8, 12 и 16 единицам. Число визитов соответственно 1, 1, 2 и 6. Для прозрачной арифметики считаем, что внутри каждого пациента показания одинаковы. Это специальный учебный набор, а не модель реального течения заболевания.

Если каждому пациенту дать одинаковый вес, среднее равно 10. Если усреднить все десять визитов, получится 13,2. Во втором расчёте человек с шестью визитами влияет на результат в шесть раз сильнее человека с одним. Ни один результат не является арифметической ошибкой: они описывают разные совокупности.

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

Одни условные пациенты, разные веса в среднем
ПациентСредний показательВизитовВес при анализе людей
A411/4
B811/4
C1221/4
D1661/4

Python: повторение строк не добавляет людей

Каждый пример можно запускать отдельно: все входные значения заданы внутри блока, внешние файлы не нужны. Для расчётов этой статьи установите пакеты командой python -m pip install numpy scipy statsmodels. Код проверен с Python 3.12; точные версии библиотек и результаты сохранены в отчёте подготовки материала. При изменении данных заново проверьте допущения, а не только успешное выполнение команды.

Код печатает оба средних и демонстрирует ошибочную оценку стандартной ошибки, если считать строки независимыми. После механического десятикратного копирования тех же визитов наивная стандартная ошибка уменьшается с 1,339983 до 0,404020. Новых людей или новых сведений не появилось, а формула стала изображать большую точность.

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

В продуктовой аналитике то же происходит с событиями. Один активный пользователь создаёт много строк, другой — одну. Если эксперимент назначается пользователю, объём таблицы событий не равен числу независимых назначений. Группировка по пользователю может помочь, но сама по себе не определяет, какую метрику следует агрегировать и за какой период.

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

pythonОписание данных
import numpy as np
# Среднее каждого пациента и число его визитов. Данные условные.
patient_means = np.array([4., 8., 12., 16.])
visits = np.array([1, 1, 2, 6])
rows = np.repeat(patient_means, visits)
print("patients", len(patient_means), "visits", len(rows))
print("equal_patient_mean", patient_means.mean())
print("visit_weighted_mean", rows.mean())
# Скопированные записи НЕ добавляют независимых пациентов.
for copies in [1, 10]:
    repeated = np.tile(rows, copies)
    naive_se = repeated.std(ddof=1) / np.sqrt(len(repeated))
    print("rows", len(repeated), "naive_se", round(naive_se, 6))

Идея 2. У набора гипотез должен быть видимый состав

Пусть исследование имеет пять заранее перечисленных вторичных гипотез. В учебном наборе их p-value равны 0,008; 0,018; 0,041; 0,12; 0,4. Если каждую сравнить с 0,05 отдельно, первые три будут отмечены как отклонённые. Это не контроль вероятности хотя бы одного ложного отклонения во всей семье.

Процедура Холма упорядочивает p-value и последовательно учитывает число оставшихся проверок. В нашем наборе скорректированные значения равны 0,040; 0,072; 0,123; 0,240; 0,400. При уровне 0,05 отклоняется только первая гипотеза. Поправка не меняет оценённые эффекты: она меняет правило статистического решения для заданного набора проверок.

Учебные значения: один заранее заданный набор проверок
ГипотезаИсходное pp по ХолмуОтклонить при 0,05
10,0080,040Да
20,0180,072Нет
30,0410,123Нет
40,1200,240Нет
50,4000,400Нет

Python: поправка Холма

Скрипт использует явно названный метод holm и возвращает результаты в исходном порядке гипотез. Это помогает избежать ошибки, когда отсортированный список p-value случайно подписывают старыми названиями показателей. В реальном отчёте рядом должны стоять эффект, интервал, исходное и скорректированное p-value, если последнее участвует в принятом правиле.

Здесь нет пациентов и исходных измерений: p-value специально заданы как учебный вход для демонстрации поправки. Скрипт не воспроизводит сами пять тестов. Если публикуете результат настоящего исследования, этого недостаточно: необходимы определения исходов, исходные данные или воспроизводимые агрегаты и описание каждой проверки.

Холм контролирует семейную ошибку при корректных исходных p-value и не требует независимости тестов. Но он не исправляет скрытый перебор десятков моделей, если в семью включили лишь удачные пять результатов. Границу семьи задают содержательно и заранее. Нельзя считать её чисто техническим параметром, который выбирается по желаемому ответу.

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

pythonПроверка расчёта
import numpy as np
from statsmodels.stats.multitest import multipletests
# Учебные p-value пяти заранее перечисленных вторичных гипотез.
p = np.array([0.008, 0.018, 0.041, 0.12, 0.4])
reject, corrected, _, _ = multipletests(p, alpha=0.05, method="holm")
for i, (raw, adj, decision) in enumerate(zip(p, corrected, reject), 1):
    print(i, f"raw={raw:.3f}", f"holm={adj:.3f}", bool(decision))

Идея 3. Отличие от нуля не равно достаточной пользе

Восемь условных участников имеют парные изменения показателя от −1 до −5 единиц; полный массив приведён в коде. Знак определён как «после минус до». Среднее изменение равно −3, а 95% t-интервал — от −4,094608 до −1,905392. Это учебное применение модели независимых примерно нормально распределённых индивидуальных разностей.

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

Python: эффект и заранее заданная граница

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

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

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

pythonУсловия вывода
import numpy as np
from scipy.stats import t
# Синтетическое парное изменение показателя. После минус до.
d = np.array([-1, -2, -2, -3, -3, -4, -4, -5], dtype=float)
mean = d.mean()
se = d.std(ddof=1) / np.sqrt(len(d))
ci = mean + np.array([-1, 1]) * t.ppf(0.975, len(d)-1) * se
print("mean_change", mean, "ci95", np.round(ci, 6))
# Условная заранее заданная граница полезности: снижение минимум на 4.
print("entire_CI_below_minus_4", bool(ci[1] < -4))

Что остаётся полезным, а что нужно дополнять

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

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

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

Как читать без переписывания формул

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

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

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

Кому выбрать другую книгу

Если затруднение начинается уже с различия среднего и стандартного отклонения, сначала удобнее пройти короткий вводный курс Банержи или Петри и Сэбина. Если проблема — согласие двух приборов, посмотрите обзор Блэнда. Если вы уже выбрали модель и готовите рукопись, Ланг и Сесик ближе к задаче описания результатов.

Альтман уместен, когда вы готовы останавливаться на неудобных вопросах до получения цифр. Результат чтения — не количество освоенных названий, а способность объяснить другому человеку, почему выбранная таблица и процедура соответствуют исследованию. Для этого небольшого собственного набора часто достаточно, даже если рабочая база содержит миллионы строк.

Следующий шаг

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

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

Продолжить чтение
Вся библиотека