Skip to content

📝 Power BI vs Tableau: Khi dashboard tĩnh không còn đủ

Mở đầu — "Sáng nào cũng chạy notebook rồi gửi email."

Khôi, 31 tuổi, DA Lead tại một startup e-commerce tăng trưởng nhanh ở TP.HCM — loại startup có 200 nhân viên, GMV 500 tỷ/năm, và đang gọi vốn Series B. Khôi phụ trách data team 4 người, báo cáo trực tiếp cho COO. Team Khôi "own" toàn bộ báo cáo nội bộ: doanh thu, marketing performance, inventory, và customer analytics.

Khôi là dân Python chính hiệu. Pandas thành thạo, Matplotlib & Seaborn mượt mà, EDA bài bản. Mỗi sáng, Khôi chạy Jupyter Notebook, generate 12 chart PNG, paste vào Google Slides, rồi gửi email cho COO, CMO, và 8 team lead. Quy trình lặp lại mỗi ngày, 365 ngày/năm.

Nhưng khi công ty scale từ 50 lên 200 người, quy trình đó sụp đổ.

Thứ Hai đầu tuần: COO gọi Slack lúc 7:15 sáng — "Khôi, doanh thu weekend thế nào? Gửi số cho anh trước 8h nhé." Khôi chạy notebook, 15 phút export xong, gửi email.

8:30 sáng: CMO ping — "Chart của Khôi cho thấy marketing spend tăng, nhưng filter theo app channel thì sao? Cho chị số riêng app với web." Khôi sửa code, thêm filter, re-run, export lại.

9:00 sáng: VP Sales nhắn — "Revenue theo vùng miền thế nào? HN vs HCM vs miền Trung? Em có chart riêng không?" Khôi thở dài. Lại sửa code, lại export, lại gửi email.

10:00 sáng: CMO reply email — "Khôi, chart của em chỉ có tháng này. So sánh với cùng kỳ năm ngoái thì sao?" Khôi gõ thêm SAMEPERIODLASTYEAR... à không, đây là Pandas, phải viết df_ly = df[df['year']==2024] rồi merge...

Đến 11:00 sáng, Khôi đã trả lời 6 yêu cầu ad-hoc, sửa code 4 lần, export 15 chart, gửi 8 email. Và chưa làm được gì cho sprint hiện tại. Team Khôi 4 người thì 2 người cũng đang bận generate report cho bộ phận khác.

COO gọi Khôi vào phòng họp lúc 2:00 chiều: "Khôi, mỗi lần anh cần 1 con số, em phải chạy code 15 phút rồi gửi email. Bên FPT và Tiki họ có dashboard ai cũng tự xem được. Mình cần cái tương tự — anh không muốn đợi mỗi lần."

Khôi biết COO đúng. Nhưng cậu chưa bao giờ xây dashboard tương tác. Python chart = tĩnh. Excel dashboard = tĩnh. Khôi cần tool khác.

Phần 1: Excel Dashboard vs BI Dashboard — Khác nhau ở đâu?

Tối hôm đó, Khôi gọi cho Phương — chị bạn đại học, hiện là BI Manager tại một tập đoàn bán lẻ ở Hà Nội: "Chị ơi, em cần chuyển từ Python chart sang dashboard tương tác. Bắt đầu từ đâu?"

Phương cười: "Chào mừng em đến thế giới BI. Câu đầu tiên: em hiểu tại sao Excel dashboard không đủ chứ?"

Khôi: "Ý chị là pivot chart trong Excel? Em có làm nhưng nó... cứng?"

Phương: "Cứng là đúng rồi. Excel dashboard = ảnh chụp tĩnh tại 1 thời điểm. Khi data mới vào, em phải refresh manual. Khi sếp muốn filter khác, em phải sửa pivot. Khi team muốn xem cùng lúc, em phải gửi file. Và khi file Excel nặng quá — 50MB — thì nó crash."

Phương share bảng so sánh:

Tiêu chíExcel DashboardPython (Matplotlib)BI Dashboard (Power BI/Tableau)
Tương tácHạn chế (slicer cơ bản)Không (chart tĩnh)⭐ Cross-filter, drill-down, tooltip
Real-timeManual refreshRe-run notebook⭐ Scheduled refresh (auto)
ShareGửi file / SharePointExport PNG, gửi email⭐ 1 link, ai cũng xem
ScalableChậm khi > 100K rowsOK nhưng không visual⭐ Xử lý hàng triệu rows
MobileKhó đọc trên phoneKhông⭐ Mobile-optimized layout
SecurityFile-levelKhông⭐ Row-Level Security
Data modelFlat tableDataFrame⭐ Star schema, relationships

"Thấy chưa?" Phương nói. "Cùng data, nhưng BI dashboard giải quyết mọi vấn đề em đang gặp: sếp tự xem thay vì chờ em, filter tự động thay vì em sửa code, share 1 link thay vì 8 email."

CEO mở app xem KPI — Đó là power của BI

Hãy tưởng tượng: CEO mở Power BI Mobile lúc 6:30 sáng trong lúc uống cà phê. Số liệu hôm qua đã tự refresh lúc 6:00 AM. CEO thấy revenue hôm qua giảm 12% so với trung bình → tap vào → drill-down thấy khu vực miền Trung giảm mạnh → tap tiếp → thấy đơn hàng từ đối tác X bị cancel.

Tất cả trong 2 phút, không cần gọi ai, không cần chờ email. Đó là BI dashboard.

Phần 2: Power BI vs Tableau — Cuộc chiến "Big Two"

Khôi hỏi: "Vậy em nên học Power BI hay Tableau?"

Phương: "Câu hỏi muôn thuở. Cả hai đều tốt, nhưng khác nhau ở triết lý:"

"Power BI = Microsoft ecosystem. Nếu công ty em dùng Microsoft 365, Teams, SharePoint, SQL Server — Power BI tích hợp mượt mà. License rẻ ($10/user/month), DAX mạnh mẽ. Phổ biến nhất ở Việt Nam vì hầu hết doanh nghiệp dùng Microsoft."

"Tableau = Visualization-first. Nếu em cần dashboard đẹp nhất, flexible nhất, interactive nhất — Tableau vượt trội. Drag-and-drop trực quan. LOD Expressions linh hoạt. Nhưng đắt hơn ($70/user/month) và community nhỏ hơn tại VN."

Khôi: "Startup em dùng Google Workspace, nhưng sales team dùng Excel. Chắc Power BI phù hợp hơn?"

Phương: "Power BI Desktop miễn phí, em install về laptop là build được. Khi cần share lên cloud thì mới cần Pro license. Cho startup đang gọi vốn, đó là điểm tốt — tiết kiệm budget."

"Nhưng em nhớ: concept là quan trọng nhất — data model, measure, dashboard design — áp dụng cho MỌI BI tool. Học Power BI xong, muốn chuyển sang Tableau chỉ cần 2-3 tuần. Đừng debate tool, hãy master concept."

Power BI hay Tableau — Chọn theo context

Tình huốngNên chọnLý do
Công ty dùng Microsoft 365Power BITích hợp Teams, SharePoint, Excel
Cần dashboard đẹp nhấtTableauVisualization engine vượt trội
Budget hạn chếPower BIDesktop free, Pro $10/user
Team tech-heavy (SQL, Python)Cả hai OKPower BI nếu muốn DAX, Tableau nếu muốn LOD
Tuyển dụng VNPower BI70% JD tại VN yêu cầu Power BI
Cần Tableau Public portfolioTableauTableau Public miễn phí, dùng làm portfolio

Phần 3: Data Model — Từ "1 bảng to" sang Star Schema

Tuần sau, Khôi bắt tay vào xây dashboard đầu tiên. Cậu import CSV doanh thu vào Power BI — 1 file, 500K rows, 25 columns. Mọi thứ nằm trong 1 bảng phẳng (flat table).

Dashboard chạy được, nhưng chậm. Filter theo region mất 3 giây. Drill-down lag. Và khi Khôi muốn thêm data marketing từ bảng khác, mọi thứ vỡ.

Khôi gọi Phương: "Chị ơi, dashboard em chậm quá. Data có 500K rows mà filter mất 3 giây."

Phương: "Em đang dùng flat table đúng không? 1 bảng to, mọi thứ nằm hết trong đó? Đó là sai lầm #1 của người mới."

"BI engine optimize cho star schema — 1 fact table chứa số liệu (revenue, quantity), nhiều dimension tables chứa thuộc tính (product name, region, date). Khi data tách thành star schema, Power BI xử lý nhanh hơn 10-50 lần."

Phương hướng dẫn Khôi refactor data model:

"Flat table 500K rows × 25 columns = 12.5 triệu cells. Star schema: fact table 500K × 5 (chỉ keys + measures) + 4 dimension tables nhỏ = tổng khoảng 3 triệu cells. Giảm 75% kích thước, query nhanh gấp bội."

Khôi làm theo: tạo DIM_PRODUCT, DIM_CUSTOMER, DIM_DATE, tách ra từ flat table. Relationship: FACT_SALES.product_id → DIM_PRODUCT.product_id (Many-to-One). Sau khi refactor, filter từ 3 giây xuống 0.2 giây.

"Aha!" Khôi exclaim. "Đây là lý do SQL database dùng JOIN — normalize data thành nhiều bảng nhỏ. Star schema trong BI cũng nguyên lý đó."

Data Model là trái tim — Dashboard chỉ là bề mặt

Nhiều DA mới nghĩ BI = kéo thả chart. Sai. 80% thời gian xây dashboard nên dành cho data model: import → clean (Power Query) → tạo relationships → viết measures. Dashboard đẹp mà data model sai → filter sai, số sai, performance chậm.

Nguyên tắc của Phương: "Nếu data model vững, dashboard tự nó sẽ đẹp. Nếu data model sai, chart đẹp mấy cũng sai số."

Phần 4: DAX — Ngôn ngữ bí mật của Power BI

Khôi viết measure đầu tiên: Total Revenue = SUM(FACT_SALES[Revenue]). OK, đơn giản. Nhưng khi COO hỏi "Revenue tháng này vs cùng kỳ năm ngoái?", Khôi bế tắc.

Trong Python, cậu sẽ viết:

python
df_this_month = df[df['month'] == current_month]
df_prev_year = df[(df['month'] == current_month) & (df['year'] == current_year - 1)]
yoy = (df_this_month['revenue'].sum() - df_prev_year['revenue'].sum()) / df_prev_year['revenue'].sum()

6 dòng code. Trong DAX? Phương show:

dax
Revenue PY = CALCULATE([Total Revenue], SAMEPERIODLASTYEAR(DIM_DATE[date_key]))
YoY Growth % = DIVIDE([Total Revenue] - [Revenue PY], [Revenue PY], 0)

2 dòng. Và nó tự động thay đổi khi user click filter tháng khác, quý khác, năm khác. Không cần re-run code.

"Đây là power của DAX," Phương giải thích. "DAX measures là dynamic — chúng tính toán dựa trên filter context. Khi user click slicer 'TP.HCM', DAX tự filter data thành chỉ TP.HCM rồi tính. Click 'Q3', DAX tự tính cho Q3. Trong Python, em phải viết code riêng cho mỗi filter combination. Trong DAX, em viết 1 measure, mọi filter combination tự hoạt động."

Khôi: "Nên CALCULATE là cách em override filter context — 'tính cái này NHƯNG chỉ cho data thỏa điều kiện'?"

Phương: "Chính xác. CALCULATE = em nói với DAX: 'Tao biết user đang filter TP.HCM, nhưng measure này tao muốn tính cho toàn quốc.' Hoặc: 'Tao muốn tính revenue, nhưng chỉ cho đơn > 1 triệu.' CALCULATE cho em quyền kiểm soát filter context."

Phần 5: Dashboard kể 1 câu chuyện — Less is More

Sau 2 tuần, Khôi xây xong dashboard đầu tiên. 14 visuals, 5 slicers, 3 pages. Cậu tự hào gửi cho COO.

COO mở dashboard lên... rồi gọi Khôi: "Em ơi, chart nhiều quá anh không biết nhìn đâu trước. Page 1 có 6 chart, anh mất 2 phút mới hiểu. Anh cần hiểu trong 10 giây."

Khôi gọi Phương. Phương cười: "Dashboard đầu tiên ai cũng nhồi nhét chart. Vì em biết Power BI có nhiều visual, em muốn dùng hết. Nhưng quy tắc vàng: Dashboard kể 1 câu chuyện. Mỗi visual trả lời 1 câu hỏi. Tổng cộng 5-8 visuals là tối đa."

"Interactive ≠ phức tạp. Interactive nghĩa là user TỰ TÌM câu trả lời bằng cách click filter, drill-down, hover tooltip. Không phải em dump hết chart lên 1 trang rồi gọi là interactive."

Phương cho Khôi 3 nguyên tắc:

  1. KPI cards ở trên cùng — 3-4 số quan trọng nhất. CEO nhìn đầu tiên.
  2. 1 chart chính (hero chart) — chiếm 40% diện tích. Kể câu chuyện chính.
  3. 2-3 chart hỗ trợ — breakdown, comparison, supporting detail.

Khôi refactor: bỏ 6 chart thừa, giữ 4 KPI cards + 1 revenue trend (hero) + 1 breakdown by category + 1 region map. Thêm 2 slicers (Region, Date range). Tổng: 8 elements, 1 page.

COO mở lại: "Giờ thì anh hiểu rồi. Revenue tuần này tăng 8%, Electronics dẫn đầu, miền Trung đang yếu. Anh thấy hết trong 10 giây. Em giỏi lắm."

Kết luận

Hai tháng sau, team Khôi không còn gửi email báo cáo buổi sáng. Dashboard Power BI auto-refresh lúc 6:00 AM. COO mở app trên phone, CMO mở trên laptop, VP Sales mở trên tablet — tất cả xem cùng 1 dashboard, cùng 1 nguồn sự thật (single source of truth). Khôi giải phóng 15 giờ/tuần — từ generate report sang build insights.

"Cái ironic," Khôi nhắn Phương, "là dashboard đơn giản nhất lại mất công nhất. Em mất 2 tuần build data model, viết DAX, test cross-filter. Nhưng output chỉ là 1 trang, 8 visuals, nhìn đơn giản đến mức sếp nghĩ em làm 2 tiếng. Đó mới là nghệ thuật."

Phương reply: "Dashboard hay nhất là dashboard mà người dùng nghĩ nó đơn giản. Vì đằng sau sự 'đơn giản' đó là data model vững vàng, DAX chính xác, và design sâu sắc. Giống như Apple — sản phẩm trông đơn giản vì engineering cực kỳ phức tạp đằng sau."

Điểm chính cần nhớ

  • BI Dashboard giải quyết vấn đề "gửi email mỗi sáng" — build 1 lần, stakeholders tự xem real-time. Tiết kiệm 10-20 giờ/tuần cho DA team.
  • Power BI vs Tableau: chọn theo context, không theo trend — Power BI phổ biến tại VN, tích hợp Microsoft, rẻ. Tableau visualization đẹp hơn. Concept (data model, measure, dashboard design) giống nhau.
  • Data model là trái tim của dashboard — Star schema (fact + dimensions) là chuẩn. Flat table = chậm, khó mở rộng. 80% thời gian nên dành cho data model.
  • DAX measures là dynamic — tính toán dựa trên filter context. CALCULATE cho phép override context. 1 measure = tự động hoạt động cho mọi filter combination.
  • Dashboard kể 1 câu chuyện, Less is More — KPI cards trên cùng, 1 hero chart, 2-3 supporting charts. Tổng 5-8 visuals max. Interactive ≠ phức tạp.
  • Publish + Scheduled Refresh = single source of truth — 1 dashboard, 1 link, tất cả team xem cùng data. Auto-refresh mỗi ngày. Không còn "file Excel version 3 final FINAL."
  • Concept > Tool — Học data model, measure, dashboard design rồi thì Power BI hay Tableau đều master nhanh. Đừng debate tool, hãy xây foundation.