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

В чём разница между экспериментальными и обсервационными данными?

2.0 Middle🔥 171 комментариев
#A/B-тестирование#Статистика и теория вероятностей

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Экспериментальные и обсервационные данные: Различия и применение

Этот вопрос касается фундаментального различия в методах сбора данных и их влияния на выводы, которые мы можем из них сделать. Данные различаются по способу сбора, степени контроля и способности устанавливать причинно-следственные связи.

Экспериментальные данные (Experimental Data)

Определение

Данные, собранные в контролируемой среде, где исследователь намеренно манипулирует независимыми переменными (treatment) и наблюдает эффект на зависимые переменные (outcomes).

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

  • Рандомизация: участников случайно распределяют в контрольную и опытную группы
  • Контроль переменных: все прочие переменные остаются постоянными
  • Причинность: можно установить причинно-следственные связи
  • Чистый эффект: измеряется истинный эффект treatment

Примеры в бизнесе

  • A/B тесты: случайные 50% пользователей видят красную кнопку (treatment), 50% зелёную (control)
  • Рандомизированные контрольные тесты (RCT): новый курс получает случайная половина студентов
  • Лабораторные эксперименты: тестирование разного UI на фокус-группах

SQL: создание экспериментальных групп

-- Рандомизированное разделение
WITH randomized_users AS (
  SELECT 
    user_id,
    CASE 
      WHEN MOD(user_id::int, 2) = 0 THEN 'control'
      ELSE 'treatment'
    END as experiment_group
  FROM users
  WHERE created_at >= '2024-03-01'
)
SELECT 
  experiment_group,
  COUNT(*) as user_count,
  ROUND(100.0 * COUNT(*) / SUM(COUNT(*)) OVER (), 2) as pct
FROM randomized_users
GROUP BY experiment_group;
-- Output:
-- control    | 5023  | 50.23%
-- treatment  | 4977  | 49.77%

Преимущества экспериментальных данных

  1. Причинность: можем утверждать "treatment X привёл к outcome Y"
  2. Чистота: эффект изолирован от других факторов
  3. Воспроизводимость: результаты воспроизводимы при повторении
  4. Статистическая мощь: контролируемые условия дают более надёжные выводы

Недостатки

  1. Дорого: требует ресурсов и времени
  2. Этические ограничения: нельзя тестировать всё (напр., вред)
  3. Малый масштаб: часто на меньших выборках
  4. Искусственность: лабораторные условия не отражают реальность

Обсервационные данные (Observational Data)

Определение

Данные, которые собираются путём наблюдения за естественным поведением, без какого-либо вмешательства со стороны исследователя. Мы смотрим, что происходит в реальном мире, без контроля переменных.

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

  • Нет рандомизации: пользователи сами выбирают действия
  • Конфаундеры: много скрытых переменных влияют на исход
  • Ассоциация, не причинность: можем только найти корреляции
  • Реальность: данные из реального мира

Примеры в бизнесе

  • Веб-аналитика: анализ естественного поведения пользователей на сайте
  • CRM данные: история продаж, интерпретации клиентов
  • Логи приложения: как реальные пользователи используют продукт
  • Исторические данные: данные о прошлых событиях

SQL: обсервационные данные

-- Анализ корреляции между ценой и объёмом продаж
-- Это обсервационные данные: мы не контролируем цену
SELECT 
  product_id,
  price,
  COUNT(*) as orders,
  SUM(quantity) as total_quantity,
  AVG(price) as avg_price
FROM orders
GROUP BY product_id, price
ORDER BY avg_price DESC;

-- Вывод: может выглядеть как "выше цена → меньше заказов"
-- НО это не значит, что снижение цены приведёт к росту заказов!
-- Может быть, дорогие товары — премиум-класса, и их покупают другие люди

Преимущества обсервационных данных

  1. Доступность: часто уже есть в компании
  2. Масштаб: большие объёмы данных
  3. Реальность: естественное поведение, не лабораторные условия
  4. Скорость: быстро анализировать существующие данные
  5. Этичность: нет этических ограничений

Недостатки

  1. Конфаундинг: много скрытых переменных
  2. Selection bias: пользователи сами выбирают
  3. Обратная причинность: Y может вызывать X, а не наоборот
  4. Нет причинности: только корреляция

Пример: Цена и объём продаж

import pandas as pd
import numpy as np
from scipy.stats import pearsonr

# Обсервационные данные
df = pd.DataFrame({
    'product_id': range(1, 101),
    'price': np.random.uniform(10, 100, 100),
    'quality_tier': np.random.choice(['basic', 'premium'], 100)
})

# Quality влияет на цену И на объём продаж
df['price'] = df.apply(
    lambda row: row['price'] * 2 if row['quality_tier'] == 'premium' else row['price'],
    axis=1
)
df['volume'] = np.where(
    df['quality_tier'] == 'premium',
    np.random.normal(500, 100, 100),  # Premium товары продаются больше
    np.random.normal(200, 50, 100)     # Basic товары продаются меньше
)

# Корреляция price → volume (из обсервационных данных)
corr, p_value = pearsonr(df['price'], df['volume'])
print(f"Корреляция (observational): {corr:.3f}, p-value={p_value:.4f}")
# Output: Positive correlation! Выше цена → больше объём продаж

# НО это ложная корреляция! Конфаундер — quality_tier
# Решение: управление конфаундером
for tier in ['basic', 'premium']:
    tier_data = df[df['quality_tier'] == tier]
    corr, _ = pearsonr(tier_data['price'], tier_data['volume'])
    print(f"Корреляция для {tier}: {corr:.3f}")
# Output: Negative or near-zero correlations within each tier

# Экспериментальные данные были бы лучше:
# Снизить цену премиум товара (control) vs. оставить (treatment)
# И посмотреть реальный эффект

Методы работы с обсервационными данными

1. Управление конфаундерами (Confounder Control)

# Стратификация: анализ внутри однородных групп
df_stratified = df.groupby('region').apply(
    lambda x: pd.Series({
        'correlation': pearsonr(x['ad_spend'], x['revenue'])[0]
    })
)
print(df_stratified)

2. Propensity Score Matching

from sklearn.linear_model import LogisticRegression
from scipy.spatial.distance import cdist

# Оценить вероятность "treatment" (напр., использование новой версии)
X = df[['age', 'income', 'engagement']]
y = df['uses_new_version']

model = LogisticRegression()
model.fit(X, y)
df['propensity_score'] = model.predict_proba(X)[:, 1]

# Подобрать контрольные пользователи с похожим propensity score
treatment = df[df['uses_new_version'] == 1]
control = df[df['uses_new_version'] == 0]

matched_pairs = []
for _, treat_row in treatment.iterrows():
    ps = treat_row['propensity_score']
    closest_control = control.iloc[(control['propensity_score'] - ps).abs().argsort()[0]]
    matched_pairs.append({
        'treatment_user': treat_row['user_id'],
        'control_user': closest_control['user_id'],
        'ps_difference': abs(ps - closest_control['propensity_score'])
    })

print(f"Спарены {len(matched_pairs)} пар")

3. Разностный анализ (Difference-in-Differences)

Сравнить изменение до и после treatment между группами:

-- DID: до и после политики в одном регионе (treatment) vs. другом (control)
WITH metrics AS (
  SELECT 
    region,
    CASE WHEN date < '2024-03-01' THEN 'before' ELSE 'after' END as period,
    AVG(revenue) as avg_revenue
  FROM sales
  GROUP BY region, period
)
SELECT 
  t1.region,
  t1.avg_revenue as before,
  t2.avg_revenue as after,
  (t2.avg_revenue - t1.avg_revenue) as change,
  (t2.avg_revenue - t1.avg_revenue) / t1.avg_revenue as pct_change
FROM metrics t1
JOIN metrics t2 ON t1.region = t2.region
WHERE t1.period = 'before' AND t2.period = 'after'
ORDER BY pct_change DESC;

Сравнительная таблица

ХарактеристикаЭкспериментальныеОбсервационные
КонтрольПолныйМинимальный
РандомизацияДаНет
ПричинностьДаСложно
МасштабЧасто малыйЧасто большой
СтоимостьВысокаяНизкая
ВремяДолгоеБыстрое
РеальностьЛабораторнаяРеальная
Selection biasКонтролированВысокий риск

Практический подход

Начните с обсервационных данных:

  • Быстро идентифицировать гипотезы
  • Найти потенциальные эффекты
  • Управлять конфаундерами

Переходите к экспериментам:

  • Валидировать важные гипотезы
  • Устанавливать причинность
  • Принимать критичные решения

Комбинируйте оба подхода:

  • Обсервационные данные для масштаба и реальности
  • Эксперименты для валидации причинности
  • Sensitivity analysis для проверки robustness

Эффективный Data Analyst должен понимать оба типа данных, их ограничения и правильно интерпретировать результаты.