← 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
- Trả lời được "một dòng là gì?" cho bất kỳ bảng nào, và phát hiện lỗi đếm trùng do sai grain.
- Phân biệt measure và dimension; roll-up và drill-down một con số.
- Vẽ được star schema cho dữ liệu bán hàng: fact table, dimension table, khoá chính, khoá ngoại.
- Giải thích vì sao tách bảng (normalization) và khi nào gộp bảng (denormalization).
- Dùng pandas để đọc, chọn, lọc và sắp xếp dữ liệu.
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 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.
- Grain (độ hạt) trả lời câu: một dòng trong bảng đại diện cho cái gì? Một đơn, một sản phẩm trong đơn, một khách hàng trong một ngày…
- Sai grain dẫn tới đếm trùng và tổng sai.
- Cách kiểm tra: tìm tổ hợp cột mà mỗi dòng có một giá trị riêng (gọi là khoá). Nếu số dòng bằng số tổ hợp khoá duy nhất, bạn đã tìm đúng 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]
- Measure (chỉ tiêu đo lường): con số để cộng, lấy trung bình. Ví dụ Sales, Profit, Quantity.
- Dimension (chiều phân tích): thuộc tính để chia nhóm, lọc. Ví dụ Region, Category, Order Date.
Một báo cáo luôn có dạng measure theo dimension: “Sales theo Region”, “Profit theo tháng và Category”.
- Roll-up là gộp từ chi tiết lên tổng: từ 3 dòng trên → tổng Sales = 350.
- Drill-down là đi từ tổng xuống chi tiết để tìm nguyên nhân: tổng 350 → Furniture 300, Office Supplies 50.
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.
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.
- Fact table (bảng sự kiện): mỗi dòng là một sự kiện xảy ra, chứa các measure. Ví dụ mỗi dòng sản phẩm được bán.
- Dimension table (bảng mô tả): mỗi dòng mô tả một đối tượng. Ví dụ mỗi khách hàng, mỗi sản phẩm.
- Khoá chính (primary key, PK): cột định danh duy nhất mỗi dòng của một bảng. Ví dụ Product ID trong bảng sản phẩm.
- Khoá ngoại (foreign key, FK): cột trong bảng này trỏ tới khoá chính của bảng khác. Ví dụ Product ID trong bảng giao dịch trỏ tới bảng sản phẩm.
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.
Đọ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 (chuẩn hoá): tách bảng để mỗi thông tin chỉ lưu ở một chỗ. Đổi Segment của một khách thì chỉ sửa 1 dòng trong DimCustomer, không sợ chỗ sửa chỗ quên dẫn tới bất nhất.
- Denormalization (phi chuẩn hoá): gộp bảng lại thành một bảng rộng để đọc và phân tích nhanh, chấp nhận thông tin bị lặp. File Superstore bạn đang dùng chính là một bảng đã denormalize.
| 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 |
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.
2. Tìm grain
Hoàn thành code để đếm số đơn hàng thật, rồi bấm ✓ Kiểm tra.
3. Kiểm tra khoá
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
5. Tách bảng dimension
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.
Đáp án mẫu
- Grain: một dòng sản phẩm thuộc một đơn, không phải một đơn hoàn chỉnh.
- Measure: Sales, Profit, Quantity. Dimension: Region, Category, Sub-Category, Order Date.
| Chỉ tiêu | Kết quả |
|---|---|
| Số dòng sản phẩm | 3 |
| Số đơn hàng (Order ID không trùng) | 2 |
| Tổng Sales | 350 USD |
| Tổng Profit | 45 USD |
- Roll-up: tổng Sales East tháng 01/2026 = 350 USD.
- Drill-down: East → Furniture 300 USD, Office Supplies 50 USD.
Lỗi hay gặp: dùng số dòng để đếm số đơn; cộng các tỷ lệ Discount rồi coi đó là tỷ lệ giảm giá chung.
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.
Đáp án mẫu
- FactSales: Line ID (PK), Order ID, Customer ID (FK), Product ID (FK), Order Date, Ship Date, Region, Sales, Quantity, Discount, Profit.
- DimCustomer: Customer ID (PK), Segment. DimProduct: Product ID (PK), Category, Sub-Category.
- Khoá chính định danh duy nhất mỗi bản ghi; khoá ngoại trỏ tới khoá chính của bảng khác.
- Normalization tách thông tin khách hàng và sản phẩm ra khỏi dòng giao dịch để không lặp lại.
- Order ID không đủ làm khoá chính vì một đơn có nhiều dòng; cần Line ID riêng.
- Star schema thường giữ nhiều thuộc tính mô tả trong cùng một dimension cho dễ phân tích, nên không nhất thiết chuẩn hoá hoàn toàn.
Lỗi hay gặp: nghĩ mỗi Order ID ứng với đúng một dòng; nghĩ tách càng nhiều bảng càng tốt.
Ô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.
Còn 15 thẻ trong lượt này
Tóm tắt tuần
- Trước khi đếm hay cộng, hỏi: một dòng là gì?
- Báo cáo = measure theo dimension. Roll-up để thấy tổng, drill-down để tìm nguyên nhân.
- Star schema: fact ở giữa chứa measure, dimension xung quanh chứa mô tả, nối bằng khoá.
- Normalization tránh bất nhất; denormalization đọc nhanh. Khoá dimension bị trùng sẽ gây fan-out.