Как мы очищаем данные
Наш подход к качеству данных, подробно.
Данные о качестве воздуха с реальных датчиков — это хаос. Приборы ломаются. Показания скачут без видимой причины. Датчик зависает и часами передаёт одно и то же число. Государственная станция меняет единицы измерения без предупреждения.
Если публиковать эти данные как есть, люди сделают неверные выводы. Если тихо удалять плохие части, люди не смогут проверить, что вы сделали. Ни один из этих вариантов нас не устраивает.
Наш подход — быть тщательными и прозрачными: проверить всё что можно, отметить каждую проблему открыто и дать людям увидеть, что именно мы сделали и почему. Вот как.
Архитектура
Три уровня, один принцип
Оригинальные данные священны. Мы никогда их не модифицируем. Вместо этого мы строим чистые данные поверх них — и сохраняем связь между ними, чтобы любой мог проследить любое опубликованное значение до его исходного источника.
Уровень 0
Сырое хранение
Точные ответы, полученные от каждого API, сохранённые как есть. Одна таблица на источник. Ничего не изменено, ничего не потеряно. Это наша основа.
Уровень 1
Чистые и гармонизированные
Все источники приведены к общим единицам, все измерения в едином формате. Каждая строка несёт флаги качества и ссылку на исходные данные. Здесь происходит очистка и валидация.
Уровень 2
Опубликованные открытые данные
Только измерения, прошедшие все проверки качества. Это то, что вы скачиваете — сжатые CSV-файлы, реестр станций CSV, GeoJSON для картографии. Чистые, надёжные, готовые к использованию.
Контроль качества
Четыре уровня проверок
Каждый уровень ловит разные виды проблем. Измерение должно пройти все четыре, прежде чем попадёт в опубликованный набор данных.
На входе
Ещё до того, как данные попадут в систему, сама база данных применяет базовые правила — обязательные поля не могут быть пустыми, дубликаты отклоняются, координаты должны быть валидными, принимаются только известные коды параметров. Сломанные или неполные ответы API отлавливаются здесь.
Во время очистки
При преобразовании сырых данных в гармонизированный формат каждое измерение проверяется индивидуально: физически ли возможно это значение? PM2.5 выше PM10 (что обычно указывает на проблему датчика)? Отрицательная ли концентрация? Каждая проблема получает конкретный флаг.
Автоматические правила очистки
Каждое часовое значение проходит одни и те же правила перед публикацией. Значения, не прошедшие проверку, остаются в нашей базе с пометкой и не попадают в опубликованные файлы:
- Жёсткий предел — значения на уровне физического предела и выше (1 000 мкг/м³ для PM2.5) считаются невалидными
- Константная станция — месяц станции, в котором одно и то же значение составляет 70% показаний и более
- Зависший датчик — одно и то же значение повторяется 6 и более часов подряд
- Мёртвый канал пыли — датчик PM2.5, PM10 или TSP, у которого суточная медиана ниже 2 мкг/м³ десять и более дней в течение месяца (так отказывают каналы КазГидроМета: они продолжают показывать около 1 мкг/м³)
- Дублирующий канал пыли — PM2.5, который повторяет значение PM10 той же станции (в пределах 2%) не менее половины часов суток. PM2.5 — часть PM10 и не может долго ей равняться, поэтому значения PM2.5 за такие дни и за период, в котором они повторяются, не публикуются
- Приподнятый пол — канал пыли, который никогда не опускается: 30 дней, в течение которых даже самые чистые часы каждого дня остаются на уровне 30 мкг/м³ и выше. В настоящем воздухе за месяц всегда бывают чистые часы; если прибор их не показывает, он прибавляет смещение или завис на высоком значении
- Шумящий канал — канал пыли, который скачет от часа к часу: двенадцать и более дней за месяц типичное изменение за час составляет 40% суточного уровня и более. Настоящая пыль растёт и спадает часами, а не случайно от измерения к измерению
- Выброс относительно района — станция, чьё суточное среднее отклоняется от медианы своего района более чем на 3 робастных стандартных отклонения
- Дубли источников — если два источника передают одну и ту же станцию и час, остаётся одно значение
- За пределами Алматы, Астаны и Караганды в большинстве городов одна станция, поэтому правила сравнивают станцию только с самой собой: жёсткие пределы, значение насыщения прибора, одно и то же значение 24 часа и дольше, нулевая пыль 6 часов и дольше, а также правила мёртвого, дублирующего, «приподнятого» и шумящего каналов пыли, описанные выше. Короткие серии на пределе обнаружения прибора и часовые пики сохраняются — рядом с промышленностью такие пики настоящие
Финальная валидация
Перед публикацией мы запускаем две независимые системы валидации по всему набору данных. Если любая из них находит проблему — даже одну непройденную проверку — публикация блокируется до решения проблемы.
Детали
Проверки валидации
Это конкретные проверки, которые запускаются перед каждой публикацией. Ошибки блокируют экспорт полностью. Предупреждения логируются и проверяются.
| Проверка | Критичность | Что отлавливает |
|---|---|---|
| out_of_range | error | Значения за физическими пределами |
| negative_values | error | Отрицательные концентрации |
| invalid_floats | error | Значения NaN, Infinity |
| orphan_measurements | error | Измерения без зарегистрированной станции |
| duplicate_measurements | error | Дубликаты, которых не должно быть |
| pm25_exceeds_pm10 | warning | Известная проблема датчиков AirKaz |
| stuck_sensors | warning | Зависшие показания датчиков |
| spikes | warning | Резкие скачки значений |
| stale_stations | warning | Активные станции без данных 48+ часов |
Мы знаем, что такой уровень детализации — не для всех. Большинство людей просто хотят скачать данные и верить, что они чистые. Мы надеемся, что так и есть.
Но для тех, кто хочет заглянуть под капот — исследователей, инженеров, всех, кто обжигался на плохих данных — мы хотим, чтобы всё было видно. Методология, флаги, сырые оригиналы. Таким проектом мы хотим быть.