Как оценить репрезентативность выборки?

Ответ

Оценка репрезентативности — это проверка, насколько хорошо выборка отражает генеральную совокупность. Я делаю это по нескольким направлениям.

1. Сравнение ключевых статистик Сравниваю основные метрики (среднее, медиану, стандартное отклонение) между выборкой и популяцией (или между обучающей и тестовой выборками).

import pandas as pd
import numpy as np

# Допустим, у нас есть данные о популяции и выборке
print("Сравнение средних:")
for col in ['age', 'income', 'score']:
    pop_mean = population[col].mean()
    samp_mean = sample[col].mean()
    diff_pct = abs((pop_mean - samp_mean) / pop_mean) * 100
    print(f"  {col}: Популяция={pop_mean:.2f}, Выборка={samp_mean:.2f}, Отклонение={diff_pct:.1f}%")

2. Проверка распределений с помощью визуализации и статистических тестов

  • Визуализация: Строю гистограммы или ECDF (Empirical Cumulative Distribution Function) для наглядного сравнения.
import matplotlib.pyplot as plt
import seaborn as sns

fig, axes = plt.subplots(1, 2, figsize=(12, 4))
# Гистограммы
sns.histplot(population['age'], label='Population', kde=True, ax=axes[0], color='blue', alpha=0.5)
sns.histplot(sample['age'], label='Sample', kde=True, ax=axes[0], color='orange', alpha=0.5)
axes[0].legend()
axes[0].set_title('Distribution of Age')

# Boxplot для сравнения
sns.boxplot(data=[population['income'], sample['income']], ax=axes[1])
axes[1].set_xticklabels(['Population', 'Sample'])
axes[1].set_title('Comparison of Income')
plt.tight_layout()
  • Статистические тесты:
    • t-тест (для средних) или Mann-Whitney U test (для медиан) — проверяют, различаются ли центральные тенденции.
    • Тест Колмогорова-Смирнова (KS-test) — проверяет, различаются ли распределения в целом.
from scipy import stats

# KS-тест для возраста
ks_stat, ks_pvalue = stats.ks_2samp(population['age'], sample['age'])
print(f"KS-test p-value for age: {ks_pvalue:.4f}")
# p-value > 0.05 обычно говорит об отсутствии значимых различий в распределениях.

3. Проверка пропорций категориальных признаков (Стратификация) Убеждаюсь, что в выборке сохранены пропорции ключевых категорий (например, пол, регион, тариф).

# Сравнение долей по полу
pop_gender_ratio = population['gender'].value_counts(normalize=True)
samp_gender_ratio = sample['gender'].value_counts(normalize=True)
comparison = pd.DataFrame({'Population': pop_gender_ratio, 'Sample': samp_gender_ratio})
print(comparison)

4. Использование Bootstrap для оценки устойчивости Генерирую множество псевдовыборок из исходной выборки (bootstrap) и смотрю, насколько стабильны оцениваемые статистики (например, среднее). Большой разброс bootstrap-оценок может указывать на проблему с репрезентативностью.

Вывод: Я считаю выборку репрезентативной, если:

  • Ключевые статистики (средние, медианы) отличаются незначительно (например, <5%).
  • Статистические тесты (t-test, KS-test) не показывают значимых различий (p-value > 0.05).
  • Визуально распределения выглядят схоже.
  • Пропорции важных категориальных признаков сохранены.

Ответ 18+ 🔞

Давай разберём эту тему, а то у меня уже подозрение ёбать чувствую, что народ часто на этом прокалывается. Репрезентативность — это, по сути, проверка, не наебал ли ты сам себя, когда данные собирал. Выборка должна быть как срез торта: откусил кусок — и понял, каков весь торт на вкус, а не как будто хапнул только крем с верхушек.

1. Сравнение ключевых статистик Первым делом я просто тупо сравниваю основные цифры между всей толпой (популяцией) и моей отобранной кучкой (выборкой). Если средние и медианы пляшут на 20-30%, это уже пиздец, а не выборка.

import pandas as pd
import numpy as np

# Допустим, у нас есть данные о популяции и выборке
print("Сравнение средних:")
for col in ['age', 'income', 'score']:
    pop_mean = population[col].mean()
    samp_mean = sample[col].mean()
    diff_pct = abs((pop_mean - samp_mean) / pop_mean) * 100
    print(f"  {col}: Популяция={pop_mean:.2f}, Выборка={samp_mean:.2f}, Отклонение={diff_pct:.1f}%")

Если отклонение, как у трезвого таксиста — в пределах 5%, то ок. Если больше — волнение ёбать, надо копать дальше.

2. Проверка распределений с помощью визуализации и статистических тестов

  • Визуализация: Тут без графиков нихуя не понятно. Надо глазами глянуть, похожи ли рожи у распределений.
import matplotlib.pyplot as plt
import seaborn as sns

fig, axes = plt.subplots(1, 2, figsize=(12, 4))
# Гистограммы
sns.histplot(population['age'], label='Population', kde=True, ax=axes[0], color='blue', alpha=0.5)
sns.histplot(sample['age'], label='Sample', kde=True, ax=axes[0], color='orange', alpha=0.5)
axes[0].legend()
axes[0].set_title('Distribution of Age')

# Boxplot для сравнения
sns.boxplot(data=[population['income'], sample['income']], ax=axes[1])
axes[1].set_xticklabels(['Population', 'Sample'])
axes[1].set_title('Comparison of Income')
plt.tight_layout()

Если на графиках выборка лежит поверх популяции как родная, то хорошо. Если торчит как хуй с горы — плохо.

  • Статистические тесты:
    • t-тест или Mann-Whitney U test — чтобы проверить, не сдвинулась ли середина.
    • Тест Колмогорова-Смирнова (KS-test) — это уже тяжёлая артиллерия, проверяет, различаются ли распределения в целом, а не только средние.
from scipy import stats

# KS-тест для возраста
ks_stat, ks_pvalue = stats.ks_2samp(population['age'], sample['age'])
print(f"KS-test p-value for age: {ks_pvalue:.4f}")
# p-value > 0.05 обычно говорит об отсутствии значимых различий в распределениях.

Здесь главное — p-value. Если он больше 0.05, можно выдохнуть: статистически значимой разницы нет. Если меньше — всё, приехали, выборка кривая.

3. Проверка пропорций категориальных признаков (Стратификация) Это вообще основа основ. Ну не может быть, чтобы в популяции было 50% мужчин и 50% женщин, а в твоей выборке одни мужики, ёпта. Надо смотреть.

# Сравнение долей по полу
pop_gender_ratio = population['gender'].value_counts(normalize=True)
samp_gender_ratio = sample['gender'].value_counts(normalize=True)
comparison = pd.DataFrame({'Population': pop_gender_ratio, 'Sample': samp_gender_ratio})
print(comparison)

Если пропорции плюс-минус совпадают — отлично. Если нет — ты, блядь, собрал не репрезентативную выборку, а манда с ушами.

4. Использование Bootstrap для оценки устойчивости Это такой хитрый приём: ты из своей выборки как будто с возвращением тыщи раз вытаскиваешь новые выборки и смотришь, как прыгает, например, среднее значение. Если оно скачет как угорелое — доверия к твоей исходной выборке ноль ебать.

Итог: Когда я всё это проделал, я могу сказать, репрезентативна выборка или нет. Критерии простые:

  • Ключевые цифры не уехали далеко (<5% разницы).
  • Статтесты молчат (p-value > 0.05).
  • На графиках всё похоже.
  • Доли мужчин, женщин и прочих категорий не разъехались. Если всё сошлось — выборка огонь, можно работать. Если нет — иди переделывай, распиздяй.