Что такое хи-квадрат простыми словами

Что такое хи-квадрат

Хи-квадрат (χ², chi-square) — статистический тест, который проверяет, связаны ли две категориальные переменные, или их распределения соответствуют ожидаемым.

В аналитике используется в двух ситуациях:

  1. Тест независимости — связаны ли платформа и конверсия?
  2. 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')

Подробнее про SRM.

Тренироваться на таких вопросах можно в 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?»

Читайте также

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 и формулу руками, но неудобно.