Статистика. Часть 4. Статистическая важность. Критерий выбора теста для проверки гипотез
Published 28 сентября 2025 г. 18:09
Доброго времени суток, уважаемые читатели!
Сегодня мы углубимся в проверку статистических гипотез и узнаем, как выбрать правильный тест, и конечно же рассмотрим это на примерах кода. Итак, поехали!
В прошлой статье мы рассмотрели понятия нулевой и альтернативной гипотез, а также ошибки первого и второго рода, которые могут возникнуть при проверке гипотез.
Пришло время разобраться, по каким же критериям мы выбираем тест для проверки гипотез.
Наверное самый важный критерий - статистическая величина, которую мы проверяем. Т.е. если мы проверяем гипотезу о среднем значении выборки, то скорее всего мы будем использовать t-тест. Второй критерий - количество групп объектов, которые участвуют в проверке. Если у нас есть больше 2 групп данных, то t-тест уже не подойдёт и мы будем использовать ANOVA (Analysis of Variance) (анализ распределения). О других критериях поговорим в следующих статьях, а сейчас подробнее остановимся на сравнении средних значений двух групп и t-тесте.
T-тест позволяет нам провести анализ 2 групп данных и понять, насколько значительно отличаются их средние значения. На самом деле t-тест применим в 3 случаях:
- Когда у нас уже известна величина среднего генеральной совокупности и мы хотим выяснить, отличается ли величина исследуемой группы объектов от известного значения.
- Когда хотим сравнить величины средних значений у двух независимых групп.
- Когда хотим сравнить средние значения одной группы до и после проведения экспериментов (например при исследовании влияния на организм изменений в питании).
Однако t-тест нельзя применять на всех выборках данных. Для применения t-теста выборки данных должны соответствовать следующим условиям:
- Выборки должны быть независимы.
- Распределение у выборок должно быть нормальным (вспоминаем колокол). Допустимы небольшие отклонения (но только небольшие!).
- Дисперсии выборок равны или близки по значению.
Т-тест (он также известен как тест Стьюдента) обычно используется для небольших выборках (обычно меньше 30 значний). Однако это не мешает нам использовать его и для более крупных датасетов. Формула для теста для двух независимых выборок следующая:
Числитель в представленной выше формуле - это разность средних значений двух групп. Знаменатель содержит корень квадратный из суммы двух частных. Каждое из слагаемых этой суммы является результатом деления дисперсии (или же стандартного отклонения в квадрате) на количество элементов в каждой группе.
Для проведения теста с использованием референс значения (т.е. заранее известной средней величины генеральной совокупности) используется немного другая формула:
Здесь µ - референсное значение, х с чертой - среднее значение выборки, s - стандартное отклонение и n - кол-во элементов в группе.
И последний вариант, когда мы сравниваем до/после:
В данном случае х с чертой и индексом d - это среднее значение разницы между наблюдениями до и после.
Кстати, а что будет, когда мы уже посчитаем значение t? Как определить по нему, что делать с нулевой гипотезой? Для этого нам на помощь приходит значение p (или же p value). Пояснительную бригаду в студию 🙂.
Сперва небольшое замечание: t-тест используется для проверки гипотезы о том, что средние значения выборок НЕ ОТЛИЧАЮТСЯ.
Для того, чтобы отвергнуть (или нет) нулевую гипотезу, нам необходимо установить уровень значимости при проверке гипотезы. Он обозначается латинской буквой ɑ (альфа) и обычно имеет значение 5%. То есть если вероятность того, что выборки имеют разные значения среднего равна 5%, то мы отвергаем нулевую гипотезу. И тут в дело вступает p value. Чем меньше его значение, тем сильнее наши значения средних отличаются от тех, которые мы ожидаем при выполнении условий нулевой гипотезы.
Расчет p value производится с помощью специальных таблиц или программных пакетов (например SPSS), так что здесь нам не нужно писать многоэтажные расчеты). Вся суть в том, что если p value < 0.05, то мы отвергаем нулевую гипотезу.
Однако мы можем обойтись и без вычисления p value! Для каждого вычисленного t существует критическое значение, благодаря которому можно опровергнуть (или нет) нулевую гипотезу. Для того, чтобы найти это критическое значение, нам необходимо знать степени свободы.
Вычисляется степень свободы несложно: для теста с референсным значением и теста до/после d = n - 1, а для двух независимых выборок d = n1 + n2 - 2, где n - кол-во наблюдений (строк) в датасете). Однако для проверки гипотезы таким образом нам необходимо воспользоваться специальными таблицами.
Теперь давайте на примере).
В качестве примера для сравнения двух независимых выборок возьмем довольно интересный датасет, который отображает зависимость чаевых от того курильщик ли посетитель или нет 🙃.
Данный датасет находится в пакете seaborn, так что лучше установить его заранее:
А дальше я доверюсь ChatGPT (не переживайте, код рабочий🙂).
import math
# Try to load the tips dataset via seaborn (common local installation).
try:
import seaborn as sns
tips = sns.load_dataset("tips")
except Exception as e:
raise RuntimeError("Could not load seaborn dataset 'tips'. Make sure seaborn is installed and you have internet if needed.") from e
# Split groups: smokers vs non-smokers, variable = tip
tips_smoker = tips[tips["smoker"] == "Yes"]["tip"].tolist()
tips_nonsmoker = tips[tips["smoker"] == "No"]["tip"].tolist()
# ---- Manual helper functions ----
def mean(xs):
return sum(xs) / len(xs)
def sample_variance(xs):
mu = mean(xs)
return sum((x - mu) ** 2 for x in xs) / (len(xs) - 1)
def t_stat(x1, x2):
m1, m2 = mean(x1), mean(x2)
v1, v2 = sample_variance(x1), sample_variance(x2)
n1, n2 = len(x1), len(x2)
numerator = m1 - m2
denominator = math.sqrt(v1/n1 + v2/n2)
return numerator / denominator
def t_stat_df(x1, x2):
v1, v2 = sample_variance(x1), sample_variance(x2)
n1, n2 = len(x1), len(x2)
num = (v1/n1 + v2/n2)**2
denom = ((v1/n1)**2) / (n1 - 1) + ((v2/n2)**2) / (n2 - 1)
return num / denom
# ---- Compute test statistic and df ----
n1, n2 = len(tips_smoker), len(tips_nonsmoker)
m1, m2 = mean(tips_smoker), mean(tips_nonsmoker)
v1, v2 = sample_variance(tips_smoker), sample_variance(tips_nonsmoker)
t_stat = t_stat(tips_smoker, tips_nonsmoker)
df = t_stat_df(tips_smoker, tips_nonsmoker)
# ---- Compute two-tailed p-value ----
p_value = None
method = None
# Primary method: use scipy if available (preferred)
try:
import scipy.stats as stats
p_value = stats.t.sf(abs(t_stat), df) * 2 # two-tailed
method = "scipy.stats"
except Exception:
# Fallback: numerical integration of t-PDF (Simpson's rule)
method = "simpson_integration"
def t_pdf(x, v):
# Student t PDF using gamma via math.lgamma
num = math.exp(math.lgamma((v+1)/2.0))
den = math.sqrt(v * math.pi) * math.exp(math.lgamma(v/2.0))
return (num / den) * (1 + x*x/v) ** (-(v+1)/2.0)
def integrate_simpson(f, a, b, n=20000):
if n % 2 == 1:
n += 1
h = (b - a) / n
s = f(a) + f(b)
for i in range(1, n):
x = a + i*h
s += (4 if i % 2 == 1 else 2) * f(x)
return s * h / 3.0
# integrate tail from |t_stat| to a large upper bound
abs_t = abs(t_stat)
upper = max(abs_t + 80, 200) # very large upper bound for safety
tail = integrate_simpson(lambda x: t_pdf(x, df), abs_t, upper, n=40000)
p_value = 2 * tail
# ---- Output summary ----
print("Manual t-test (smokers vs non-smokers: tip amounts)")
print("-----------------------------------------------------")
print(f"n_smokers = {n1}, n_nonsmokers = {n2}")
print(f"mean_smokers = {m1:.4f}, mean_nonsmokers = {m2:.4f}")
print(f"var_smokers = {v1:.6f}, var_nonsmokers = {v2:.6f}")
print(f"t-statistic = {t_stat:.6f}")
print(f"degrees of freedom = {df:.4f}")
print(f"p-value = {p_value:.6g} (computed via {method})")
# ---- If you want to use critical-value method ----
alpha = 0.05
try:
import scipy.stats as stats
crit = stats.t.ppf(1 - alpha/2, df)
print(f"critical t (two-tailed, alpha={alpha}) = ±{crit:.4f}")
print("Reject H0 if |t| > critical t.")
except Exception:
print("scipy not available to get critical t. You can use a t-table with df ≈", round(df))
Выглядит красиво 🤩
В результате поличили наши p и t:
Как мы видим, значение p value выше критического 0.05, поэтому мы не можем отвергнуть нулевую гипотезу. Можем сделать вывод, что чаевые будут почти одинаковыми независимо от того, курит посетитель или он закоренелый ЗОЖник.
Что ж, на сегодня, пожалуй, достаточно математики). В следующий раз разберем, как нам проверить гипотезы, когда у нас больше двух выборок. До скорой встречи!
Похожие публикации
Статистика. Часть 3. Проверка гипотез
Статистика. Часть 2. Меры рассеивания (measures of dispersion)