Логнормальное распределение простыми словами
Карьерник — квиз-тренажёр в 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), shapeLog-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+ вопросами для собесов.