Введение
DAMA-DMBOK 2 (2017) формализовал 6 core data quality dimensions — completeness, accuracy, consistency, timeliness, uniqueness, validity. BCBS 239 (2013) и ECB RDARR Guide (May 2024) — основные регуляторные якоря, требующие quantified DQ-контролей на CDE с traceable evidence. GDPR Art. 5(1)(d) обязывает «accurate and, where necessary, kept up to date». IFRS 13 fair-value framework требует reliability в input data для measurement.
Эти 6 измерений — не абстрактный framework; они переводятся в конкретные control activities с SQL patterns, thresholds и потоками evidence. Этот урок — прямая карта: каждое измерение → control archetype → пример SwiftRide на CDE-SWR-002 (kyc_profile).
Обзор 6 измерений DAMA
| Измерение | Вопрос, на который отвечает |
|---|---|
| Completeness | Все ожидаемые записи / поля присутствуют? |
| Accuracy | Значения соответствуют real-world / source-of-truth? |
| Consistency | Значения согласованы между системами / во времени? |
| Timeliness | Data достаточно свежий per SLA? |
| Uniqueness | Нет дубликатов там, где invariant required? |
| Validity | Значения соответствуют определённым domain rules? |
Каждое измерение отвечает на отдельный вопрос; multi-dimensional coverage обязательно для material CDE. Single-dimension coverage (например, «у нас completeness и timeliness» без accuracy / consistency) — типичный признак незрелой CDE-программы.
Измерение 1 — Completeness
Определение: все ожидаемые записи и поля присутствуют.
SQL pattern
-- Field-level: NULL rate
SELECT COUNT(*) FILTER (WHERE document_number_hash IS NULL) * 1.0 / COUNT(*) AS null_rate
FROM kyc_profile
WHERE created_at >= current_date - interval '1 day';
-- Row-level: ожидаемый vs фактический count
SELECT
CASE
WHEN COUNT(*) BETWEEN expected_min AND expected_max THEN 'pass'
ELSE 'fail'
END AS completeness_status
FROM kyc_profile, completeness_expectations
WHERE created_at = current_date;
Настройка threshold
- Field-level NULL rate: ≤0.01% для CDE required fields.
- Row-level: ожидаемый count ±5% trailing 30-day average (ловит резкие падения ingestion).
Evidence
GE Core 1.17.1 expectation expect_column_values_to_not_be_null + result JSON; row count delta логируется в S3 object lock; failure → PagerDuty Sev-2.
KYC profile SwiftRide
CDE-SWR-002 kyc_profile — required fields: kyc_id, customer_id, document_type, document_number_hash, biometric_match_score, kyc_status, verified_at. Null rate threshold 0.005% (более строгий, чем baseline — gap в поле KYC = gap в regulatory submission). Ожидаемый daily inflow: 8K-15K новых KYC per day (40 стран × ~250-400 на страну). Row count <7K → completeness fail + AML compliance review.
Измерение 2 — Accuracy
Определение: значения соответствуют real-world / source-of-truth.
SQL pattern
-- Cross-system accuracy: наша система vs внешний source
WITH ours AS (
SELECT customer_id, kyc_status FROM kyc_profile WHERE verified_at >= current_date - interval '7 days'
), external_source AS (
SELECT customer_id, kyc_status FROM external_kyc_provider_export
)
SELECT COUNT(*) FILTER (WHERE ours.kyc_status != external_source.kyc_status) AS mismatches
FROM ours INNER JOIN external_source USING (customer_id);
Настройка threshold
- Mismatch rate ≤0.1% для cross-system reconciliation.
- Sample-based ручная верификация — квартально 25 KYC records вручную верифицируются против оригинальных документов.
Evidence
Reconciliation log entry с mismatched IDs (для follow-up); отчёт ручной верификации, подписанный комплаенс-офицером KYC.
Регуляторный якорь
BCBS 239 Principle 3 — «largely automated aggregation; minimised manual workarounds; reconciliation to source». GDPR Art. 5(1)(d) — personal data «accurate and, where necessary, kept up to date».
KYC profile SwiftRide
Onfido — внешний KYC-провайдер; еженедельная reconciliation kyc_profile.kyc_status против Onfido export. Mismatches: расследуются в течение 5 рабочих дней; flag к AML Compliance Lead.
Измерение 3 — Consistency
Определение: значения согласованы между системами / во времени.
SQL pattern
-- Cross-table consistency: rules-based
SELECT customer_id
FROM kyc_profile p
INNER JOIN customer_master m ON p.customer_id = m.customer_id
WHERE p.country_code != m.country_code -- должны быть согласованы
OR (p.kyc_status = 'approved' AND m.account_status = 'closed') -- противоречие
;
Настройка threshold
- Cross-table contradictions: нулевая толерантность для material business rules.
- Drift detection — ежемесячный статистический анализ, сравнивающий распределения против trailing 12-month baseline.
Evidence
Anomalo detection alerts; dbt-expectations test results; ежемесячный архив отчёта о статистическом drift.
KYC profile SwiftRide
Правила:
kyc_status = 'approved'→customer_master.account_statusMUST be in{'active', 'suspended', 'closed'}(не ‘pending’).country_codeвkyc_profileMUST соответствоватьcustomer_master.primary_country_code.biometric_match_score >= 0.95ANDdocument_type = 'passport'→ ожидается verified в течение 24h.
Detection rule violations: ServiceNow-инцидент; AML Compliance review.
Измерение 4 — Timeliness
Определение: data достаточно свежий per SLA.
SQL pattern
-- Freshness check
SELECT
MAX(verified_at) AS latest_record,
current_timestamp - MAX(verified_at) AS staleness
FROM kyc_profile;
-- Late-arriving data tracking
SELECT COUNT(*) AS late_arrivals
FROM kyc_profile
WHERE verified_at < current_date - interval '24 hours'
AND created_at >= current_date - interval '1 day';
Настройка threshold
- SLA: KYC profile обновляется в течение 24h после подачи.
- Late arrival rate ≤2%.
Evidence
Airflow DAG SLA monitoring; PagerDuty incidents при SLA breach.
KYC profile SwiftRide
KYC submission → Onfido processing → kyc_profile updated. SLA: 24h. >24h pending count → Sev-3 alert; >48h → Sev-2 + эскалация к AML Compliance Lead.
Измерение 5 — Uniqueness
Определение: нет дубликатов там, где invariant required.
SQL pattern
-- Primary key uniqueness (должно быть 0)
SELECT customer_id, COUNT(*)
FROM kyc_profile
GROUP BY customer_id
HAVING COUNT(*) > 1;
-- Business-key uniqueness (один approved KYC per customer per country)
SELECT customer_id, country_code, COUNT(*)
FROM kyc_profile
WHERE kyc_status = 'approved'
GROUP BY customer_id, country_code
HAVING COUNT(*) > 1;
Настройка threshold
- Primary key: 0 duplicates (hard constraint).
- Business key: 0 duplicates для invariants; залогированные exceptions для сценариев перепроверки.
Evidence
dbt unique test result; database PRIMARY KEY enforcement; exception log, если business rule разрешает контролируемые duplicates.
KYC profile SwiftRide
kyc_id — primary key, hard constraint. (customer_id, country_code, document_type) — business key для approved status; duplicates здесь = проблема качества данных или multi-KYC сценарий (легитимный в некоторых юрисдикциях).
Измерение 6 — Validity
Определение: значения соответствуют определённым domain rules.
SQL pattern
-- Domain rule: country_code должен быть ISO 3166-1 alpha-2
SELECT customer_id, country_code
FROM kyc_profile
WHERE country_code NOT IN (SELECT iso_code FROM ref_country_iso_3166);
-- Domain rule: biometric_match_score должен быть 0.0 - 1.0
SELECT kyc_id, biometric_match_score
FROM kyc_profile
WHERE biometric_match_score IS NOT NULL
AND (biometric_match_score < 0 OR biometric_match_score > 1);
Настройка threshold
- Domain violations: нулевая толерантность (hard validation).
- Соответствие regex pattern для
email,phone,vat_number: нулевая толерантность.
Evidence
dbt accepted_values test result; результаты GE expectation suite; отклонённые записи в dead-letter queue (DLQ) с reason code.
KYC profile SwiftRide
country_codeIN ISO 3166-1 alpha-2 codes (40 рынков SwiftRide).document_typeIN('passport', 'national_id', 'driver_license', 'residence_permit').kyc_statusIN('pending', 'in_review', 'approved', 'rejected', 'expired').biometric_match_scoreBETWEEN 0.0 AND 1.0.
Mapping 6 измерений ↔ регуляторные требования
| Измерение | BCBS 239 | GDPR | IFRS | EU AI Act |
|---|---|---|---|---|
| Completeness | BCBS 239 Principle 4 | — | — | EU AI Act Art. 10(3) |
| Accuracy | Principle 3 | Art. 5(1)(d) | IFRS 13 fair value reliability | Art. 10(2) error-free |
| Consistency | Principle 3, 7 | Art. 5(1)(d) | — | Art. 10(2) |
| Timeliness | Principle 5 (timeliness) | Art. 5(1)(d) «kept up to date» | — | Art. 10(3) representativeness |
| Uniqueness | Principle 3 (integrity) | — | — | Art. 10(2) |
| Validity | Principle 3 (integrity) | Art. 5(1)(d) | — | Art. 10(2) |
BCBS 239 — наиболее полное покрытие. ECB RDARR Guide (May 2024) — операционализация для euro-area significant institutions.
SwiftRide CDE-SWR-002 KYC profile — 6 измерений per dataset
Каждое измерение с threshold, специфичной реализацией SwiftRide и индикатором tooling support. Наведите для tooltip.
6 измерений, реализующих 14 control activities (некоторые измерения имеют несколько проверок); все с потоками evidence в S3 object lock + retention 7y (SOX) + GDPR overlay (per Art. 30 — длительность processing).
Для CDE-SWR-002 KYC profile — GX Core expectation suite:
from great_expectations.dataset import SqlAlchemyDataset
# Suite: kyc_profile_validity_suite
dataset.expect_column_values_to_not_be_null(
column="document_number_hash",
mostly=0.99995 # threshold 0.005% null max
)
dataset.expect_column_values_to_be_in_set(
column="country_code",
value_set=["NL", "DE", "FR", "..."] # 40 рынков
)
dataset.expect_column_values_to_be_in_set(
column="document_type",
value_set=["passport", "national_id", "driver_license", "residence_permit"]
)
dataset.expect_column_values_to_be_between(
column="biometric_match_score",
min_value=0.0,
max_value=1.0,
allow_cross_type_comparisons=False
)
dataset.expect_column_value_lengths_to_be_between(
column="document_number_hash",
min_value=64, # SHA-256 hex
max_value=64
)Результаты валидации → Data Docs HTML → S3 object lock; queryable by suite_id + run_timestamp. Failed expectations → PagerDuty (severity per измерение) + ServiceNow ticket.
Версия 1.17.1 — текущая per PyPI release timing late 2025. Legacy v0.x deprecated в 2026.
Сравнение tooling support
| Инструмент | Сильная сторона | Применение SwiftRide |
|---|---|---|
| dbt tests (1.9.x) | Самый дешёвый, встроен в build, in-repo evidence | Hard rules уровня test (unique, not_null, accepted_values, relationships) |
| dbt-expectations | Более богатые GE-style tests как dbt YAML | Расширенные domain rules (regex, between, type) inline в dbt project |
| GE Core (1.17.1) | Зрелая expectations library, Data Docs HTML evidence | Сложные inline validation suites; standalone runs, если пайплайн не dbt |
| Soda Core 4.0 (2025) | Data-contract-first; SodaCL DSL; in-VPC Soda Agent + Soda Cloud reviewer workflow | Контракты SwiftPay на cross-team handoff data |
| Anomalo (SaaS) | Unsupervised ML anomaly detection per table; ML thresholds; root-cause analysis | Drift detection «unknown unknowns» на распределениях KYC ежемесячно |
| Monte Carlo (SaaS) | Data observability — freshness, volume, schema, distribution, lineage incidents | Pipeline incidents + cross-tool observability layer |
| Elementary (OSS + Cloud) | dbt-native anomaly tests + отчёт для стейкхолдеров | Дашборды для стейкхолдеров без dbt-экспертизы |
Правило выбора: dbt tests/dbt-expectations baseline для hard rules in-repo (самый дешёвый путь SOX evidence); GE Core для сложных inline suites; Anomalo / Monte Carlo для drift detection. Состояние SwiftRide T+9M — dbt + GE Core baseline; оценка Anomalo для anomaly detection layer.
Anti-patterns
Покрытие одного измерения
Паттерн: «у нас completeness checks для всех CDE; качество хорошее».
Почему плохо: completeness не ловит accuracy / consistency / validity / uniqueness / timeliness errors. KYC record может быть complete (все fields populated), но значения wrong, или дубликаты есть, или присутствуют schema-violating values.
Fix: defense-in-depth по измерениям — каждый material CDE минимум 4 из 6 измерений covered.
DQ tests без regulatory mapping
Паттерн: команда реализует DQ tests на основе интуиции, не на основе конкретного регуляторного требования.
Почему плохо: при аудите, существование DQ tests ≠ regulatory compliance. Если аудит спрашивает «как обеспечивается GDPR Art. 5(1)(d) accuracy», команда не может прямо проследить к специфическим тестам.
Fix: каждый DQ test linked к специфической regulatory citation (BCBS Principle, GDPR Art, EU AI Act Art). Сохраняется в control registry.
Настройка threshold без статистической базы
Паттерн: «threshold = 5%; почему — потому что круглое число».
Почему плохо: thresholds без статистической базы либо too lenient (ничего не ловит), либо too strict (alert fatigue).
Fix: threshold derive из trailing 30-90 day baseline ± standard deviations; tune per измерение со специфическим анализом failure-mode.
Evidence в дашбордах DQ-инструмента, не в S3
Паттерн: «всё видно в Monte Carlo / Anomalo дашбордах».
Почему плохо: дашборды mutable, vendor-controlled, не SOX-grade retention.
Fix: результаты DQ-инструмента — operational signal; primary evidence — exported snapshots в S3 object lock 7y retention.
Резюме
- 6 DQ dimensions (DAMA-DMBOK 2): completeness, accuracy, consistency, timeliness, uniqueness, validity. Каждое отвечает на отдельный вопрос; multi-dimensional coverage обязательно для material CDE.
- На измерение: SQL pattern + настройка threshold + поток evidence + регуляторный якорь (BCBS 239, GDPR, IFRS, EU AI Act).
- BCBS 239 Principle 3 (accuracy/integrity) + Principle 4 (completeness) + Principle 5 (timeliness) — наиболее полный regulatory framework. ECB RDARR Guide May 2024 — операционализация.
- GDPR Art. 5(1)(d) — accuracy + kept up to date. EU AI Act Art. 10 — измерения training data требуются (особенно для high-risk AI). IFRS 13 — fair value reliability.
- Tooling layered: dbt tests baseline (самый дешёвый in-repo) + GE Core 1.17.1 expectation suites + Soda Core 4.0 contracts + Anomalo / Monte Carlo drift detection. dbt + GE — baseline SwiftRide.
- Evidence — дашборды DQ-инструмента = operational signal; primary evidence S3 object lock 7y retention. Всегда экспортируем snapshots.
В M5.6 разберём cross-system reconciliation подробно — PostgreSQL OLTP ↔ Snowflake warehouse, real-time против batch, late-arriving data, audit-grade evidence.
dbt Quality Tests — DQ dimensions в коде Freshness и Timeliness — observability-контроли