Статистические тесты
Данные почти всегда содержат случайность. Если средний балл одной группы 4.2, а другой 4.4 — это настоящая разница или случайно так вышло? Статистические тесты отвечают на такие вопросы.
Логика теста
- Нулевая гипотеза H0 — «ничего интересного нет»: средние равны, признаки независимы, связи нет.
- По данным считается статистика — число, которое тем больше по модулю, чем сильнее данные противоречат H0.
- p-значение — вероятность получить такую же или более крайнюю статистику, если H0 верна.
- Заранее выбирают уровень значимости α (часто 0.05). Если p < α, гипотезу 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 < α → отвергаем нулевую гипотезу;
ttest_ind(a, b, equal_var=False)— сравнение средних двух независимых групп;pearsonr— линейная связь,spearmanr— монотонная (по рангам);chi2_contingency(table)— независимость категориальных признаков; поляstatistic,pvalue,dof.