Data LMS

← Tất cả các tuần · Phase 1: Nền tảng dữ liệu · khoảng 240 phút

Tuần 2: Grain và cách tổ chức dữ liệu

Bản nháp, đang chờ duyệt nội dung

Sau tuần này bạn có thể:
Video tóm tắt Tuần 2 · Video · Tiếng Việt

Video tóm tắt cả tuần (tạo bằng NotebookLM). Xem trước khi đọc để nắm bức tranh chung.

Podcast: Hạt dữ liệu và mô hình sao · Audio · Tiếng Việt · 6 phút

Podcast ngắn về grain, fact và dimension, star schema. Nghe trước hoặc sau khi đọc bài.

Cách học tuần này: đây là tuần quan trọng nhất của Phase 1. Sai grain là lỗi phổ biến nhất trong báo cáo thực tế, và nó âm thầm làm sai mọi con số phía sau.

Bài 2.1. Grain: một dòng là gì? [7]

Sếp hỏi: “Năm nay mình có bao nhiêu đơn hàng?”. Bạn mở file bán hàng, thấy 3,039 dòng và trả lời 3,039 đơn. Nhưng mỗi dòng của file này là một sản phẩm trong một đơn, không phải một đơn. Con số đúng nhỏ hơn nhiều. Lỗi này gọi là sai grain.

Ví dụ 3 dòng sau có grain “một sản phẩm trong một đơn”:

Order ID Category Sales Profit
O-01 Furniture 200 40
O-01 Office Supplies 50 10
O-02 Furniture 100 −5

3 dòng nhưng chỉ 2 đơn. Muốn đếm đơn, phải đếm Order ID khác nhau, không đếm dòng.

Bài 2.2. Measure, dimension, roll-up và drill-down [7]

Một báo cáo luôn có dạng measure theo dimension: “Sales theo Region”, “Profit theo tháng và Category”.

Khi sếp hỏi “vì sao doanh thu giảm?”, việc đầu tiên thường là drill-down theo từng dimension (vùng, sản phẩm, kênh) để khoanh vùng chỗ giảm.

Câu hỏi nhanh
1. Bảng có cột Ngày, Cửa hàng, Doanh thu; mỗi cửa hàng có đúng một dòng mỗi ngày. Grain của bảng là gì?
2. Trong bảng chi tiết đơn hàng, cột nào là measure?
3. Bảng chi tiết đơn có cột 'Tổng giá trị đơn' lặp lại ở mỗi dòng sản phẩm. Cộng cột này để ra doanh thu sẽ thế nào?

Bài 2.3. Fact, dimension, khoá chính và khoá ngoại [6]

Trong hệ thống thật, dữ liệu không nằm trong một bảng to mà được tách thành nhiều bảng nối với nhau.

Bài 2.4. Star schema [6]

Star schema là cách tổ chức phổ biến nhất cho phân tích: một fact table ở giữa, các dimension table xung quanh như cánh sao.

FactSalesLine ID (PK)Customer ID, Product ID (FK)Order ID, Order DateSales, Quantity, ProfitDimCustomerCustomer ID (PK), SegmentDimProductProduct ID (PK), CategoryDimDateDate (PK), Tháng, Quý, NămDimRegionCity (PK), Region

Đọc sơ đồ: mỗi dòng của FactSales là một sản phẩm được bán. Muốn biết Segment của khách, nối qua Customer ID sang DimCustomer. Muốn “Sales theo Category”, nối qua Product ID sang DimProduct rồi nhóm theo Category.

Bài 2.5. Normalization và denormalization [7]

Normalization Denormalization
Mục tiêu Tránh bất nhất, dễ cập nhật Đọc nhanh, dễ phân tích
Đổi lại Phải nối (join) nhiều bảng khi phân tích Dữ liệu lặp, dễ bất nhất khi cập nhật
Thường thấy ở Hệ thống giao dịch (bán hàng, kế toán) File báo cáo, bảng cho dashboard
Bẫy: khi nối bảng, nếu bảng dimension có khoá bị trùng (một Product ID xuất hiện 2 lần), mỗi dòng fact sẽ bị nhân đôi và tổng Sales bị phóng đại. Lỗi này gọi là fan-out, bạn sẽ thực hành ở Tuần 5.
Câu hỏi nhanh
1. Trong star schema bán hàng, bảng nào chứa cột Sales?
2. Vì sao không dùng Order ID làm khoá chính của bảng giao dịch Superstore?
3. Bảng khách hàng lưu Segment ở 1 chỗ, thay vì lặp lại trên mọi dòng giao dịch. Đây là ví dụ của?

Thực hành Python [6]

Dữ liệu là bản giả lập theo cấu trúc Superstore. Bấm ▶ Chạy: lần đầu Python cần 10–20 giây để khởi động, những lần sau chạy ngay.

1. Đọc dữ liệu

Bấm ▶ Chạy. Lần đầu Python cần 10–20 giây để khởi động, những lần sau chạy ngay.

Đọc file Superstore

2. Tìm grain

Hoàn thành code để đếm số đơn hàng thật, rồi bấm ✓ Kiểm tra.

Đếm đúng số đơn hàng

3. Kiểm tra khoá

Thử khoá Row ID
Ô trên cố ý không đạt. Lộ trình cho phép tính là đạt nếu bạn giải thích được chênh lệch. Hãy xem dòng in ra và trả lời câu hỏi dưới đây.

Vì sao số dòng lớn hơn số Row ID duy nhất? Bạn sẽ xử lý thế nào trước khi tính tổng Sales?

Câu trả lời đã nộp sẽ được khoá lại, không sửa được.

4. Lọc và sắp xếp

Top 3 sản phẩm theo Sales ở Region West

5. Tách bảng dimension

Tách DimCustomer và kiểm tra khoá
Tách DimProduct: thử xem khoá có duy nhất không
Ô trên cũng cố ý không đạt: dữ liệu có 1 Product ID mang 2 tên khác nhau. Nếu nối bảng này vào fact, các dòng của sản phẩm đó sẽ bị nhân đôi. Ghi lại lỗi và cách bạn sẽ xử lý (ví dụ giữ tên mới nhất) vào log.

Luyện tập tình huống

Tình huống 3. Vì sao 3 dòng dữ liệu chỉ có 2 đơn hàng?

Bối cảnh. Trưởng phòng cần báo cáo bán hàng tháng 01/2026 của khu vực East. Bản trích gồm ba dòng: đơn O-01 có một dòng Furniture (Sales 200 USD, Profit 40 USD) và một dòng Office Supplies (Sales 50 USD, Profit 10 USD); đơn O-02 có một dòng Furniture (Sales 100 USD, Profit −5 USD). Một đồng nghiệp đếm ba dòng nên báo cáo có ba đơn hàng.

Câu hỏi. Xác định grain, measure và dimension. Nếu sếp muốn xem tổng East rồi đi sâu xuống từng Category, bạn roll-up và drill-down thế nào?

Câu trả lời đã nộp sẽ được khoá lại, không sửa được.

Tình huống 4. Vì sao cần tách một bảng thành nhiều bảng?

Bối cảnh. IT muốn xây cơ sở dữ liệu dùng chung cho báo cáo bán hàng. Trong Superstore, Segment lặp lại ở nhiều dòng cùng Customer ID, còn Category và Sub-Category lặp lại trên nhiều giao dịch của cùng sản phẩm. Đồng nghiệp đề xuất chia bảng lớn thành các bảng nhỏ, nhưng định dùng Order ID làm khoá chính cho bảng giao dịch.

Câu hỏi. Đề xuất cách tổ chức theo star schema. Giải thích khoá chính, khoá ngoại và vai trò của normalization.

Câu trả lời đã nộp sẽ được khoá lại, không sửa được.

Ôn bằng thẻ ghi nhớ

15 thẻ ôn lại các khái niệm của tuần. Thẻ “chưa nhớ” sẽ quay lại cuối lượt.

Thẻ ghi nhớĐã nhớ 0/15

Còn 15 thẻ trong lượt này

Tóm tắt tuần