Data Validation - Phần quan trọng nhất khi viết data model
Một phần trong công việc Product Data Scientist của mình là viết data model, tạo các data table và đưa vào database cho các nhu cầu sử dụng về báo cáo, phân tích. Tuỳ vào business logic mà những model có thể rất đơn giản, hoặc vô cùng phức tạp. Công ty mình sử dụng dbt để quản lý và duy trì quy trình ETL, và Airflow để lên lịch chạy và giám sát các quy trình này.
Mỗi lần viết một model, mình phải kiểm tra trong development environment trước. Khi code đã được kiểm tra kỹ càng và review bởi team, code mới được đưa vào chạy trong production.
Trước khi mình viết data model, mình đã đặt ra sẵn những kỳ vọng về kết quả, để giúp định hướng cách viết code ngay từ đầu. Mình sẽ viết thêm về phần này sau. Đối với riêng mình, phần quan trọng nhất trong cả quá trình tạo data model vẫn là phần cuối, data validation - xác thực lại kết quả.
Tuỳ trường hợp sẽ phải dùng các test khác nhau. Nhưng sau đây là các test phổ biến nhất mình hay dùng.
1/ Grain of data: Mỗi dòng trong data table có đúng như mình đã lên kế hoạch không
Đây là bài kiểm tra để xác thực xem mình có duplication trong bảng dữ liệu hay không. Đặc biệt, khi đây là data model mới, mình sẽ kiểm tra cái này đầu tiên.
Nếu mình đã dự kiến mỗi dòng là một khách hàng, mà mình ra kết quả mỗi customer ID có đến vài dòng, thì phải kiểm tra lại code hoặc upstream table (table mình dùng trong data model này)
SELECT
customer_id, COUNT(1)
FROM table
GROUP BY customer_id
HAVING COUNT(1) > 1
2/ Số dòng và số cột thay đổi thế nào so với production
Với những data model đã có sẵn, đã chạy trong production mà mình cần thêm hoặc thay đổi logic, mình cần kiểm tra xem số dòng và số cột thay đổi có giống như dự kiến hay không.
WITH dev_table_info AS (
SELECT
'dev' AS version,
COUNT(*) AS count_rows,
(SELECT COUNT(*) FROM `your_project.your_dataset.INFORMATION_SCHEMA.COLUMNS`
WHERE table_name = 'your_dev_table_name') AS count_columns
FROM `your_project.your_dataset.your_dev_table_name`
),
prod_table_info AS (
SELECT
'prod' AS version,
COUNT(*) AS count_rows,
(SELECT COUNT(*) FROM `your_project.your_dataset.INFORMATION_SCHEMA.COLUMNS`
WHERE table_name = 'your_prod_table_name') AS count_columns
FROM `your_project.your_dataset.your_prod_table_name`
)
SELECT * FROM dev_table_info
UNION ALL
SELECT * FROM prod_table_info;
3/ Missing data: Dữ liệu không bị thiếu, NULL ở những chỗ mình không dự kiến
Nếu bạn đang dùng dbt, bạn có thể set up sẵn test này (link). Còn không, có thể sử dụng query sau
SELECT
SUM(IF(column1 IS NULL, 1, 0)) AS count_nulls_column1,
SUM(IF(column2 IS NULL, 1, 0)) AS count_nulls_column2
FROM table
4/ Business rule: xác nhận các quy tắc business đúng với dự kiến
Mỗi business sẽ có những rule cụ thể.
Ví dụ như promotion code giảm giá không quá 50%. Bạn không những phải kiểm tra xem có trường hợp nào vượt quá 50% hay không, mà còn phải kiểm tra xem có trường hợp âm nào không. Phần trăm giảm giá mà âm thì đâu còn là giảm giá nữa đúng không?
SELECT
count(1)
FROM table
WHERE promotion_percentage < 0 OR promotion_percentage > 0.5
5/ Độ tin cậy của dữ liệu: So sánh dữ liệu với Source of Truth (nguồn sự thật)
Mỗi công ty sẽ có source of truth cho dữ liệu khác nhau. Thường thì đây sẽ là hệ thống nơi tạo ra dữ liệu, nguồn thông tin gốc.
Để tránh các trường hợp stakeholder hỏi bạn: “Tại sao dữ liệu của em nói khách mua 500 cái áo tháng trước, mà trong hệ thống lại show khách mua có 50 cái áo thôi vậy?” Bạn phải chủ động kiểm tra phần này trước khi đưa dữ liệu vào sử dụng. Không thì dễ làm stakeholder mất niềm tin vào báo cáo của mình lắm.
Mình có viết một ví dụ ở đây (link) cách mình xác nhận xem dữ liệu mình thấy có đúng hay không.
6/ Những kiếm tra khác
Ngoài những điểm trên, mình cũng kiểm tra thêm data type, schema documentation có được load lên database đúng như dự kiến hay không. Airflow schedule mình set up có chạy đúng không, có theo dependency mình đã chỉ định hay không (cái nào chạy trước, chạy sau vì chúng phụ thuộc vào nhau)
Kết
Data validation là task vô cùng chi li, đòi hỏi sự tập trung đến từng tiểu tiết. Nhưng đó lại là phần vô cùng quan trọng, giúp chúng ta kiểm tra xem dữ liệu trong data model có chính xác không, trước khi mang vào sử dụng. Điều này làm nền móng cho những phân tích và báo cáo có giá trị sau này, cũng như tạo sự tin tưởng giữa stakeholder với người phân tích và dữ liệu.