Что такое хи-квадрат простыми словами
Что такое хи-квадрат
Хи-квадрат (χ², chi-square) — статистический тест, который проверяет, связаны ли две категориальные переменные, или их распределения соответствуют ожидаемым.
В аналитике используется в двух ситуациях:
- Тест независимости — связаны ли платформа и конверсия?
- Goodness of fit — соответствует ли реальное распределение ожидаемому (например, 50/50 в A/B-тесте)?
Интуиция
У вас таблица:
| Купили | Не купили | |
|---|---|---|
| iOS | 120 | 880 |
| Android | 100 | 900 |
Вопрос: различается ли конверсия между iOS и Android? Или наблюдаемая разница — случайность?
χ² сравнивает наблюдаемое с ожидаемым распределением.
Тест независимости — пример
import pandas as pd
from scipy.stats import chi2_contingency
# Таблица сопряжённости
contingency = pd.DataFrame({
'iOS': [120, 880],
'Android': [100, 900]
}, index=['Bought', 'Not Bought'])
chi2, p, dof, expected = chi2_contingency(contingency)
print(f'chi2: {chi2:.3f}, p-value: {p:.4f}')- chi2 — значение статистики (большое → сильно отличается от независимости).
- p — вероятность такого или большего отличия при независимости.
Если p < 0.05 → платформа и конверсия связаны.
Goodness of Fit (SRM в A/B-тестах)
Самое частое применение в аналитике — проверка корректности сплита в A/B.
В сплите 50/50 ожидаем: контроль 10000, тест 10000. Видим: контроль 10200, тест 9800. Случайность или SRM?
from scipy.stats import chisquare
observed = [10200, 9800]
expected = [10000, 10000]
chi2, p = chisquare(observed, expected)
if p < 0.001:
print('SRM detected! Тест нельзя доверять')
else:
print('Сплит OK')
Тренироваться на таких вопросах можно в Telegram-боте Карьерник — там 1500+ задач с реальных собесов с разборами.
Формула (не учить)
χ² = Σ ((observed - expected)² / expected)На практике считаете через scipy.
Когда использовать
Хорошо
- Категориальные переменные (платформа, регион, тариф).
- Достаточно наблюдений в каждой ячейке (>5).
- Нужно проверить независимость / соответствие распределению.
Плохо
- Непрерывные переменные (amount, time) — используйте t-test.
- Очень маленькие выборки (<5 в ячейке) — Fisher's exact test.
- Бинарные с одним событием — z-test пропорций точнее.
Отличие от других тестов
Chi-square vs t-test
- χ² — для категориальных (купил/не купил, да/нет).
- t-test — для непрерывных (чек, время).
Chi-square vs Fisher's exact
- χ² — большие выборки.
- Fisher's — маленькие выборки или <5 в ячейке.
Chi-square vs McNemar
- χ² — независимые выборки.
- McNemar — парные (те же пользователи до/после).
Практический пример
Задача: A/B-тест показал разницу конверсии по платформам
# Таблица: (контроль/тест) × (купили/не купили) × платформа
import pandas as pd
from scipy.stats import chi2_contingency
# Для iOS
ios = [[120, 880], [140, 860]] # [control, test]
chi2, p, _, _ = chi2_contingency(ios)
print(f'iOS: chi2={chi2:.3f}, p={p:.4f}')
# Для Android
android = [[100, 900], [105, 895]]
chi2, p, _, _ = chi2_contingency(android)
print(f'Android: chi2={chi2:.3f}, p={p:.4f}')Если на iOS p значим, на Android нет — heterogeneous effect.
Degrees of Freedom (dof)
dof = (rows - 1) × (cols - 1)
Для таблицы 2×2 → dof = 1. Не нужно считать руками — scipy возвращает.
К слову, набить руку на таких кейсах удобно через тренажёр в Telegram — разбирайте по 10 вопросов в день, через 2 недели тема становится рефлексом.
Интерпретация значения χ²
Большое χ² → сильное отклонение от независимости.
Но не сравнивайте разные χ² между разными таблицами — размеры влияют.
Сравнивайте p-value и размеры эффектов (Cramér's V):
import numpy as np
n = np.sum(observed)
cramers_v = np.sqrt(chi2 / (n * (min(rows, cols) - 1)))
# 0.1 — слабая связь, 0.3 — средняя, 0.5+ — сильнаяНа собеседовании
Вопросы:
- «Когда chi-square, когда t-test?»
- «Что такое SRM и как он проверяется?»
- «Что делать, если в ячейке таблицы <5?»
- «Что такое contingency table?»
Читайте также
- Хи-квадрат тест: подробно
- SRM — Sample Ratio Mismatch
- T-test простыми словами
- A/B-тест простыми словами
- Задачи на статистику
FAQ
Chi-square или z-test для пропорций?
Для 2×2 — эквивалентны (χ² = z²). Для больших таблиц — только chi-square.
Что делать, если в ячейке 0?
Нельзя применять chi-square (деление на 0 в expected). Используйте Fisher's exact test.
Как оценить размер эффекта?
Cramér's V (0–1). χ² и p-value говорят о значимости, не о силе связи.
Chi-square в SQL?
Нет встроенных функций. Обычно считают в Python. Можно через CTE и формулу руками, но неудобно.