Bài 3: Đánh giá chất lượng dữ liệu
🎯 Mục tiêu học tập
Sau khi hoàn thành bài này, bạn sẽ có thể:
- Hiểu được 4 nguyên tắc cơ bản đánh giá chất lượng dữ liệu
- Áp dụng các nguyên tắc vào bài toán tín dụng thực tế
- Sử dụng Python để kiểm tra chất lượng dữ liệu
- Tránh các lỗi phổ biến khi làm việc với dữ liệu tài chính
📖 Giới thiệu
Trong học phần trước, chúng ta đã làm quen với một số câu hỏi và công cụ cơ bản giúp các bạn làm quen và thấu hiểu dữ liệu mình sẽ sử dụng trong lĩnh vực tài chính. Trong phần này, chúng ta sẽ tìm hiểu một bước quan trọng để đảm bảo rằng dữ liệu mình sử dụng chất lượng và phù hợp với mục đích sử dụng, đó là đánh giá chất lượng dữ liệu.
1. Chất lượng dữ liệu
Dưới góc nhìn của một kỹ sư tài chính, dữ liệu là thông tin được cung cấp bởi thị trường (ví dụ, sàn giao dịch chứng khoán, thị trường không kê đơn, cơ quan tín dụng, ngân hàng trung ương, tổ chức kinh tế, v.v.). Dữ liệu cũng có thể đến từ các sàn giao dịch, các đại lý môi giới ta giao dịch, thậm chí từ các ngân hàng và các tổ chức kinh tế thông qua cổng API của họ. Để đảm bảo chất lượng dữ liệu bất kể dữ liệu đến từ nguồn nào, chúng ta cũng cần quan tâm đến các nguyên tắc được đúc kết dưới bảng sau với 2 cột đầu tiên tương ứng từ khoá bằng tiếng Anh và tiếng Việt giúp các bạn dễ dàng tìm tài liệu tham khảo, và cột thứ ba là mô tả của các nguyên tắc đó.
| Từ khoá | Nguyên tắc | Mô tả | Cách kiểm tra với Python |
|---|---|---|---|
| Accuracy | Tính chính xác | Mức độ chính xác của thông tin mà dữ liệu cung cấp? | So sánh với nguồn khác, kiểm tra outliers |
| Completeness | Tính đầy đủ | Dữ liệu phải thu thập theo nhu cầu đã đầy đủ chưa? | df.isnull().sum(), tỷ lệ khuyết |
| Consistency | Tính nhất quán | Có sự mâu thuẫn, xung đột giữa cùng một đối tượng dữ liệu trong các tập dữ liệu khác nhau không? | So sánh giữa các nguồn, kiểm tra duplicates |
| Timeliness | Tính kịp thời | Dữ liệu có cung cấp thông tin là những sự kiện xảy ra gần đây hoặc theo thời gian thực không? | Kiểm tra timestamp, độ trễ dữ liệu |
Bên cạnh 4 nguyên tắc cơ bản này, các bạn có thể tham khảo thêm các nguyên tắc khác như Integrity (tính toàn vẹn), Relevance (tính liên quan), Validity (tính hợp lệ), v.v. phục vụ cho việc đánh giá chất lượng dữ liệu nói chung, không chỉ dành cho dữ liệu tài chính tại chương Data Quality trong quyển sách DMBoK - Data Management Body of Knowledge.
2. Ví dụ thực tiễn
Để giúp cho các bạn có thể dễ dàng hình dung, chúng ta sẽ cùng đi vào một ví dụ cụ thể: đó là bài toán tín dụng. Giả sử ta cần đưa ra quyết định có nên cho vay hay không đối với khách hàng. Làm thế nào chúng ta biết được độ uy tín hay rủi ro tín dụng của khách hàng để có thể xác định hạn mức tín dụng, lãi suất và thời hạn trả nợ phù hợp? Hãy cùng áp dụng bốn nguyên tắc trên.
2.1. Tính chính xác
Chắc hẳn các bạn đã quen thuộc với câu nói "Garbage in, garbage out" như một lời nhắc nhở về tầm quan trọng của tính chính xác của dữ liệu.
Ví dụ, chúng ta cần đảm bảo rằng dữ liệu thu thập được đúng là dữ liệu liên quan tới khách hàng ta định cho vay vốn. Cũng giống như chứng khoán có những khoá chính như CUSIP hay SEDOL, chúng ta cũng cần có định danh duy nhất cho mỗi khách hàng, từ đó đảm bảo rằng thông tin không bị trộn lẫn bởi những người có cùng tên hay những thành viên trong gia đình có cùng tên sống ở cùng một địa chỉ.
Bên cạnh đó, chúng ta cũng cần đảm bảo những thông tin xoay quanh khách hàng đó mà ta có được là chính xác. Ví dụ, nếu chúng ta có dữ liệu về thu nhập của khách hàng, nhưng thu nhập này được tính bằng đô la Mỹ, thì chúng ta sẽ không thể so sánh được với thu nhập của khách hàng khác được tính bằng đồng Việt Nam. Điều này sẽ gây ra sai lệch trong việc đánh giá rủi ro tín dụng của khách hàng. Do đó, chúng ta cần đảm bảo rằng dữ liệu thu thập được là chính xác, đúng với mục đích sử dụng.
2.2. Tính đầy đủ
Để có một lịch sử hoàn chỉnh các thông tin liên quan tới khách hàng mà ta dự định cho vay, chúng ta cần đảm bảo rằng dữ liệu thu thập được đầy đủ.
Ví dụ, chúng ta muốn thu thập các báo cáo tín dụng liên quan tới khách hàng. Nếu ta chỉ lấy các báo cáo tín dụng trong vòng 10 năm qua của khách hàng đối với nhà và các khoản vay thế chấp khác, chứ không phải đối với thẻ tín dụng thông thường, khi đó chúng ta chỉ nhìn thấy phần nổi trên tảng băng chìm. Tính đầy đủ ở đây có nghĩa là chúng ta cần đảm bảo rằng chúng ta, phía cho vay, phải thực hiện thẩm định để khám phá được tất cả các thông tin liên quan tới khách hàng đó, từ đó nhìn được bức tranh tổng quan về khách hàng.
2.3. Tính nhất quán
Để tăng độ uy tín của dữ liệu, chúng ta có thể tiếp cận cùng một dữ liệu nhưng từ các nguồn khác nhau và đảm bảo không có sự mẫu thuẫn giữa cùng một dữ liệu trong các nguồn khác nhau đó.
Ví dụ, một khách hàng có nhu cầu vay một khoản tiền lớn ở công ty của chúng ta. Khi thông tin của khách hàng được gửi về hệ thống, khách hàng đã thực hiện 4 giao dịch vay vốn ở công ty khác trong vòng 3 tháng trước đó. Tuy nhiên, khi dữ liệu của khách hàng này được gửi về phòng Mô hình rủi ro, chỉ có 2 giao dịch vay vốn của khách hàng được cập nhất trong vòng 3 tháng gần nhất. Đây là biểu hiện của sự xung đột thông tin và thiếu nhất quán của dữ liệu. Chúng ta cần đảm bảo rằng dữ liệu về lịch sử giao dịch vay vốn của khách hàng này được thu thập nhất quán, từ đó có thể đánh giá rủi ro tín dụng của khách hàng một cách chính xác.
Mặt khác, khi thông tin về khách hàng được thu thập bởi nhiều công ty để đưa ra các báo cáo tín dụng khác nhau, chúng ta có thể chọn lọc từ hai hoặc các đại lý chính hay cơ quan tín dụng để kiểm tra xem thông tin có nhất quán hay không, từ đó có thể đưa ra hướng giải quyết và sửa chưa nếu tồn tại bất kỳ sự khác biệt nào.
2.4. Tính kịp thời
Tính kịp thời của dữ liệu ở đây nghĩa là chúng ta cần đảm bảo rằng dữ liệu được cập nhật thường xuyên và đúng lúc. Dữ liệu cần được thu thập càng sớm càng tốt khi nó vừa xuất hiện bởi theo thời gian giá trị của dữ liệu sẽ giảm dần và không phù hợp để sử dụng cho bối cảnh hiện tại và tương lai.
Ví dụ, khi một khách hàng đăng ký 10 thẻ tín dụng khác nhau trong vòng một buổi sáng, chúng ta cần đảm bảo rằng bước kiểm tra tín dụng của mình phản ánh việc cho vay theo thời gian thực. Điều này nhằm đảm bảo giảm thiểu gian lận từ những người đi vay tín dụng với mục đích xấu. Bằng cách gian lận đi vay tất cả các khoản vay nhỏ trong thời gian ngắn, họ có thể để thu được tổng số tiền vượt xa mức có được nếu chỉ đăng ký một khoản vay to trong khoảng thời gian dài hơn. Đây cũng là một thách thức lớn đối với các công ty cung cấp phân tích dữ liệu không chỉ bởi nó đòi hỏi khả năng xử lý các yêu cầu theo thời gian thực mà còn cả khả năng chạy các phân tích trong thời gian ngắn để có thể đưa ra quyết định nhanh chóng.
3. Kiểm tra chất lượng dữ liệu với Python
Dưới đây là code Python để kiểm tra 4 nguyên tắc chất lượng dữ liệu:
import pandas as pd
import numpy as np
from datetime import datetime
def check_data_quality(df, customer_id_col='customer_id'):
"""Kiểm tra chất lượng dữ liệu theo 4 nguyên tắc"""
print("=" * 60)
print("ĐÁNH GIÁ CHẤT LƯỢNG DỮ LIỆU")
print("=" * 60)
# 1. COMPLETENESS - Tính đầy đủ
print("\n1. TÍNH ĐẦY ĐỦ (Completeness):")
missing = df.isnull().sum()
missing_pct = (missing / len(df)) * 100
for col in df.columns:
if missing[col] > 0:
print(f" ⚠️ {col}: {missing[col]} giá trị khuyết ({missing_pct[col]:.2f}%)")
else:
print(f" ✅ {col}: Đầy đủ")
# 2. ACCURACY - Tính chính xác
print("\n2. TÍNH CHÍNH XÁC (Accuracy):")
# Kiểm tra outliers
numeric_cols = df.select_dtypes(include=[np.number]).columns
for col in numeric_cols:
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
outliers = df[(df[col] < Q1 - 1.5*IQR) | (df[col] > Q3 + 1.5*IQR)]
if len(outliers) > 0:
print(f" ⚠️ {col}: {len(outliers)} giá trị bất thường (outliers)")
else:
print(f" ✅ {col}: Không có outliers")
# 3. CONSISTENCY - Tính nhất quán
print("\n3. TÍNH NHẤT QUÁN (Consistency):")
# Kiểm tra duplicates
duplicates = df.duplicated().sum()
if duplicates > 0:
print(f" ⚠️ Có {duplicates} bản ghi trùng lặp")
else:
print(f" ✅ Không có bản ghi trùng lặp")
# Kiểm tra định danh duy nhất
if customer_id_col in df.columns:
unique_customers = df[customer_id_col].nunique()
total_records = len(df)
if unique_customers < total_records:
print(f" ⚠️ Có {total_records - unique_customers} bản ghi trùng ID khách hàng")
else:
print(f" ✅ Mỗi khách hàng có ID duy nhất")
# 4. TIMELINESS - Tính kịp thời
print("\n4. TÍNH KỊP THỜI (Timeliness):")
date_cols = df.select_dtypes(include=['datetime64']).columns
if len(date_cols) > 0:
for col in date_cols:
latest_date = df[col].max()
days_old = (datetime.now() - latest_date).days
print(f" 📅 {col}: Dữ liệu mới nhất từ {days_old} ngày trước")
if days_old > 30:
print(f" ⚠️ Dữ liệu có thể đã lỗi thời (>30 ngày)")
else:
print(" ℹ️ Không có cột ngày tháng để kiểm tra")
return {
'completeness': (missing == 0).all(),
'accuracy': len(outliers) == 0 if len(numeric_cols) > 0 else True,
'consistency': duplicates == 0,
'timeliness': days_old <= 30 if len(date_cols) > 0 else None
}
# Sử dụng
# quality_report = check_data_quality(your_dataframe)4. Best Practices
✅ Do's (Nên làm)
-
Luôn kiểm tra 4 nguyên tắc trước khi phân tích
quality_report = check_data_quality(df) -
So sánh dữ liệu từ nhiều nguồn
# So sánh giá cổ phiếu từ 2 nguồn source1 = pd.read_csv('source1.csv') source2 = pd.read_csv('source2.csv') comparison = source1.merge(source2, on='symbol', suffixes=('_s1', '_s2')) differences = comparison[comparison['price_s1'] != comparison['price_s2']] -
Thiết lập data quality checks tự động
def validate_data(df): assert df.isnull().sum().sum() == 0, "Có dữ liệu khuyết!" assert df.duplicated().sum() == 0, "Có dữ liệu trùng lặp!" return True
❌ Don'ts (Không nên làm)
- Không tin tưởng hoàn toàn vào dữ liệu từ nhà cung cấp
- Không bỏ qua việc kiểm tra tính nhất quán
- Không sử dụng dữ liệu quá cũ mà không cập nhật
✅ Tóm tắt
Trong bài này, chúng ta đã tìm hiểu:
-
4 nguyên tắc đánh giá chất lượng dữ liệu:
- Accuracy: Tính chính xác
- Completeness: Tính đầy đủ
- Consistency: Tính nhất quán
- Timeliness: Tính kịp thời
-
Áp dụng vào bài toán tín dụng: Ví dụ cụ thể cho từng nguyên tắc
-
Công cụ Python: Code để tự động kiểm tra chất lượng dữ liệu
💡 Lưu ý quan trọng
- "Garbage in, garbage out" - Dữ liệu chất lượng kém sẽ dẫn đến kết quả sai
- Luôn kiểm tra dữ liệu từ nhiều nguồn để đảm bảo tính nhất quán
- Thiết lập quy trình kiểm tra chất lượng dữ liệu tự động
➡️ Bước tiếp theo
Sau khi đã đánh giá chất lượng dữ liệu, chúng ta sẽ tiếp cận với dữ liệu thực tế và bước đầu phân tích dữ liệu trước khi đi vào ứng dụng các mô hình học máy. Hãy tiếp tục với Case Study: Xác suất vỡ nợ!
Chúc các bạn học tập vui vẻ!
Một số tài liệu tham khảo:
- Machine Learning for Financial Risk Management with Python, Abdullah Karasan, 7 December 2021.
- WoldQuant University. “MscFe 600 Financial Data.” WoldQuant University, https://learn.wqu.edu/my-path/courses/financial-data/. Accessed 22 August 2022.
- “Data Quality.” DMBoK - Data Management Body of Knowledge. Accessed 22 August 2022.