← Назад к вопросам

Что такое Репрезентативность?

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 тестов становятся надежными
  • ✅ Прогнозы на основе выборки будут точными

Как проверить репрезентативность:

  1. Сравнить параметры выборки с популяцией
  2. Chi-square тест на распределение
  3. Визуальный анализ (histogram, boxplot)

Как обеспечить:

  1. Случайный отбор
  2. Стратифицированная выборка
  3. Достаточный размер
  4. Учет всех групп (не только успешные)