«Есть ложь, наглая ложь и статистика» — этот афоризм, по утверждению Марка Твена, принадлежит премьер‑министру Великобритании Бенджамину Дизраэли. А по мнению скептиков — самому Твену. Как бы там ни было, статистика не так уж и врёт, по крайней мере не больше, чем машинное обучение (ML). Более того — в некоторых случаях она может оказаться привлекательнее, надёжнее и значительно дешевле, чем обучение и внедрение ML‑моделей.
В этой статье я пропущу очевидные вещи вроде среднего, медианы и моды и сразу перейду к более интересным и полезным инструментам. Примеры и код — на Python, с использованием библиотек numpy, pandas.

1. Средневзвешенное значение — более честное, чем обычное среднее значение
Обычное среднее — показатель капризный. Оно неустойчиво к выбросам и часто искажает картину. Например:
В компании директор получает $10, а уборщица — $0.10. Суммируем и делим на двоих — получаем среднюю зарплату $5.05. Уверен, уборщица с такой арифметикой не согласится.
Взвешенное среднее решает проблему:
import numpy as np
salary = np.array([10.0, 0.10])
weight = np.array([1, 10])
result = np.sum(salary * weight) / np.sum(weight)
print(f"Weighted average: ${result:.2f}")
? Результат: $1.00 — уже куда ближе к реальности.
Где это полезно:
при анализе доходов по каналам продаж;
при учёте доли клиентов в группах;
в расчётах с сильным перекосом в частотах.
2. Стандартное отклонение — насколько сильно данные «колеблются» вокруг среднего значения
Стандартное отклонение показывает, насколько в среднем данные отклоняются от среднего значения. Это важный показатель стабильности, однородности и предсказуемости.
Пример: зарплаты в компании
import pandas as pd
import numpy as np
data = {
"Employee": ["Ivan", "Maria", "Oleg", "Anna", "CEO"],
"Salary": [500, 400, 450, 550, 5000]
}
df = pd.DataFrame(data)
n = len(df['Salary'])
mean_ = df['Salary'].mean()
s = np.sqrt(np.sum((df['Salary'] - mean_) ** 2) / (n - 1))
print(f"Standard deviation: {s:.2f}")
? Результат: 2024.41 — огромный разброс, вызванный зарплатой директора.
Вывод: стандартное отклонение сразу показывает, что у нас сильное смещение и простое среднее здесь неадекватно.
3. Дисперсия — квадратичная версия отклонения
Дисперсия — это то же стандартное отклонение, только без корня. То есть отклонения считаются в квадрате единиц (рубли², кг² и т.д.), и интерпретировать её сложнее. Тем не менее она полезна, когда нужно сравнить стабильность и однородность данных.
Пример: кофейня и количество продаж
import numpy as np
sales = np.array([90, 95, 92, 93, 91, 200, 210])
mean_sales = np.mean(sales)
dispersion = np.sum((sales - mean_sales) ** 2) / (len(sales) - 1)
print("Variance:", dispersion)
? Среднее = 110 чашек, но на деле будни продают по 90–95, а выходные — по 200+. Дисперсия покажет неоднородность и поможет понять, что данные нужно разделять по сегментам.
4. Корреляция Пирсона — линейная зависимость (с оговорками)
Корреляция — вещь полезная. Она показывает, как одна переменная линейно связана с другой. Подчеркну: линейно и математически. Это не означает причинно-следственную связь, и это важно помнить.
Например, между зарплатой и стажем может быть высокая корреляция — и это логично. А вот между игрой в гольф и смертностью гольфистов — тоже есть сильная корреляция, но причина вовсе не гольф, а то, что большинство гольфистов — пожилые люди. Поэтому: корреляция — не причинность.
Пример: сколько учишься — так и пишешь тест
import numpy as np
X = np.array([1, 2, 3, 4, 5]) # study hours
Y = np.array([50, 55, 60, 65, 70]) # test scores
x_mean = np.mean(X)
y_mean = np.mean(Y)
corXY = np.sum((X - x_mean) * (Y - y_mean))
corr_sqrt = np.sqrt(np.sum((X - x_mean)**2) * np.sum((Y - y_mean)**2))
res = corXY / corr_sqrt
print(f"Pearson correlation: {res:.2f}")
? Результат будет 1.00 — идеальная линейная зависимость.
Зачем тогда квадрат корреляции?
Чтобы понять, какая доля изменений одной переменной объясняется другой. Если r = 0.9, то r² = 0.81 → 81% изменений объясняются, остальное — случайность или другие факторы.
В ML это называют коэффициент детерминации, и он активно используется для оценки качества регрессий.
5. Тест «хи-квадрат» — соответствуют ли наши ожидания реальности?
Ещё один потрясающий метод из статистики, который может быть полезен при оценке почти чего угодно. Человеческому роду свойственно постфактум всегда интересоваться: а как же наши планы соотнесены с реальным результатом?
Так вот, хи-квадрат помогает узнать, насколько прогноз отличается от полученного результата.
? И, как всегда в статистике, есть свои подводные камни:
· оба набора данных должны быть одинаковой длины — что логично;
· в ожидаемых значениях не должно быть нулей, математика не любит их, особенно при делении;
· хи-квадрат возвращает безразмерный результат: это не проценты и не «единицы измерения данных», а просто число, которое показывает, насколько сильно расхождение между ожиданиями и реальностью. Причём чем больше это число, тем сильнее расхождение.
Вот простой пример расчёта хи-квадрат-статистики:
import numpy as np
O = np.array([1, 2, 3, 4, 7, 9, 11, 13, 14]) # observed
E = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) # expected
xi = np.sum((O - E) ** 2 / E)
print(f"Chi-square statistic: {xi:.2f}")
6. Распределение Пуассона — когда редкие события перестают быть неожиданностью
Распределение Пуассона используется, когда нужно предсказать, сколько раз случится редкое событие за фиксированный период времени или в определённой области. Это один из самых полезных и недооценённых инструментов статистики — особенно в бизнесе, где «редкие» события вроде жалоб, отказов или сбоев случаются регулярно.
Например:
Сколько клиентов позвонят в поддержку за вечер?
Сколько заказов поступит на сайт за час?
Пусть в среднем с лендинга приходит 3 заявки в день. Какова вероятность, что сегодня придут ровно 5?
в распределении Пуассона следующие переменные:
· λ — среднее количество событий за интервал,
· k — количество событий, которое нас интересует,
· e — основание натурального логарифма (примерно 2.718),
· k! — факториал числа k.
Пусть в среднем с лендинга приходит 3 заявки в день. Какова вероятность, что сегодня придут ровно 5?
import math
λ = 3 # среднесуточное количество потенциальных клиентов
k = 5 # вероятность того, что сегодня будет ровно 5 потенциальных клиентов
prob = (λ ** k) * math.exp(-λ) / math.factorial(k)
print ( f"Вероятность 5 потенциальных клиентов: {prob: .4 f} " )
? Результат: 0.1008, то есть около 10.08%
Где пригодится:
в маркетинге — для оценки откликов на рекламу,
в техподдержке — чтобы спрогнозировать нагрузку на операторов,
в логистике — чтобы оценить число заказов/возвратов,
в безопасности — при анализе частоты инцидентов,
в финансах — при оценке количества просрочек или рисков.
Важное замечание:
Распределение Пуассона предполагает, что:
события происходят независимо друг от друга;
вероятность события постоянна для любого маленького отрезка времени;
нельзя иметь два события одновременно (одно за раз).
7. Биномиальное распределение — успех или неудача с вероятностью
Так, дальше тоже интересно – биномиальное распределение – это такая штуковина, которая помогает понять сколько при фиксированном количестве независимых испытаний произойдёт успешный исход, с учетом того, что есть только два исхода успех/неудача
Ключевые характеристики биномиального распределения:
n — общее число испытаний (например, писем, бросков, клиентов)
k — количество успехов (например, открытые письма, победы)
p — вероятность успеха в каждом отдельном испытании
1 - p — вероятность неудачи
n = 100 # общее количество писем
k = 70 # количество открытых писем
p = 0.7 # вероятность открытия одного письма
import math
n = 100
k = 70
p = 0,7
b_coef = math.factorial(n) / (math.factorial(k) * math.factorial(n - k))
prob = b_coef * (p ** k) * (( 1 - p) ** (n - k))
print ( f"Вероятность 70 открытий: {prob: .6 f} " )
Примеры, когда используется биномиальное распределение:
Email-маркетинг: из 100 писем 70 открыли — насколько это вероятно, если шанс открытия 0.7?
Контроль качества: из 20 деталей 2 бракованные — насколько это отклонение?
A/B тесты: из 1000 пользователей 300 кликнули на кнопку — насколько это лучше, чем 250 у варианта B?
Медицина: у 8 из 100 пациентов побочные эффекты — это в пределах нормы?
8. Экспоненциальное распределение — сколько времени осталось до следующего события?
Экспоненциальное распределение — это способ посчитать, сколько времени пройдёт до того, как произойдёт какое-то случайное событие, если такие события случаются равномерно, случайно и независимо друг от друга.
Например:
сколько времени пройдёт до следующего звонка в кол‑центр,
когда снова сломается техника,
через сколько минут придёт следующий клиент.
То есть, оно отвечает на вопрос: «Сколько ждать до следующего события, если такие события случаются с постоянной средней скоростью?»
import math
lambd = 4 # avg 4 вызова/час
x = 1 / 3 # 20 минут = 1/3 часа
prob = lambd * math.exp(-lambd * x)
print ( f"Вероятность следующего вызова через 20 мин: {prob: .4 f} " )
Заключительные мысли
Это далеко не полный арсенал статистических методов — их слишком много, чтобы охватить все в одной статье. Я намеренно выбрал те, которые малый бизнес сможет использовать уже завтра — без специалистов по анализу данных, графических процессоров и многомиллионных бюджетов.
Если хотя бы один из этих методов поможет вам предсказать завтрашних клиентов немного лучше, чем вчера — миссия выполнена.