Теория множеств и дедупликация: вопросы для собеседования (часть 4)

Объединение, пересечение, разность множеств, DISTINCT, дедупликация — базовые операции при работе с данными. На собеседовании просят найти пользователей, которые есть в одной таблице, но отсутствуют в другой, или объяснить, почему UNION и UNION ALL дают разные результаты. Ошибки в дедупликации ведут к двойному подсчёту метрик.

Булева логика и фильтрыКачество данных и инвариантыВоронки и когортные рассужденияJOIN и кардинальностьПостановка задачиДоли и процентыSanity-check и оценкаСегментация и конфаундингВзвешенные средние и смешение

Вопросы 1620 из 20

16При расчёте объединения трёх множеств вы посчитали `|A ∪ B ∪ C| = |A| + |B| + |C| − |A ∩ B| − |A ∩ C| − |B ∩ C|`, но не добавили `|A ∩ B ∩ C|`. Какое смещение в оценке объединения вы получите?
AОценка не изменится: тройное пересечение всегда равно нулю, поэтому в формуле включения–исключения его можно опустить
BПереоцените объединение, потому что тройное пересечение учитывается дважды, и без поправки получается верхняя граница
CНедооцените парные пересечения, но объединение останется точным независимо от того, добавили вы тройное пересечение или нет
DНедооцените объединение, потому что тройное пересечение нужно добавить обратно, и без него получается нижняя граница
Ответ: В формуле включения–исключения для трёх множеств тройное пересечение нужно добавить обратно, иначе объединение получается заниженным.

Тройное пересечение входит в каждое одиночное множество и в каждое парное пересечение, поэтому при вычитании парных пересечений оно обнуляется. Но в объединении оно должно учитываться один раз, поэтому его нужно добавить обратно. Если тройное пересечение неизвестно, выражение без него даёт нижнюю границу для объединения. Это типичная проверка адекватности при работе с тремя каналами или сегментами.

Подробный разбор →
17У вас три множества для трёх кампаний: известны `|A|`, `|B|`, `|C|` и все парные пересечения, но тройное пересечение неизвестно. Что корректнее всего сделать, если нужно оценить объединение без доступа к сырым данным?
AПосчитать объединение по формуле `|A| + |B| + |C|` и игнорировать парные пересечения, потому что при крупных кампаниях вклад пересечений всегда мал
BПо принципу включения–исключения признать неопределённость тройного пересечения `|A∩B∩C|` и дать границы для объединения или запросить пересчёт по сырым данным
CВзять среднее значений `|A|`, `|B|`, `|C|` и считать его оценкой объединения трёх кампаний, потому что среднее ближе всего к истинному размеру охвата
DВыбрать максимум из `|A|`, `|B|`, `|C|` и считать его объединением, потому что вклад тройного пересечения всё равно сам исправит расхождения с реальностью
Ответ: Для трёх множеств точное объединение по принципу включения–исключения требует тройного пересечения, иначе остаются только границы.

Парные пересечения недостаточны, потому что тройное пересечение влияет на итог через знак плюс в формуле включения–исключения. Без него вы можете построить только диапазон возможных значений объединения, используя нижнюю и верхнюю границы для тройного пересечения. В продуктовой аналитике важно явно проговаривать такие допущения, чтобы не выдавать оценку за точный факт. Лучший вариант — запросить расчёт тройного пересечения по сырым данным.

Подробный разбор →
18Вы делаете `JOIN` таблицы `users` (1 строка на `user_id`) с таблицей `events` (много строк на `user_id`) и считаете `COUNT(users.user_id)` как уникальных пользователей в кампании. Получилось завышение. Какое исправление наиболее корректно?
AДедуплицировать на уровне `user_id`: использовать `COUNT(DISTINCT users.user_id)` или предварительно агрегировать `events` до набора `user_id`
BЗаменить `JOIN` на `UNION` между таблицами: пересечение строк исчезнет и счётчик перестанет завышать аудиторию кампании
CОставить `COUNT(users.user_id)` и поделить на среднее число `events` на пользователя для компенсации размножения строк
DСчитать `COUNT(DISTINCT event_id)` по таблице `events` как число уникальных пользователей в данной кампании
Ответ: После `JOIN` один `user_id` может повториться много раз, поэтому для уникальных пользователей нужна дедупликация через `DISTINCT`.

Когда вы присоединяете `events` к `users`, каждая строка `events` размножает строку `user_id`. Счётчик без дедупликации превращается в счётчик событий, а не аудитории. Правильная проверка адекватности — убедиться, что вы считаете размер набора `user_id`, например через `COUNT(DISTINCT user_id)`. Замена на `UNION` не решает задачу подсчёта уникальных пользователей в одной кампании; деление на среднее — эвристика без гарантий; а `COUNT(DISTINCT event_id)` считает события, а не пользователей.

Подробный разбор →
19Вы строите отчёт по платформе и видите iOS и Android. Какое утверждение о пересечении наиболее корректно в зависимости от ключа дедупликации?
AЕсли считать по `device_id`, пересечение между iOS и Android всегда больше нуля, потому что одно устройство учитывается в обеих платформах одновременно и не дедуплицируется
BЕсли считать уникальных пользователей по `user_id`, пересечение возможно: один человек заходит с двух устройств; если считать по `device_id`, такие множества обычно не пересекаются
CЕсли считать по `user_id`, пересечение между iOS и Android всегда равно нулю, потому что один пользователь не может быть учтён дважды в одном отчёте по платформам
DЕсли пересечение между iOS и Android получилось ненулевым, это всегда означает ошибку в данных и требует немедленного пересчёта отчёта по платформам
Ответ: Размер пересечения зависит от ключа дедупликации: `user_id` даёт кросс-платформенное пересечение, `device_id` делает множества почти раздельными.

Если цель — считать людей, используйте `user_id`: тогда один пользователь может попадать и в iOS, и в Android, создавая пересечение. Если цель — считать устройства, то `device_id` обычно уникален в пределах одной платформы, и пересечение будет близко к нулю. Утверждение про `device_id` всегда > 0 неверно: одно устройство почти никогда не работает на двух ОС. Утверждение про `user_id` всегда = 0 тоже неверно: люди свободно переключаются между телефоном и планшетом. И ненулевое пересечение само по себе не значит ошибку — это нормальное следствие выбранного ключа.

Подробный разбор →
20У вас три канала рассылок: e-mail — 100 тыс уникальных пользователей, push — 120 тыс, SMS — 60 тыс. Парные пересечения: e-mail и push = 40 тыс, e-mail и SMS = 10 тыс, push и SMS = 20 тыс. Тройное пересечение всех трёх каналов = 5 тыс. Сколько уникальных пользователей в объединении трёх каналов по формуле включений-исключений?
A210 тыс
B205 тыс
C280 тыс
D215 тыс
Ответ: Для трёх множеств формула включений-исключений использует сумму размеров, минус парные пересечения, плюс тройное пересечение.

При суммировании размеров множеств тройное пересечение учитывается три раза, а при вычитании парных пересечений оно вычитается тоже три раза, поэтому его нужно добавить обратно один раз. Формула: |A ∪ B ∪ C| = |A| + |B| + |C| − |A ∩ B| − |A ∩ C| − |B ∩ C| + |A ∩ B ∩ C|. Подставим: 100 + 120 + 60 − 40 − 10 − 20 + 5 = 215 тыс. Это типовая задача для оценки охвата уникальных пользователей по нескольким каналам.

Подробный разбор →
1234

Хотите тренировать интерактивно?

В приложении — таймер, прогресс, стрики и 1700+ вопросов по всем темам.

Открыть Карьерник в Telegram

Другие темы: Логика

Булева логика и фильтрыКачество данных и инвариантыВоронки и когортные рассужденияJOIN и кардинальностьПостановка задачиДоли и процентыSanity-check и оценкаСегментация и конфаундингВзвешенные средние и смешение