</>
Topic 4 of 5

Course materials are currently available in Russian only.

Статистические тесты

Данные почти всегда содержат случайность. Если средний балл одной группы 4.2, а другой 4.4 — это настоящая разница или случайно так вышло? Статистические тесты отвечают на такие вопросы.

Логика теста

  1. Нулевая гипотеза H0 — «ничего интересного нет»: средние равны, признаки независимы, связи нет.
  2. По данным считается статистика — число, которое тем больше по модулю, чем сильнее данные противоречат H0.
  3. p-значение — вероятность получить такую же или более крайнюю статистику, если H0 верна.
  4. Заранее выбирают уровень значимости α (часто 0.05). Если p &lt; α, гипотезу H0 отвергают: «разница статистически значима».

Важно: p-значение — не вероятность того, что H0 верна. И «незначимо» не значит «разницы нет» — возможно, просто мало данных.

Все тесты в scipy.stats возвращают объект с полями statistic и pvalue. Его можно и распаковать: t, p = ttest_ind(a, b).

Сравнение средних: ttest_ind

from scipy.stats import ttest_ind

before = [72, 75, 70, 78, 74, 71]
after = [68, 70, 65, 72, 69, 66]
res = ttest_ind(before, after)
print(res.statistic, res.pvalue)

По умолчанию считается, что разброс в группах одинаковый (t-критерий Стьюдента). Если это не так или вы не уверены, используйте критерий Уэлча: ttest_ind(a, b, equal_var=False). Знак статистики показывает, у какой группы среднее больше: положительный — у первой.

Если обе группы — одни и те же объекты до и после (давление пациентов до и после лекарства), нужен парный тест ttest_rel(before, after).

Корреляция: pearsonr и spearmanr

Корреляция Пирсона от -1 до 1 показывает, насколько точки близки к прямой: 1 — идеальная возрастающая прямая, -1 — убывающая, 0 — линейной связи нет.

from scipy.stats import pearsonr, spearmanr

x = [1, 2, 3, 4, 5]
y = [2, 4, 5, 4, 5]
print(pearsonr(x, y).statistic)    # ≈ 0.775
print(spearmanr(x, y).statistic)   # ≈ 0.738

Корреляция Спирмена — та же корреляция Пирсона, но посчитанная по рангам (номерам значений после сортировки). Одинаковым значениям достаётся средний ранг: у [10, 20, 20, 30] ранги 1, 2.5, 2.5, 4. Спирмен ловит любую монотонную связь и не боится выбросов.

Корреляция — не причинность: мороженое и солнечные ожоги связаны, но через третью величину — жару.

Категориальные признаки: chi2_contingency

Для двух категориальных признаков строят таблицу сопряжённости: строки — значения одного признака, столбцы — другого, в клетках — количества.

from scipy.stats import chi2_contingency

#            чай  кофе
table = [[30, 10],      # утро
         [15, 25]]      # вечер
res = chi2_contingency(table)
print(res.statistic, res.pvalue, res.dof)
print(res.expected_freq)   # чего ждать при независимости
  • dof — число степеней свободы, (r - 1)(c - 1);
  • expected_freq — ожидаемые количества, если признаки независимы;
  • для таблицы 2 × 2 по умолчанию применяется поправка Йейтса (correction=True), которая делает тест осторожнее.

Итог

  • p &lt; α → отвергаем нулевую гипотезу;
  • ttest_ind(a, b, equal_var=False) — сравнение средних двух независимых групп;
  • pearsonr — линейная связь, spearmanr — монотонная (по рангам);
  • chi2_contingency(table) — независимость категориальных признаков; поля statistic, pvalue, dof.