← Назад к вопросам
Что такое Репрезентативность?
2.3 Middle🔥 171 комментариев
#A/B-тестирование#Статистика и теория вероятностей
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Репрезентативность: статистический принцип в аналитике
Что такое репрезентативность
Репрезентативность — это свойство выборки адекватно отражать характеристики генеральной совокупности (всей популяции).
Если выборка репрезентативна, выводы из неё можно обобщить на всю популяцию.
Визуальный пример
Генеральная совокупность (целое население)
┌────────────────────────────────────┐
│ Возраст: 18-80 лет │
│ Доход: от $20k до $500k │
│ Пол: 50% M, 50% F │
│ Образование: разное │
│ География: вся страна │
│ Численность: 100 млн │
└────────────────────────────────────┘
↓
Репрезентативная выборка
┌────────────────────────────────────┐
│ Возраст: 18-80 лет (похоже распред) │
│ Доход: от $20k до $500k │
│ Пол: 49% M, 51% F │
│ Образование: похожее распределение │
│ География: представлены все регионы │
│ Численность: 1000 человек │
└────────────────────────────────────┘
✅ Результаты можно обобщить на всех
НЕ репрезентативная выборка
┌────────────────────────────────────┐
│ Возраст: только 25-35 лет │
│ Доход: только $100k+ │
│ Пол: 80% M, 20% F │
│ Образование: только университеты │
│ География: только крупные города │
│ Численность: 1000 человек │
└────────────────────────────────────┘
❌ Смещенные результаты, нельзя обобщить
Примеры нарушения репрезентативности
Проблема 1: Selection Bias (смещение отбора)
Задача: понять мнение потребителей о сервисе
❌ Неправильно: опросить только активных пользователей
Результат: 95% удовлетворены
Проблема: неудовлетворенные уже ушли (не видны)
✅ Правильно: опросить случайную выборку ВСЕх
Результат: 75% удовлетворены
(включены уходящие пользователи)
Проблема 2: Survivorship Bias (смещение пережившего)
Вопрос: какова средняя прибыль у стартапов?
❌ Неправильно: анализировать только успешные стартапы
Выборка: 50 успешных компаний
Средняя прибыль: $10М
Проблема: неудачные стартапы исчезли из выборки
✅ Правильно: включить все стартапы (успешные + банкроты)
Выборка: 500 стартапов (50 успешных + 450 закрытых)
Средняя прибыль: -$500k (включая убытки банкротов)
Проблема 3: Temporary Bias (временное смещение)
Вопрос: что среднее потребление кофе?
❌ Неправильно: опросить летом
Результат: 2 кружки в день
Проблема: зимой люди пьют больше
✅ Правильно: опросить в разное время года
Результат: зима 4 кружки, лето 2 кружки
Среднее: 3 кружки
Как обеспечить репрезентативность
1. Случайная выборка (Random Sampling)
import numpy as np
from scipy import stats
# Генеральная совокупность: 1 млн пользователей
total_users = 1000000
# Репрезентативная выборка: 1000 пользователей
sample_size = 1000
# Случайный отбор
random_users = np.random.choice(total_users, size=sample_size, replace=False)
print(f"Выбрано {sample_size} из {total_users}")
print(f"Доля выборки: {sample_size / total_users * 100:.2f}%")
2. Стратифицированная выборка (Stratified Sampling)
import pandas as pd
from sklearn.model_selection import train_test_split
df = pd.DataFrame({
'user_id': range(10000),
'segment': ['free'] * 8000 + ['paid'] * 2000 # 80% free, 20% paid
})
# Стратифицированная выборка сохраняет соотношение
train, test = train_test_split(
df,
test_size=0.1, # 10% выборка
stratify=df['segment'], # сохранить соотношение segment
random_state=42
)
print("Исходный датасет:")
print(df['segment'].value_counts(normalize=True))
print("\nВыборка (сохранило пропорции):")
print(test['segment'].value_counts(normalize=True))
# free: 80%, paid: 20% (как в исходном)
3. Калибровка (Calibration)
# Если выборка не репрезентативна, используй weights
import numpy as np
# Исходный датасет: 80% мужчины, 20% женщины
# Реальность в стране: 50% мужчины, 50% женщины
df['weight'] = df['gender'].apply(
lambda x: 1.0 if x == 'Female' else 0.5 # женщинам вес 1.0, мужчинам 0.5
)
# Взвешенное среднее
weighted_avg = np.average(df['income'], weights=df['weight'])
print(f"Взвешенный средний доход: ${weighted_avg:.0f}")
Проверка репрезентативности
Способ 1: Chi-Square тест
from scipy.stats import chisquare
# Ожидаемое распределение по возрасту в популяции
expected = [0.20, 0.30, 0.30, 0.20] # 18-30, 30-40, 40-50, 50+
# Наблюдаемое распределение в выборке
observed = [100, 180, 150, 70] # абсолютные числа
# Chi-square тест
chi2, p_value = chisquare(observed, expected=[e * sum(observed) for e in expected])
print(f"Chi-square: {chi2:.2f}")
print(f"p-value: {p_value:.4f}")
if p_value < 0.05:
print("❌ Выборка НЕ репрезентативна (распределение отличается)")
else:
print("✅ Выборка репрезентативна")
Способ 2: Сравнение параметров
import pandas as pd
from scipy import stats
# Генеральная совокупность (известные параметры)
population_mean_age = 42
population_std_age = 15
# Выборка
sample = pd.DataFrame({'age': [35, 42, 48, 39, 45, 50, 41, 38, 44, 43]})
# t-тест: сравнить mean выборки с mean популяции
t_stat, p_value = stats.ttest_1samp(sample['age'], population_mean_age)
print(f"Среднее в выборке: {sample['age'].mean():.1f}")
print(f"Среднее в популяции: {population_mean_age}")
print(f"p-value: {p_value:.4f}")
if p_value > 0.05:
print("✅ Выборка репрезентативна по возрасту")
else:
print("❌ Выборка НЕ репрезентативна")
Размер выборки (Sample Size)
Достаточный размер выборки критичен для репрезентативности:
from scipy.stats import norm
def calculate_sample_size(confidence=0.95, margin_of_error=0.05, p=0.5):
"""
Расчет размера выборки
confidence: уровень доверия (95% = 0.95)
margin_of_error: допустимая ошибка (5% = 0.05)
p: предполагаемая доля (0.5 для максимальной дисперсии)
"""
z = norm.ppf((1 + confidence) / 2) # z-score
n = (z**2 * p * (1 - p)) / (margin_of_error**2)
return int(np.ceil(n))
# Примеры
print(f"Для 95% доверия, 5% ошибка: {calculate_sample_size(0.95, 0.05)} человек")
print(f"Для 95% доверие, 2% ошибка: {calculate_sample_size(0.95, 0.02)} человек")
print(f"Для 99% доверие, 5% ошибка: {calculate_sample_size(0.99, 0.05)} человек")
# Результат:
# Для 95% доверия, 5% ошибка: 385 человек
# Для 95% доверие, 2% ошибка: 2401 человек
# Для 99% доверие, 5% ошибка: 665 человек
Примеры из практики аналитика
Пример 1: A/B тест
-- ❌ НЕПРАВИЛЬНО: тест на новых пользователей (bias)
SELECT
variant,
COUNT(*) as users,
SUM(CASE WHEN purchased THEN 1 ELSE 0 END) as conversions,
SUM(CASE WHEN purchased THEN 1 ELSE 0 END) * 1.0 / COUNT(*) as conversion_rate
FROM ab_test
WHERE user_age < 30 -- только молодежь
GROUP BY variant;
-- ✅ ПРАВИЛЬНО: репрезентативная выборка всех пользователей
SELECT
variant,
COUNT(*) as users,
SUM(CASE WHEN purchased THEN 1 ELSE 0 END) as conversions,
SUM(CASE WHEN purchased THEN 1 ELSE 0 END) * 1.0 / COUNT(*) as conversion_rate
FROM ab_test
GROUP BY variant;
Пример 2: Опрос клиентов
# ❌ НЕПРАВИЛЬНО: опросить только активных пользователей
def survey_active_users():
# выбираем только пользователей с 10+ покупками
users = db.query(User).filter(User.purchase_count >= 10).all()
satisfaction = [user.survey_score for user in users]
return np.mean(satisfaction) # смещенный результат
# ✅ ПРАВИЛЬНО: случайная выборка всех пользователей
def survey_representative():
all_users = db.query(User).all()
sample = random.sample(all_users, size=1000) # 1000 случайных
satisfaction = [user.survey_score for user in sample]
return np.mean(satisfaction) # репрезентативный результат
Пример 3: Когортный анализ
-- ❌ НЕПРАВИЛЬНО: анализировать только месячных пользователей
SELECT
DATE_TRUNC('month', signup_date) as cohort,
COUNT(*) as users,
AVG(revenue) as avg_revenue
FROM users
WHERE lifetime_value > 0 -- только платящие (выживший bias!)
GROUP BY cohort;
-- ✅ ПРАВИЛЬНО: включить всех (платящих и нет)
SELECT
DATE_TRUNC('month', signup_date) as cohort,
COUNT(*) as users,
AVG(COALESCE(revenue, 0)) as avg_revenue
FROM users
GROUP BY cohort;
Типичные ошибки репрезентативности
| Ошибка | Описание | Решение |
|---|---|---|
| Selection Bias | Выбираешь не случайно | Используй random.sample() |
| Survivorship Bias | Анализируешь только оставшихся | Включай удаленные/неудачные |
| Volunteer Bias | Анализируешь только желающих | Требуй участие случайных |
| Temporal Bias | Анализируешь только определенное время | Охватывай разные периоды |
| Geographic Bias | Охватываешь только один регион | Включай все регионы пропорционально |
Размер выборки vs Репрезентативность
100 человек (случайно отобраны) → репрезентативно
10 млн человек (все молодые) → не репрезентативно
Репрезентативность зависит больше от СПОСОБА отбора,
чем от SIZE выборки
Ключевые моменты для собеседования
Репрезентативность важна потому что:
- ✅ Позволяет делать обобщения на всю популяцию
- ✅ Результаты A/B тестов становятся надежными
- ✅ Прогнозы на основе выборки будут точными
Как проверить репрезентативность:
- Сравнить параметры выборки с популяцией
- Chi-square тест на распределение
- Визуальный анализ (histogram, boxplot)
Как обеспечить:
- Случайный отбор
- Стратифицированная выборка
- Достаточный размер
- Учет всех групп (не только успешные)