Xử lý tập dữ liệu thưa (sparse data) trong Qlik

Trung tâm của quy mô tài liệu ( data Model ) trong một ứng dụng Qlik Sense là bảng sự kiện ( fact table ) – bảng ghi lại những thanh toán giao dịch, thông số kỹ thuật và sự kiện trong một quy trình tiến độ nhiệm vụ của tổ chức triển khai. Ở điều kiện kèm theo lý tưởng, nghiên cứu và phân tích tài liệu đa chiều trong Qlik được cho phép bạn thấy được một phần fact tương ứng với mọi “ lát cắt ” ( slice ) trên bất kỳ dimension nào. Ví dụ, nhìn vào một ngày bất kể trong năm, bạn luôn thấy được lượng hàng tồn dư trong ngày đó .
Tuy nhiên, trong phần đông trường hợp, tập dữ liệu mà bạn cần nghiên cứu và phân tích ít khi được hoàn hảo nhất như vậy. Khi load tài liệu vào ứng dụng Qlik Sense, rất thường gặp những bảng dữ liệu thưa ( sparse data ) – là fact data với nhiều measure bị khuyết hoặc mang giá trị rỗng ( NULL ) .

Hiểu về dữ liệu thưa

Có nhiều nguyên do tạo nên tài liệu thưa, gồm có :

  • Mất mát dữ liệu: mất dữ liệu trong quá trình lưu trữ do lỗi từ nguồn dữ liệu, hoặc trong quá trình tải dữ liệu do lỗi của data connector.
  • Ghi nhận không đầy đủ: ví dụ dữ liệu khí tượng phải theo dõi hằng ngày, nhưng một số trạm khí tượng chỉ đo 2 ngày 1 lần
  • Cách thức ghi nhận dữ liệu: hệ thống chỉ ghi nhận giao dịch / sự kiện khi có thay đổi. Ví dụ hệ thống theo dõi hàng tồn kho: chỉ ghi nhận khi có thay đổi số lượng hàng trong kho.

Quá nhiều giá trị NULL trong tập dữ liệu thường dẫn đến phân tích dữ liệu thiếu chính xác. Trong 2 trường hợp đầu, vấn đề rất rõ ràng: khi dữ liệu bị mất mát hoặc ghi nhận không đầy đủ, mọi tính toán trên tập dữ liệu đều không phản ánh đúng thực tế. Vậy còn trường hợp thứ 3 ảnh hưởng thế nào đến kết quả phân tích dữ liệu?

Để hiểu rõ hơn về trường hợp tài liệu thưa tạo ra bởi phương pháp ghi nhận tài liệu, ta dùng lại ví dụ về mạng lưới hệ thống theo dõi hàng tồn dư nêu trên. Xét bảng tài liệu sau :

StockTable

Bảng tài liệu trên theo dõi lượng hàng tồn dư trong 10 ngày từ 11/01/2018 đến 20/01/2018, nhưng chỉ có 4 dòng tương ứng với những ngày có thanh toán giao dịch hàng xuất / nhập kho. Khi biểu lộ bảng tài liệu thành đồ thị đường thẳng ( line chart ), ta có biểu đồ sau :

StockChart

Nhìn vào biểu đồ trên, ta thấy ngày 12/1 có vẻ lượng hàng tồn dư là 50, trong khi thực tiễn vẫn là 30 như ngày 11/1 ( ngày có thanh toán giao dịch xuất / nhập kho gần nhất ). Ngày 12 và 13 không có tài liệu ( giá trị NULL ), nên line chart vẽ 1 đường thẳng nối tiếp ngày 11 và 14. Dữ liệu nguồn không thiếu hoặc sai, nhưng phương pháp ghi nhận tài liệu trong trường hợp này phân phối góc nhìn rơi lệch cho người nghiên cứu và phân tích khi trình diễn bằng đồ thị .

Xử lý dữ liệu thưa như thế nào?

Có nhiều cách để giải quyết và xử lý những giá trị NULL trong tập tài liệu :

  • Loại bỏ các dòng có giá trị NULL. Đây là cách dễ nhất, nhưng cũng rất dễ gây mất mát dữ liệu. Fact table thường chứa nhiều measure. Không thể vì một vài measure không mấy quan trọng có giá trị NULL mà loại bỏ hoàn toàn dòng dữ liệu.
  • Thay thế  NULL bằng một giá trị đại diện. Có các lựa chọn sau:
    • Giá trị trung bình trong toàn tập dữ liệu hoặc một phân nhóm dữ liệu. Hướng tiếp cận này tương đối tốt cho trường hợp mất mát dữ liệu. Ví dụ, nếu dữ liệu của tỉnh Đồng Nai là NULL trong bảng thu nhập bình quân 63 tỉnh thành, lấy thu nhập bình quân cả nước là một phương án thay thế chấp nhận được.
    • Giá trị trung bình giữa 2 lần ghi nhận gần nhất. Có thể áp dụng cho trường hợp trạm khí tượng nêu trên. Nếu nhiệt độ được ghi nhận vào ngày 5 và ngày 7, ta có thể lấy trung bình 2 ngày này làm giá trị của ngày 6. Lựa chọn này là tương đối hợp lý với giả định nhiệt độ không thay đổi quá đột ngột trong một khoảng thời gian ngắn.
    • Giá trị của lần ghi nhận gần nhất trước đó. Áp dụng được cho trường hợp dữ liệu chỉ được ghi nhận khi số dư thay đổi, như tỷ giá ngoại tệ hoặc ví dụ về hàng tồn kho nêu trên.

Ngoài ra, cũng không hề không nhắc đến hướng tiếp cận mặc định : để nguyên những giá trị NULL trong tập dữ liệu ! Đôi khi, giá trị NULL cũng cung ứng những insight nhất định cho người nghiên cứu và phân tích. Điều quan trọng là phải xác lập được giá trị NULL là do lỗi ghi nhận của mạng lưới hệ thống nhiệm vụ, hay do thật sự không có thanh toán giao dịch nào phát sinh. Hiểu về tài liệu mà bạn đang nghiên cứu và phân tích luôn là nhu yếu tối quan trọng khi thiết kế xây dựng BI dashboard .

Lấp đầy dữ liệu thưa bằng giá trị của lần ghi nhận gần nhất trước đó

Phần sau đây của bài viết sẽ trình diễn cách hiện thực 1 trong 3 lựa chọn sửa chữa thay thế giá trị NULL : sử dụng giá trị của lần ghi nhận gần nhất trước đó. Quay lại với ví dụ về bảng theo dõi hàng tồn dư ở phần đầu bài viết, tiềm năng là biến hóa bảng này thành bảng tài liệu rất đầy đủ như sau :

StockTableFull

Chuẩn bị dữ liệu

Sử dụng câu lệnh Inline Load sau để tạo bảng tài liệu khởi đầu :

WarehouseData_Raw:
Load
Date(Date#(Day,'DD-MM-YYYY'),'DD/MM/YYYY') as Day,
Stock;
Load * INLINE [
Day, Stock
11-01-2018, 30
14-01-2018, 90
17-01-2018, 50
20-01-2018, 70
];

Các bước thực hiện

Các bước biến hóa bảng tài liệu khởi đầu thành bảng tài liệu không thiếu được tóm tắt trong hình dưới đây .

Steps.png

  1. Tìm ra giá trị ngày lớn nhất và nhỏ nhất trong bảng dữ liệu ban đầu
  2. Tạo ra tất cả các ngày có thể giữa ngày lớn nhất và nhỏ nhất bằng câu lệnh Load … Autogenerate. Bạn sẽ gặp lại cách làm này khi xây dựng Master Calendar – sẽ được trình bày trong một bài viết khác.
  3. Join cột ngày mới tạo vào bảng dữ liệu ban đầu. Những ngày mới được tạo mang giá trị Stock là NULL
  4. Sắp xếp bảng dữ liệu vừa join theo thứ tự tăng dần theo ngày
  5. Thay thế giá trị NULL bằng giá trị gần nhất trước đó theo nguyên tắc lặp từng bước qua từng hàng. Ở mỗi hàng:
    • Nếu Stock có giá trị, giữ nguyên giá trị này
    • Ngược lại nếu Stock là NULL, lấy giá trị Stock của hàng ngay trước đó bằng hàm Peek( )

Toàn bộ script triển khai những bước trên :

// Step 1 
MinMaxDate:
Load Min(Day) as MinDate, Max(Day) as MaxDate 
resident WarehouseData_Raw;

Let vMinDate = Peek('MinDate',-1,'MinMaxDate') - 1;
Let vMaxDate = Peek('MaxDate',-1,'MinMaxDate') ;

// Step 2 & 3
Join (WarehouseData_Raw)                                    //3  
Load Date(recno()+$(vMinDate)) as Day
Autogenerate (vMaxDate - vMinDate);                         //2

//Step 4 & 5
WarehouseData:
NoConcatenate Load 
     Day, 
     If( IsNull( Stock ), Peek( Stock ), Stock ) as Stock    //5
Resident WarehouseData_Raw
Order By Day ;                                               //4

Drop Table MinMaxDate, WarehouseData_Raw;

Kiểm tra dữ liệu

Để kiểm tra tài liệu vừa biến hóa, tạo một line chart với dimension = Day, measure = Sum ( Stock ) tương tự như như hình sau :

FInalLineChart.png

Ta thấy line chart này đã hiển thị đúng chuẩn hơn so với line chart bắt đầu : Các ngày 11,12,13 và 14,15,16 có giá trị Stock bằng nhau .
Advertisement

Share this:

Thích bài này:

Thích

Đang tải …