Ответ
Оценка репрезентативности — это проверка, насколько хорошо выборка отражает генеральную совокупность. Я делаю это по нескольким направлениям.
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).
- На графиках всё похоже.
- Доли мужчин, женщин и прочих категорий не разъехались. Если всё сошлось — выборка огонь, можно работать. Если нет — иди переделывай, распиздяй.