Trong lớp học PowerBI vừa rồi của mình có một bạn học viên đặt ra một tình huống rất thú vị: Dựa trên dữ liệu lịch sử mua hàng làm sao để biết được thông tin tại lần mua hàng (hay sử dụng dịch vụ) gần nhất của 1 khách hàng như: khách mua hàng vào thời gian nào, mua những mặt hàng gì, chi bao nhiêu tiền...? Và vấn đề ở đây là dữ liệu lịch sử mua hàng này rất lớn: mỗi tháng có hàng triệu bản ghi (record) nên phải lưu trữ trên nhiều file excel, đặt trong nhiều folder. Việc truy xuất thông tin lịch sử mua hàng này phải thực hiện nhanh và xét trên toàn bộ dữ liệu - tối thiểu cũng là 1 năm. Chúng ta có thể hình dung khối lượng dữ liệu là rất lớn, vượt quá khả năng sử dụng excel bình thường. Vậy làm thế nào để giải quyết bài toán này?
Các bạn có thể tải file bài tập mẫu tại đây:
Mục tiêu cần đạt được:

Tính ứng dụng của bài toán

Bài toán này mình thấy có tính ứng dụng rất cao trong các ngành dịch vụ, thương mại cho bộ phận bán hàng, chăm sóc khách hàng:
+ Có thông tin lần mua hàng gần nhất, chúng ta có thể lên kế hoạch gọi điện, gửi email cho khách hàng để xin ý kiến về dịch vụ/sản phẩm họ đã sử dụng sau bao nhiêu ngày. Điều này giúp tạo thiện cảm với khách hàng và khiến họ "nhớ" về chúng ta nhiều hơn.
+ Khi một khách hàng tới mua hàng, dựa trên một vài thông tin rất cơ bản như tên hoặc số điện thoại, bộ phận bán hàng có thể nhanh chóng tra cứu được thông tin của khách hàng là khách mới hay khách đã từng đến mua hàng rồi. Từ thông tin này họ có thể tư vấn khách hàng tốt hơn.
+ Dựa trên lịch sử mua hàng, chúng ta có thể phần nào hiểu được thói quen, sở thích, khả năng chi trả của khách hàng (nếu thông tin đủ nhiều - không chỉ lần mua hàng gần nhất mà trong topN lần gần nhất chẳng hạn). Dựa vào đó có thể đưa ra các cách tư vấn và khuyến mại phù hợp để thúc đẩy hành vi của hàng của khách.

Cách giải quyết bài toán này trên Power BI

Trước hết mình sẽ nói lý do vì sao mình chọn Power BI để giải quyết bài toán này. Nếu dữ liệu nhỏ, chỉ trong phạm vi 1 bảng tính excel như trong bài tập mẫu mà mình cung cấp ở trên thì chúng ta hoàn toàn có thể dùng hàm và PivotTable có sẵn trong Excel để giải quyết được. Nhưng vấn đề ở đây là:
+ Dữ liệu lớn, trên nhiều bảng, nhiều file, có khả năng vượt quá phạm vi của 1 sheet Excel thông thường. Do đó không thể dùng hàm Excel để làm được.
+ Làm việc trên Excel với khối lượng dữ liệu lớn, sử dụng nhiều công thức thì rất dễ gặp tình trạng tính toán chậm. Thời gian truy xuất thông tin đôi khi không đáp ứng được theo yêu cầu.
Vì vậy chúng ta cần có công cụ tiên tiến hơn, hiệu suất cao hơn, đồng thời có phương pháp làm việc hiệu quả hơn, đó là trên công cụ Power BI.
Tiếp theo mình sẽ mô tả qua các bước thực hiện. Một vài bước có thể nói ngắn gọn để tập trung vào những bước quan trọng của tình huống này. Các bước mang tính áp dụng chung với mọi mô hình dữ liệu thì các bạn có thể tìm hiểu thêm về cách sử dụng Power BI là được nhé.
Bước 1: Kết nối dữ liệu từ file Excel vào Power BI. Bạn có thể mở ứng dụng Power BI Desktop, tạo 1 báo cáo mới. Sau đó tại thẻ Home chọn mục Excel Workbook, duyệt tới thư mục nơi chứa file bài tập mẫu và chọn file
Bước 2: Chọn bảng dữ liệu cần sử dụng (ở dạng Table): gồm 2 bảng data_BHdim_Date, chọn tiếp mục Transpose để mở ra cửa sổ làm việc trong Power Queries Editor. Hai bảng này có vai trò:
+ data_BH: chứa dữ liệu lịch sử bán hàng của khách hàng theo các lần mua.
+ dim_Date: chứa thời gian báo cáo. dim_Date hoàn toàn có thể dùng kỹ thuật khác để tạo ra nhưng ở đây mình muốn làm sẵn để các bạn tiện theo dõi và làm thử.
Bước 3: Mục tiêu của bước này là cần tổ chức lại bảng data_BH. Vì đặc điểm bảng này đang ở dạng 1 lần mua hàng của 1 khách hàng có nhiều dòng, tương ứng với nhiều sản phẩm. Cần phải gộp các dòng này lại thành 1 dòng để khi lấy thông tin lần mua hàng gần nhất chỉ thể hiện trên 1 dòng, cho tất cả các sản phẩm của lần mua đó.
Cột được gộp nhóm gồm 2 cột:
+ Thành tiền: Tính tổng số tiền
+ ID sản phẩm: Gộp văn bản từ nhiều dòng thành 1 dòng
Ở bước này, bạn có thể sử dụng chức năng 'Group by' trong Power Query Editor cho cột Thành tiền trước, sau đó trong chức năng Advanced Editor (xem toàn bộ các bước xử lý Query dưới dạng M-Code), chúng ta sửa lại bước #“Grouped Rows” như sau (có thể copy-paste đoạn code này):
#"Grouped Rows" = Table.Group(#"Changed Type", {"Ngày mua", "ID khách hàng"}, {{"Tổng số tiền", each List.Sum([Thành tiền]), type nullable number}, {"Gộp mặt hàng", each Text.Combine([ID sản phẩm], ", "), type nullable text}})
Đoạn mình bôi đậm là đoạn code không có sẵn nếu dùng chức năng Group by bình thường, phải tùy biến lại theo code (hơi khó một chút với những bạn chưa biết dùng Power Query).
Kết quả thu được ở bước này có dạng:
Bước 4: Sau bước 3 thì việc xử lý cấu trúc bảng đã xong. Chúng ta có thể đóng màn hình làm việc Power Query: Tại thẻ Home chọn Close & Apply
Bước 5: Tạo mô hình dữ liệu (data model) tại Model view: để liên kết bảng dim_date với bảng data_BH (đã được gộp nhóm lại) => Phần này liên quan tới kiến thức về Data Model, cách tạo liên kết… nhưng mình tạm thời không nói sâu, chỉ cần biết cách tạo Relationship giữa 2 bảng trong mô hình là làm được rồi. Mục đích là có được sự liên kết giữa bảng dim_Date với bảng data_BH để có thể đánh giá yếu tố thời gian một cách dễ dàng hơn.
Kết quả mô hình dữ liệu mẫu:
Bước 6: Tại Report View (Visualize), tạo một Measure mới để xác định Ngày mua hàng gần nhất theo cú pháp sau:
Ngày mua gần nhất = CALCULATE( MAX(Group_KH[Ngày mua]), ALL(dim_Date[Ngày]))
Bước này khá quan trọng vì chúng ta sẽ sử dụng hàm DAX để tính toán thay cho các công thức Excel bình thường. Việc hiểu về hàm DAX khá là khó với hầu hết những ai học về Power BI (nó thuộc level cao nhất về độ khó luôn đấy). Nhưng hàm DAX mẫu mà mình viết ở trên không quá khó hiểu nhỉ, nó đơn giản chỉ là tìm ngày mua có giá trị lớn nhất trong bảng lịch sử mua hàng, trong đó bỏ qua các bối cảnh lọc liên quan tới cột Ngày của bảng dim_Date => Để khi lọc theo thời gian thì vẫn luôn tìm được đúng ngày mua gần nhất.
Bước 7: Biểu diễn kết quả. Trong Power BI thì việc biểu diễn kết quả rất đa dạng. Bạn có thể tạo các đối tượng Slicer để tạo bộ lọc, Card để biểu diễn các kết quả dưới dạng thẻ số liệu như sau:
+ Slicers: theo ID khách hàng
+ Cards: gồm 3 thẻ để biểu diễn 3 kết quả:
1) Ngày mua gần nhất: Đưa measure [Ngày mua gần nhất] vào card này
2) Mặt hàng mua lần gần nhất: đưa field [Gộp mặt hàng] vào card này, trong đó áp dụng thêm Filters là: Top 1 của [Ngày mua gần nhất]
3) Số tiền mua lần gần nhất: tương tự với Mặt hàng mua lần gần nhất, nhưng áp dụng với field [Tổng số tiền]
Mình sẽ minh họa qua hình ảnh này để dễ hình dung hơn nhé:
Như vậy khi thay đổi ID khách hàng trong Slicer, chúng ta sẽ thu được kết quả là thông tin lần mua hàng gần nhất theo các nội dung của card tương ứng:
+ Ngày mua
+ Mặt hàng đã mua
+ Tổng số tiền của lần đó
Bạn thấy các bước để làm bài toán trên có vẻ phức tạp phải không? nhưng đó là bài toán giải quyết triệt để các vấn đề, đồng thời những gì chúng ta đã làm chính là xây dựng một quy trình báo cáo tự động: Khi có thêm dữ liệu mới, chỉ việc bấm Refresh là sẽ ngay lập tức có kết quả. Việc tính toán cũng rất nhanh chóng. Thông tin hiển thị đơn giản và trực quan, đúng trọng tâm. Điều đó sẽ giúp chúng ta đạt được hiệu quả công việc tối đa nhất, tiết kiệm nguồn lực và thời gian nhất. Điều đó cũng xứng đáng với công sức chúng ta bỏ ra nhỉ?
Hy vọng qua bài chia sẻ này của tôi, các bạn có thể thấy được một phần quy trình làm Power BI và những kết quả mà nó đem lại khi ứng dụng trong công việc.