Skip to content

📝 ML cho DA: 20% kiến thức giải 80% bài toán

Mở đầu — "Em muốn xây ML model cho mọi thứ!"

Vy, 27 tuổi, Data Analyst tại MediTrack — healthtech startup 60 nhân viên ở TP.HCM, sản phẩm chính là app quản lý sức khỏe cá nhân: theo dõi lịch khám, nhắc uống thuốc, kết nối phòng khám. 180,000 monthly active users, 35,000 premium subscribers, ARR 12 tỷ VND. Vy là DA duy nhất, report cho CPO — anh Minh, 34 tuổi, ex-Lazada, ex-Tiki.

Vy vào MediTrack được 14 tháng. Background: tốt nghiệp Toán ứng dụng ĐH Khoa học Tự nhiên, từng làm intern BI analyst tại một công ty bảo hiểm 6 tháng. SQL thành thạo, Python ổn, Tableau dashboard đẹp. Gần đây, Vy bắt đầu học Machine Learning qua Coursera — Andrew Ng's course. Xong 60% course, Vy cảm thấy enlightened: "ML có thể giải quyết MỌI THỨ!"

Sáng thứ 2, standup meeting. Product Manager — chị Lan — đặt câu hỏi: "Churn rate tháng này tăng từ 4.2% lên 5.8%. Có ai biết tại sao không?"

Vy giơ tay: "Em có thể xây ML model predict churn! Logistic Regression, Decision Tree, train trên historical data, optimize F1 score..."

Chị Lan nhìn Vy rồi hỏi: "Uh... nhưng trước hết, data churn breakdown theo segment thì sao? Nhóm nào churn nhiều nhất?"

"Ờ... em chưa check."

Anh Minh — CPO — nhắn riêng Vy sau meeting: "Vy ơi, anh cần nói chuyện với em về ML."

Phần 1: Bài học đầu tiên — "SQL trước, ML sau"

"Em skip bước quan trọng nhất"

Anh Minh ngồi cạnh Vy, mở data lên:

"Em muốn xây churn prediction model — tốt. Nhưng trước khi nói đến model, anh hỏi em 3 câu:"

  1. "Churn tăng từ segment nào? Free users hay Premium?"
  2. "Tăng từ tháng nào? Tháng trước hay đã trend 3 tháng?"
  3. "Có event gì xảy ra gần đây? App update? Pricing change?"

Vy im lặng. "Em... chưa check."

"Đúng rồi. Em nhảy thẳng vào ML mà skip step 0: HIỂU VẤN ĐỀ. 90% bài toán business giải được bằng SQL + visualization. ML chỉ cần cho 10% còn lại — và chỉ khi data đủ tốt."

Anh Minh bảo Vy query data trước:

sql
-- Churn breakdown theo segment
SELECT
    user_segment,
    COUNT(CASE WHEN churned = 1 THEN 1 END) AS churned_users,
    COUNT(*) AS total_users,
    ROUND(100.0 * SUM(churned) / COUNT(*), 1) AS churn_rate_pct
FROM users
WHERE month = '2025-12'
GROUP BY user_segment
ORDER BY churn_rate_pct DESC;

Kết quả:

SegmentChurnedTotalChurn Rate
Premium — Monthly3124,2007.4%
Free → Premium (< 3 months)1802,8006.4%
Premium — Annual488,5000.6%
Free users1,20019,5006.2%

"Nhìn thấy chưa?" anh Minh chỉ. "Premium Monthly churn 7.4% — cao nhất. Free → Premium < 3 tháng churn 6.4%. Annual chỉ 0.6%. Vấn đề không phải 'predict ai churn' — vấn đề là Monthly subscribers không gắn bó đủ lâu để thấy giá trị."

"Vậy fix bằng gì?" Vy hỏi.

"Có thể: onboarding tốt hơn cho 3 tháng đầu, incentive chuyển từ Monthly → Annual, hoặc feature gate khác nhau. Giải quyết bằng SQL + product thinking. Chưa cần ML."

Vy ghi nhận bài học #1:

❌ Nhảy vào ML trước khi hiểu vấn đề
✅ LUÔN bắt đầu bằng: SQL → segmented analysis → visualization
✅ Hỏi "Vấn đề gì?" trước khi hỏi "Model nào?"
✅ 90% bài toán giải bằng descriptive analytics + business logic

Phần 2: ML đầu tiên — "Revenue forecast cho Board meeting"

Bài toán thực sự cần ML

2 tuần sau, CFO — chị Hạ — gửi yêu cầu: "Q2 sắp tới, Board muốn revenue forecast chi tiết: monthly breakdown, by segment, với confidence interval. Excel trendline không đủ — cần model chính xác hơn."

Anh Minh gật: "Đây mới là lúc cần ML. Revenue phụ thuộc vào 10+ features: new signups, churn rate, upgrade rate, seasonality, marketing spend... Linear Regression fit tốt bài này."

Vy bắt tay xây model đầu tiên:

python
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_absolute_error

# Load 24 tháng historical data
data = pd.read_csv('monthly_metrics.csv')  # 24 rows × 12 features

features = ['new_signups', 'active_users', 'churn_rate',
            'upgrade_rate', 'marketing_spend', 'avg_revenue_per_user',
            'app_sessions_avg', 'support_tickets', 'nps_score',
            'month_number', 'is_q4']

X = data[features]
y = data['monthly_revenue']

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42
)

model = LinearRegression()
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
print(f"R² = {r2_score(y_test, y_pred):.3f}")
print(f"MAE = {mean_absolute_error(y_test, y_pred):,.0f} VND")

Kết quả: R² = 0.91, MAE = 82 triệu VND (trên average revenue 1 tỷ/tháng → error ~8%). CFO chấp nhận được.

Nhưng Vy mắc lỗi mới:

"Em gửi cho chị Hạ: 'Model dự đoán Q2 revenue = 3.2 tỷ VND, R² = 0.91, MAE = 82M.'"

Chị Hạ reply: "R² là gì? MAE là gì? Em nói bằng tiếng người được không?"

Anh Minh nhắc Vy: "Translate ML output thành business language."

Vy viết lại:

"Dựa trên phân tích 24 tháng data và 11 yếu tố ảnh hưởng, dự đoán revenue Q2: 3.2 tỷ VND (±250 triệu). Yếu tố ảnh hưởng lớn nhất: số lượng active users (+35% impact) và churn rate (-22% impact). Nếu churn rate giảm từ 5.8% về 4%, revenue tăng thêm ~180 triệu/tháng."

Chị Hạ: "Rõ ràng, actionable. Thanh!"

Vy ghi nhận bài học #2:

❌ Gửi R², MAE cho business stakeholders
✅ Translate: "Model predict X ± Y. Top driver: Z. If we do A → impact B đồng"
✅ Business people cần: con số, khoảng tin cậy, action
✅ Technical people cần: R², MAE, feature importance → để trong appendix

Phần 3: Churn prediction — "Lần này ML thực sự cứu công ty"

Bài toán scale mà SQL không giải được

Tháng 3, MediTrack nhận funding Series A — 50 tỷ VND. Board yêu cầu: "Giảm churn rate từ 5.8% xuống 3.5% trong 6 tháng. Retention là survival metric."

CPO Minh gọi Vy: "180,000 users. Em không thể manually review từng người. Cần model predict TOP 500 khách có churn risk cao nhất mỗi tháng → retention team gọi điện/tặng voucher. Đây là lúc ML tỏa sáng."

Vy nhớ bài học và bắt đầu ĐÚNG CÁCH:

Step 1 — Business Understanding:

  • Objective: Predict khách churn trong 30 ngày tới
  • Target: churn_30d (0/1)
  • Success metric: Recall ≥ 0.75 (bắt ≥ 75% khách sẽ churn — FN costly hơn FP)
  • Business constraint: retention team chỉ handle 500 cases/tháng

Step 2 — EDA trước khi model:

python
# Key findings từ EDA
print("CHURN vs NON-CHURN comparison:")
print(f"Avg sessions/week:    Churn=1.2  vs  Stay=4.8")
print(f"Avg days since login: Churn=18   vs  Stay=3")
print(f"Support tickets:      Churn=3.2  vs  Stay=0.8")
print(f"Features used:        Churn=2.1  vs  Stay=5.4")
print(f"Contract monthly:     Churn=82%  vs  Stay=35%")

Step 3 — Train models:

python
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report, confusion_matrix

# Logistic Regression
lr = LogisticRegression(max_iter=1000, class_weight='balanced')
lr.fit(X_train, y_train)

# Decision Tree
dt = DecisionTreeClassifier(max_depth=5, class_weight='balanced')
dt.fit(X_train, y_train)

print("=== LOGISTIC REGRESSION ===")
print(classification_report(y_test, lr.predict(X_test),
      target_names=['Stay', 'Churn']))

print("=== DECISION TREE ===")
print(classification_report(y_test, dt.predict(X_test),
      target_names=['Stay', 'Churn']))

Kết quả:

ModelAccuracyPrecisionRecallF1
Logistic Regression0.790.710.760.73
Decision Tree0.810.740.790.76

Step 4 — Feature importance từ Decision Tree:

RankFeatureImportance
1days_since_last_login0.31
2sessions_per_week0.24
3contract_type (monthly)0.18
4features_used_count0.12
5support_tickets_last_30d0.09

Vy trình bày cho team:

"Model churn prediction đúng 81% trường hợp, và bắt được 79% khách sẽ churn (recall = 0.79). Top 500 khách risk cao nhất — nếu retention team contact và giữ lại 40% (200 khách), tiết kiệm 200 × LTV 2.5 triệu = 500 triệu/năm. Chi phí retention campaign: 80 triệu. ROI = 5.25x."

"Key insight: khách churn có 3 dấu hiệu chính — (1) không login > 14 ngày, (2) sessions < 2/tuần, (3) dùng monthly contract. Recommendation: auto-trigger re-engagement email khi user inactive 7 ngày. Push incentive chuyển Annual cho Monthly users."

Kết quả sau 4 tháng triển khai:

  • Churn rate: 5.8% → 4.1% (chưa đạt target 3.5% nhưng trending đúng)
  • 780 khách được retain từ model predictions
  • Revenue saved: ~420 triệu
  • Board ấn tượng — CPO Minh proud

Phần 4: Bài học sâu nhất — "Biết khi nào KHÔNG dùng ML"

Sai lầm suýt xảy ra

Sau thành công churn model, Vy bắt đầu muốn ML hóa mọi thứ:

  • "Em muốn xây model predict user nào sẽ upgrade!"
  • "Em muốn ML recommend content phòng khám!"
  • "Em muốn NLP phân tích review trên app store!"

Anh Minh kéo Vy lại:

"Vy, dừng lại. Không phải bài toán nào cũng cần ML. Evaluate trước:"

Bài toán Vy đề xuấtCần ML?Tại sao?
Predict upgradeChỉ có 35,000 premium users, 500 upgrades/tháng → data quá ít. Rule-based tốt hơn: "user active > 10 sessions/tuần + tenure > 3 tháng → push upgrade"
Recommend phòng khám⚠️Có thể — nhưng bắt đầu bằng simple rules (location + specialty), ML chỉ khi rules không đủ
NLP reviews200 reviews/tháng → đọc manual nhanh hơn. NLP overkill. Sentiment analysis khi có 10,000+ reviews

"Rule of thumb: nếu con người có thể review manually trong < 2 tiếng → không cần ML. Nếu cần process 10,000+ cases/tháng → ML."

Framework "ML or Not?"

Vy tạo framework cho team:

🤔 ML OR NOT? — Decision Framework
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. Bài toán cần PREDICTION hay chỉ REPORTING?
   → Reporting: SQL/BI đủ. Stop.

2. Data có đủ lớn? (> 1,000 labeled examples)
   → Không: Rule-based hoặc statistics. Stop.

3. Pattern có phức tạp? (> 3 features interact)
   → Đơn giản: IF-THEN rules. Stop.

4. Business impact justify effort? (> 3 tháng dev)
   → Không: Simple heuristic. Stop.

5. Tất cả YES → BUILD ML MODEL ✅

Spotify Discover Weekly — ML đúng chỗ

Vy đọc case study Spotify trong buổi tối:

Spotify Discover Weekly — mỗi tuần Monday, 30 bài mới cho mỗi user. 600 triệu users, mỗi user cần playlist KHÁC NHAU. Con người không thể manual → ML là lựa chọn DUY NHẤT.

  • Input: 100+ triệu tracks, listening history, collaborative filtering
  • Output: 30 songs/user/week personalized
  • Impact: 40% tổng streams đến từ algorithmic recommendations
  • Revenue: ML recommendations đóng góp ước tính $1.5B/năm cho Spotify

"Đây là bài toán PHẢI dùng ML — scale quá lớn, pattern quá phức tạp, impact quá cao," Vy ghi nhận.

Nhưng Netflix — công ty recommendation nổi tiếng — vẫn dùng manual curation cho homepage hero banner. Vì hero banner chỉ có 1 slot, impact lớn, cần creative judgment. "Ngay cả Netflix cũng biết khi nào KHÔNG dùng ML."

Kết — "20% ML knowledge, 80% impact"

8 tháng sau ngày hào hứng nói "em muốn xây ML model cho mọi thứ", Vy viết lên Notion team:

"Hồi đó em nghĩ ML là magic — train model, predict, xong. Sai.

ML chỉ tốt khi: (1) BÀI TOÁN đúng — cần prediction, không phải reporting; (2) DATA đủ — quality và quantity; (3) IMPACT justify effort — ROI phải positive.

8 tháng ở MediTrack, em xây 2 ML models (churn prediction + revenue forecast). Nhưng em cũng từ chối xây 5 models khác — vì SQL + business logic giải quyết tốt hơn, nhanh hơn, rẻ hơn.

20% kiến thức ML — Linear Regression, Logistic Regression, Decision Tree, confusion matrix — giải quyết 80% bài toán prediction của DA. Không cần neural network. Không cần deep learning. Không cần gradient boosting (chưa). Cần hiểu: khi nào dùng, khi nào KHÔNG dùng, và cách explain cho business.

Andrew Ng nói: 'The most important thing in ML is not the algorithm. It's the data.' Và em thêm: 'The most important thing for DA is not the model. It's knowing when NOT to model.'"

Anh Minh comment bên dưới: "Đúng rồi Vy. DA giỏi nhất không phải người xây model phức tạp nhất — mà là người biết chọn ĐÚNG TOOL cho đúng bài toán. Đôi khi tool đó là SQL. Đôi khi là Excel. Và đôi khi — chỉ đôi khi — là ML."

💡 3 bài học Vy rút ra

  1. SQL trước, ML sau — 90% bài toán giải bằng descriptive analytics. Hiểu vấn đề trước khi nhảy vào modeling.
  2. Translate, đừng flex — Stakeholders không cần R², MAE. Họ cần: "Model predict X, impact Y đồng, recommendation Z."
  3. Biết khi nào KHÔNG dùng ML — DA giỏi là người chọn đúng tool: SQL cho reporting, statistics cho testing, ML cho prediction AT SCALE. Không phải mọi nail đều cần hammer.