Проверки качества данных должны выполняться до того, как кто-либо увидит цифры
У каждого аналитика случалась встреча, на которой кто-то другой обнаружил ошибку. Это почти никогда не бывает тонким. Это дублированный ключ, отсутствующая неделя или категория, переименованная в исходном коде, и все они выявляются проверками, выполнение которых занимает десять минут.
Что вы делаете: запускаете эти восемь, прежде чем что-либо создавать, сохраняете результаты и сравниваете их с последним запуском.
Краткая версия. Десять минут в начале всегда лучше часа на совещании.
1. Подсчет строк по источнику
SELECT COUNT(*) FROM orders;
Сравните с собственным счетом исходной системы. Это самая ценная проверка, которую чаще всего пропускают. Он обнаруживает обрезанные файлы, неудачные загрузки и фильтр, добавленный кем-то в прошлом месяце. Версия той же ловушки в Excel находится в предел строки: файл, обрезанный на 1 048 576 строк, выглядит совершенно нормально.
2. Действительно ли ключ уникален?
SELECT order_id, COUNT(*) AS n
FROM orders
GROUP BY order_id
HAVING COUNT(*) > 1
ORDER BY n DESC;
Если это что-то возвращает, каждое соединение через order_id умножает строки, и каждая следующая сумма увеличивается. Проверьте ключ, по которому вы собираетесь присоединиться, а не только первичный ключ, поскольку ключ соединения часто представляет собой бизнес-столбец без каких-либо ограничений.
3. Нулевые значения в столбце
SELECT COUNT(*) AS rows,
SUM(CASE WHEN region IS NULL THEN 1 ELSE 0 END) AS null_region,
SUM(CASE WHEN amount IS NULL THEN 1 ELSE 0 END) AS null_amount,
SUM(CASE WHEN order_dt IS NULL THEN 1 ELSE 0 END) AS null_date
FROM orders;
Важно не сегодняшнее число, а изменение с момента последней загрузки. Столбец, в котором всегда было 2 процента нулевых значений, а затем внезапно стал нулевым 30 процентов, означает, что что-то изменилось в восходящем направлении, и никто вам об этом не сообщит.
4. Диапазоны и невозможные значения
SELECT MIN(amount), MAX(amount), AVG(amount),
SUM(CASE WHEN amount < 0 THEN 1 ELSE 0 END) AS negatives,
SUM(CASE WHEN amount = 0 THEN 1 ELSE 0 END) AS zeros
FROM orders;
Найдите значения-заполнители, которые системы используют для отсутствующих: -1, 0, 999, 9999 и дату 1900-01-01. Каждый из них будет усреднен в ваших результатах, как если бы он был реальным. Число 99 999 не является выбросом, это соглашение о вводе данных.
5. Разумное свидание
SELECT MIN(order_dt), MAX(order_dt) FROM orders;
SELECT strftime('%Y-%m', order_dt) AS month, COUNT(*)
FROM orders GROUP BY 1 ORDER BY 1;
Второй запрос следует внимательно прочитать. Пропущенный месяц или месяц с десятой частью обычного объема – это скорее провальная загрузка, чем период затишья в торговле. Будущие даты и даты до существования бизнеса указывают на проблемы синтаксического анализа, обычно файл с первым днем читается как первый с месяца.
6. Ссылочная целостность
SELECT COUNT(*) AS orphan_orders
FROM orders o
WHERE NOT EXISTS (SELECT 1 FROM customers c
WHERE c.customer_id = o.customer_id);
Сироты исчезают из любого внутреннего объединения, молча, забирая с собой свои доходы. Вот почему два отчета по одним и тем же данным могут отличаться на несколько процентов, причем ни один из них не является явно ошибочным. NOT EXISTS скорее, чем NOT IN, по причине NULL в анти-соединение.
7. Смещение категории
SELECT region, COUNT(*) FROM orders GROUP BY region ORDER BY 2 DESC;
Прочтите весь список, включая небольшие значения внизу. Новые категории появляются при перенастройке системы; старые перестают появляться, когда происходит переименование вверх по течению. В сгруппированном отчете будут показаны две строки там, где должна быть одна, и это будет выглядеть как настоящее разделение.
8. Сверьте одну сумму с чем-то внешним
Финансовая книга, опубликованный отчет за прошлый месяц, собственная информационная панель исходной системы. Один номер, договорились до копейки или объяснили. Все вышеперечисленное проверяет данные на себе; это единственная проверка, которая проверяет его на соответствие миру.
Десятиминутная рутина
| # | Проверить | Сбой, когда |
|---|---|---|
| 1 | Количество строк | Загрузка сокращена или отфильтрована |
| 2 | Ключевая уникальность | Объединения будут разветвляться |
| 3 | Нулевые ставки | Поле вверх по течению перестало заполняться |
| 4 | Диапазоны | Заполнители рассматриваются как значения |
| 5 | Диапазон дат и количество месяцев | Пропущена точка, плохой синтаксический анализ |
| 6 | Сироты | Строки исчезают при объединении |
| 7 | Список категорий | Переименование разделяет группу на две части |
| 8 | Внешнее примирение | Все внутри согласилось и все еще было неправильным |
Как применить это в своей работе
- Сохраните восемь запросов как один сценарий для каждого источника с заполненными именами таблиц.
- Запускайте его до начала сборки, а не после того, как кто-то задаст вопрос.
- Запишите результаты в таблицу журнала с указанием даты, чтобы стало видно отклонение.
- Поместите количество строк и сверку в сам отчет в виде сноски. Это меняет способ получения отчета.
- Если проверка не удалась, сообщите об этом владельцу источника. Тихие обходные пути означают, что один и тот же сбой происходит каждый месяц навсегда.
Единственная привычка, которую нужно сохранить
Проверьте, прежде чем строить. Работа в любом случае идентична; разница в том, нашли ли вы проблему или ее нашел кто-то другой, и эта разница во многом состоит в том, что люди имеют в виду, когда говорят, что аналитик надежен.
Какой из этих восьми не сработает с данными, которые вы использовали в последний раз?
SQL для аналитиков — это 458 страниц, которые считывают запросы построчно в повседневных словах, поэтому ошибочный результат нужно где-то отслеживать, а не перепечатывать, пока он не станет выглядеть лучше.
SQL для аналитиков, 19 $ →Профилирование исходной системы это более глубокая версия тех же проверок, и Исследовательский анализ данных это то, что вы делаете, когда данные проходят мимо них.
Читать «Профилирование источника» →