Логнормальное распределение простыми словами

Карьерник — квиз-тренажёр в Telegram с 1500+ вопросами для собесов аналитика. SQL, Python, A/B, метрики. Бесплатно.

Зачем это знать

Revenue, средний чек, LTV, session duration, response time — всё это не normal, а log-normal. Аналитик, который считает t-test на revenue как будто это normal, получает искажённые результаты. Понимание log-normal — необходимость.

На собесах часто спрашивают: «какое распределение у среднего чека?» — правильный ответ log-normal или similar skewed.

Короткое объяснение

Log-normal — если логарифм переменной распределён normal.

Y ~ Log-normal(μ, σ²) ⟺ log(Y) ~ Normal(μ, σ²)

Форма: positive, skewed right, с длинным хвостом.

Почему возникает

Normal — сумма многих независимых эффектов. Log-normal — произведение многих положительных эффектов.

Examples:

  • Доход = базовый × опыт × удача × образование × ... (произведение)
  • Session duration — время × скорость загрузки × engagement

Характеристики

Параметры μ и σ (относятся к log-скейлу).

  • Mean: e^(μ + σ²/2)
  • Variance: (e^(σ²) - 1) × e^(2μ + σ²)
  • Median: e^μ
  • Mode: e^(μ - σ²)

Median < Mean всегда для log-normal — классика skewed right.

Визуально

X-axis: original scale → heavy right tail, mode около 0.

X-axis: log(X) → симметричный bell curve.

Тест на log-normal

Histogram

На оригинальной шкале — right skewed. На log-шкале — normal-like.

QQ plot

qq plot log(X) vs normal — должен быть линейным.

Shapiro-Wilk

Тест log(X) на normal. Если p > 0.05, log-normal ok.

Примеры в аналитике

Revenue per user

Большинство платят мало, редкие — много. Log-normal.

LTV

Same logic — long tail power users.

Response time

Большинство быстрые, редкие — очень медленные. Log-normal или Weibull.

Продолжительность сессии

Коротких много, длинных мало — log-normal.

Проблемы с t-test

T-test предполагает normal или большое N (через ЦПТ).

На log-normal:

  • Малое N: t-test врёт из-за skewness
  • Большое N: работает, но slow convergence к normal

Решение: log-transform перед тестом.

from scipy.stats import ttest_ind

# Плохо
ttest_ind(revenue_a, revenue_b)

# Лучше
ttest_ind(np.log(revenue_a + 1), np.log(revenue_b + 1))

+ 1 чтобы log(0) не был -inf.

В Python

import numpy as np
from scipy.stats import lognorm

# Сэмпл
samples = lognorm.rvs(s=0.5, scale=np.exp(2), size=1000)

# Fit параметров
shape, loc, scale = lognorm.fit(data, floc=0)
mu, sigma = np.log(scale), shape

Log-transform в A/B

Вместо average revenue сравниваем average log(revenue).

Обратная трансформация: geometric mean = exp(mean(log)).

Осторожно: результат на log-scale интерпретируется как relative change, не absolute.

На собесе

«Какое распределение у revenue?» Log-normal (или похожее skewed).

«Почему не нормальное?» Сумма нескольких положительных эффектов → log-normal (произведение).

«Как тестировать?» Log-transform + t-test, или Mann-Whitney, или bootstrap.

«Когда не работает log-transform?» Когда 0 встречается (revenue = 0 для non-payers).

Частые ошибки

T-test без трансформации

На малом N — смещённый результат.

log(0)

Нужно +1 или filter.

Интерпретация mean(log)

Это logarithm of geometric mean, не mean revenue.

Median vs mean

На log-normal median часто более репрезентативный, чем mean.

Связанные темы

FAQ

Все positive данные — log-normal?

Нет. Weibull, gamma, exponential тоже на positive support.

Как отличить от gamma?

Shape различается. QQ plot показывает.

Bootstrap лучше?

Для non-normal данных — часто да. Не требует assumption.


Тренируйте статистику — откройте тренажёр с 1500+ вопросами для собесов.