← Назад к вопросам

Как оценить статистическую значимость результата анализа?

2.0 Middle🔥 221 комментариев
#Статистика и теория вероятностей#Статистические критерии и тесты

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Оценка статистической значимости

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

Основные концепции

Нулевая и альтернативная гипотезы:

  • H0 (нулевая гипотеза): нет эффекта, наблюдаемая разница случайна
  • H1 (альтернативная гипотеза): есть реальный эффект

Пример:

  • H0: Средняя зарплата мужчин и женщин одинакова
  • H1: Зарплаты различаются

P-value (p-значение):

p-value — это вероятность получить наблюдаемый результат (или более экстремальный), если H0 верна.

# Пример p-value
# p-value = 0.03
# Интерпретация: если нет реального различия, 
# вероятность получить такую разницу случайно = 3%

Уровень значимости (α):

Это порог, ниже которого результат считается статистически значимым. Обычно α = 0.05 (5%).

Если p-value < α → результат значим (отклоняем H0)
Если p-value ≥ α → результат не значим (не отклоняем H0)

T-тест (для сравнения средних)

Независимые выборки:

Сравнить средние зарплаты в двух отделах:

from scipy import stats
import numpy as np

# Данные
group1 = [50000, 55000, 52000, 58000, 51000]  # Отдел A
group2 = [60000, 65000, 62000, 68000, 61000]  # Отдел B

# T-тест
t_stat, p_value = stats.ttest_ind(group1, group2)

print(f"T-статистика: {t_stat:.4f}")
print(f"P-value: {p_value:.4f}")

if p_value < 0.05:
    print("Разница статистически значима!")
else:
    print("Разница не значима (может быть случайной)")

Зависимые выборки (before/after):

# Зарплата до и после повышения
before = [50000, 55000, 52000, 58000, 51000]
after = [52000, 57000, 54000, 60000, 53000]

# Парный t-тест
t_stat, p_value = stats.ttest_rel(before, after)

print(f"P-value: {p_value:.4f}")
if p_value < 0.05:
    print("Повышение статистически значимо")

Chi-square тест (для категорийных данных)

Сравнить распределения категорий (например, предпочтения продуктов):

from scipy.stats import chi2_contingency
import pandas as pd

# Таблица сопряженности
contingency_table = pd.crosstab(
    ['M', 'M', 'F', 'F', 'M', 'F', 'M', 'F'],  # Пол
    ['A', 'B', 'A', 'B', 'A', 'B', 'B', 'A']   # Предпочитаемый продукт
)

print(contingency_table)
#        A  B
# F    2  1
# M    3  2

# Chi-square тест
chi2, p_value, dof, expected = chi2_contingency(contingency_table)

print(f"Chi-square статистика: {chi2:.4f}")
print(f"P-value: {p_value:.4f}")
print(f"Степени свободы: {dof}")

if p_value < 0.05:
    print("Пол и предпочтение продукта связаны")

ANOVA (для сравнения 3+ групп)

Сравнить среднее по 3+ категориям:

from scipy import stats

# Зарплата в 3 отделах
sales = [50000, 52000, 51000, 48000]
it = [60000, 62000, 65000, 63000]
hr = [45000, 46000, 44000, 47000]

# ANOVA
f_stat, p_value = stats.f_oneway(sales, it, hr)

print(f"F-статистика: {f_stat:.4f}")
print(f"P-value: {p_value:.4f}")

if p_value < 0.05:
    print("Различия между отделами значимы")

Доверительный интервал (Confidence Interval)

Диапазон, в который с определённой вероятностью попадает истинное значение:

from scipy import stats
import numpy as np

data = [50000, 52000, 51000, 48000, 53000]

# 95% доверительный интервал
mean = np.mean(data)
std_err = stats.sem(data)  # Standard error
ci = stats.t.interval(0.95, len(data)-1, loc=mean, scale=std_err)

print(f"Средняя зарплата: ${mean:,.0f}")
print(f"95% доверительный интервал: ${ci[0]:,.0f} - ${ci[1]:,.0f}")
# С 95% вероятностью истинное среднее в этом диапазоне

Effect Size (размер эффекта)

Не только p-value важен, но и размер эффекта:

Cohen's d (для t-теста):

from scipy import stats

group1 = [50000, 55000, 52000, 58000, 51000]
group2 = [60000, 65000, 62000, 68000, 61000]

# T-тест
t_stat, p_value = stats.ttest_ind(group1, group2)

# Cohen's d
mean1, mean2 = np.mean(group1), np.mean(group2)
std1, std2 = np.std(group1), np.std(group2)
n1, n2 = len(group1), len(group2)

pooled_std = np.sqrt(((n1-1)*std1**2 + (n2-1)*std2**2) / (n1+n2-2))
cohens_d = (mean2 - mean1) / pooled_std

print(f"Cohen's d: {cohens_d:.4f}")
print(f"P-value: {p_value:.4f}")

# Интерпретация
if abs(cohens_d) < 0.2:
    effect = "negligible"
elif abs(cohens_d) < 0.5:
    effect = "small"
elif abs(cohens_d) < 0.8:
    effect = "medium"
else:
    effect = "large"
    
print(f"Размер эффекта: {effect}")

Критические ошибки

Type I Error (Ошибка 1 рода):

  • Отклоняем H0, хотя она верна (ложноположительный)
  • Вероятность = α (обычно 5%)
  • Вывод: есть эффект, а его нет

Type II Error (Ошибка 2 рода):

  • Не отклоняем H0, хотя она неверна (ложноотрицательный)
  • Вероятность = β
  • Вывод: нет эффекта, а он есть
#          H0 верна      H0 неверна
# Отклонили  Type I      Correct ✓
# Не отклонили Correct ✓ Type II

Практический пример: A/B тест

import pandas as pd
from scipy import stats

# A/B тест конверсии
group_a = [1, 0, 1, 0, 1, 0, 1, 1, 0, 1]  # 1 = конвертировались
group_b = [1, 1, 0, 1, 1, 1, 0, 1, 1, 1]  # 1 = конвертировались

conversion_a = sum(group_a) / len(group_a)  # 60%
conversion_b = sum(group_b) / len(group_b)  # 80%

print(f"Конверсия A: {conversion_a:.1%}")
print(f"Конверсия B: {conversion_b:.1%}")
print(f"Разница: {(conversion_b - conversion_a):.1%}")

# Chi-square тест
contingency = [[sum(group_a), len(group_a) - sum(group_a)],
               [sum(group_b), len(group_b) - sum(group_b)]]

chi2, p_value, dof, expected = stats.chi2_contingency(contingency)

print(f"\nP-value: {p_value:.4f}")

if p_value < 0.05:
    print("Вариант B статистически значимо лучше!")
else:
    print("Разница может быть случайной. Нужно больше данных.")

Распространённые ошибки

1. P-hacking (множественные тесты):

# Опасно! Если провести 20 тестов на α=0.05,
# в среднем 1 будет статистически значим случайно

# Решение: используй коррекцию (Bonferroni)
α_corrected = 0.05 / 20  # 0.0025

2. Выводы с малой выборкой:

# С n=5 может быть статистическая значимость,
# но с большим доверительным интервалом
# Нужна достаточная выборка!

3. Не учитывать размер эффекта:

# С большой выборкой даже микроскопический эффект может быть значим
# Например: разница в 1 доллар при n=1,000,000 может быть p < 0.05
# Но практически это бессмыслено!

Чеклист анализа значимости

  • Определить гипотезы (H0 и H1)
  • Выбрать подходящий тест (t-тест, chi-square, ANOVA)
  • Проверить предположения теста (нормальность, гомогенность дисперсии)
  • Выбрать α (обычно 0.05)
  • Провести тест, получить p-value
  • Рассчитать размер эффекта (Cohen's d, η²)
  • Оценить доверительный интервал
  • Оценить практическую значимость
  • Учесть потенциальные смещения

Итог

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

  • P-value — вероятность случайности
  • Effect size — размер эффекта
  • Доверительный интервал — диапазон истинного значения
  • Практическая значимость — важно ли это для бизнеса
Как оценить статистическую значимость результата анализа? | PrepBro