Ở bài 4, Nhà Gọn đã có dữ liệu thô trong BigQuery. Nhưng họ nhanh chóng thấy một vấn đề: mỗi lần cần một con số, ai đó lại viết lại cùng những phép mở lồng và biến đổi, và hai người viết ra hai con số khác nhau cho cùng một khái niệm "khách hoạt động". Dữ liệu thô mạnh, nhưng nó lộn xộn.
Bài này về lớp giải quyết chuyện đó: biến sự kiện thô thành các bảng sạch, có kỷ luật, dùng được cho mọi báo cáo. Công cụ phổ biến nhất cho việc này là dbt. Đây là phần kỹ thuật, phù hợp khi bạn đã có kho dữ liệu và bắt đầu có nhiều người cùng đọc số, không phải việc làm ngay từ đầu.
Từ thô tới sạch: nghề analytics engineer
Có một nghề nằm giữa kỹ sư dữ liệu (lo hạ tầng, đường ống) và nhà phân tích (lo phân tích): analytics engineer. Việc của họ là nhận dữ liệu thô đã đổ vào kho, và biến nó thành dữ liệu sạch, đáng tin, dễ dùng cho người phân tích.
Cách làm hiện đại gọi là tải trước, biến đổi sau: đổ dữ liệu thô vào kho, rồi biến đổi ngay trong kho, tận dụng sức mạnh tính toán của kho. dbt là công cụ cho bước biến đổi đó. Mỗi mô hình trong dbt là một câu truy vấn SQL, và dbt lo phần còn lại: vật chất hóa thành bảng, quản lý thứ tự phụ thuộc giữa các mô hình, chạy kiểm thử, và tự sinh tài liệu kèm sơ đồ nguồn gốc dữ liệu.
Mô hình theo lớp
Nguyên tắc là không nhảy thẳng từ thô sang bảng cuối, mà đi qua các lớp:
Nguồn (sự kiện GA4 thô, bán hàng, CRM)
→ Làm sạch: một mô hình cho mỗi nguồn, chỉ đổi tên, ép kiểu, mở lồng
→ Trung gian: logic ghép, dựng phiên
→ Sẵn dùng: bảng chia theo lĩnh vực (sản phẩm, marketing, doanh thu)
Lớp làm sạch chỉ làm sạch, không nhét logic kinh doanh vào. Lớp sẵn dùng mới là nơi có logic và là nguồn cho mọi dashboard. Cách chia lớp này giữ cho hệ thống dễ tái dùng: một mô hình làm sạch được dùng bởi nhiều bảng cuối, thay vì mỗi báo cáo tự làm sạch lại từ đầu.
Ở lớp sẵn dùng, có hai loại bảng:
- Bảng sự kiện: chứa các phép đo, nhiều dòng. Với Nhà Gọn: bảng đơn hàng, bảng phiên truy cập. Chứa số và các khóa liên kết.
- Bảng chiều: mô tả, ít thay đổi. Với Nhà Gọn: bảng khách hàng (kèm kênh, trạng thái kích hoạt), bảng sản phẩm. Dùng để cắt các số trong bảng sự kiện.
Xác định hạt trước khi viết mô hình
Quyết định thiết kế quan trọng nhất, và hay bị bỏ qua nhất, là xác định hạt: một dòng trong mô hình này đại diện cho cái gì. Một sự kiện? Một phiên? Một khách trong một ngày?
Nếu không xác định hạt trước, mô hình sẽ nhập nhằng và đếm sai. Một bảng mà bạn tưởng là một dòng mỗi đơn hàng, nhưng thực ra là một dòng mỗi món trong đơn, sẽ làm mọi phép đếm đơn hàng phồng lên. Trước khi viết câu SQL đầu tiên, viết ra một câu: "một dòng của bảng này là một ___". Mọi thứ khác theo sau.
Định nghĩa một lần, hết cãi nhau
Đây là giá trị lớn nhất của cách làm này. Trước khi có một lớp mô hình tập trung, định nghĩa "khách hoạt động" nằm rải rác trong từng dashboard, mỗi nơi một kiểu, và mỗi cuộc họp lại có người hỏi "số của ai đúng".
Với dbt, bạn định nghĩa "khách đã kích hoạt" đúng một lần, trong một cột của một mô hình. Mọi dashboard, mọi công cụ đọc cùng cột đó. Hết cảnh bốn con số cho một khái niệm.
-- Định nghĩa kích hoạt một lần, mọi nơi đọc cột này
select
user_id,
count(*) as so_don,
min(order_ts) as ngay_don_dau,
logical_or(has_review_14d) as da_kich_hoat
from {{ ref('int_don_hang') }}
group by user_id
Kiểm thử dữ liệu như kiểm thử code, và dùng gói có sẵn
dbt cho bạn viết kiểm thử ngay trong mô hình: cột này phải duy nhất, cột kia không được rỗng, cột phân loại chỉ được nhận các giá trị trong danh sách, khóa này phải khớp bảng kia. Chạy kiểm thử tự động bắt lỗi dữ liệu trước khi nó lan vào báo cáo. Đây chính là data quality của series trước, giờ được tự động hóa.
Một mẹo tiết kiệm thời gian: có sẵn các gói cộng đồng chuyên xử lý sự kiện GA4, tự động mở lồng thuộc tính và dựng phiên. Đừng viết lại phần đó từ đầu, dễ sai và tốn thời gian. Dùng gói có sẵn rồi tập trung công sức vào các bảng đặc thù của doanh nghiệp bạn.
Ba lỗi thường gặp với mô hình hóa dữ liệu
| Lỗi | Vì sao hại | Cách sửa |
|---|---|---|
| Không xác định hạt | Mô hình nhập nhằng, đếm sai | Viết ra hạt trước khi viết SQL |
| Nhét logic kinh doanh vào lớp làm sạch | Khó tái dùng, rối | Lớp làm sạch chỉ làm sạch |
| Định nghĩa một chỉ số ở nhiều nơi | Số không khớp, mất niềm tin | Một định nghĩa, một chỗ, mọi nơi đọc chung |
Trước khi sang bài 6
- Nếu bạn đã có kho dữ liệu, dựng một dự án dbt tối thiểu nối vào nó.
- Viết lớp làm sạch cho ít nhất hai nguồn, ví dụ sự kiện GA4 và dữ liệu bán hàng.
- Viết vài bảng sẵn dùng: bảng sự kiện, bảng khách hàng, bảng doanh thu, mỗi bảng xác định hạt rõ ràng.
- Định nghĩa một chỉ số quan trọng, ví dụ kích hoạt, đúng một lần và dùng lại nó cho retention.
- Thêm vài kiểm thử, chạy dựng toàn bộ cho tới khi qua, và sinh tài liệu.
Có các bảng sạch rồi, câu hỏi tiếp theo là công cụ nào đọc chúng để trả lời câu hỏi về hành vi sản phẩm nhanh và tự phục vụ. GA4 mạnh cho marketing nhưng yếu cho phân tích hành vi sâu. Bài 6 nói về các công cụ product analytics như Mixpanel, Amplitude và PostHog, khi nào cần thêm chúng, và cách giữ chúng dùng chung một bộ đặt tên với GA4 để số không lệch nhau.
Đọc tiếp
Bài 6, Product analytics: Mixpanel, Amplitude, PostHog
GA4 mạnh cho marketing nhưng yếu cho phân tích hành vi sâu và tự phục vụ. Bài này giải thích product analytics thêm gì so với GA4, so sánh ba công cụ phổ biến, khi nào thật sự cần thêm, và nguyên tắc quan trọng nhất: dùng chung một bộ đặt tên với GA4 để số không bao giờ lệch nhau.
Đọc bàiBài 4, Khi nào cần BigQuery (và khi nào chưa)
BigQuery cho bạn dữ liệu sự kiện thô, không lấy mẫu, ghép được với dữ liệu bán hàng. Nhưng nó cũng là chi phí và độ phức tạp mới. Bài này đưa ra checklist khi nào thật sự cần một kho dữ liệu, giải thích schema sự kiện lồng nhau của GA4 và mẫu truy vấn cốt lõi, và cách kiểm soát chi phí.
Đọc bàiBài 1, Content và SEO analytics: đo nội dung nào thật sự ra khách
Phần lớn doanh nghiệp đo nội dung bằng lượt xem, nên không biết bài nào ra khách. Bài này ghép nửa trước click (Search Console) với nửa sau click (GA4) thành một phễu SEO đầy đủ, giới thiệu ma trận nội dung để quyết định mở rộng hay bỏ, và cách đo tới tận chuyển đổi thay vì dừng ở view.
Đọc bài